Changeset 204543 in webkit


Ignore:
Timestamp:
Aug 16, 2016 5:25:36 PM (8 years ago)
Author:
Chris Dumez
Message:

Add support for ShadowRoot.mode attribute
https://bugs.webkit.org/show_bug.cgi?id=160919

Reviewed by Ryosuke Niwa.

LayoutTests/imported/w3c:

Rebaseline W3C test now that one more check is passing.

  • web-platform-tests/dom/interfaces-expected.txt:

Source/WebCore:

Add support for ShadowRoot.mode attribute:

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):

LayoutTests:

Add layout test coverage.

  • fast/shadow-dom/ShadowRoot-mode-expected.txt: Added.
  • fast/shadow-dom/ShadowRoot-mode.html: Added.
Location:
trunk
Files:
2 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r204540 r204543  
     12016-08-16  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for ShadowRoot.mode attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=160919
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Add layout test coverage.
     9
     10        * fast/shadow-dom/ShadowRoot-mode-expected.txt: Added.
     11        * fast/shadow-dom/ShadowRoot-mode.html: Added.
     12
    1132016-08-16  Ryosuke Niwa  <rniwa@webkit.org>
    214
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r204536 r204543  
     12016-08-16  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for ShadowRoot.mode attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=160919
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Rebaseline W3C test now that one more check is passing.
     9
     10        * web-platform-tests/dom/interfaces-expected.txt:
     11
    1122016-08-16  Chris Dumez  <cdumez@apple.com>
    213
  • trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt

    r204247 r204543  
    726726PASS ShadowRoot interface: existence and properties of interface prototype object
    727727PASS ShadowRoot interface: existence and properties of interface prototype object's "constructor" property
    728 FAIL ShadowRoot interface: attribute mode assert_true: The prototype object must have a property "mode" expected true got false
     728PASS ShadowRoot interface: attribute mode
    729729PASS ShadowRoot interface: attribute host
    730730PASS Element interface: existence and properties of interface object
  • trunk/Source/WebCore/ChangeLog

    r204540 r204543  
     12016-08-16  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for ShadowRoot.mode attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=160919
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Add support for ShadowRoot.mode attribute:
     9        - https://dom.spec.whatwg.org/#interface-shadowroot
     10
     11        Test: fast/shadow-dom/ShadowRoot-mode.html
     12
     13        * css/ElementRuleCollector.cpp:
     14        (WebCore::ElementRuleCollector::collectMatchingRules):
     15        * css/SelectorChecker.cpp:
     16        (WebCore::SelectorChecker::matchRecursively):
     17        * dom/Element.cpp:
     18        (WebCore::Element::bindingsOffsetParent):
     19        (WebCore::Element::addShadowRoot):
     20        (WebCore::Element::attachShadow):
     21        (WebCore::Element::shadowRootForBindings):
     22        (WebCore::Element::userAgentShadowRoot):
     23        (WebCore::Element::ensureUserAgentShadowRoot):
     24        * dom/Node.cpp:
     25        (WebCore::Node::isUnclosedNode):
     26        (WebCore::Node::assignedSlotForBindings):
     27        (WebCore::Node::isInUserAgentShadowTree):
     28        * dom/ShadowRoot.cpp:
     29        (WebCore::ShadowRoot::ShadowRoot):
     30        (WebCore::ShadowRoot::styleResolver):
     31        * dom/ShadowRoot.h:
     32        * dom/ShadowRoot.idl:
     33        * dom/SlotAssignment.cpp:
     34        (WebCore::SlotAssignment::didChangeSlot):
     35        * html/HTMLSummaryElement.cpp:
     36        (WebCore::HTMLSummaryElement::create):
     37        * inspector/InspectorDOMAgent.cpp:
     38        (WebCore::shadowRootType):
     39        (WebCore::InspectorDOMAgent::buildObjectForNode):
     40        * rendering/HitTestResult.cpp:
     41        (WebCore::moveOutOfUserAgentShadowTree):
     42        * rendering/RenderElement.cpp:
     43        (WebCore::RenderElement::selectionPseudoStyle):
     44        * rendering/RenderLayer.cpp:
     45        (WebCore::rendererForScrollbar):
     46        * svg/SVGElement.cpp:
     47        (WebCore::SVGElement::correspondingUseElement):
     48        * testing/Internals.cpp:
     49        (WebCore::Internals::shadowRootType):
     50
    1512016-08-16  Ryosuke Niwa  <rniwa@webkit.org>
    252
  • trunk/Source/WebCore/css/ElementRuleCollector.cpp

    r204220 r204543  
    149149
    150150    auto* shadowRoot = m_element.containingShadowRoot();
    151     if (shadowRoot && shadowRoot->type() == ShadowRoot::Type::UserAgent) {
     151    if (shadowRoot && shadowRoot->mode() == ShadowRoot::Mode::UserAgent) {
    152152        const AtomicString& pseudoId = m_element.shadowPseudoId();
    153153        if (!pseudoId.isEmpty())
  • trunk/Source/WebCore/css/SelectorChecker.cpp

    r203976 r204543  
    279279                    return MatchResult::fails(Match::SelectorFailsLocally);
    280280
    281                 if (context.selector->isWebKitCustomPseudoElement() && root->type() != ShadowRoot::Type::UserAgent)
     281                if (context.selector->isWebKitCustomPseudoElement() && root->mode() != ShadowRoot::Mode::UserAgent)
    282282                    return MatchResult::fails(Match::SelectorFailsLocally);
    283283            } else
  • trunk/Source/WebCore/dom/Element.cpp

    r204540 r204543  
    811811    if (!element || !element->isInShadowTree())
    812812        return element;
    813     return element->containingShadowRoot()->type() == ShadowRoot::Type::UserAgent ? nullptr : element;
     813    return element->containingShadowRoot()->mode() == ShadowRoot::Mode::UserAgent ? nullptr : element;
    814814}
    815815
     
    16751675    InspectorInstrumentation::didPushShadowRoot(*this, shadowRoot);
    16761676
    1677     if (shadowRoot.type() == ShadowRoot::Type::UserAgent)
     1677    if (shadowRoot.mode() == ShadowRoot::Mode::UserAgent)
    16781678        didAddUserAgentShadowRoot(&shadowRoot);
    16791679}
     
    17541754    }
    17551755
    1756     auto shadow = ShadowRoot::create(document(), init.mode == ShadowRootMode::Open ? ShadowRoot::Type::Open : ShadowRoot::Type::Closed);
     1756    auto shadow = ShadowRoot::create(document(), init.mode == ShadowRootMode::Open ? ShadowRoot::Mode::Open : ShadowRoot::Mode::Closed);
    17571757    addShadowRoot(shadow.copyRef());
    17581758    return WTFMove(shadow);
     
    17651765        return nullptr;
    17661766
    1767     if (root->type() != ShadowRoot::Type::Open) {
     1767    if (root->mode() != ShadowRoot::Mode::Open) {
    17681768        if (!JSC::jsCast<JSDOMGlobalObject*>(state.lexicalGlobalObject())->world().shadowRootIsAlwaysOpen())
    17691769            return nullptr;
     
    17761776{
    17771777    if (ShadowRoot* shadowRoot = this->shadowRoot()) {
    1778         ASSERT(shadowRoot->type() == ShadowRoot::Type::UserAgent);
     1778        ASSERT(shadowRoot->mode() == ShadowRoot::Mode::UserAgent);
    17791779        return shadowRoot;
    17801780    }
     
    17861786    ShadowRoot* shadowRoot = userAgentShadowRoot();
    17871787    if (!shadowRoot) {
    1788         addShadowRoot(ShadowRoot::create(document(), ShadowRoot::Type::UserAgent));
     1788        addShadowRoot(ShadowRoot::create(document(), ShadowRoot::Mode::UserAgent));
    17891789        shadowRoot = userAgentShadowRoot();
    17901790    }
  • trunk/Source/WebCore/dom/Node.cpp

    r204536 r204543  
    10891089        }
    10901090        auto& root = treeScopeThatCanAccessOtherNode->rootNode();
    1091         if (is<ShadowRoot>(root) && downcast<ShadowRoot>(root).type() != ShadowRoot::Type::Open)
     1091        if (is<ShadowRoot>(root) && downcast<ShadowRoot>(root).mode() != ShadowRoot::Mode::Open)
    10921092            break;
    10931093    }
     
    11131113{
    11141114    auto* shadowRoot = parentShadowRoot(*this);
    1115     if (shadowRoot && shadowRoot->type() == ShadowRoot::Type::Open)
     1115    if (shadowRoot && shadowRoot->mode() == ShadowRoot::Mode::Open)
    11161116        return shadowRoot->findAssignedSlot(*this);
    11171117    return nullptr;
     
    11311131{
    11321132    auto* shadowRoot = containingShadowRoot();
    1133     return shadowRoot && shadowRoot->type() == ShadowRoot::Type::UserAgent;
     1133    return shadowRoot && shadowRoot->mode() == ShadowRoot::Mode::UserAgent;
    11341134}
    11351135
  • trunk/Source/WebCore/dom/ShadowRoot.cpp

    r202091 r204543  
    5050COMPILE_ASSERT(sizeof(ShadowRoot) == sizeof(SameSizeAsShadowRoot), shadowroot_should_stay_small);
    5151
    52 ShadowRoot::ShadowRoot(Document& document, Type type)
     52ShadowRoot::ShadowRoot(Document& document, Mode type)
    5353    : DocumentFragment(document, CreateShadowRoot)
    5454    , TreeScope(*this, document)
     
    6161    : DocumentFragment(document, CreateShadowRoot)
    6262    , TreeScope(*this, document)
    63     , m_type(Type::UserAgent)
     63    , m_type(Mode::UserAgent)
    6464    , m_slotAssignment(WTFMove(slotAssignment))
    6565{
     
    8383StyleResolver& ShadowRoot::styleResolver()
    8484{
    85     if (m_type == Type::UserAgent)
     85    if (m_type == Mode::UserAgent)
    8686        return document().userAgentShadowTreeStyleResolver();
    8787
  • trunk/Source/WebCore/dom/ShadowRoot.h

    r202091 r204543  
    4343class ShadowRoot final : public DocumentFragment, public TreeScope {
    4444public:
    45     enum class Type : uint8_t {
     45    enum class Mode : uint8_t {
    4646        UserAgent = 0,
    4747        Closed,
     
    4949    };
    5050
    51     static Ref<ShadowRoot> create(Document& document, Type type)
     51    static Ref<ShadowRoot> create(Document& document, Mode type)
    5252    {
    5353        return adoptRef(*new ShadowRoot(document, type));
     
    8080    Element* activeElement() const;
    8181
    82     Type type() const { return m_type; }
     82    Mode mode() const { return m_type; }
    8383
    8484    void removeAllEventListeners() override;
     
    9898
    9999protected:
    100     ShadowRoot(Document&, Type);
     100    ShadowRoot(Document&, Mode);
    101101
    102102    ShadowRoot(Document&, std::unique_ptr<SlotAssignment>&&);
     
    111111
    112112    bool m_resetStyleInheritance { false };
    113     Type m_type { Type::UserAgent };
     113    Mode m_type { Mode::UserAgent };
    114114
    115115    Element* m_host { nullptr };
  • trunk/Source/WebCore/dom/ShadowRoot.idl

    r202091 r204543  
    2828    JSGenerateToJSObject
    2929] interface ShadowRoot : DocumentFragment {
     30    readonly attribute ShadowRootMode   mode;
    3031    readonly attribute Element          activeElement;
    3132    readonly attribute Element          host;
     
    3334    [TreatNullAs=EmptyString, SetterRaisesException] attribute DOMString innerHTML;
    3435};
     36
     37// "user-agent" is a WebKit extension that is not exposed to the Web.
     38enum ShadowRootMode { "user-agent", "closed", "open" };
  • trunk/Source/WebCore/dom/SlotAssignment.cpp

    r203324 r204543  
    159159    }
    160160
    161     if (shadowRoot.type() == ShadowRoot::Type::UserAgent)
     161    if (shadowRoot.mode() == ShadowRoot::Mode::UserAgent)
    162162        return;
    163163
  • trunk/Source/WebCore/html/HTMLSummaryElement.cpp

    r202105 r204543  
    4141{
    4242    Ref<HTMLSummaryElement> summary = adoptRef(*new HTMLSummaryElement(tagName, document));
    43     summary->addShadowRoot(ShadowRoot::create(document, ShadowRoot::Type::UserAgent));
     43    summary->addShadowRoot(ShadowRoot::create(document, ShadowRoot::Mode::UserAgent));
    4444    return summary;
    4545}
  • trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp

    r204499 r204543  
    12811281}
    12821282
    1283 static Inspector::Protocol::DOM::ShadowRootType shadowRootType(ShadowRoot::Type type)
    1284 {
    1285     switch (type) {
    1286     case ShadowRoot::Type::UserAgent:
     1283static Inspector::Protocol::DOM::ShadowRootType shadowRootType(ShadowRoot::Mode mode)
     1284{
     1285    switch (mode) {
     1286    case ShadowRoot::Mode::UserAgent:
    12871287        return Inspector::Protocol::DOM::ShadowRootType::UserAgent;
    1288     case ShadowRoot::Type::Closed:
     1288    case ShadowRoot::Mode::Closed:
    12891289        return Inspector::Protocol::DOM::ShadowRootType::Closed;
    1290     case ShadowRoot::Type::Open:
     1290    case ShadowRoot::Mode::Open:
    12911291        return Inspector::Protocol::DOM::ShadowRootType::Open;
    12921292    }
     
    14081408    } else if (is<ShadowRoot>(*node)) {
    14091409        ShadowRoot& shadowRoot = downcast<ShadowRoot>(*node);
    1410         value->setShadowRootType(shadowRootType(shadowRoot.type()));
     1410        value->setShadowRootType(shadowRootType(shadowRoot.mode()));
    14111411    }
    14121412
  • trunk/Source/WebCore/rendering/HitTestResult.cpp

    r203338 r204543  
    128128    if (node.isInShadowTree()) {
    129129        if (ShadowRoot* root = node.containingShadowRoot()) {
    130             if (root->type() == ShadowRoot::Type::UserAgent)
     130            if (root->mode() == ShadowRoot::Mode::UserAgent)
    131131                return root->host();
    132132        }
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r203738 r204543  
    15841584
    15851585    if (ShadowRoot* root = element()->containingShadowRoot()) {
    1586         if (root->type() == ShadowRoot::Type::UserAgent) {
     1586        if (root->mode() == ShadowRoot::Mode::UserAgent) {
    15871587            if (Element* shadowHost = element()->shadowHost())
    15881588                return shadowHost->renderer()->getUncachedPseudoStyle(PseudoStyleRequest(SELECTION));
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r204047 r204543  
    30973097    if (Element* element = renderer.element()) {
    30983098        if (ShadowRoot* shadowRoot = element->containingShadowRoot()) {
    3099             if (shadowRoot->type() == ShadowRoot::Type::UserAgent)
     3099            if (shadowRoot->mode() == ShadowRoot::Mode::UserAgent)
    31003100                return shadowRoot->host()->renderer();
    31013101        }
  • trunk/Source/WebCore/svg/SVGElement.cpp

    r204459 r204543  
    439439    if (!root)
    440440        return nullptr;
    441     if (root->type() != ShadowRoot::Type::UserAgent)
     441    if (root->mode() != ShadowRoot::Mode::UserAgent)
    442442        return nullptr;
    443443    auto* host = root->host();
  • trunk/Source/WebCore/testing/Internals.cpp

    r204394 r204543  
    823823    }
    824824
    825     switch (downcast<ShadowRoot>(root).type()) {
    826     case ShadowRoot::Type::UserAgent:
     825    switch (downcast<ShadowRoot>(root).mode()) {
     826    case ShadowRoot::Mode::UserAgent:
    827827        return String("UserAgentShadowRoot");
    828     case ShadowRoot::Type::Closed:
     828    case ShadowRoot::Mode::Closed:
    829829        return String("ClosedShadowRoot");
    830     case ShadowRoot::Type::Open:
     830    case ShadowRoot::Mode::Open:
    831831        return String("OpenShadowRoot");
    832832    default:
Note: See TracChangeset for help on using the changeset viewer.