// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. // // /// /// module WinJSTests { "use strict"; var Key = WinJS.Utilities.Key; var canElementResize = null; var _elementWrapper; var _element; var navUtils = NavBarUtils; var NavBarContainer = WinJS.UI.NavBarContainer; export class NavBarLayoutTests { setUp = function (complete) { LiveUnit.LoggingCore.logComment("In setup"); _elementWrapper = document.createElement("div"); var newNode = document.createElement("div"); newNode.id = "container"; newNode.style.width = "500px"; newNode.style.backgroundColor = "darkgreen"; _elementWrapper.appendChild(newNode); document.body.appendChild(_elementWrapper); _element = newNode; Helper.detectMsElementResize(function (canResize) { canElementResize = canResize; complete(); }); }; tearDown = function () { LiveUnit.LoggingCore.logComment("In tearDown"); if (_elementWrapper) { WinJS.Utilities.disposeSubTree(_elementWrapper); document.body.removeChild(_elementWrapper); _elementWrapper = null; _element = null; } }; // Verifies that the NavBar focus state is reset when the NavBar is hidden and then shown. testNavBarFocusOnHideAndShow = function (complete) { var navbarEl = document.createElement("div"), navbarContainerEl = document.createElement("div"); _element.appendChild(navbarEl); navbarEl.appendChild(navbarContainerEl); navbarContainerEl.style.backgroundColor = "brown"; var navbar = new WinJS.UI.NavBar(navbarEl); var navbarContainer = new NavBarContainer(navbarContainerEl, { data: navUtils.getNavBarCommandsData(20, true, false, false, false, false, true) }); navbar.open(); function waitForScrollComplete(viewportEl) { return new WinJS.Promise(function (c, e, p) { // Wait time needs to be more than time required to perform UI action var waitTime = 300; function completeForReal() { viewportEl.removeEventListener("scroll", handler); c(); } var timeout = setTimeout(completeForReal, waitTime); function handler(e) { clearTimeout(timeout); timeout = setTimeout(completeForReal, waitTime); }; viewportEl.addEventListener("scroll", handler); }); } Helper.waitForEvent(navbar, "afteropen"). then(function () { // Move focus to the last command var firstNavItem = navbarContainer._surfaceEl.children[0].winControl; var lastNavItem = navbarContainer._surfaceEl.children[19].winControl; Helper.keydown(firstNavItem._buttonEl, Key.end); LiveUnit.Assert.areEqual(lastNavItem._buttonEl, document.activeElement); LiveUnit.Assert.areEqual(19, navbarContainer.currentIndex); return waitForScrollComplete(navbarContainerEl.querySelector(".win-navbarcontainer-viewport")); }). then(function () { var lastNavItem = navbarContainer._surfaceEl.children[19].winControl; // Open the split button lastNavItem._splitButtonEl.click(); LiveUnit.Assert.isTrue(lastNavItem.splitOpened); // Hide the navbar navbar.close(); return Helper.waitForEvent(navbar, "afterclose"); }). then(function () { // Show the navbar navbar.open(); return Helper.waitForEvent(navbar, "afteropen"); }). then(function () { // Verify the focus state was reset var firstNavItem = navbarContainer._surfaceEl.children[0].winControl; var lastNavItem = navbarContainer._surfaceEl.children[19].winControl; LiveUnit.Assert.areEqual(firstNavItem._buttonEl, document.activeElement); LiveUnit.Assert.areEqual(0, navbarContainer.currentIndex); LiveUnit.Assert.isFalse(lastNavItem.splitOpened); complete(); }); }; testNavBarAriaProperties = function (complete) { var navbarEl = document.createElement("div"), navbarContainerEl = document.createElement("div"); _element.appendChild(navbarEl); navbarEl.appendChild(navbarContainerEl); navbarContainerEl.style.backgroundColor = "brown"; var navbar = new WinJS.UI.NavBar(navbarEl); var navbarContainer = new WinJS.UI.NavBarContainer(navbarContainerEl, { data: navUtils.getNavBarCommandsData(20, true, false, false, false, false, true) }); function checkAttribute(element, attribute, expectedValue) { var values = element.getAttribute(attribute).match(expectedValue), value = values ? values[0] : null; LiveUnit.Assert.areEqual(value, expectedValue, "Expected " + attribute + ": " + expectedValue + " Actual: " + value); } // Verify the NavBarContainer aria properties var viewportEl = navbarContainerEl.querySelector(".win-navbarcontainer-viewport"); checkAttribute(viewportEl, "role", "group"); checkAttribute(viewportEl, "aria-label", WinJS.Resources._getWinJSString("ui/navBarContainerViewportAriaLabel").value); // Verify the NavBarCommand aria properties var navbarCmds: any = navbarContainerEl.querySelectorAll(".win-navbarcommand"); for (var i = 0; i < navbarCmds.length; i++) { var cmd = navbarCmds[i].winControl; checkAttribute(cmd._buttonEl, "role", "button"); checkAttribute(cmd._splitButtonEl, "aria-expanded", "false"); } navbar.open(); Helper.waitForEvent(navbar, "afteropen"). then(function () { // Click on split button and verify aria-expanded var splitEl = navbarCmds[0].winControl._splitButtonEl; splitEl.click(); checkAttribute(splitEl, "aria-expanded", "true"); splitEl.click(); checkAttribute(splitEl, "aria-expanded", "false"); complete(); }); }; }; } LiveUnit.registerTestClass("WinJSTests.NavBarLayoutTests");