If an element A has a parent element, then A's assigned context menu is the...

If an element A has a parent element, then A's assigned context menu is the assigned context menu of its parent element. Otherwise, A's assigned context menu is null.

Specification: https://html.spec.whatwg.org/multipage/forms.html#assigned-context-menu

"Each element has an assigned context menu, which can be null. If an element A has a contextmenu attribute, and there is an element with the ID given by A's contextmenu attribute's value in A's home subtree, and the first such element in tree order is a menu element whose type attribute is in the popup menu state, then A's assigned context menu is that element. Otherwise, if A has a parent element, then A's assigned context menu is the assigned context menu of its parent element. Otherwise, A's assigned context menu is null."

BUG=424494

Review URL: https://codereview.chromium.org/721603002

git-svn-id: svn://svn.chromium.org/blink/trunk@185198 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent b107a017
...@@ -45,6 +45,8 @@ PASS container9.contextMenu.type is "" ...@@ -45,6 +45,8 @@ PASS container9.contextMenu.type is ""
PASS container9.contextMenu.label is "menu without type" PASS container9.contextMenu.label is "menu without type"
Test setting contextmenu attribute to menu element which is in shadow dom Test setting contextmenu attribute to menu element which is in shadow dom
PASS container10.contextMenu is null PASS container10.contextMenu is null
Test contextmenu attribute of an element with no contextmenu attribute but parent has valid contextmenu
PASS inner.contextMenu is null
PASS successfullyParsed is true PASS successfullyParsed is true
TEST COMPLETE TEST COMPLETE
......
...@@ -124,5 +124,9 @@ container10.createShadowRoot().appendChild(menu5); ...@@ -124,5 +124,9 @@ container10.createShadowRoot().appendChild(menu5);
container10.contextMenu = menu5; container10.contextMenu = menu5;
shouldBeNull("container10.contextMenu"); shouldBeNull("container10.contextMenu");
debug("Test contextmenu attribute of an element with no contextmenu attribute but parent has valid contextmenu");
document.write("<div contextmenu='menu7'><button id='inner'></button><menu id='menu7' type='popup' label='menu 7'></menu></div>");
var inner = document.getElementById('inner');
shouldBeNull("inner.contextMenu");
</script> </script>
</html> </html>
...@@ -25,8 +25,13 @@ PASS items1.length - items.length is 0 ...@@ -25,8 +25,13 @@ PASS items1.length - items.length is 0
PASS items2.length - items.length is 0 PASS items2.length - items.length is 0
PASS items3.length - items.length is 0 PASS items3.length - items.length is 0
PASS items4.length - items.length is 0 PASS items4.length - items.length is 0
PASS items5.length - items.length is 3
PASS items5[0] is "Item1"
PASS items5[1] is "Item2"
PASS items5[2] is "Item3"
PASS successfullyParsed is true PASS successfullyParsed is true
TEST COMPLETE TEST COMPLETE
...@@ -81,6 +81,17 @@ ...@@ -81,6 +81,17 @@
<menu id="menu_4" type="popup"> <menu id="menu_4" type="popup">
</menu> </menu>
</button> </button>
<!-- Test if an element A has a parent element, then A's assigned context menu is the assigned context menu of its parent element. -->
<div contextmenu="menu_5">
<div>
<button id="button_5" style="height: 100px; width: 100px;"></button>
</div>
<menu id="menu_5" type="popup">
<menuitem label="Item1">
<menuitem label="Item2">
<menuitem label="Item3">
</menu>
</div>
<script> <script>
if (!window.eventSender) if (!window.eventSender)
debug("This test requires window.eventSender.") debug("This test requires window.eventSender.")
...@@ -136,6 +147,12 @@ eventSender.keyDown("escape"); ...@@ -136,6 +147,12 @@ eventSender.keyDown("escape");
var button4 = document.getElementById("button_4"); var button4 = document.getElementById("button_4");
var items4 = contextClickAndGetMenuItems(button4); var items4 = contextClickAndGetMenuItems(button4);
// Esc key to hide the context menu.
eventSender.keyDown("escape");
var button5 = document.getElementById("button_5");
var items5 = contextClickAndGetMenuItems(button5);
shouldBeEqualToNumber("itemsWithCustomContextMenu.length - items.length", 17); shouldBeEqualToNumber("itemsWithCustomContextMenu.length - items.length", 17);
shouldBeEqualToString("itemsWithCustomContextMenu[0]", "Item1"); shouldBeEqualToString("itemsWithCustomContextMenu[0]", "Item1");
shouldBeEqualToString("itemsWithCustomContextMenu[1]", "Item2"); shouldBeEqualToString("itemsWithCustomContextMenu[1]", "Item2");
...@@ -158,5 +175,9 @@ shouldBeEqualToNumber("items1.length - items.length", 0); ...@@ -158,5 +175,9 @@ shouldBeEqualToNumber("items1.length - items.length", 0);
shouldBeEqualToNumber("items2.length - items.length", 0); shouldBeEqualToNumber("items2.length - items.length", 0);
shouldBeEqualToNumber("items3.length - items.length", 0); shouldBeEqualToNumber("items3.length - items.length", 0);
shouldBeEqualToNumber("items4.length - items.length", 0); shouldBeEqualToNumber("items4.length - items.length", 0);
shouldBeEqualToNumber("items5.length - items.length", 3);
shouldBeEqualToString("items5[0]", "Item1");
shouldBeEqualToString("items5[1]", "Item2");
shouldBeEqualToString("items5[2]", "Item3");
</script> </script>
...@@ -934,6 +934,13 @@ bool HTMLElement::isInteractiveContent() const ...@@ -934,6 +934,13 @@ bool HTMLElement::isInteractiveContent() const
return false; return false;
} }
HTMLMenuElement* HTMLElement::assignedContextMenu() const
{
if (HTMLMenuElement* menu = contextMenu())
return menu;
return parentElement() && parentElement()->isHTMLElement() ? toHTMLElement(parentElement())->assignedContextMenu() : nullptr;
}
HTMLMenuElement* HTMLElement::contextMenu() const HTMLMenuElement* HTMLElement::contextMenu() const
{ {
......
...@@ -96,6 +96,7 @@ public: ...@@ -96,6 +96,7 @@ public:
static const AtomicString& eventParameterName(); static const AtomicString& eventParameterName();
HTMLMenuElement* assignedContextMenu() const;
HTMLMenuElement* contextMenu() const; HTMLMenuElement* contextMenu() const;
void setContextMenu(HTMLMenuElement*); void setContextMenu(HTMLMenuElement*);
......
...@@ -95,13 +95,13 @@ void ContextMenuController::populateCustomContextMenu(const Event& event) ...@@ -95,13 +95,13 @@ void ContextMenuController::populateCustomContextMenu(const Event& event)
return; return;
HTMLElement& element = toHTMLElement(*node); HTMLElement& element = toHTMLElement(*node);
RefPtrWillBeRawPtr<HTMLMenuElement> menuElement = element.contextMenu(); RefPtrWillBeRawPtr<HTMLMenuElement> menuElement = element.assignedContextMenu();
if (!menuElement || !equalIgnoringCase(menuElement->fastGetAttribute(typeAttr), "popup")) if (!menuElement || !equalIgnoringCase(menuElement->fastGetAttribute(typeAttr), "popup"))
return; return;
RefPtrWillBeRawPtr<RelatedEvent> relatedEvent = RelatedEvent::create(EventTypeNames::show, true, true, node); RefPtrWillBeRawPtr<RelatedEvent> relatedEvent = RelatedEvent::create(EventTypeNames::show, true, true, node);
if (!menuElement->dispatchEvent(relatedEvent.release())) if (!menuElement->dispatchEvent(relatedEvent.release()))
return; return;
if (menuElement != element.contextMenu()) if (menuElement != element.assignedContextMenu())
return; return;
m_menuProvider = CustomContextMenuProvider::create(*menuElement, element); m_menuProvider = CustomContextMenuProvider::create(*menuElement, element);
m_menuProvider->populateContextMenu(m_contextMenu.get()); m_menuProvider->populateContextMenu(m_contextMenu.get());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment