Title: [286151] trunk/Source/WebCore
Revision
286151
Author
[email protected]
Date
2021-11-24 10:29:11 -0800 (Wed, 24 Nov 2021)

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

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (286150 => 286151)


--- trunk/Source/WebCore/ChangeLog	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/ChangeLog	2021-11-24 18:29:11 UTC (rev 286151)
@@ -1,3 +1,56 @@
+2021-11-24  Dean Jackson  <[email protected]>
+
+        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):
+
 2021-11-24  Patrick Griffis  <[email protected]>
 
         CSP: Implement submitting samples in violation reports

Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (286150 => 286151)


--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -3334,7 +3334,8 @@
 
 static inline Assembler::Jump testIsHTMLClassOnDocument(Assembler::ResultCondition condition, Assembler& assembler, Assembler::RegisterID documentAddress)
 {
-    return assembler.branchTest32(condition, Assembler::Address(documentAddress, Document::documentClassesMemoryOffset()), Assembler::TrustedImm32(Document::isHTMLDocumentClassFlag()));
+    static_assert(sizeof(Document::DocumentClass) == 2, "Document::DocumentClass must be a 16-bit value for branchTest16");
+    return assembler.branchTest16(condition, Assembler::Address(documentAddress, Document::documentClassesMemoryOffset()), Assembler::TrustedImm32(Document::isHTMLDocumentClassFlag()));
 }
 
 void SelectorCodeGenerator::generateElementAttributeValueExactMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AtomString& expectedValue, AttributeCaseSensitivity valueCaseSensitivity)

Modified: trunk/Source/WebCore/dom/Document.cpp (286150 => 286151)


--- trunk/Source/WebCore/dom/Document.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -607,7 +607,7 @@
     return CachedResourceLoader::create(nullptr);
 }
 
-Document::Document(Frame* frame, const Settings& settings, const URL& url, DocumentClassFlags documentClasses, unsigned constructionFlags)
+Document::Document(Frame* frame, const Settings& settings, const URL& url, DocumentClasses documentClasses, unsigned constructionFlags)
     : ContainerNode(*this, CreateDocument)
     , TreeScope(*this)
     , FrameDestructionObserver(frame)
@@ -687,7 +687,7 @@
 
 Ref<Document> Document::create(Document& contextDocument)
 {
-    auto document = adoptRef(*new Document(nullptr, contextDocument.m_settings, URL()));
+    auto document = adoptRef(*new Document(nullptr, contextDocument.m_settings, URL(), { }));
     document->setContextDocument(contextDocument);
     document->setSecurityOriginPolicy(contextDocument.securityOriginPolicy());
     return document;
@@ -695,7 +695,7 @@
 
 Ref<Document> Document::createNonRenderedPlaceholder(Frame& frame, const URL& url)
 {
-    return adoptRef(*new Document(&frame, frame.settings(), url, DefaultDocumentClass, NonRenderedPlaceholder));
+    return adoptRef(*new Document(&frame, frame.settings(), url, { }, NonRenderedPlaceholder));
 }
 
 Document::~Document()

Modified: trunk/Source/WebCore/dom/Document.h (286150 => 286151)


--- trunk/Source/WebCore/dom/Document.h	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/dom/Document.h	2021-11-24 18:29:11 UTC (rev 286151)
@@ -291,22 +291,6 @@
 enum class EventHandlerRemoval { One, All };
 using EventTargetSet = HashCountedSet<Node*>;
 
-enum DocumentClass {
-    DefaultDocumentClass = 0,
-    HTMLDocumentClass = 1,
-    XHTMLDocumentClass = 1 << 1,
-    ImageDocumentClass = 1 << 2,
-    PluginDocumentClass = 1 << 3,
-    MediaDocumentClass = 1 << 4,
-    SVGDocumentClass = 1 << 5,
-    TextDocumentClass = 1 << 6,
-    XMLDocumentClass = 1 << 7,
-#if ENABLE(MODEL_ELEMENT)
-    ModelDocumentClass = 1 << 8,
-#endif
-};
-using DocumentClassFlags = uint16_t;
-
 enum class DocumentCompatibilityMode : unsigned char {
     NoQuirksMode = 1,
     QuirksMode = 1 << 1,
@@ -532,22 +516,39 @@
 
     // Other methods (not part of DOM)
     bool isSynthesized() const { return m_isSynthesized; }
-    bool isHTMLDocument() const { return m_documentClasses & HTMLDocumentClass; }
-    bool isXHTMLDocument() const { return m_documentClasses & XHTMLDocumentClass; }
-    bool isXMLDocument() const { return m_documentClasses & XMLDocumentClass; }
-    bool isImageDocument() const { return m_documentClasses & ImageDocumentClass; }
-    bool isSVGDocument() const { return m_documentClasses & SVGDocumentClass; }
-    bool isPluginDocument() const { return m_documentClasses & PluginDocumentClass; }
-    bool isMediaDocument() const { return m_documentClasses & MediaDocumentClass; }
-    bool isTextDocument() const { return m_documentClasses & TextDocumentClass; }
+
+    enum class DocumentClass : uint16_t {
+        HTML = 1,
+        XHTML = 1 << 1,
+        Image = 1 << 2,
+        Plugin = 1 << 3,
+        Media = 1 << 4,
+        SVG = 1 << 5,
+        Text = 1 << 6,
+        XML = 1 << 7,
 #if ENABLE(MODEL_ELEMENT)
-    bool isModelDocument() const { return m_documentClasses & ModelDocumentClass; }
+        Model = 1 << 8,
 #endif
+    };
+
+    using DocumentClasses = OptionSet<DocumentClass>;
+
+    bool isHTMLDocument() const { return m_documentClasses.contains(DocumentClass::HTML); }
+    bool isXHTMLDocument() const { return m_documentClasses.contains(DocumentClass::XHTML); }
+    bool isXMLDocument() const { return m_documentClasses.contains(DocumentClass::XML); }
+    bool isImageDocument() const { return m_documentClasses.contains(DocumentClass::Image); }
+    bool isSVGDocument() const { return m_documentClasses.contains(DocumentClass::SVG); }
+    bool isPluginDocument() const { return m_documentClasses.contains(DocumentClass::Plugin); }
+    bool isMediaDocument() const { return m_documentClasses.contains(DocumentClass::Media); }
+    bool isTextDocument() const { return m_documentClasses.contains(DocumentClass::Text); }
+#if ENABLE(MODEL_ELEMENT)
+    bool isModelDocument() const { return m_documentClasses.contains(DocumentClass::Model); }
+#endif
     bool hasSVGRootNode() const;
     virtual bool isFrameSet() const { return false; }
 
     static ptrdiff_t documentClassesMemoryOffset() { return OBJECT_OFFSETOF(Document, m_documentClasses); }
-    static uint32_t isHTMLDocumentClassFlag() { return HTMLDocumentClass; }
+    static uint32_t isHTMLDocumentClassFlag() { return static_cast<uint32_t>(DocumentClass::HTML); }
 
     bool isSrcdocDocument() const { return m_isSrcdocDocument; }
 
@@ -1664,7 +1665,7 @@
 
 protected:
     enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
-    WEBCORE_EXPORT Document(Frame*, const Settings&, const URL&, DocumentClassFlags = DefaultDocumentClass, unsigned constructionFlags = 0);
+    WEBCORE_EXPORT Document(Frame*, const Settings&, const URL&, DocumentClasses = { }, unsigned constructionFlags = 0);
 
     void clearXMLVersion() { m_xmlVersion = String(); }
 
@@ -1937,7 +1938,7 @@
 
     std::unique_ptr<SelectorQueryCache> m_selectorQueryCache;
 
-    DocumentClassFlags m_documentClasses;
+    DocumentClasses m_documentClasses;
 
     RenderPtr<RenderView> m_renderView;
 

Modified: trunk/Source/WebCore/dom/XMLDocument.h (286150 => 286151)


--- trunk/Source/WebCore/dom/XMLDocument.h	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/dom/XMLDocument.h	2021-11-24 18:29:11 UTC (rev 286151)
@@ -34,17 +34,17 @@
 public:
     static Ref<XMLDocument> create(Frame* frame, const Settings& settings, const URL& url)
     {
-        return adoptRef(*new XMLDocument(frame, settings, url));
+        return adoptRef(*new XMLDocument(frame, settings, url, { DocumentClass::XML }));
     }
 
     static Ref<XMLDocument> createXHTML(Frame* frame, const Settings& settings, const URL& url)
     {
-        return adoptRef(*new XMLDocument(frame, settings, url, XHTMLDocumentClass));
+        return adoptRef(*new XMLDocument(frame, settings, url, { DocumentClass::XML, DocumentClass::XHTML }));
     }
 
 protected:
-    XMLDocument(Frame* frame, const Settings& settings, const URL& url, unsigned documentClasses = DefaultDocumentClass)
-        : Document(frame, settings, url, XMLDocumentClass | documentClasses)
+    XMLDocument(Frame* frame, const Settings& settings, const URL& url, DocumentClasses documentClasses = { })
+        : Document(frame, settings, url, documentClasses | DocumentClasses(DocumentClass::XML))
     {
     }
 };

Modified: trunk/Source/WebCore/html/HTMLDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/html/HTMLDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/HTMLDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -89,11 +89,11 @@
 
 Ref<HTMLDocument> HTMLDocument::createSynthesizedDocument(Frame& frame, const URL& url)
 {
-    return adoptRef(*new HTMLDocument(&frame, frame.settings(), url, HTMLDocumentClass, Synthesized));
+    return adoptRef(*new HTMLDocument(&frame, frame.settings(), url, { DocumentClass::HTML }, Synthesized));
 }
 
-HTMLDocument::HTMLDocument(Frame* frame, const Settings& settings, const URL& url, DocumentClassFlags documentClasses, unsigned constructionFlags)
-    : Document(frame, settings, url, documentClasses | HTMLDocumentClass, constructionFlags)
+HTMLDocument::HTMLDocument(Frame* frame, const Settings& settings, const URL& url, DocumentClasses documentClasses, unsigned constructionFlags)
+    : Document(frame, settings, url, documentClasses | DocumentClasses(DocumentClass::HTML), constructionFlags)
 {
     clearXMLVersion();
 }

Modified: trunk/Source/WebCore/html/HTMLDocument.h (286150 => 286151)


--- trunk/Source/WebCore/html/HTMLDocument.h	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/HTMLDocument.h	2021-11-24 18:29:11 UTC (rev 286151)
@@ -54,7 +54,7 @@
     static bool isCaseSensitiveAttribute(const QualifiedName&);
 
 protected:
-    HTMLDocument(Frame*, const Settings&, const URL&, DocumentClassFlags = 0, unsigned constructionFlags = 0);
+    HTMLDocument(Frame*, const Settings&, const URL&, DocumentClasses = { }, unsigned constructionFlags = 0);
 
 private:
     bool isFrameSet() const final;
@@ -67,7 +67,7 @@
 
 inline Ref<HTMLDocument> HTMLDocument::create(Frame* frame, const Settings& settings, const URL& url)
 {
-    return adoptRef(*new HTMLDocument(frame, settings, url, HTMLDocumentClass));
+    return adoptRef(*new HTMLDocument(frame, settings, url, { DocumentClass::HTML }));
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/html/ImageDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/html/ImageDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/ImageDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -198,7 +198,7 @@
 }
 
 ImageDocument::ImageDocument(Frame& frame, const URL& url)
-    : HTMLDocument(&frame, frame.settings(), url, ImageDocumentClass)
+    : HTMLDocument(&frame, frame.settings(), url, { DocumentClass::Image })
     , m_imageElement(nullptr)
     , m_imageSizeIsKnown(false)
 #if !PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebCore/html/MediaDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/html/MediaDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/MediaDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -140,7 +140,7 @@
 }
     
 MediaDocument::MediaDocument(Frame* frame, const Settings& settings, const URL& url)
-    : HTMLDocument(frame, settings, url, MediaDocumentClass)
+    : HTMLDocument(frame, settings, url, { DocumentClass::Media })
 {
     setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
     lockCompatibilityMode();

Modified: trunk/Source/WebCore/html/ModelDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/html/ModelDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/ModelDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -138,7 +138,7 @@
 }
 
 ModelDocument::ModelDocument(Frame* frame, const Settings& settings, const URL& url)
-    : HTMLDocument(frame, settings, url, ModelDocumentClass)
+    : HTMLDocument(frame, settings, url, { DocumentClass::Model })
 {
     if (frame)
         m_outgoingReferrer = frame->loader().outgoingReferrer();

Modified: trunk/Source/WebCore/html/PluginDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/html/PluginDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/PluginDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -144,7 +144,7 @@
 }
 
 PluginDocument::PluginDocument(Frame& frame, const URL& url)
-    : HTMLDocument(&frame, frame.settings(), url, PluginDocumentClass)
+    : HTMLDocument(&frame, frame.settings(), url, { DocumentClass::Plugin })
 {
     setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
     lockCompatibilityMode();

Modified: trunk/Source/WebCore/html/TextDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/html/TextDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/html/TextDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -33,7 +33,7 @@
 WTF_MAKE_ISO_ALLOCATED_IMPL(TextDocument);
 
 TextDocument::TextDocument(Frame* frame, const Settings& settings, const URL& url)
-    : HTMLDocument(frame, settings, url, TextDocumentClass)
+    : HTMLDocument(frame, settings, url, { DocumentClass::Text })
 {
     setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
     lockCompatibilityMode();

Modified: trunk/Source/WebCore/svg/SVGDocument.cpp (286150 => 286151)


--- trunk/Source/WebCore/svg/SVGDocument.cpp	2021-11-24 16:20:55 UTC (rev 286150)
+++ trunk/Source/WebCore/svg/SVGDocument.cpp	2021-11-24 18:29:11 UTC (rev 286151)
@@ -32,7 +32,7 @@
 WTF_MAKE_ISO_ALLOCATED_IMPL(SVGDocument);
 
 SVGDocument::SVGDocument(Frame* frame, const Settings& settings, const URL& url)
-    : XMLDocument(frame, settings, url, SVGDocumentClass)
+    : XMLDocument(frame, settings, url, { DocumentClass::SVG })
 {
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to