Index: chrome/test/data/webui/cr_elements/cr_action_menu_test.js |
diff --git a/chrome/test/data/webui/cr_elements/cr_action_menu_test.js b/chrome/test/data/webui/cr_elements/cr_action_menu_test.js |
index 62e51011ed259d10ee569e8da711fe095a892fe4..6fa40b55156889925028982ef481e612ee37819b 100644 |
--- a/chrome/test/data/webui/cr_elements/cr_action_menu_test.js |
+++ b/chrome/test/data/webui/cr_elements/cr_action_menu_test.js |
@@ -13,6 +13,9 @@ suite('CrActionMenu', function() { |
/** @type {?NodeList<HTMLElement>} */ |
var items = null; |
+ /** @type {HTMLElement} */ |
+ var dots = null; |
+ |
setup(function() { |
PolymerTest.clearBody(); |
@@ -28,10 +31,13 @@ suite('CrActionMenu', function() { |
menu = document.querySelector('dialog[is=cr-action-menu]'); |
items = menu.querySelectorAll('.dropdown-item'); |
+ dots = document.querySelector('#dots'); |
assertEquals(3, items.length); |
}); |
teardown(function() { |
+ document.body.style.direction = 'ltr'; |
+ |
if (menu.open) |
menu.close(); |
}); |
@@ -45,25 +51,25 @@ suite('CrActionMenu', function() { |
} |
test('hidden or disabled items', function() { |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
down(); |
assertEquals(menu.root.activeElement, items[0]); |
menu.close(); |
items[0].hidden = true; |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
down(); |
assertEquals(menu.root.activeElement, items[1]); |
menu.close(); |
items[1].disabled = true; |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
down(); |
assertEquals(menu.root.activeElement, items[2]); |
}); |
test('focus after down/up arrow', function() { |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
// The menu should be focused when shown, but not on any of the items. |
assertEquals(menu, document.activeElement); |
@@ -93,8 +99,8 @@ suite('CrActionMenu', function() { |
assertEquals(items[0], menu.root.activeElement); |
}); |
- test('pressing up arrow when no focus will focus last item', function(){ |
- menu.showAt(document.querySelector('#dots')); |
+ test('pressing up arrow when no focus will focus last item', function() { |
+ menu.showAt(dots); |
assertEquals(menu, document.activeElement); |
up(); |
@@ -106,7 +112,7 @@ suite('CrActionMenu', function() { |
var item = document.createElement('button'); |
item.classList.add('dropdown-item'); |
menu.insertBefore(item, items[0]); |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
down(); |
assertEquals(item, menu.root.activeElement); |
@@ -122,7 +128,7 @@ suite('CrActionMenu', function() { |
}); |
test('close on resize', function() { |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
assertTrue(menu.open); |
window.dispatchEvent(new CustomEvent('resize')); |
@@ -130,7 +136,7 @@ suite('CrActionMenu', function() { |
}); |
test('close on popstate', function() { |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
assertTrue(menu.open); |
window.dispatchEvent(new CustomEvent('popstate')); |
@@ -140,7 +146,6 @@ suite('CrActionMenu', function() { |
/** @param {string} key The key to use for closing. */ |
function testFocusAfterClosing(key) { |
return new Promise(function(resolve) { |
- var dots = document.querySelector('#dots'); |
menu.showAt(dots); |
assertTrue(menu.open); |
@@ -151,7 +156,9 @@ suite('CrActionMenu', function() { |
}); |
} |
- test('close on Tab', function() { return testFocusAfterClosing('Tab'); }); |
+ test('close on Tab', function() { |
+ return testFocusAfterClosing('Tab'); |
+ }); |
test('close on Escape', function() { |
return testFocusAfterClosing('Escape'); |
}); |
@@ -162,7 +169,7 @@ suite('CrActionMenu', function() { |
node.dispatchEvent(e); |
} |
- menu.showAt(document.querySelector('#dots')); |
+ menu.showAt(dots); |
// Moving mouse on option 1 should focus it. |
assertNotEquals(items[0], menu.root.activeElement); |
@@ -259,7 +266,7 @@ suite('CrActionMenu', function() { |
height: 0, |
maxX: menuWidth * 2 - 10, |
}); |
- assertEquals(`${menuWidth - 10}px`, menu.style.left); |
+ assertEquals(`${menuWidth - 10}px`, menu.style.left); |
assertEquals(`0px`, menu.style.top); |
menu.close(); |
@@ -270,88 +277,122 @@ suite('CrActionMenu', function() { |
assertEquals(140 - menuWidth, menu.offsetLeft); |
assertEquals('250px', menu.style.top); |
menu.close(); |
- document.body.style.direction = 'ltr'; |
}); |
- test('offscreen scroll positioning', function() { |
+ suite('offscreen scroll positioning', function() { |
var bodyHeight = 10000; |
var bodyWidth = 20000; |
var containerLeft = 5000; |
var containerTop = 10000; |
var containerWidth = 500; |
var containerHeight = 500; |
- document.body.innerHTML = ` |
- <style> |
- body { |
- height: ${bodyHeight}px; |
- width: ${bodyWidth}px; |
- } |
- |
- #container { |
- overflow: auto; |
- position: absolute; |
- top: ${containerTop}px; |
- left: ${containerLeft}px; |
- height: ${containerHeight}px; |
- width: ${containerWidth}px; |
- } |
- |
- #inner-container { |
- height: 1000px; |
- width: 1000px; |
- } |
- </style> |
- <div id="container"> |
- <div id="inner-container"> |
- <button id="dots">...</button> |
- <dialog is="cr-action-menu"> |
- <button class="dropdown-item">Un</button> |
- <hr> |
- <button class="dropdown-item">Dos</button> |
- <button class="dropdown-item">Tres</button> |
- </dialog> |
+ var menuWidth = 100; |
+ var menuHeight = 200; |
+ |
+ setup(function() { |
+ document.body.scrollTop = 0; |
+ document.body.scrollLeft = 0; |
+ document.body.innerHTML = ` |
+ <style> |
+ body { |
+ height: ${bodyHeight}px; |
+ width: ${bodyWidth}px; |
+ } |
+ |
+ #container { |
+ overflow: auto; |
+ position: absolute; |
+ top: ${containerTop}px; |
+ left: ${containerLeft}px; |
+ right: ${containerLeft}px; |
+ height: ${containerHeight}px; |
+ width: ${containerWidth}px; |
+ } |
+ |
+ #inner-container { |
+ height: 1000px; |
+ width: 1000px; |
+ } |
+ |
+ dialog { |
+ height: ${menuHeight}; |
+ width: ${menuWidth}; |
+ padding: 0; |
+ } |
+ </style> |
+ <div id="container"> |
+ <div id="inner-container"> |
+ <button id="dots">...</button> |
+ <dialog is="cr-action-menu"> |
+ <button class="dropdown-item">Un</button> |
+ <hr> |
+ <button class="dropdown-item">Dos</button> |
+ <button class="dropdown-item">Tres</button> |
+ </dialog> |
+ </div> |
</div> |
- </div> |
- `; |
- menu = document.querySelector('dialog[is=cr-action-menu]'); |
- var dots = document.querySelector('#dots'); |
+ `; |
+ menu = document.querySelector('dialog[is=cr-action-menu]'); |
+ dots = document.querySelector('#dots'); |
+ }) |
// Show the menu, scrolling the body to the button. |
- menu.showAt( |
- dots, |
- {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
- assertEquals(`${containerLeft}px`, menu.style.left); |
- assertEquals(`${containerTop}px`, menu.style.top); |
- menu.close(); |
+ test('simple offscreen', function() { |
+ menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
+ assertEquals(`${containerLeft}px`, menu.style.left); |
+ assertEquals(`${containerTop}px`, menu.style.top); |
+ menu.close(); |
+ }); |
// Show the menu, scrolling the container to the button, and the body to the |
// button. |
- document.body.scrollLeft = bodyWidth; |
- document.body.scrollTop = bodyHeight; |
+ test('offscreen and out of scroll container viewport', function() { |
+ document.body.scrollLeft = bodyWidth; |
+ document.body.scrollTop = bodyHeight; |
+ var container = document.querySelector('#container'); |
- document.querySelector('#container').scrollLeft = containerLeft; |
- document.querySelector('#container').scrollTop = containerTop; |
+ container.scrollLeft = containerLeft; |
+ container.scrollTop = containerTop; |
- menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
- assertEquals(`${containerLeft}px`, menu.style.left); |
- assertEquals(`${containerTop}px`, menu.style.top); |
- menu.close(); |
+ menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
+ assertEquals(`${containerLeft}px`, menu.style.left); |
+ assertEquals(`${containerTop}px`, menu.style.top); |
+ menu.close(); |
+ }); |
// Show the menu for an already onscreen button. The anchor should be |
// overridden so that no scrolling happens. |
- document.body.scrollLeft = 0; |
- document.body.scrollTop = 0; |
+ test('onscreen forces anchor change', function() { |
+ var rect = dots.getBoundingClientRect(); |
+ document.body.scrollLeft = rect.right - document.body.clientWidth + 10; |
+ document.body.scrollTop = rect.bottom - document.body.clientHeight + 10; |
+ |
+ menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
+ var buttonWidth = dots.offsetWidth; |
+ var buttonHeight = dots.offsetHeight; |
+ assertEquals(containerLeft - menuWidth + buttonWidth, menu.offsetLeft); |
+ assertEquals(containerTop - menuHeight + buttonHeight, menu.offsetTop); |
+ menu.close(); |
+ }); |
- var rect = dots.getBoundingClientRect(); |
- document.body.scrollLeft = rect.right - document.body.clientWidth; |
- document.body.scrollTop = rect.bottom - document.body.clientHeight; |
+ test('scroll position maintained for showAtPosition', function() { |
+ document.body.scrollLeft = 500; |
+ document.body.scrollTop = 1000; |
+ menu.showAtPosition({top: 50, left: 50}); |
+ assertEquals(550, menu.offsetLeft); |
+ assertEquals(1050, menu.offsetTop); |
+ menu.close(); |
+ }); |
- menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
- var menuWidth = menu.offsetWidth; |
- var menuHeight = menu.offsetHeight; |
- var buttonWidth = dots.offsetWidth; |
- var buttonHeight = dots.offsetHeight; |
- assertEquals(containerLeft - menuWidth + buttonWidth, menu.offsetLeft); |
- assertEquals(containerTop - menuHeight + buttonHeight, menu.offsetTop); |
+ test('rtl', function() { |
+ // Anchor to an item in RTL. |
+ document.body.style.direction = 'rtl'; |
+ menu.showAt(dots, {anchorAlignmentX: AnchorAlignment.AFTER_START}); |
+ assertEquals( |
+ container.offsetLeft + containerWidth - menuWidth, |
+ menu.offsetLeft); |
+ assertEquals(containerTop, menu.offsetTop); |
+ menu.close(); |
+ }); |
}); |
}); |