diff options
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/ui/submenu_test.html')
-rw-r--r-- | contexts/data/lib/closure-library/closure/goog/ui/submenu_test.html | 536 |
1 files changed, 0 insertions, 536 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/ui/submenu_test.html b/contexts/data/lib/closure-library/closure/goog/ui/submenu_test.html deleted file mode 100644 index 71e5bb4..0000000 --- a/contexts/data/lib/closure-library/closure/goog/ui/submenu_test.html +++ /dev/null @@ -1,536 +0,0 @@ -<!DOCTYPE html> -<html> -<!-- -Copyright 2008 The Closure Library Authors. All Rights Reserved. - -Use of this source code is governed by the Apache License, Version 2.0. -See the COPYING file for details. ---> -<!-- - - @author nicksantos@google.com (Nick Santos) ---> -<head> -<meta http-equiv="X-UA-Compatible" content="IE=edge"> -<title>Closure Unit Tests - goog.ui.SubMenu</title> -<style type='text/css'> -.goog-menu { - position: absolute; - color: #000; - border: 1px solid #B5B6B5; - background-color: #F3F3F7; - cursor: default; - font: normal small arial, helvetica, sans-serif; - margin: 0; - padding: 0; - outline: none; -} - -.goog-menuitem { - padding: 2px 1.5em 2px 5px; - margin: 0; - list-style: none; -} - -.goog-menuitem-rtl { - padding: 2px 5px 2px 1.5em; -} - -.goog-submenu-arrow { - text-align: right; - position: absolute; - right: 0; - left: auto; -} - -.goog-menuitem-rtl .goog-submenu-arrow { - text-align: left; - position: absolute; - left: 0; - right: auto; -} - -.goog-menuitem-disabled .goog-submenu-arrow { - display: none; -} -</style> -<script src="../base.js"></script> -<script> - goog.require('goog.dom'); - goog.require('goog.dom.classes'); - goog.require('goog.events'); - goog.require('goog.positioning'); - goog.require('goog.positioning.Overflow'); - goog.require('goog.style'); - goog.require('goog.testing.MockClock'); - goog.require('goog.testing.events'); - goog.require('goog.testing.jsunit'); - goog.require('goog.ui.Component.EventType'); - goog.require('goog.ui.Menu'); - goog.require('goog.ui.MenuItem'); - goog.require('goog.ui.Popup'); - goog.require('goog.ui.SubMenu'); - goog.require('goog.ui.SubMenuRenderer'); - - -</script> -</head> -<body> -<script> - -var menu; -var clonedMenuDom; - -var mockClock; - -// mock out goog.positioning.positionAtCoordinate so that -// the menu always fits. (we don't care about testing the -// dynamic menu positioning if the menu doesn't fit in the window.) -var oldPositionFn = goog.positioning.positionAtCoordinate; -goog.positioning.positionAtCoordinate = function(absolutePos, movableElement, - movableElementCorner, - opt_margin, opt_overflow) { - return oldPositionFn.call(null, absolutePos, movableElement, - movableElementCorner, opt_margin, goog.positioning.Overflow.IGNORE); -}; - -function setUp() { - clonedMenuDom = goog.dom.getElement('demoMenu').cloneNode(true); - - menu = new goog.ui.Menu(); -} - -function tearDown() { - document.body.style.direction = 'ltr'; - menu.dispose(); - - var element = goog.dom.getElement('demoMenu'); - element.parentNode.replaceChild(clonedMenuDom, element); - - goog.dom.getElement('sandbox').innerHTML = ''; - - if (mockClock) { - mockClock.uninstall(); - mockClock = null; - } -} - -function assertKeyHandlingIsCorrect(keyToOpenSubMenu, keyToCloseSubMenu) { - menu.setFocusable(true); - menu.decorate(goog.dom.getElement('demoMenu')); - - var KeyCodes = goog.events.KeyCodes; - var plainItem = menu.getChildAt(0); - plainItem.setMnemonic(KeyCodes.F); - - var subMenuItem1 = menu.getChildAt(1); - subMenuItem1.setMnemonic(KeyCodes.S); - var subMenuItem1Menu = subMenuItem1.getMenu(); - menu.setHighlighted(plainItem); - - var fireKeySequence = goog.testing.events.fireKeySequence; - - assertTrue( - 'Expected OpenSubMenu key to not be handled', - fireKeySequence(plainItem.getElement(), keyToOpenSubMenu)); - assertFalse(subMenuItem1Menu.isVisible()); - - assertFalse( - 'Expected F key to be handled', - fireKeySequence(plainItem.getElement(), KeyCodes.F)); - - assertFalse( - 'Expected DOWN key to be handled', - fireKeySequence(plainItem.getElement(), KeyCodes.DOWN)); - assertEquals(subMenuItem1, menu.getChildAt(1)); - - assertFalse( - 'Expected OpenSubMenu key to be handled', - fireKeySequence(subMenuItem1.getElement(), keyToOpenSubMenu)); - assertTrue(subMenuItem1Menu.isVisible()); - - assertFalse( - 'Expected CloseSubMenu key to be handled', - fireKeySequence(subMenuItem1.getElement(), keyToCloseSubMenu)); - assertFalse(subMenuItem1Menu.isVisible()); - - assertFalse( - 'Expected UP key to be handled', - fireKeySequence(subMenuItem1.getElement(), KeyCodes.UP)); - - assertFalse( - 'Expected S key to be handled', - fireKeySequence(plainItem.getElement(), KeyCodes.S)); - assertTrue(subMenuItem1Menu.isVisible()); -} - -function testKeyHandling_ltr() { - assertKeyHandlingIsCorrect(goog.events.KeyCodes.RIGHT, - goog.events.KeyCodes.LEFT); -} - -function testKeyHandling_rtl() { - document.body.style.direction = 'rtl'; - assertKeyHandlingIsCorrect(goog.events.KeyCodes.LEFT, - goog.events.KeyCodes.RIGHT); -} - -function testNormalLtrSubMenu() { - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - assertArrowDirection(subMenu, false); - assertRenderDirection(subMenu, false); - assertArrowPosition(subMenu, false); -} - -function testNormalRtlSubMenu() { - document.body.style.direction = 'rtl'; - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - assertArrowDirection(subMenu, true); - assertRenderDirection(subMenu, true); - assertArrowPosition(subMenu, true); -} - -function testLtrSubMenuAlignedToStart() { - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - subMenu.setAlignToEnd(false); - assertArrowDirection(subMenu, true); - assertRenderDirection(subMenu, true); - assertArrowPosition(subMenu, false); -} - -function testNullContentElement() { - var subMenu = new goog.ui.SubMenu(); - subMenu.setContent('demo'); -} - -function testRtlSubMenuAlignedToStart() { - document.body.style.direction = 'rtl'; - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - subMenu.setAlignToEnd(false); - assertArrowDirection(subMenu, false); - assertRenderDirection(subMenu, false); - assertArrowPosition(subMenu, true); -} - -function testSetContentKeepsArrow_ltr() { - document.body.style.direction = 'ltr'; - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - subMenu.setAlignToEnd(false); - subMenu.setContent('test'); - assertArrowDirection(subMenu, true); - assertRenderDirection(subMenu, true); - assertArrowPosition(subMenu, false); -} - -function testSetContentKeepsArrow_rtl() { - document.body.style.direction = 'rtl'; - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - subMenu.setAlignToEnd(false); - subMenu.setContent('test'); - assertArrowDirection(subMenu, false); - assertRenderDirection(subMenu, false); - assertArrowPosition(subMenu, true); -} - -function testExitDocument() { - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - var innerMenu = subMenu.getMenu(); - - assertTrue('Top-level menu was not in document', menu.isInDocument()); - assertTrue('Submenu was not in document', subMenu.isInDocument()); - assertTrue('Inner menu was not in document', innerMenu.isInDocument()); - - menu.exitDocument(); - - assertFalse('Top-level menu was in document', menu.isInDocument()); - assertFalse('Submenu was in document', subMenu.isInDocument()); - assertFalse('Inner menu was in document', innerMenu.isInDocument()); -} - -function testDisposal() { - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - var innerMenu = subMenu.getMenu(); - menu.dispose(); - - assert('Top-level menu was not disposed', menu.getDisposed()); - assert('Submenu was not disposed', subMenu.getDisposed()); - assert('Inner menu was not disposed', innerMenu.getDisposed()); -} - -function testShowAndDismissSubMenu() { - var openEventDispatched = false; - var closeEventDispatched = false; - - function handleEvent(e) { - switch (e.type) { - case goog.ui.Component.EventType.OPEN: - openEventDispatched = true; - break; - case goog.ui.Component.EventType.CLOSE: - closeEventDispatched = true; - break; - default: - fail('Invalid event type: ' + e.type); - } - } - - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - subMenu.setHighlighted(true); - - goog.events.listen(subMenu, [ - goog.ui.Component.EventType.OPEN, - goog.ui.Component.EventType.CLOSE - ], handleEvent); - - assertFalse('Submenu must not have "-open" CSS class', - goog.dom.classes.has(subMenu.getElement(), 'goog-submenu-open')); - assertFalse('Popup menu must not be visible', - subMenu.getMenu().isVisible()); - assertFalse('No OPEN event must have been dispatched', openEventDispatched); - assertFalse('No CLOSE event must have been dispatched', closeEventDispatched); - - subMenu.showSubMenu(); - assertTrue('Submenu must have "-open" CSS class', - goog.dom.classes.has(subMenu.getElement(), 'goog-submenu-open')); - assertTrue('Popup menu must be visible', - subMenu.getMenu().isVisible()); - assertTrue('OPEN event must have been dispatched', openEventDispatched); - assertFalse('No CLOSE event must have been dispatched', closeEventDispatched); - - subMenu.dismissSubMenu(); - assertFalse('Submenu must not have "-open" CSS class', - goog.dom.classes.has(subMenu.getElement(), 'goog-submenu-open')); - assertFalse('Popup menu must not be visible', - subMenu.getMenu().isVisible()); - assertTrue('CLOSE event must have been dispatched', closeEventDispatched); - - goog.events.unlisten(subMenu, [ - goog.ui.Component.EventType.OPEN, - goog.ui.Component.EventType.CLOSE - ], handleEvent); -} - -function testLazyInstantiateSubMenu() { - menu.decorate(goog.dom.getElement('demoMenu')); - var subMenu = menu.getChildAt(1); - subMenu.setHighlighted(true); - - var lazyMenu; - - var key = goog.events.listen(subMenu, goog.ui.Component.EventType.OPEN, - function(e) { - lazyMenu = new goog.ui.Menu(); - lazyMenu.addItem(new goog.ui.MenuItem('foo')); - lazyMenu.addItem(new goog.ui.MenuItem('bar')); - subMenu.setMenu(lazyMenu, /* opt_internal */ false); - }); - - subMenu.showSubMenu(); - assertNotNull('Popup menu must have been created', lazyMenu); - assertEquals('Popup menu must be a child of the submenu', subMenu, - lazyMenu.getParent()); - assertTrue('Popup menu must have been rendered', lazyMenu.isInDocument()); - assertTrue('Popup menu must be visible', lazyMenu.isVisible()); - - menu.dispose(); - assertTrue('Submenu must have been disposed of', subMenu.isDisposed()); - assertFalse('Popup menu must not have been disposed of', - lazyMenu.isDisposed()); - - lazyMenu.dispose(); - - goog.events.unlistenByKey(key); -} - -function testReusableMenu() { - var subMenuOne = new goog.ui.SubMenu('SubMenu One'); - var subMenuTwo = new goog.ui.SubMenu('SubMenu Two'); - menu.addItem(subMenuOne); - menu.addItem(subMenuTwo); - menu.render(goog.dom.getElement('sandbox')); - - // It is possible for the same popup menu to be shared between different - // submenus. - var sharedMenu = new goog.ui.Menu(); - sharedMenu.addItem(new goog.ui.MenuItem('Hello')); - sharedMenu.addItem(new goog.ui.MenuItem('World')); - - assertNull('Shared menu must not have a parent', sharedMenu.getParent()); - - subMenuOne.setMenu(sharedMenu); - assertEquals('SubMenuOne must point to the shared menu', sharedMenu, - subMenuOne.getMenu()); - assertEquals('SubMenuOne must be the shared menu\'s parent', subMenuOne, - sharedMenu.getParent()); - - subMenuTwo.setMenu(sharedMenu); - assertEquals('SubMenuTwo must point to the shared menu', sharedMenu, - subMenuTwo.getMenu()); - assertEquals('SubMenuTwo must be the shared menu\'s parent', subMenuTwo, - sharedMenu.getParent()); - assertEquals('SubMenuOne must still point to the shared menu', sharedMenu, - subMenuOne.getMenu()); - - menu.setHighlighted(subMenuOne); - subMenuOne.showSubMenu(); - assertEquals('SubMenuOne must point to the shared menu', sharedMenu, - subMenuOne.getMenu()); - assertEquals('SubMenuOne must be the shared menu\'s parent', subMenuOne, - sharedMenu.getParent()); - assertEquals('SubMenuTwo must still point to the shared menu', sharedMenu, - subMenuTwo.getMenu()); - assertTrue('Shared menu must be visible', sharedMenu.isVisible()); - - menu.setHighlighted(subMenuTwo); - subMenuTwo.showSubMenu(); - assertEquals('SubMenuTwo must point to the shared menu', sharedMenu, - subMenuTwo.getMenu()); - assertEquals('SubMenuTwo must be the shared menu\'s parent', subMenuTwo, - sharedMenu.getParent()); - assertEquals('SubMenuOne must still point to the shared menu', sharedMenu, - subMenuOne.getMenu()); - assertTrue('Shared menu must be visible', sharedMenu.isVisible()); -} - -/** - * If you remove a submenu in the interval between when a mouseover event - * is fired on it, and showSubMenu() is called, showSubMenu causes a null - * value to be dereferenced. This test validates that the fix for this works. - * (See bug 1823144). - */ -function testDeleteItemDuringSubmenuDisplayInterval() { - mockClock = new goog.testing.MockClock(true); - - var submenu = new goog.ui.SubMenu('submenu'); - submenu.addItem(new goog.ui.MenuItem("submenu item 1")); - menu.addItem(submenu); - - // Trigger mouseover, and remove item before showSubMenu can be called. - var e = new goog.events.Event(); - submenu.handleMouseOver(e); - menu.removeItem(submenu); - mockClock.tick(goog.ui.SubMenu.MENU_DELAY_MS); - // (No JS error should occur.) -} - -function testShowSubMenuAfterRemoval() { - var submenu = new goog.ui.SubMenu('submenu'); - menu.addItem(submenu); - menu.removeItem(submenu); - submenu.showSubMenu(); - // (No JS error should occur.) -} - -function testSubmenuSelectable() { - var submenu = new goog.ui.SubMenu('submenu'); - submenu.addItem(new goog.ui.MenuItem('submenu item 1')); - menu.addItem(submenu); - submenu.setSelectable(true); - - var numClicks = 0; - var menuClickedFn = function(e) { - numClicks++; - } - - goog.events.listen(submenu, goog.ui.Component.EventType.ACTION, - menuClickedFn); - submenu.performActionInternal(null); - submenu.performActionInternal(null); - - assertEquals('The submenu should have fired an event', 2, numClicks); - - submenu.setSelectable(false); - submenu.performActionInternal(null); - - assertEquals('The submenu should not have fired any further events', 2, - numClicks); -} - -/** - * Asserts that this sub menu renders in the right direction relative to - * the parent menu. - * @param {goog.ui.SubMenu} subMenu The sub menu. - * @param {boolean} left True for left-pointing, false for right-pointing. - */ -function assertRenderDirection(subMenu, left) { - subMenu.getParent().setHighlighted(subMenu); - subMenu.showSubMenu(); - var menuItemPosition = goog.style.getPageOffset(subMenu.getElement()); - var menuPosition = goog.style.getPageOffset(subMenu.getMenu().getElement()); - assert(Math.abs(menuItemPosition.y - menuPosition.y) < 5); - assertEquals( - "Menu at: " + menuPosition.x + - ", submenu item at: " + menuItemPosition.x, - left, menuPosition.x < menuItemPosition.x); -} - -/** - * Asserts that this sub menu has a properly-oriented arrow. - * @param {goog.ui.SubMenu} subMenu The sub menu. - * @param {boolean} left True for left-pointing, false for right-pointing. - */ -function assertArrowDirection(subMenu, left) { - assertEquals( - left ? goog.ui.SubMenuRenderer.LEFT_ARROW_ : - goog.ui.SubMenuRenderer.RIGHT_ARROW_, - getArrowElement(subMenu).innerHTML); -} - -/** - * Asserts that the arrow position is correct. - * @param {goog.ui.SubMenu} subMenu The sub menu. - * @param {boolean} leftAlign True for left-aligned, false for right-aligned. - */ -function assertArrowPosition(subMenu, left) { - var arrow = getArrowElement(subMenu); - var expectedLeft = - left ? 0 : arrow.offsetParent.offsetWidth - arrow.offsetWidth; - var actualLeft = arrow.offsetLeft; - assertTrue('Expected left offset: ' + expectedLeft + '\n' + - 'Actual left offset: ' + actualLeft + '\n', - Math.abs(expectedLeft - actualLeft) < 5); -} - -/** - * Gets the arrow element of a sub menu. - * @param {goog.ui.SubMenu} subMenu The sub menu. - * @return {Element} The arrow. - */ -function getArrowElement(subMenu) { - return subMenu.getContentElement().lastChild; -} - -</script> - -<p> - Here's a menu (with submenus) defined in markup: -</p> -<div id="demoMenu" class="goog-menu"> - <div class="goog-menuitem">Open...</div> - <div class="goog-submenu">Open Recent - <div class="goog-menu"> - <div class="goog-menuitem">Annual Report.pdf</div> - <div class="goog-menuitem">Quarterly Update.pdf</div> - <div class="goog-menuitem">Enemies List.txt</div> - <div class="goog-submenu">More - <div class="goog-menu"> - <div class="goog-menuitem">Foo.txt</div> - <div class="goog-menuitem">Bar.txt</div> - </div> - </div> - </div> - </div> -</div> -<div id="sandbox"></div> - -</body> -</html> |