Changeset 237932 in webkit


Ignore:
Timestamp:
Nov 7, 2018 11:33:54 AM (6 years ago)
Author:
mitz@apple.com
Message:

Add a pseudoclass that matches img elements that are backed by an attachment
https://bugs.webkit.org/show_bug.cgi?id=191286
<rdar://problem/45823554>

Reviewed by Dean Jackson.

Source/WebCore:

Test: fast/css/has-attachment.html

Added a :has-attachment pseudoclass, enabled only when the attachment element is enabled at
runtime, that matches elements (currently only img elements qualify) that have an attachment
element in their shadow DOM.

  • css/CSSSelector.cpp:

(WebCore::CSSSelector::selectorText const): Handle the new PseudoClassHasAttachment value.

  • css/CSSSelector.h: Added a new value to the PseudoClassType enum.
  • css/SelectorChecker.cpp:

(WebCore::SelectorChecker::checkOne const): Check the new PseudoClassHasAttachment value

using the new hasAttachment test function.

  • css/SelectorCheckerTestFunctions.h:

(WebCore::hasAttachment): Added. Tests if the element is an img element that has an

attachment.

  • css/SelectorPseudoClassAndCompatibilityElementMap.in: Added has-attachment.
  • css/parser/CSSParserContext.cpp:

(WebCore::CSSParserContext::CSSParserContext): Initialize new attachmentEnabled member based

on RuntimeEnabledFeatures.

(WebCore::operator==): Compare new attachmentEnabled member.

  • css/parser/CSSParserContext.h:

(WebCore::CSSParserContextHash::hash): Include new attachmentEnabled member.

  • css/parser/CSSSelectorParser.cpp:

(WebCore::CSSSelectorParser::consumePseudo): Reject :has-attachment if the attachment

element is not enabled.

  • cssjit/SelectorCompiler.cpp:

(WebCore::SelectorCompiler::addPseudoClassType): Handle PseudoClassHasAttachment.

LayoutTests:

  • fast/css/has-attachment-expected.txt: Added.
  • fast/css/has-attachment.html: Added.
  • platform/win/TestExpectations:
Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r237929 r237932  
     12018-11-07  Dan Bernstein  <mitz@apple.com>
     2
     3        Add a pseudoclass that matches img elements that are backed by an attachment
     4        https://bugs.webkit.org/show_bug.cgi?id=191286
     5        <rdar://problem/45823554>
     6
     7        Reviewed by Dean Jackson.
     8
     9        * fast/css/has-attachment-expected.txt: Added.
     10        * fast/css/has-attachment.html: Added.
     11        * platform/win/TestExpectations:
     12
    1132018-11-07  Ali Juma  <ajuma@chromium.org>
    214
  • trunk/LayoutTests/platform/win/TestExpectations

    r237927 r237932  
    626626# TODO Attachment elements do not provide a custom renderer
    627627webkit.org/b/142260 fast/attachment [ Skip ]
     628webkit.org/b/142260 fast/css/has-attachment.html [ Skip ]
    628629
    629630# TODO APNG is not supported
  • trunk/Source/WebCore/ChangeLog

    r237930 r237932  
     12018-11-07  Dan Bernstein  <mitz@apple.com>
     2
     3        Add a pseudoclass that matches img elements that are backed by an attachment
     4        https://bugs.webkit.org/show_bug.cgi?id=191286
     5        <rdar://problem/45823554>
     6
     7        Reviewed by Dean Jackson.
     8
     9        Test: fast/css/has-attachment.html
     10
     11        Added a :has-attachment pseudoclass, enabled only when the attachment element is enabled at
     12        runtime, that matches elements (currently only img elements qualify) that have an attachment
     13        element in their shadow DOM.
     14
     15        * css/CSSSelector.cpp:
     16        (WebCore::CSSSelector::selectorText const): Handle the new PseudoClassHasAttachment value.
     17        * css/CSSSelector.h: Added a new value to the PseudoClassType enum.
     18
     19        * css/SelectorChecker.cpp:
     20        (WebCore::SelectorChecker::checkOne const): Check the new PseudoClassHasAttachment value
     21          using the new hasAttachment test function.
     22
     23        * css/SelectorCheckerTestFunctions.h:
     24        (WebCore::hasAttachment): Added. Tests if the element is an img element that has an
     25          attachment.
     26
     27        * css/SelectorPseudoClassAndCompatibilityElementMap.in: Added has-attachment.
     28
     29        * css/parser/CSSParserContext.cpp:
     30        (WebCore::CSSParserContext::CSSParserContext): Initialize new attachmentEnabled member based
     31          on RuntimeEnabledFeatures.
     32        (WebCore::operator==): Compare new attachmentEnabled member.
     33        * css/parser/CSSParserContext.h:
     34        (WebCore::CSSParserContextHash::hash): Include new attachmentEnabled member.
     35
     36        * css/parser/CSSSelectorParser.cpp:
     37        (WebCore::CSSSelectorParser::consumePseudo): Reject :has-attachment if the attachment
     38          element is not enabled.
     39
     40        * cssjit/SelectorCompiler.cpp:
     41        (WebCore::SelectorCompiler::addPseudoClassType): Handle PseudoClassHasAttachment.
     42
    1432018-11-07  Don Olmstead  <don.olmstead@sony.com>
    244
  • trunk/Source/WebCore/css/CSSSelector.cpp

    r236284 r237932  
    506506                break;
    507507#endif
     508#if ENABLE(ATTACHMENT_ELEMENT)
     509            case CSSSelector::PseudoClassHasAttachment:
     510                str.appendLiteral(":has-attachment");
     511                break;
     512#endif
    508513            case CSSSelector::PseudoClassHorizontal:
    509514                str.appendLiteral(":horizontal");
  • trunk/Source/WebCore/css/CSSSelector.h

    r236284 r237932  
    163163            PseudoClassHost,
    164164            PseudoClassDefined,
     165#if ENABLE(ATTACHMENT_ELEMENT)
     166            PseudoClassHasAttachment,
     167#endif
    165168        };
    166169
  • trunk/Source/WebCore/css/SelectorChecker.cpp

    r235917 r237932  
    11101110        case CSSSelector::PseudoClassRole:
    11111111            return false;
     1112#endif
     1113
     1114#if ENABLE(ATTACHMENT_ELEMENT)
     1115        case CSSSelector::PseudoClassHasAttachment:
     1116            return hasAttachment(element);
    11121117#endif
    11131118
  • trunk/Source/WebCore/css/SelectorCheckerTestFunctions.h

    r233066 r237932  
    3535#include <wtf/Compiler.h>
    3636
     37#if ENABLE(ATTACHMENT_ELEMENT)
     38#include "HTMLAttachmentElement.h"
     39#endif
     40
    3741#if ENABLE(VIDEO_TRACK)
    3842#include "WebVTTElement.h"
     
    130134    return !page->focusController().isActive();
    131135}
     136
     137#if ENABLE(ATTACHMENT_ELEMENT)
     138ALWAYS_INLINE bool hasAttachment(const Element& element)
     139{
     140    return is<HTMLImageElement>(element) && downcast<HTMLImageElement>(element).attachmentElement();
     141}
     142#endif
    132143
    133144ALWAYS_INLINE bool containslanguageSubtagMatchingRange(StringView language, StringView range, unsigned languageLength, unsigned& position)
  • trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in

    r233066 r237932  
    2929focus
    3030focus-within
     31#if ENABLE(ATTACHMENT_ELEMENT)
     32has-attachment
     33#endif
    3134horizontal
    3235host, PseudoClassHost, PseudoElementUnknown
  • trunk/Source/WebCore/css/parser/CSSParserContext.cpp

    r237402 r237932  
    2929#include "Document.h"
    3030#include "Page.h"
     31#include "RuntimeEnabledFeatures.h"
    3132#include "Settings.h"
    3233#include <wtf/NeverDestroyed.h>
     
    6970    constantPropertiesEnabled = document.settings().constantPropertiesEnabled();
    7071    colorFilterEnabled = document.settings().colorFilterEnabled();
     72#if ENABLE(ATTACHMENT_ELEMENT)
     73    attachmentEnabled = RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled();
     74#endif
    7175    deferredCSSParserEnabled = document.settings().deferredCSSParserEnabled();
    7276    useSystemAppearance = document.page() ? document.page()->useSystemAppearance() : false;
     
    9599        && a.constantPropertiesEnabled == b.constantPropertiesEnabled
    96100        && a.colorFilterEnabled == b.colorFilterEnabled
     101#if ENABLE(ATTACHMENT_ELEMENT)
     102        && a.attachmentEnabled == b.attachmentEnabled
     103#endif
    97104        && a.deferredCSSParserEnabled == b.deferredCSSParserEnabled
    98105        && a.hasDocumentSecurityOrigin == b.hasDocumentSecurityOrigin
  • trunk/Source/WebCore/css/parser/CSSParserContext.h

    r237402 r237932  
    5656    bool constantPropertiesEnabled { false };
    5757    bool colorFilterEnabled { false };
     58#if ENABLE(ATTACHMENT_ELEMENT)
     59    bool attachmentEnabled { false };
     60#endif
    5861    bool deferredCSSParserEnabled { false };
    5962   
     
    99102            & key.hasDocumentSecurityOrigin                 << 9
    100103            & key.useSystemAppearance                       << 10
    101             & key.mode                                      << 11; // Keep this last.
     104#if ENABLE(ATTACHMENT_ELEMENT)
     105            & key.attachmentEnabled                         << 11
     106#endif
     107            & key.mode                                      << 12; // Keep this last.
    102108        hash ^= WTF::intHash(bits);
    103109        return hash;
  • trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp

    r235002 r237932  
    494494    auto value = StringView { lowercasedValue };
    495495
    496     if (colons == 1)
     496    if (colons == 1) {
    497497        selector = std::unique_ptr<CSSParserSelector>(CSSParserSelector::parsePseudoClassSelectorFromStringView(value));
    498     else {
     498#if ENABLE(ATTACHMENT_ELEMENT)
     499        if (!m_context.attachmentEnabled && selector && selector->match() == CSSSelector::PseudoClass && selector->pseudoClassType() == CSSSelector::PseudoClassHasAttachment)
     500            return nullptr;
     501#endif
     502    } else {
    499503        selector = std::unique_ptr<CSSParserSelector>(CSSParserSelector::parsePseudoElementSelectorFromStringView(value));
    500504#if ENABLE(VIDEO_TRACK)
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r237173 r237932  
    620620#endif
    621621
     622#if ENABLE(ATTACHMENT_ELEMENT)
     623    case CSSSelector::PseudoClassHasAttachment:
     624        fragment.unoptimizedPseudoClasses.append(JSC::FunctionPtr<CSSOperationPtrTag>(hasAttachment));
     625        return FunctionType::SimpleSelectorChecker;
     626#endif
     627
    622628    // These pseudo-classes only have meaning with scrollbars.
    623629    case CSSSelector::PseudoClassHorizontal:
Note: See TracChangeset for help on using the changeset viewer.