⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286151 in webkit


Ignore:
Timestamp:
Nov 24, 2021, 10:29:11 AM (5 years ago)
Author:
dino@apple.com
Message:

Make DocumentClass an OptionSet
https://bugs.webkit.org/show_bug.cgi?id=233274

Reviewed by Sam Weinig.

DocumentClassFlags was playing the part of an OptionSet, so
it might as well be one.

  • cssjit/SelectorCompiler.cpp:

(WebCore::SelectorCompiler::testIsHTMLClassOnDocument): Use
branchTest16 here, as DocumentClass is a 16-bit value.

  • dom/Document.cpp: Use new type.

(WebCore::Document::Document):

  • dom/Document.h: Make a new type alias DocumentClasses

that is OptionSet<DocumentClass>, use that for m_documentClasses,
and change all the is*Document methods to test the OptionSet.
(WebCore::Document::isHTMLDocument const):
(WebCore::Document::isXHTMLDocument const):
(WebCore::Document::isXMLDocument const):
(WebCore::Document::isImageDocument const):
(WebCore::Document::isSVGDocument const):
(WebCore::Document::isPluginDocument const):
(WebCore::Document::isMediaDocument const):
(WebCore::Document::isTextDocument const):
(WebCore::Document::isModelDocument const):
(WebCore::Document::documentClassesMemoryOffset):
(WebCore::Document::isHTMLDocumentClassFlag):
(WebCore::Document::Document):

  • dom/XMLDocument.h: Use new type.

(WebCore::XMLDocument::createXHTML):
(WebCore::XMLDocument::XMLDocument):

  • html/HTMLDocument.cpp: Ditto.

(WebCore::HTMLDocument::createSynthesizedDocument):
(WebCore::HTMLDocument::HTMLDocument):

  • html/HTMLDocument.h: Ditto.

(WebCore::HTMLDocument::HTMLDocument):
(WebCore::HTMLDocument::create):

  • html/ImageDocument.cpp: Ditto.

(WebCore::ImageDocument::ImageDocument):

  • html/MediaDocument.cpp: Ditto.

(WebCore::MediaDocument::MediaDocument):

  • html/ModelDocument.cpp: Ditto.

(WebCore::ModelDocument::ModelDocument):

  • html/PluginDocument.cpp: Ditto.

(WebCore::PluginDocument::PluginDocument):

  • html/TextDocument.cpp: Ditto.

(WebCore::TextDocument::TextDocument):

  • svg/SVGDocument.cpp: Ditto.

(WebCore::SVGDocument::SVGDocument):

Location:
trunk/Source/WebCore
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286150 r286151  
     12021-11-24  Dean Jackson  <dino@apple.com>
     2
     3        Make DocumentClass an OptionSet
     4        https://bugs.webkit.org/show_bug.cgi?id=233274
     5
     6        Reviewed by Sam Weinig.
     7
     8        DocumentClassFlags was playing the part of an OptionSet, so
     9        it might as well be one.
     10
     11        * cssjit/SelectorCompiler.cpp:
     12        (WebCore::SelectorCompiler::testIsHTMLClassOnDocument): Use
     13        branchTest16 here, as DocumentClass is a 16-bit value.
     14
     15        * dom/Document.cpp: Use new type.
     16        (WebCore::Document::Document):
     17        * dom/Document.h: Make a new type alias DocumentClasses
     18        that is OptionSet<DocumentClass>, use that for m_documentClasses,
     19        and change all the is*Document methods to test the OptionSet.
     20        (WebCore::Document::isHTMLDocument const):
     21        (WebCore::Document::isXHTMLDocument const):
     22        (WebCore::Document::isXMLDocument const):
     23        (WebCore::Document::isImageDocument const):
     24        (WebCore::Document::isSVGDocument const):
     25        (WebCore::Document::isPluginDocument const):
     26        (WebCore::Document::isMediaDocument const):
     27        (WebCore::Document::isTextDocument const):
     28        (WebCore::Document::isModelDocument const):
     29        (WebCore::Document::documentClassesMemoryOffset):
     30        (WebCore::Document::isHTMLDocumentClassFlag):
     31        (WebCore::Document::Document):
     32        * dom/XMLDocument.h: Use new type.
     33        (WebCore::XMLDocument::createXHTML):
     34        (WebCore::XMLDocument::XMLDocument):
     35        * html/HTMLDocument.cpp: Ditto.
     36        (WebCore::HTMLDocument::createSynthesizedDocument):
     37        (WebCore::HTMLDocument::HTMLDocument):
     38        * html/HTMLDocument.h: Ditto.
     39        (WebCore::HTMLDocument::HTMLDocument):
     40        (WebCore::HTMLDocument::create):
     41        * html/ImageDocument.cpp: Ditto.
     42        (WebCore::ImageDocument::ImageDocument):
     43        * html/MediaDocument.cpp: Ditto.
     44        (WebCore::MediaDocument::MediaDocument):
     45        * html/ModelDocument.cpp: Ditto.
     46        (WebCore::ModelDocument::ModelDocument):
     47        * html/PluginDocument.cpp: Ditto.
     48        (WebCore::PluginDocument::PluginDocument):
     49        * html/TextDocument.cpp: Ditto.
     50        (WebCore::TextDocument::TextDocument):
     51        * svg/SVGDocument.cpp: Ditto.
     52        (WebCore::SVGDocument::SVGDocument):
     53
    1542021-11-24  Patrick Griffis  <pgriffis@igalia.com>
    255
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r285610 r286151  
    33353335static inline Assembler::Jump testIsHTMLClassOnDocument(Assembler::ResultCondition condition, Assembler& assembler, Assembler::RegisterID documentAddress)
    33363336{
    3337     return assembler.branchTest32(condition, Assembler::Address(documentAddress, Document::documentClassesMemoryOffset()), Assembler::TrustedImm32(Document::isHTMLDocumentClassFlag()));
     3337    static_assert(sizeof(Document::DocumentClass) == 2, "Document::DocumentClass must be a 16-bit value for branchTest16");
     3338    return assembler.branchTest16(condition, Assembler::Address(documentAddress, Document::documentClassesMemoryOffset()), Assembler::TrustedImm32(Document::isHTMLDocumentClassFlag()));
    33383339}
    33393340
  • trunk/Source/WebCore/dom/Document.cpp

    r286063 r286151  
    608608}
    609609
    610 Document::Document(Frame* frame, const Settings& settings, const URL& url, DocumentClassFlags documentClasses, unsigned constructionFlags)
     610Document::Document(Frame* frame, const Settings& settings, const URL& url, DocumentClasses documentClasses, unsigned constructionFlags)
    611611    : ContainerNode(*this, CreateDocument)
    612612    , TreeScope(*this)
     
    688688Ref<Document> Document::create(Document& contextDocument)
    689689{
    690     auto document = adoptRef(*new Document(nullptr, contextDocument.m_settings, URL()));
     690    auto document = adoptRef(*new Document(nullptr, contextDocument.m_settings, URL(), { }));
    691691    document->setContextDocument(contextDocument);
    692692    document->setSecurityOriginPolicy(contextDocument.securityOriginPolicy());
     
    696696Ref<Document> Document::createNonRenderedPlaceholder(Frame& frame, const URL& url)
    697697{
    698     return adoptRef(*new Document(&frame, frame.settings(), url, DefaultDocumentClass, NonRenderedPlaceholder));
     698    return adoptRef(*new Document(&frame, frame.settings(), url, { }, NonRenderedPlaceholder));
    699699}
    700700
  • trunk/Source/WebCore/dom/Document.h

    r286012 r286151  
    292292using EventTargetSet = HashCountedSet<Node*>;
    293293
    294 enum DocumentClass {
    295     DefaultDocumentClass = 0,
    296     HTMLDocumentClass = 1,
    297     XHTMLDocumentClass = 1 << 1,
    298     ImageDocumentClass = 1 << 2,
    299     PluginDocumentClass = 1 << 3,
    300     MediaDocumentClass = 1 << 4,
    301     SVGDocumentClass = 1 << 5,
    302     TextDocumentClass = 1 << 6,
    303     XMLDocumentClass = 1 << 7,
    304 #if ENABLE(MODEL_ELEMENT)
    305     ModelDocumentClass = 1 << 8,
    306 #endif
    307 };
    308 using DocumentClassFlags = uint16_t;
    309 
    310294enum class DocumentCompatibilityMode : unsigned char {
    311295    NoQuirksMode = 1,
     
    533517    // Other methods (not part of DOM)
    534518    bool isSynthesized() const { return m_isSynthesized; }
    535     bool isHTMLDocument() const { return m_documentClasses & HTMLDocumentClass; }
    536     bool isXHTMLDocument() const { return m_documentClasses & XHTMLDocumentClass; }
    537     bool isXMLDocument() const { return m_documentClasses & XMLDocumentClass; }
    538     bool isImageDocument() const { return m_documentClasses & ImageDocumentClass; }
    539     bool isSVGDocument() const { return m_documentClasses & SVGDocumentClass; }
    540     bool isPluginDocument() const { return m_documentClasses & PluginDocumentClass; }
    541     bool isMediaDocument() const { return m_documentClasses & MediaDocumentClass; }
    542     bool isTextDocument() const { return m_documentClasses & TextDocumentClass; }
     519
     520    enum class DocumentClass : uint16_t {
     521        HTML = 1,
     522        XHTML = 1 << 1,
     523        Image = 1 << 2,
     524        Plugin = 1 << 3,
     525        Media = 1 << 4,
     526        SVG = 1 << 5,
     527        Text = 1 << 6,
     528        XML = 1 << 7,
    543529#if ENABLE(MODEL_ELEMENT)
    544     bool isModelDocument() const { return m_documentClasses & ModelDocumentClass; }
     530        Model = 1 << 8,
     531#endif
     532    };
     533
     534    using DocumentClasses = OptionSet<DocumentClass>;
     535
     536    bool isHTMLDocument() const { return m_documentClasses.contains(DocumentClass::HTML); }
     537    bool isXHTMLDocument() const { return m_documentClasses.contains(DocumentClass::XHTML); }
     538    bool isXMLDocument() const { return m_documentClasses.contains(DocumentClass::XML); }
     539    bool isImageDocument() const { return m_documentClasses.contains(DocumentClass::Image); }
     540    bool isSVGDocument() const { return m_documentClasses.contains(DocumentClass::SVG); }
     541    bool isPluginDocument() const { return m_documentClasses.contains(DocumentClass::Plugin); }
     542    bool isMediaDocument() const { return m_documentClasses.contains(DocumentClass::Media); }
     543    bool isTextDocument() const { return m_documentClasses.contains(DocumentClass::Text); }
     544#if ENABLE(MODEL_ELEMENT)
     545    bool isModelDocument() const { return m_documentClasses.contains(DocumentClass::Model); }
    545546#endif
    546547    bool hasSVGRootNode() const;
     
    548549
    549550    static ptrdiff_t documentClassesMemoryOffset() { return OBJECT_OFFSETOF(Document, m_documentClasses); }
    550     static uint32_t isHTMLDocumentClassFlag() { return HTMLDocumentClass; }
     551    static uint32_t isHTMLDocumentClassFlag() { return static_cast<uint32_t>(DocumentClass::HTML); }
    551552
    552553    bool isSrcdocDocument() const { return m_isSrcdocDocument; }
     
    16651666protected:
    16661667    enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
    1667     WEBCORE_EXPORT Document(Frame*, const Settings&, const URL&, DocumentClassFlags = DefaultDocumentClass, unsigned constructionFlags = 0);
     1668    WEBCORE_EXPORT Document(Frame*, const Settings&, const URL&, DocumentClasses = { }, unsigned constructionFlags = 0);
    16681669
    16691670    void clearXMLVersion() { m_xmlVersion = String(); }
     
    19381939    std::unique_ptr<SelectorQueryCache> m_selectorQueryCache;
    19391940
    1940     DocumentClassFlags m_documentClasses;
     1941    DocumentClasses m_documentClasses;
    19411942
    19421943    RenderPtr<RenderView> m_renderView;
  • trunk/Source/WebCore/dom/XMLDocument.h

    r268114 r286151  
    3535    static Ref<XMLDocument> create(Frame* frame, const Settings& settings, const URL& url)
    3636    {
    37         return adoptRef(*new XMLDocument(frame, settings, url));
     37        return adoptRef(*new XMLDocument(frame, settings, url, { DocumentClass::XML }));
    3838    }
    3939
    4040    static Ref<XMLDocument> createXHTML(Frame* frame, const Settings& settings, const URL& url)
    4141    {
    42         return adoptRef(*new XMLDocument(frame, settings, url, XHTMLDocumentClass));
     42        return adoptRef(*new XMLDocument(frame, settings, url, { DocumentClass::XML, DocumentClass::XHTML }));
    4343    }
    4444
    4545protected:
    46     XMLDocument(Frame* frame, const Settings& settings, const URL& url, unsigned documentClasses = DefaultDocumentClass)
    47         : Document(frame, settings, url, XMLDocumentClass | documentClasses)
     46    XMLDocument(Frame* frame, const Settings& settings, const URL& url, DocumentClasses documentClasses = { })
     47        : Document(frame, settings, url, documentClasses | DocumentClasses(DocumentClass::XML))
    4848    {
    4949    }
  • trunk/Source/WebCore/html/HTMLDocument.cpp

    r284075 r286151  
    9090Ref<HTMLDocument> HTMLDocument::createSynthesizedDocument(Frame& frame, const URL& url)
    9191{
    92     return adoptRef(*new HTMLDocument(&frame, frame.settings(), url, HTMLDocumentClass, Synthesized));
    93 }
    94 
    95 HTMLDocument::HTMLDocument(Frame* frame, const Settings& settings, const URL& url, DocumentClassFlags documentClasses, unsigned constructionFlags)
    96     : Document(frame, settings, url, documentClasses | HTMLDocumentClass, constructionFlags)
     92    return adoptRef(*new HTMLDocument(&frame, frame.settings(), url, { DocumentClass::HTML }, Synthesized));
     93}
     94
     95HTMLDocument::HTMLDocument(Frame* frame, const Settings& settings, const URL& url, DocumentClasses documentClasses, unsigned constructionFlags)
     96    : Document(frame, settings, url, documentClasses | DocumentClasses(DocumentClass::HTML), constructionFlags)
    9797{
    9898    clearXMLVersion();
  • trunk/Source/WebCore/html/HTMLDocument.h

    r284075 r286151  
    5555
    5656protected:
    57     HTMLDocument(Frame*, const Settings&, const URL&, DocumentClassFlags = 0, unsigned constructionFlags = 0);
     57    HTMLDocument(Frame*, const Settings&, const URL&, DocumentClasses = { }, unsigned constructionFlags = 0);
    5858
    5959private:
     
    6868inline Ref<HTMLDocument> HTMLDocument::create(Frame* frame, const Settings& settings, const URL& url)
    6969{
    70     return adoptRef(*new HTMLDocument(frame, settings, url, HTMLDocumentClass));
     70    return adoptRef(*new HTMLDocument(frame, settings, url, { DocumentClass::HTML }));
    7171}
    7272
  • trunk/Source/WebCore/html/ImageDocument.cpp

    r284901 r286151  
    199199
    200200ImageDocument::ImageDocument(Frame& frame, const URL& url)
    201     : HTMLDocument(&frame, frame.settings(), url, ImageDocumentClass)
     201    : HTMLDocument(&frame, frame.settings(), url, { DocumentClass::Image })
    202202    , m_imageElement(nullptr)
    203203    , m_imageSizeIsKnown(false)
  • trunk/Source/WebCore/html/MediaDocument.cpp

    r282799 r286151  
    141141   
    142142MediaDocument::MediaDocument(Frame* frame, const Settings& settings, const URL& url)
    143     : HTMLDocument(frame, settings, url, MediaDocumentClass)
     143    : HTMLDocument(frame, settings, url, { DocumentClass::Media })
    144144{
    145145    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
  • trunk/Source/WebCore/html/ModelDocument.cpp

    r285936 r286151  
    139139
    140140ModelDocument::ModelDocument(Frame* frame, const Settings& settings, const URL& url)
    141     : HTMLDocument(frame, settings, url, ModelDocumentClass)
     141    : HTMLDocument(frame, settings, url, { DocumentClass::Model })
    142142{
    143143    if (frame)
  • trunk/Source/WebCore/html/PluginDocument.cpp

    r282799 r286151  
    145145
    146146PluginDocument::PluginDocument(Frame& frame, const URL& url)
    147     : HTMLDocument(&frame, frame.settings(), url, PluginDocumentClass)
     147    : HTMLDocument(&frame, frame.settings(), url, { DocumentClass::Plugin })
    148148{
    149149    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
  • trunk/Source/WebCore/html/TextDocument.cpp

    r268114 r286151  
    3434
    3535TextDocument::TextDocument(Frame* frame, const Settings& settings, const URL& url)
    36     : HTMLDocument(frame, settings, url, TextDocumentClass)
     36    : HTMLDocument(frame, settings, url, { DocumentClass::Text })
    3737{
    3838    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
  • trunk/Source/WebCore/svg/SVGDocument.cpp

    r268114 r286151  
    3333
    3434SVGDocument::SVGDocument(Frame* frame, const Settings& settings, const URL& url)
    35     : XMLDocument(frame, settings, url, SVGDocumentClass)
     35    : XMLDocument(frame, settings, url, { DocumentClass::SVG })
    3636{
    3737}
Note: See TracChangeset for help on using the changeset viewer.