Diff
Modified: trunk/LayoutTests/ChangeLog (204542 => 204543)
--- trunk/LayoutTests/ChangeLog 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/LayoutTests/ChangeLog 2016-08-17 00:25:36 UTC (rev 204543)
@@ -1,3 +1,15 @@
+2016-08-16 Chris Dumez <[email protected]>
+
+ Add support for ShadowRoot.mode attribute
+ https://bugs.webkit.org/show_bug.cgi?id=160919
+
+ Reviewed by Ryosuke Niwa.
+
+ Add layout test coverage.
+
+ * fast/shadow-dom/ShadowRoot-mode-expected.txt: Added.
+ * fast/shadow-dom/ShadowRoot-mode.html: Added.
+
2016-08-16 Ryosuke Niwa <[email protected]>
customElements.define should retrieve lifecycle callbacks
Added: trunk/LayoutTests/fast/shadow-dom/ShadowRoot-mode-expected.txt (0 => 204543)
--- trunk/LayoutTests/fast/shadow-dom/ShadowRoot-mode-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/ShadowRoot-mode-expected.txt 2016-08-17 00:25:36 UTC (rev 204543)
@@ -0,0 +1,11 @@
+Tests support for ShadowRoot.mode attribute.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS shadowRoot1.mode is "open"
+PASS shadowRoot2.mode is "closed"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/shadow-dom/ShadowRoot-mode.html (0 => 204543)
--- trunk/LayoutTests/fast/shadow-dom/ShadowRoot-mode.html (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/ShadowRoot-mode.html 2016-08-17 00:25:36 UTC (rev 204543)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src=""
+<script>
+description("Tests support for ShadowRoot.mode attribute.");
+
+var element1 = document.createElement('div');
+var shadowRoot1 = element1.attachShadow({ mode: "open" });
+shouldBeEqualToString("shadowRoot1.mode", "open");
+
+var element2 = document.createElement('div');
+var shadowRoot2 = element2.attachShadow({ mode: "closed" });
+shouldBeEqualToString("shadowRoot2.mode", "closed");
+</script>
+<script src=""
+</body>
+</html>
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (204542 => 204543)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2016-08-17 00:25:36 UTC (rev 204543)
@@ -1,5 +1,16 @@
2016-08-16 Chris Dumez <[email protected]>
+ Add support for ShadowRoot.mode attribute
+ https://bugs.webkit.org/show_bug.cgi?id=160919
+
+ Reviewed by Ryosuke Niwa.
+
+ Rebaseline W3C test now that one more check is passing.
+
+ * web-platform-tests/dom/interfaces-expected.txt:
+
+2016-08-16 Chris Dumez <[email protected]>
+
Align isDefaultNamespace() / lookupPrefix() / lookupNamespaceURI() with the specification
https://bugs.webkit.org/show_bug.cgi?id=160911
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt (204542 => 204543)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt 2016-08-17 00:25:36 UTC (rev 204543)
@@ -725,7 +725,7 @@
PASS ShadowRoot interface object name
PASS ShadowRoot interface: existence and properties of interface prototype object
PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property
-FAIL ShadowRoot interface: attribute mode assert_true: The prototype object must have a property "mode" expected true got false
+PASS ShadowRoot interface: attribute mode
PASS ShadowRoot interface: attribute host
PASS Element interface: existence and properties of interface object
PASS Element interface object length
Modified: trunk/Source/WebCore/ChangeLog (204542 => 204543)
--- trunk/Source/WebCore/ChangeLog 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/ChangeLog 2016-08-17 00:25:36 UTC (rev 204543)
@@ -1,3 +1,53 @@
+2016-08-16 Chris Dumez <[email protected]>
+
+ Add support for ShadowRoot.mode attribute
+ https://bugs.webkit.org/show_bug.cgi?id=160919
+
+ Reviewed by Ryosuke Niwa.
+
+ Add support for ShadowRoot.mode attribute:
+ - https://dom.spec.whatwg.org/#interface-shadowroot
+
+ Test: fast/shadow-dom/ShadowRoot-mode.html
+
+ * css/ElementRuleCollector.cpp:
+ (WebCore::ElementRuleCollector::collectMatchingRules):
+ * css/SelectorChecker.cpp:
+ (WebCore::SelectorChecker::matchRecursively):
+ * dom/Element.cpp:
+ (WebCore::Element::bindingsOffsetParent):
+ (WebCore::Element::addShadowRoot):
+ (WebCore::Element::attachShadow):
+ (WebCore::Element::shadowRootForBindings):
+ (WebCore::Element::userAgentShadowRoot):
+ (WebCore::Element::ensureUserAgentShadowRoot):
+ * dom/Node.cpp:
+ (WebCore::Node::isUnclosedNode):
+ (WebCore::Node::assignedSlotForBindings):
+ (WebCore::Node::isInUserAgentShadowTree):
+ * dom/ShadowRoot.cpp:
+ (WebCore::ShadowRoot::ShadowRoot):
+ (WebCore::ShadowRoot::styleResolver):
+ * dom/ShadowRoot.h:
+ * dom/ShadowRoot.idl:
+ * dom/SlotAssignment.cpp:
+ (WebCore::SlotAssignment::didChangeSlot):
+ * html/HTMLSummaryElement.cpp:
+ (WebCore::HTMLSummaryElement::create):
+ * inspector/InspectorDOMAgent.cpp:
+ (WebCore::shadowRootType):
+ (WebCore::InspectorDOMAgent::buildObjectForNode):
+ * rendering/HitTestResult.cpp:
+ (WebCore::moveOutOfUserAgentShadowTree):
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::selectionPseudoStyle):
+ * rendering/RenderLayer.cpp:
+ (WebCore::rendererForScrollbar):
+ * svg/SVGElement.cpp:
+ (WebCore::SVGElement::correspondingUseElement):
+ * testing/Internals.cpp:
+ (WebCore::Internals::shadowRootType):
+
2016-08-16 Ryosuke Niwa <[email protected]>
customElements.define should retrieve lifecycle callbacks
Modified: trunk/Source/WebCore/css/ElementRuleCollector.cpp (204542 => 204543)
--- trunk/Source/WebCore/css/ElementRuleCollector.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/css/ElementRuleCollector.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -148,7 +148,7 @@
#endif
auto* shadowRoot = m_element.containingShadowRoot();
- if (shadowRoot && shadowRoot->type() == ShadowRoot::Type::UserAgent) {
+ if (shadowRoot && shadowRoot->mode() == ShadowRoot::Mode::UserAgent) {
const AtomicString& pseudoId = m_element.shadowPseudoId();
if (!pseudoId.isEmpty())
collectMatchingRulesForList(matchRequest.ruleSet->shadowPseudoElementRules(pseudoId.impl()), matchRequest, ruleRange);
Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (204542 => 204543)
--- trunk/Source/WebCore/css/SelectorChecker.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -278,7 +278,7 @@
if (context.element->shadowPseudoId() != context.selector->value())
return MatchResult::fails(Match::SelectorFailsLocally);
- if (context.selector->isWebKitCustomPseudoElement() && root->type() != ShadowRoot::Type::UserAgent)
+ if (context.selector->isWebKitCustomPseudoElement() && root->mode() != ShadowRoot::Mode::UserAgent)
return MatchResult::fails(Match::SelectorFailsLocally);
} else
return MatchResult::fails(Match::SelectorFailsLocally);
Modified: trunk/Source/WebCore/dom/Element.cpp (204542 => 204543)
--- trunk/Source/WebCore/dom/Element.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/dom/Element.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -810,7 +810,7 @@
Element* element = offsetParent();
if (!element || !element->isInShadowTree())
return element;
- return element->containingShadowRoot()->type() == ShadowRoot::Type::UserAgent ? nullptr : element;
+ return element->containingShadowRoot()->mode() == ShadowRoot::Mode::UserAgent ? nullptr : element;
}
Element* Element::offsetParent()
@@ -1674,7 +1674,7 @@
InspectorInstrumentation::didPushShadowRoot(*this, shadowRoot);
- if (shadowRoot.type() == ShadowRoot::Type::UserAgent)
+ if (shadowRoot.mode() == ShadowRoot::Mode::UserAgent)
didAddUserAgentShadowRoot(&shadowRoot);
}
@@ -1753,7 +1753,7 @@
return nullptr;
}
- auto shadow = ShadowRoot::create(document(), init.mode == ShadowRootMode::Open ? ShadowRoot::Type::Open : ShadowRoot::Type::Closed);
+ auto shadow = ShadowRoot::create(document(), init.mode == ShadowRootMode::Open ? ShadowRoot::Mode::Open : ShadowRoot::Mode::Closed);
addShadowRoot(shadow.copyRef());
return WTFMove(shadow);
}
@@ -1764,7 +1764,7 @@
if (!root)
return nullptr;
- if (root->type() != ShadowRoot::Type::Open) {
+ if (root->mode() != ShadowRoot::Mode::Open) {
if (!JSC::jsCast<JSDOMGlobalObject*>(state.lexicalGlobalObject())->world().shadowRootIsAlwaysOpen())
return nullptr;
}
@@ -1775,7 +1775,7 @@
ShadowRoot* Element::userAgentShadowRoot() const
{
if (ShadowRoot* shadowRoot = this->shadowRoot()) {
- ASSERT(shadowRoot->type() == ShadowRoot::Type::UserAgent);
+ ASSERT(shadowRoot->mode() == ShadowRoot::Mode::UserAgent);
return shadowRoot;
}
return nullptr;
@@ -1785,7 +1785,7 @@
{
ShadowRoot* shadowRoot = userAgentShadowRoot();
if (!shadowRoot) {
- addShadowRoot(ShadowRoot::create(document(), ShadowRoot::Type::UserAgent));
+ addShadowRoot(ShadowRoot::create(document(), ShadowRoot::Mode::UserAgent));
shadowRoot = userAgentShadowRoot();
}
return *shadowRoot;
Modified: trunk/Source/WebCore/dom/Node.cpp (204542 => 204543)
--- trunk/Source/WebCore/dom/Node.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/dom/Node.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -1088,7 +1088,7 @@
return true; // treeScopeThatCanAccessOtherNode is a shadow-including inclusive ancestor of this node.
}
auto& root = treeScopeThatCanAccessOtherNode->rootNode();
- if (is<ShadowRoot>(root) && downcast<ShadowRoot>(root).type() != ShadowRoot::Type::Open)
+ if (is<ShadowRoot>(root) && downcast<ShadowRoot>(root).mode() != ShadowRoot::Mode::Open)
break;
}
@@ -1112,7 +1112,7 @@
HTMLSlotElement* Node::assignedSlotForBindings() const
{
auto* shadowRoot = parentShadowRoot(*this);
- if (shadowRoot && shadowRoot->type() == ShadowRoot::Type::Open)
+ if (shadowRoot && shadowRoot->mode() == ShadowRoot::Mode::Open)
return shadowRoot->findAssignedSlot(*this);
return nullptr;
}
@@ -1130,7 +1130,7 @@
bool Node::isInUserAgentShadowTree() const
{
auto* shadowRoot = containingShadowRoot();
- return shadowRoot && shadowRoot->type() == ShadowRoot::Type::UserAgent;
+ return shadowRoot && shadowRoot->mode() == ShadowRoot::Mode::UserAgent;
}
Node* Node::nonBoundaryShadowTreeRootNode()
Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (204542 => 204543)
--- trunk/Source/WebCore/dom/ShadowRoot.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -49,7 +49,7 @@
COMPILE_ASSERT(sizeof(ShadowRoot) == sizeof(SameSizeAsShadowRoot), shadowroot_should_stay_small);
-ShadowRoot::ShadowRoot(Document& document, Type type)
+ShadowRoot::ShadowRoot(Document& document, Mode type)
: DocumentFragment(document, CreateShadowRoot)
, TreeScope(*this, document)
, m_type(type)
@@ -60,7 +60,7 @@
ShadowRoot::ShadowRoot(Document& document, std::unique_ptr<SlotAssignment>&& slotAssignment)
: DocumentFragment(document, CreateShadowRoot)
, TreeScope(*this, document)
- , m_type(Type::UserAgent)
+ , m_type(Mode::UserAgent)
, m_slotAssignment(WTFMove(slotAssignment))
{
}
@@ -82,7 +82,7 @@
StyleResolver& ShadowRoot::styleResolver()
{
- if (m_type == Type::UserAgent)
+ if (m_type == Mode::UserAgent)
return document().userAgentShadowTreeStyleResolver();
if (!m_styleResolver) {
Modified: trunk/Source/WebCore/dom/ShadowRoot.h (204542 => 204543)
--- trunk/Source/WebCore/dom/ShadowRoot.h 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/dom/ShadowRoot.h 2016-08-17 00:25:36 UTC (rev 204543)
@@ -42,13 +42,13 @@
class ShadowRoot final : public DocumentFragment, public TreeScope {
public:
- enum class Type : uint8_t {
+ enum class Mode : uint8_t {
UserAgent = 0,
Closed,
Open,
};
- static Ref<ShadowRoot> create(Document& document, Type type)
+ static Ref<ShadowRoot> create(Document& document, Mode type)
{
return adoptRef(*new ShadowRoot(document, type));
}
@@ -79,7 +79,7 @@
Element* activeElement() const;
- Type type() const { return m_type; }
+ Mode mode() const { return m_type; }
void removeAllEventListeners() override;
@@ -97,7 +97,7 @@
const Vector<Node*>* assignedNodesForSlot(const HTMLSlotElement&);
protected:
- ShadowRoot(Document&, Type);
+ ShadowRoot(Document&, Mode);
ShadowRoot(Document&, std::unique_ptr<SlotAssignment>&&);
@@ -110,7 +110,7 @@
Ref<Node> cloneNodeInternal(Document&, CloningOperation) override;
bool m_resetStyleInheritance { false };
- Type m_type { Type::UserAgent };
+ Mode m_type { Mode::UserAgent };
Element* m_host { nullptr };
Modified: trunk/Source/WebCore/dom/ShadowRoot.idl (204542 => 204543)
--- trunk/Source/WebCore/dom/ShadowRoot.idl 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/dom/ShadowRoot.idl 2016-08-17 00:25:36 UTC (rev 204543)
@@ -27,8 +27,12 @@
EnabledAtRuntime=ShadowDOM,
JSGenerateToJSObject
] interface ShadowRoot : DocumentFragment {
+ readonly attribute ShadowRootMode mode;
readonly attribute Element activeElement;
readonly attribute Element host;
[TreatNullAs=EmptyString, SetterRaisesException] attribute DOMString innerHTML;
};
+
+// "user-agent" is a WebKit extension that is not exposed to the Web.
+enum ShadowRootMode { "user-agent", "closed", "open" };
Modified: trunk/Source/WebCore/dom/SlotAssignment.cpp (204542 => 204543)
--- trunk/Source/WebCore/dom/SlotAssignment.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/dom/SlotAssignment.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -158,7 +158,7 @@
m_slotAssignmentsIsValid = false;
}
- if (shadowRoot.type() == ShadowRoot::Type::UserAgent)
+ if (shadowRoot.mode() == ShadowRoot::Mode::UserAgent)
return;
recursivelyFireSlotChangeEvent(*slotElement);
Modified: trunk/Source/WebCore/html/HTMLSummaryElement.cpp (204542 => 204543)
--- trunk/Source/WebCore/html/HTMLSummaryElement.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/html/HTMLSummaryElement.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -40,7 +40,7 @@
Ref<HTMLSummaryElement> HTMLSummaryElement::create(const QualifiedName& tagName, Document& document)
{
Ref<HTMLSummaryElement> summary = adoptRef(*new HTMLSummaryElement(tagName, document));
- summary->addShadowRoot(ShadowRoot::create(document, ShadowRoot::Type::UserAgent));
+ summary->addShadowRoot(ShadowRoot::create(document, ShadowRoot::Mode::UserAgent));
return summary;
}
Modified: trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp (204542 => 204543)
--- trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -1280,14 +1280,14 @@
}
}
-static Inspector::Protocol::DOM::ShadowRootType shadowRootType(ShadowRoot::Type type)
+static Inspector::Protocol::DOM::ShadowRootType shadowRootType(ShadowRoot::Mode mode)
{
- switch (type) {
- case ShadowRoot::Type::UserAgent:
+ switch (mode) {
+ case ShadowRoot::Mode::UserAgent:
return Inspector::Protocol::DOM::ShadowRootType::UserAgent;
- case ShadowRoot::Type::Closed:
+ case ShadowRoot::Mode::Closed:
return Inspector::Protocol::DOM::ShadowRootType::Closed;
- case ShadowRoot::Type::Open:
+ case ShadowRoot::Mode::Open:
return Inspector::Protocol::DOM::ShadowRootType::Open;
}
@@ -1407,7 +1407,7 @@
value->setValue(attribute.value());
} else if (is<ShadowRoot>(*node)) {
ShadowRoot& shadowRoot = downcast<ShadowRoot>(*node);
- value->setShadowRootType(shadowRootType(shadowRoot.type()));
+ value->setShadowRootType(shadowRootType(shadowRoot.mode()));
}
// Need to enable AX to get the computed role.
Modified: trunk/Source/WebCore/rendering/HitTestResult.cpp (204542 => 204543)
--- trunk/Source/WebCore/rendering/HitTestResult.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/rendering/HitTestResult.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -127,7 +127,7 @@
{
if (node.isInShadowTree()) {
if (ShadowRoot* root = node.containingShadowRoot()) {
- if (root->type() == ShadowRoot::Type::UserAgent)
+ if (root->mode() == ShadowRoot::Mode::UserAgent)
return root->host();
}
}
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (204542 => 204543)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -1583,7 +1583,7 @@
return nullptr;
if (ShadowRoot* root = element()->containingShadowRoot()) {
- if (root->type() == ShadowRoot::Type::UserAgent) {
+ if (root->mode() == ShadowRoot::Mode::UserAgent) {
if (Element* shadowHost = element()->shadowHost())
return shadowHost->renderer()->getUncachedPseudoStyle(PseudoStyleRequest(SELECTION));
}
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (204542 => 204543)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -3096,7 +3096,7 @@
{
if (Element* element = renderer.element()) {
if (ShadowRoot* shadowRoot = element->containingShadowRoot()) {
- if (shadowRoot->type() == ShadowRoot::Type::UserAgent)
+ if (shadowRoot->mode() == ShadowRoot::Mode::UserAgent)
return shadowRoot->host()->renderer();
}
}
Modified: trunk/Source/WebCore/svg/SVGElement.cpp (204542 => 204543)
--- trunk/Source/WebCore/svg/SVGElement.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/svg/SVGElement.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -438,7 +438,7 @@
auto* root = containingShadowRoot();
if (!root)
return nullptr;
- if (root->type() != ShadowRoot::Type::UserAgent)
+ if (root->mode() != ShadowRoot::Mode::UserAgent)
return nullptr;
auto* host = root->host();
if (!is<SVGUseElement>(host))
Modified: trunk/Source/WebCore/testing/Internals.cpp (204542 => 204543)
--- trunk/Source/WebCore/testing/Internals.cpp 2016-08-17 00:18:43 UTC (rev 204542)
+++ trunk/Source/WebCore/testing/Internals.cpp 2016-08-17 00:25:36 UTC (rev 204543)
@@ -822,12 +822,12 @@
return String();
}
- switch (downcast<ShadowRoot>(root).type()) {
- case ShadowRoot::Type::UserAgent:
+ switch (downcast<ShadowRoot>(root).mode()) {
+ case ShadowRoot::Mode::UserAgent:
return String("UserAgentShadowRoot");
- case ShadowRoot::Type::Closed:
+ case ShadowRoot::Mode::Closed:
return String("ClosedShadowRoot");
- case ShadowRoot::Type::Open:
+ case ShadowRoot::Mode::Open:
return String("OpenShadowRoot");
default:
ASSERT_NOT_REACHED();