123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865 |
- goog.provide('goog.ui.MenuButtonTest');
- goog.setTestOnly('goog.ui.MenuButtonTest');
- goog.require('goog.Timer');
- goog.require('goog.a11y.aria');
- goog.require('goog.a11y.aria.State');
- goog.require('goog.dom');
- goog.require('goog.dom.TagName');
- goog.require('goog.events');
- goog.require('goog.events.Event');
- goog.require('goog.events.EventType');
- goog.require('goog.events.KeyCodes');
- goog.require('goog.events.KeyHandler');
- goog.require('goog.positioning');
- goog.require('goog.positioning.Corner');
- goog.require('goog.positioning.MenuAnchoredPosition');
- goog.require('goog.positioning.Overflow');
- goog.require('goog.style');
- goog.require('goog.testing.ExpectedFailures');
- goog.require('goog.testing.PropertyReplacer');
- goog.require('goog.testing.events');
- goog.require('goog.testing.jsunit');
- goog.require('goog.testing.recordFunction');
- goog.require('goog.ui.Component');
- goog.require('goog.ui.Menu');
- goog.require('goog.ui.MenuButton');
- goog.require('goog.ui.MenuItem');
- goog.require('goog.ui.SubMenu');
- goog.require('goog.userAgent');
- goog.require('goog.userAgent.product');
- goog.require('goog.userAgent.product.isVersion');
- var menuButton;
- var clonedMenuButtonDom;
- var expectedFailures;
- function setUpPage() {
- expectedFailures = new goog.testing.ExpectedFailures();
- }
- var originalPositionAtCoordinate = goog.positioning.positionAtCoordinate;
- goog.positioning.positionAtCoordinate = function(
- absolutePos, movableElement, movableElementCorner, opt_margin, opt_viewport,
- opt_overflow, opt_preferredSize) {
- return originalPositionAtCoordinate.call(
- this, absolutePos, movableElement, movableElementCorner, opt_margin,
- opt_viewport, goog.positioning.Overflow.IGNORE, opt_preferredSize);
- };
- function MyFakeEvent(keyCode, opt_eventType) {
- this.type = opt_eventType || goog.events.KeyHandler.EventType.KEY;
- this.keyCode = keyCode;
- this.propagationStopped = false;
- this.preventDefault = goog.nullFunction;
- this.stopPropagation = function() { this.propagationStopped = true; };
- }
- function setUp() {
- window.scrollTo(0, 0);
- var viewportSize = goog.dom.getViewportSize();
-
- if (viewportSize.width < 600 || viewportSize.height < 600) {
- window.moveTo(0, 0);
- window.resizeTo(640, 640);
- }
- clonedMenuButtonDom = goog.dom.getElement('demoMenuButton').cloneNode(true);
- menuButton = new goog.ui.MenuButton();
- }
- function tearDown() {
- expectedFailures.handleTearDown();
- menuButton.dispose();
- var element = goog.dom.getElement('demoMenuButton');
- element.parentNode.replaceChild(clonedMenuButtonDom, element);
- }
- function checkHasPopUp() {
- menuButton.enterDocument();
- assertFalse(
- 'Menu button must have aria-haspopup attribute set to false',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.HASPOPUP));
- var menu = new goog.ui.Menu();
- menu.createDom();
- menuButton.setMenu(menu);
- assertTrue(
- 'Menu button must have aria-haspopup attribute set to true',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.HASPOPUP));
- menuButton.setMenu(null);
- assertFale(
- 'Menu button must have aria-haspopup attribute set to false',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.HASPOPUP));
- }
- function testBasicButtonBehavior() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- assertEquals(
- 'Menu button must have aria-haspopup attribute set to true', 'true',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.HASPOPUP));
- goog.testing.events.fireClickSequence(node);
- assertTrue('Menu must open after click', menuButton.isOpen());
- var menuItemClicked = 0;
- var lastMenuItemClicked = null;
- goog.events.listen(
- menuButton.getMenu(), goog.ui.Component.EventType.ACTION, function(e) {
- menuItemClicked++;
- lastMenuItemClicked = e.target;
- });
- var menuItem2 = goog.dom.getElement('menuItem2');
- goog.testing.events.fireClickSequence(menuItem2);
- assertFalse('Menu must close on clicking when open', menuButton.isOpen());
- assertEquals('Number of menu items clicked should be 1', 1, menuItemClicked);
- assertEquals(
- 'menuItem2 should be the last menuitem clicked', menuItem2,
- lastMenuItemClicked.getElement());
- }
- function testHighlightItemBehavior() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- goog.testing.events.fireClickSequence(node);
- assertTrue('Menu must open after click', menuButton.isOpen());
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.DOWN));
- assertNotNull(menuButton.getElement());
- assertEquals(
- 'First menuitem must be the aria-activedescendant', 'menuItem1',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.ACTIVEDESCENDANT));
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.DOWN));
- assertEquals(
- 'Second menuitem must be the aria-activedescendant', 'menuItem2',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.ACTIVEDESCENDANT));
- }
- function testHighlightFirstOnOpen() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.ENTER));
- assertEquals(
- 'By default no items should be highlighted when opened with enter.', null,
- menuButton.getMenu().getHighlighted());
- menuButton.setOpen(false);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.DOWN));
- assertTrue('Menu must open after down key', menuButton.isOpen());
- assertEquals(
- 'First menuitem must be highlighted', 'menuItem1',
- menuButton.getMenu().getHighlighted().getElement().id);
- }
- function testHighlightFirstOnOpen_withFirstDisabled() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var menu = menuButton.getMenu();
- menu.getItemAt(0).setEnabled(false);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.ENTER));
- assertEquals(
- 'By default no items should be highlighted when opened with enter.', null,
- menuButton.getMenu().getHighlighted());
- menuButton.setOpen(false);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.DOWN));
- assertTrue('Menu must open after down key', menuButton.isOpen());
- assertEquals(
- 'First enabled menuitem must be highlighted', 'menuItem2',
- menuButton.getMenu().getHighlighted().getElement().id);
- }
- function testHighlightFirstOnOpen_withEnterOrSpaceSet() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.setSelectFirstOnEnterOrSpace(true);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.ENTER));
- assertEquals(
- 'The first item should be highlighted when opened with enter ' +
- 'after setting selectFirstOnEnterOrSpace',
- 'menuItem1', menuButton.getMenu().getHighlighted().getElement().id);
- }
- function testHighlightFirstOnOpen_withEnterOrSpaceSetAndFirstDisabled() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.setSelectFirstOnEnterOrSpace(true);
- var menu = menuButton.getMenu();
- menu.getItemAt(0).setEnabled(false);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.ENTER));
- assertEquals(
- 'The first enabled item should be highlighted when opened ' +
- 'with enter after setting selectFirstOnEnterOrSpace',
- 'menuItem2', menuButton.getMenu().getHighlighted().getElement().id);
- }
- function testCloseSubMenuBehavior() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var menu = menuButton.getMenu();
- var subMenu = new goog.ui.SubMenu('Submenu');
- menu.addItem(subMenu);
- subMenu.getElement().id = 'subMenu';
- var subMenuMenu = new goog.ui.Menu();
- subMenu.setMenu(subMenuMenu);
- var subMenuItem = new goog.ui.MenuItem('Submenu item 1');
- subMenuMenu.addItem(subMenuItem);
- subMenuItem.getElement().id = 'subMenuItem1';
- menuButton.setOpen(true);
- for (var i = 0; i < 4; i++) {
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.DOWN));
- }
- assertEquals(
- 'Submenu must be the aria-activedescendant', 'subMenu',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.ACTIVEDESCENDANT));
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.RIGHT));
- assertEquals(
- 'Submenu item 1 must be the aria-activedescendant', 'subMenuItem1',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.ACTIVEDESCENDANT));
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.LEFT));
- assertEquals(
- 'Submenu must be the aria-activedescendant', 'subMenu',
- goog.a11y.aria.getState(
- menuButton.getElement(), goog.a11y.aria.State.ACTIVEDESCENDANT));
- }
- function testEnterOpensMenu() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.ENTER));
- assertTrue('Menu must open after enter', menuButton.isOpen());
- }
- function testSpaceOrEnterClosesMenu() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.setOpen(true);
- menuButton.handleKeyEvent(new MyFakeEvent(goog.events.KeyCodes.ENTER));
- assertFalse('Menu should close after pressing Enter', menuButton.isOpen());
- menuButton.setOpen(true);
- menuButton.handleKeyEvent(
- new MyFakeEvent(goog.events.KeyCodes.SPACE, goog.events.EventType.KEYUP));
- assertFalse('Menu should close after pressing Space', menuButton.isOpen());
- }
- function testStopEscapePropagationMenuClosed() {
- var node = goog.dom.getElement('demoMenuButton');
- var fakeEvent = new MyFakeEvent(
- goog.events.KeyCodes.ESCAPE, goog.events.EventType.KEYDOWN);
- menuButton.decorate(node);
- menuButton.setOpen(false);
- menuButton.handleKeyDownEvent_(fakeEvent);
- assertFalse(
- 'Event propagation was erroneously stopped.',
- fakeEvent.propagationStopped);
- }
- function testStopEscapePropagationMenuOpen() {
- var node = goog.dom.getElement('demoMenuButton');
- var fakeEvent = new MyFakeEvent(
- goog.events.KeyCodes.ESCAPE, goog.events.EventType.KEYDOWN);
- menuButton.decorate(node);
- menuButton.setOpen(true);
- menuButton.handleKeyDownEvent_(fakeEvent);
- assertTrue(
- 'Event propagation was not stopped.', fakeEvent.propagationStopped);
- }
- function testButtonAfterEnterDocument() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.exitDocument();
- menuButton.enterDocument();
- goog.testing.events.fireClickSequence(node);
- assertTrue('Menu must open after click', menuButton.isOpen());
- var menuItem2 = goog.dom.getElement('menuItem2');
- goog.testing.events.fireClickSequence(menuItem2);
- assertFalse('Menu must close on clicking when open', menuButton.isOpen());
- }
- function testPositionMenu() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var menu = menuButton.getMenu();
- menu.setVisible(true, true);
-
- menu.setPosition(500, 500);
-
- menuButton.positionMenu();
- var menuNode = goog.dom.getElement('demoMenu');
- assertRoughlyEquals(
- menuNode.offsetTop, node.offsetTop + node.offsetHeight, 20);
- assertRoughlyEquals(menuNode.offsetLeft, node.offsetLeft, 20);
- }
- function testPositionMenuNotInDocument() {
- var menu = new goog.ui.Menu();
- menu.createDom();
- menuButton.setMenu(menu);
- menuButton.positionMenu();
- }
- function testOpenedMenuPositionCorrection() {
- var iframe = goog.dom.getElement('iframe1');
- var iframeDoc = goog.dom.getFrameContentDocument(iframe);
- var iframeDom = goog.dom.getDomHelper(iframeDoc);
- var iframeWindow = goog.dom.getWindow(iframeDoc);
- var button = new goog.ui.MenuButton();
- iframeWindow.scrollTo(0, 0);
- var node = iframeDom.getElement('demoMenuButton');
- button.decorate(node);
- var mockTimer = new goog.Timer();
-
- mockTimer.start = goog.nullFunction;
- button.timer_ = mockTimer;
- var replacer = new goog.testing.PropertyReplacer();
- var positionMenuCalled;
- var origPositionMenu = goog.bind(button.positionMenu, button);
- replacer.set(button, 'positionMenu', function() {
- positionMenuCalled = true;
- origPositionMenu();
- });
-
- button.setOpen(true);
-
- var menuNode = iframeDom.getElement('demoMenu');
- assertRoughlyEquals(
- menuNode.offsetTop, node.offsetTop + node.offsetHeight, 20);
- assertRoughlyEquals(menuNode.offsetLeft, node.offsetLeft, 20);
- positionMenuCalled = false;
-
- mockTimer.dispatchEvent(goog.Timer.TICK);
- assertFalse('positionMenu() shouldn\'t be called.', positionMenuCalled);
-
- var p1 = iframeDom.createDom(
- goog.dom.TagName.P, null, iframeDom.createTextNode('foo'));
- var p2 = iframeDom.createDom(
- goog.dom.TagName.P, null, iframeDom.createTextNode('foo'));
- var p3 = iframeDom.createDom(
- goog.dom.TagName.P, null, iframeDom.createTextNode('foo'));
- iframeDom.insertSiblingBefore(p1, node);
- iframeDom.insertSiblingBefore(p2, node);
- iframeDom.insertSiblingBefore(p3, node);
-
- assertTrue(
- Math.abs(node.offsetTop + node.offsetHeight - menuNode.offsetTop) > 20);
- positionMenuCalled = false;
-
- mockTimer.dispatchEvent(goog.Timer.TICK);
- assertTrue('positionMenu() should be called.', positionMenuCalled);
-
- assertRoughlyEquals(
- menuNode.offsetTop, node.offsetTop + node.offsetHeight, 20);
-
- var viewportHeight = iframeDom.getViewportSize().height;
- var footer = iframeDom.getElement('footer');
- goog.style.setSize(footer, 1, viewportHeight * 2);
-
- iframeWindow.scrollTo(0, viewportHeight);
-
- positionMenuCalled = false;
- mockTimer.dispatchEvent(goog.Timer.TICK);
- assertTrue('positionMenu() should be called.', positionMenuCalled);
- goog.style.setSize(footer, 1, 1);
-
- iframeDom.removeNode(p1);
- iframeDom.removeNode(p2);
- iframeDom.removeNode(p3);
- replacer.reset();
- button.dispose();
- }
- function testAlternatePositioningElement() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var posElement = goog.dom.getElement('positionElement');
- menuButton.setPositionElement(posElement);
-
- menuButton.setOpen(true);
-
- var menuNode = menuButton.getMenu().getElement();
- assertRoughlyEquals(
- menuNode.offsetTop, posElement.offsetTop + posElement.offsetHeight, 20);
- assertRoughlyEquals(menuNode.offsetLeft, posElement.offsetLeft, 20);
- }
- function testPositioningAboveAnchor() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
-
- menuButton.setAlignMenuToStart(true);
- menuButton.setScrollOnOverflow(true);
- var position = new goog.positioning.MenuAnchoredPosition(
- menuButton.getElement(), goog.positioning.Corner.TOP_START,
- false, false);
- menuButton.setMenuPosition(position);
- menuButton.setOpen(true);
-
- var buttonBounds = goog.style.getBounds(node);
- var menuNode = menuButton.getMenu().getElement();
- var menuBounds = goog.style.getBounds(menuNode);
- assertRoughlyEquals(menuBounds.top + menuBounds.height, buttonBounds.top, 3);
- assertRoughlyEquals(menuBounds.left, buttonBounds.left, 3);
-
- assertRoughlyEquals(node.offsetHeight, 19, 3);
- }
- function testPositioningBelowAnchor() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
-
- menuButton.setAlignMenuToStart(true);
- menuButton.setScrollOnOverflow(true);
- var position = new goog.positioning.MenuAnchoredPosition(
- menuButton.getElement(), goog.positioning.Corner.BOTTOM_START,
- false, false);
- menuButton.setMenuPosition(position);
- menuButton.setOpen(true);
-
- var buttonBounds = goog.style.getBounds(node);
- var menuNode = menuButton.getMenu().getElement();
- var menuBounds = goog.style.getBounds(menuNode);
- expectedFailures.expectFailureFor(isWinSafariBefore5());
- try {
- assertRoughlyEquals(
- menuBounds.top, buttonBounds.top + buttonBounds.height, 3);
- assertRoughlyEquals(menuBounds.left, buttonBounds.left, 3);
- } catch (e) {
- expectedFailures.handleException(e);
- }
-
- assertRoughlyEquals(node.offsetHeight, 19, 3);
- }
- function isWinSafariBefore5() {
- return goog.userAgent.WINDOWS && goog.userAgent.product.SAFARI &&
- goog.userAgent.product.isVersion(4) &&
- !goog.userAgent.product.isVersion(5);
- }
- function testSpaceFireOnKeyUp() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- e = new goog.events.Event(goog.events.KeyHandler.EventType.KEY, menuButton);
- e.preventDefault = goog.testing.recordFunction();
- e.keyCode = goog.events.KeyCodes.SPACE;
- menuButton.handleKeyEvent(e);
- assertFalse(
- 'Menu must not have been triggered by Space keypress',
- menuButton.isOpen());
- assertNotNull('Page scrolling is prevented', e.preventDefault.getLastCall());
- e = new goog.events.Event(goog.events.EventType.KEYUP, menuButton);
- e.keyCode = goog.events.KeyCodes.SPACE;
- menuButton.handleKeyEvent(e);
- assertTrue(
- 'Menu must have been triggered by Space keyup', menuButton.isOpen());
- menuButton.getMenu().setHighlightedIndex(0);
- e = new goog.events.Event(goog.events.KeyHandler.EventType.KEY, menuButton);
- e.keyCode = goog.events.KeyCodes.DOWN;
- menuButton.handleKeyEvent(e);
- assertEquals(
- 'Highlighted menu item must have hanged by Down keypress', 1,
- menuButton.getMenu().getHighlightedIndex());
- menuButton.getMenu().setHighlightedIndex(0);
- e = new goog.events.Event(goog.events.EventType.KEYUP, menuButton);
- e.keyCode = goog.events.KeyCodes.DOWN;
- menuButton.handleKeyEvent(e);
- assertEquals(
- 'Highlighted menu item must not have changed by Down keyup', 0,
- menuButton.getMenu().getHighlightedIndex());
- }
- function testPreventHide() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- menuButton.setDispatchTransitionEvents(goog.ui.Component.State.OPENED, true);
-
- menuButton.setOpen(true);
- assertTrue('Menu button should be open.', menuButton.isOpen());
- assertTrue('Menu should be visible.', menuButton.getMenu().isVisible());
- var key = goog.events.listen(
- menuButton, goog.ui.Component.EventType.CLOSE,
- function(event) { event.preventDefault(); });
-
- menuButton.setOpen(false);
- assertTrue('Menu button should still be open.', menuButton.isOpen());
- assertTrue('Menu should still be visible.', menuButton.getMenu().isVisible());
-
- goog.events.unlistenByKey(key);
- menuButton.setOpen(false);
- assertFalse('Menu button should not be open.', menuButton.isOpen());
- assertFalse('Menu should not be visible.', menuButton.getMenu().isVisible());
- }
- function testResizeOnItemAddOrRemove() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var menu = menuButton.getMenu();
-
- menuButton.setOpen(true);
- var originalSize = goog.style.getSize(menu.getElement());
-
-
-
- var item = menu.removeChildAt(0, true);
-
- var afterRemoveSize = goog.style.getSize(menu.getElement());
- assertTrue(
- 'Height of menu must decrease after removing a menu item.',
- afterRemoveSize.height < originalSize.height);
-
-
-
- menuButton.setOpen(false);
- var item2 = menu.removeChildAt(0, true);
- menuButton.setOpen(true);
-
- var afterRemoveAgainSize = goog.style.getSize(menu.getElement());
- assertTrue(
- 'Height of menu must decrease after removing a second menu item.',
- afterRemoveAgainSize.height < afterRemoveSize.height);
-
-
-
- menuButton.setOpen(true);
- menuButton.addItem(item2);
- menuButton.setOpen(false);
- menuButton.setOpen(true);
-
- var afterAddSize = goog.style.getSize(menu.getElement());
- assertTrue(
- 'Height of menu must increase after adding a menu item.',
- afterRemoveAgainSize.height < afterAddSize.height);
- assertEquals(
- 'Removing and adding back items must not change the height of a menu.',
- afterRemoveSize.height, afterAddSize.height);
-
- menuButton.addItem(item);
- }
- function testResizeOnItemAddOrRemoveWithScrollOnOverflow() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var menu = menuButton.getMenu();
-
- menuButton.setScrollOnOverflow(true);
- menuButton.setOpen(true);
- var originalSize = goog.style.getSize(menu.getElement());
-
-
-
- var item = menu.removeChildAt(0, true);
- menuButton.invalidateMenuSize();
- menuButton.positionMenu();
-
- var afterRemoveSize = goog.style.getSize(menu.getElement());
- assertTrue(
- 'Height of menu must decrease after removing a menu item.',
- afterRemoveSize.height < originalSize.height);
- var item2 = menu.removeChildAt(0, true);
- menuButton.invalidateMenuSize();
- menuButton.positionMenu();
-
- var afterRemoveAgainSize = goog.style.getSize(menu.getElement());
- assertTrue(
- 'Height of menu must decrease after removing a second menu item.',
- afterRemoveAgainSize.height < afterRemoveSize.height);
-
-
- menuButton.addItem(item2);
- menuButton.invalidateMenuSize();
- menuButton.positionMenu();
-
- var afterAddSize = goog.style.getSize(menu.getElement());
- assertTrue(
- 'Height of menu must increase after adding a menu item.',
- afterRemoveAgainSize.height < afterAddSize.height);
- assertEquals(
- 'Removing and adding back items must not change the height of a menu.',
- afterRemoveSize.height, afterAddSize.height);
- }
- function testRenderMenuAsSibling() {
- menuButton.setRenderMenuAsSibling(true);
- menuButton.addItem(new goog.ui.MenuItem('Menu item 1'));
- menuButton.addItem(new goog.ui.MenuItem('Menu item 2'));
-
-
-
-
- menuButton.render(goog.dom.getElement('siblingTest'));
- menuButton.setOpen(true);
- assertEquals(
- menuButton.getElement().parentNode,
- menuButton.getMenu().getElement().parentNode);
- }
- function testRenderMenuAsSiblingForDecoratedButton() {
- var menu = new goog.ui.Menu();
- menu.addChild(new goog.ui.MenuItem('Menu item 1'), true );
- menu.addChild(new goog.ui.MenuItem('Menu item 2'), true );
- menu.addChild(new goog.ui.MenuItem('Menu item 3'), true );
- var menuButton = new goog.ui.MenuButton();
- menuButton.setMenu(menu);
- menuButton.setRenderMenuAsSibling(true);
- var node = goog.dom.getElement('button1');
- menuButton.decorate(node);
- menuButton.setOpen(true);
- assertEquals(
- 'The menu should be rendered immediately after the menu button',
- goog.dom.getNextElementSibling(menuButton.getElement()),
- menu.getElement());
- assertEquals(
- 'The menu should be rendered immediately before the next button',
- goog.dom.getNextElementSibling(menu.getElement()),
- goog.dom.getElement('button2'));
- }
- function testAlignToStartSetter() {
- assertTrue(menuButton.isAlignMenuToStart());
- menuButton.setAlignMenuToStart(false);
- assertFalse(menuButton.isAlignMenuToStart());
- menuButton.setAlignMenuToStart(true);
- assertTrue(menuButton.isAlignMenuToStart());
- }
- function testScrollOnOverflowSetter() {
- assertFalse(menuButton.isScrollOnOverflow());
- menuButton.setScrollOnOverflow(true);
- assertTrue(menuButton.isScrollOnOverflow());
- menuButton.setScrollOnOverflow(false);
- assertFalse(menuButton.isScrollOnOverflow());
- }
- function testSetOpenUnsetsAriaHidden() {
- var node = goog.dom.getElement('demoMenuButton');
- menuButton.decorate(node);
- var menuElem = menuButton.getMenu().getElementStrict();
- goog.a11y.aria.setState(menuElem, goog.a11y.aria.State.HIDDEN, true);
- menuButton.setOpen(true);
- assertEquals(
- '', goog.a11y.aria.getState(menuElem, goog.a11y.aria.State.HIDDEN));
- }
|