diff --git a/gpii/node_modules/displaySettingsHandler/src/displaySettingsHandler.js b/gpii/node_modules/displaySettingsHandler/src/displaySettingsHandler.js index 446efc437..c867b7ab5 100644 --- a/gpii/node_modules/displaySettingsHandler/src/displaySettingsHandler.js +++ b/gpii/node_modules/displaySettingsHandler/src/displaySettingsHandler.js @@ -101,16 +101,55 @@ windows.display.createDevModeStruct = function () { return dm; }; +fluid.defaults("gpii.windowsDisplay", { + gradeNames: ["fluid.component"], + invokers: { + getScreenResolution: { + funcName: "gpii.windows.display.getScreenResolution", + args: [] + }, + getAvailableResolutions: { + funcName: "gpii.windows.display.getAvailableResolutions", + args: ["{that}"] + }, + getAllScreenResolutions: { + funcName: "gpii.windows.display.getAllScreenResolutions", + args: [] + }, + isScreenResolutionInvalid: { + funcName: "gpii.windows.display.isInvalid", + args: ["{that}", "{arguments}.0"] + // { width, height } + }, + setScreenResolution: { + funcName: "gpii.windows.display.setScreenResolution", + args: ["{that}", "{arguments}.0"] + // { width, height } + }, + getImpl: { + funcName: "gpii.windows.display.getImpl", + args: [] + }, + setImpl: { + funcName: "gpii.windows.display.setImpl", + args: ["{arguments}.0"] + // settingsRequest payload + } + } +}); + + /* * Returns if a screen resolution is invalid * - * @param (Object) + * @psrsm that {Component} An instance of gpii.displaySettingsHandler + * @param screenRes (Object) Screen resolution to test as {width, height} * @returns {boolean} true if invalid */ -windows.display.isInvalid = function (screenRes) { +gpii.windows.display.isInvalid = function (that, screenRes) { var isInvalid = true; if (typeof(screenRes.width) === "number" && typeof(screenRes.height) === "number" && screenRes.width > 0 && screenRes.height > 0) { - fluid.each(windows.display.getAvailableResolutions(), function (validScreenRes) { + fluid.each(that.getAvailableResolutions(), function (validScreenRes) { if (validScreenRes.dmPelsWidth === screenRes.width && validScreenRes.dmPelsHeight === screenRes.height) { isInvalid = false; }; @@ -124,7 +163,7 @@ windows.display.isInvalid = function (screenRes) { * * @return {Object) The width and height of the screen. */ -windows.display.getScreenResolution = function () { +gpii.windows.display.getScreenResolution = function () { var dm = windows.display.createDevModeStruct(); if (windows.display.user32.EnumDisplaySettingsW(ref.NULL, c.ENUM_CURRENT_SETTINGS, dm.ref()) !== c.FALSE) { // note for unknown reason on win 10 the returned dmSize is 188 not expected 220 @@ -138,9 +177,9 @@ windows.display.getScreenResolution = function () { /* * Gets available resolutions * - * @return {list} of resolutions + * @return {array} of resolutions */ -windows.display.getAvailableResolutions = function () { +gpii.windows.display.getAvailableResolutions = function () { var index = 0; var dm = windows.display.createDevModeStruct(); var availableResolutions = []; @@ -158,14 +197,38 @@ windows.display.getAvailableResolutions = function () { return availableResolutions; }; +/* + * Gets the current and all available screen resolutions + * + * @return {Object) The width and height as "current-resolution" and an array of + * widths/heights as "available-resolutions". + */ +gpii.windows.display.getAllScreenResolutions = function () { + var winDisplay = gpii.windowsDisplay(); + var currentResolution = winDisplay.getScreenResolution(); + var available = winDisplay.getAvailableResolutions(); + var rule = { + width: "dmPelsWidth", + height: "dmPelsHeight" + }; + available = fluid.transform (available, function (currRes) { + return fluid.model.transformWithRules (currRes, rule); + }); + return { + "screen-resolution": currentResolution, + "available-resolutions": available + }; +}; + /* * Sets the current display's screen resolution if possible * + * @psrsm that {Component} An instance of gpii.displaySettingsHandler * @param {Object} The new screen resolution width and height * @return {boolean} true if successful */ -windows.display.setScreenResolution = function (newRes) { - if (windows.display.isInvalid(newRes)) { +gpii.windows.display.setScreenResolution = function (that, newRes) { + if (that.isScreenResolutionInvalid(newRes)) { fluid.fail("Received an invalid screen resolution: ", newRes); } else { var dmCurrent = windows.display.createDevModeStruct(); @@ -193,19 +256,27 @@ windows.display.setScreenResolution = function (newRes) { } }; -windows.display.setImpl = function (payload) { +/* + * Sets the current display's screen resolution based on payload. + * + * @param {Object} Payload that contains a "screen-resolution" property. + * @return {Object} containing the resolution before changing it ("oldValue"), + * and a copy of the new resolution (newRes), both with + * memmbers {width, height} + */ +gpii.windows.display.setImpl = function (payload) { + var windowsDisplay = gpii.windowsDisplay(); + var oldRes = windowsDisplay.getScreenResolution(); + var newRes = oldRes; var results = {}; var targetRes = payload.settings["screen-resolution"]; if (targetRes) { - var oldRes = windows.display.getScreenResolution(); - var newRes = oldRes; - if (typeof(targetRes.width) !== "number" || typeof(targetRes.height) !== "number") { fluid.fail("Incorrect payload for screen resolution: " + - JSON.stringify(payload, null, 4)); + JSON.stringify(payload, null, 4)); } - else if (windows.display.setScreenResolution(targetRes)) { + else if (windowsDisplay.setScreenResolution(targetRes)) { newRes = targetRes; } @@ -223,14 +294,16 @@ windows.display.setImpl = function (payload) { return results; }; -windows.display.getImpl = function () { - var curRes = windows.display.getScreenResolution(); - var curDpi = windows.display.getScreenDpi(); - var results = { - "screen-resolution": curRes, - "screen-dpi": curDpi.configured - }; - +/* + * Returns the display's current screen resolution, and dpi. + * + * @return {Object} containing "screen-resolution" property that is the current + * resolution {width, height}, and a "screen-dpi" property. + */ +gpii.windows.display.getImpl = function () { + var results = {}; + fluid.set(results, "screen-resolution", windows.display.getScreenResolution()); + fluid.set(results, "screen-dpi", windows.display.getScreenDpi().configured); return results; }; diff --git a/gpii/node_modules/displaySettingsHandler/test/testDisplaySettingsHandler.js b/gpii/node_modules/displaySettingsHandler/test/testDisplaySettingsHandler.js index cb4fd7769..1a95e59e2 100644 --- a/gpii/node_modules/displaySettingsHandler/test/testDisplaySettingsHandler.js +++ b/gpii/node_modules/displaySettingsHandler/test/testDisplaySettingsHandler.js @@ -21,6 +21,8 @@ fluid.registerNamespace("gpii.tests.displaySettings"); require("../../WindowsUtilities/WindowsUtilities.js"); require("../src/displaySettingsHandler.js"); +var windowsDisplay = gpii.windowsDisplay(); + /** * Tests for the DPI settings. */ @@ -119,52 +121,145 @@ jqUnit.module("Windows Display Settings Handler Tests", { jqUnit.test("Testing GetScreenResolution", function () { jqUnit.expect(3); - var screenRes = gpii.windows.display.getScreenResolution(); + var screenRes = windowsDisplay.getScreenResolution(); jqUnit.assertDeepEq("getScreenResolution returns an object", "object", typeof(screenRes)); jqUnit.assertDeepEq("value for width is a number", "number", typeof(screenRes.width)); jqUnit.assertDeepEq("value for height is a number", "number", typeof(screenRes.height)); }); +jqUnit.test("Get available screen resolutions", function () { + var availableReesolutions = windowsDisplay.getAvailableResolutions(); + jqUnit.assertNotNull("Available resoiultions array", availableReesolutions); + jqUnit.assertNotEquals("Number of availableReesolutions", + 0, availableReesolutions.length); +}); + +jqUnit.test("Get all screen resolutions", function () { + var current = windowsDisplay.getScreenResolution(); + var available = windowsDisplay.getAvailableResolutions(); + var all = windowsDisplay.getAllScreenResolutions(); + jqUnit.assertDeepEq("All screen resolutions contains current resolution", + current, all["screen-resolution"]); + + // Revisit use of "dmPels" prefix as returnsd by getAvailalbeResolutions(). + // Can't do a deep equals because the property names are different. + var allAvailable = all["available-resolutions"]; + jqUnit.assertEquals("All screen resolutions contain available resolutions", + available.length, allAvailable.length); + fluid.each (available, function (expected, index) { + var actual = allAvailable[index]; + jqUnit.assertEquals("Available resolution width in 'all' structure vs available", + expected.dmPelsWidth, actual.width); + jqUnit.assertEquals("Available resolution height in 'all' structure vs available", + expected.dmPelsHeight, actual.height); + }); +}); + +jqUnit.test("Valid and invalid screen resolutions", function () { + var currentResolution = windowsDisplay.getScreenResolution(); + jqUnit.assertFalse( + "Valid screen resolution", + windowsDisplay.isScreenResolutionInvalid(currentResolution) + ); + var invalidResolution = { width: -999, height: -666 }; + jqUnit.assertTrue( + "Valid screen resolution", + windowsDisplay.isScreenResolutionInvalid(invalidResolution) + ); +}); + jqUnit.test("Testing setScreenResolution ", function () { - var oldRes = gpii.windows.display.getScreenResolution(); + var oldRes = windowsDisplay.getScreenResolution(); // We can change resolution // Not such a good unit test as depends on available modes and current screen resolution jqUnit.expect(2); var targetRes = { width: 800, height: 600 }; - jqUnit.assertTrue("We can call to setScreenResolution, it returns 'true'", gpii.windows.display.setScreenResolution(targetRes)); - var newRes = gpii.windows.display.getScreenResolution(); + jqUnit.assertTrue("We can call to setScreenResolution, it returns 'true'", + windowsDisplay.setScreenResolution(targetRes)); + var newRes = windowsDisplay.getScreenResolution(); jqUnit.assertDeepEq("New resolution is set", targetRes, newRes); // Restore old resolution jqUnit.expect(2); - jqUnit.assertTrue("Resetting to old resolution", gpii.windows.display.setScreenResolution(oldRes)); - var restoredRes = gpii.windows.display.getScreenResolution(); + jqUnit.assertTrue("Resetting to old resolution", windowsDisplay.setScreenResolution(oldRes)); + var restoredRes = windowsDisplay.getScreenResolution(); jqUnit.assertDeepEq("Old resolution appear to be restored", oldRes, restoredRes); // test can't change to invalid resolution var badRes = { width: -123, height: -123 }; jqUnit.expectFrameworkDiagnostic("setScreenResolution fails when receives an invalid resolution such as {w: -123, h: -123}", function () { - gpii.windows.display.setScreenResolution(badRes); + windowsDisplay.setScreenResolution(badRes); }, "invalid screen resolution"); // test that setScreenResolution fails when it receives a faulty screen resolution var faulty1 = 2; jqUnit.expectFrameworkDiagnostic("setScreenResolution fails when receives a non-object parameter", function () { - gpii.windows.display.setScreenResolution(faulty1); + windowsDisplay.setScreenResolution(faulty1); }, "invalid screen resolution"); var faulty2 = { w: 0, h: 1 }; jqUnit.expectFrameworkDiagnostic("setScreenResolution fails when receives a wrong object", function () { - gpii.windows.display.setScreenResolution(faulty2); + windowsDisplay.setScreenResolution(faulty2); }, ["invalid screen resolution"]); var faulty3 = { width: 0, height: "" }; jqUnit.expectFrameworkDiagnostic("setScreenResolution fails when receives one string as value for height", function () { - gpii.windows.display.setScreenResolution(faulty3); + windowsDisplay.setScreenResolution(faulty3); }, "invalid screen resolution"); }); +jqUnit.test("Windows display settings handlerr: getImpl()", function () { + var actualSettings = windowsDisplay.getImpl(); + var expectedSettings = windowsDisplay.getAllScreenResolutions(); + jqUnit.assertDeepEq("Return value of getImpl() with no input", + expectedSettings["screen-resolution"], + actualSettings["screen-resolution"]); +}); + +jqUnit.test("Windows display settings handler: setImpl()", function () { + var allRez = windowsDisplay.getAllScreenResolutions(); + var newRez = fluid.find(allRez["available-resolutions"], function (aRez) { + if (aRez.width !== allRez["screen-resolution"].width || + aRez.height !== allRez["screen-resolution"].height) { + return aRez; + } + }, null); + if (newRez !== null) { + var rezToSet = {}; + rezToSet.width = newRez.width; + rezToSet.height = newRez.height; + var screenResolution = {}; + fluid.set(screenResolution, "screen-resolution", rezToSet); + var payload = {}; + payload.settings = screenResolution; + var oldRez = windowsDisplay.setImpl(payload); + jqUnit.assertDeepEq( + "New resolution via setImpl()", + windowsDisplay.getScreenResolution(), + rezToSet + ); + jqUnit.assertDeepEq( + "Old resolution from setImpl()", + allRez["screen-resolution"], + oldRez["screen-resolution"].oldValue + ); + // Revert to the previous resolution. + payload.settings["screen-resolution"] = allRez["screen-resolution"]; + oldRez = windowsDisplay.setImpl(payload); + jqUnit.assertDeepEq( + "Revert to old resolution using setImpl()", + windowsDisplay.getScreenResolution(), + allRez["screen-resolution"] + ); + jqUnit.assertDeepEq( + "Old resolution returned during revert via setImpl()", + rezToSet, + oldRez["screen-resolution"].oldValue + ); + } +}); + // This test is only able to test the implementation for the version of Windows it's running on. jqUnit.test("Testing getScreenDpi ", function () { var dpi = gpii.windows.display.getScreenDpi(); @@ -184,10 +279,10 @@ jqUnit.test("Testing setScreenDpi ", function () { var res = gpii.windows.display.getScreenResolution(); if (res.width < 1024 || res.height < 768) { teardowns.push(function () { - gpii.windows.display.setScreenResolution(res); + windowsDisplay.setScreenResolution(res); }); - gpii.windows.display.setScreenResolution({width: 1024, height: 768}); + windowsDisplay.setScreenResolution({width: 1024, height: 768}); } // Restore the original setting at the end.