Devirtualize Document class type checking
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 May 2013 01:41:16 +0000 (01:41 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 May 2013 01:41:16 +0000 (01:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=115755

Reviewed by Benjamin Poulain.

Merge https://chromium.googlesource.com/chromium/blink/+/dae5adc768d5ce6bff301df6515745da8ea24950

Document has a bunch of virtual bool is*Document() methods on it, but it also has
two bools for XHTML and HTML documents which is silly. We can merge them all
together into an enum of values and devirtualize the type checking methods.

* dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::createElement):
* dom/Document.h:
(WebCore::Document::create):
(WebCore::Document::createXHTML):
(WebCore::Document::isHTMLDocument):
(WebCore::Document::isXHTMLDocument):
(WebCore::Document::isImageDocument):
(WebCore::Document::isSVGDocument):
(WebCore::Document::isPluginDocument):
(WebCore::Document::isMediaDocument):
(WebCore::Document):
* html/HTMLDocument.cpp:
(WebCore::HTMLDocument::HTMLDocument):
* html/HTMLDocument.h:
(WebCore::HTMLDocument):
* html/ImageDocument.cpp:
(WebCore::ImageDocument::ImageDocument):
* html/ImageDocument.h:
(WebCore::ImageDocument):
* html/MediaDocument.cpp:
(WebCore::MediaDocument::MediaDocument):
* html/MediaDocument.h:
(WebCore::MediaDocument):
* html/PluginDocument.cpp:
(WebCore::PluginDocument::PluginDocument):
* html/PluginDocument.h:
(WebCore::PluginDocument):
* loader/PlaceholderDocument.h:
(WebCore::PlaceholderDocument::PlaceholderDocument):
* svg/SVGDocument.cpp:
(WebCore::SVGDocument::SVGDocument):
* svg/SVGDocument.h:
(WebCore::SVGDocument):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@149705 268f45cc-cd09-0410-ab3c-d52691b4dbfc

14 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/html/HTMLDocument.cpp
Source/WebCore/html/HTMLDocument.h
Source/WebCore/html/ImageDocument.cpp
Source/WebCore/html/ImageDocument.h
Source/WebCore/html/MediaDocument.cpp
Source/WebCore/html/MediaDocument.h
Source/WebCore/html/PluginDocument.cpp
Source/WebCore/html/PluginDocument.h
Source/WebCore/loader/PlaceholderDocument.h
Source/WebCore/svg/SVGDocument.cpp
Source/WebCore/svg/SVGDocument.h

index c1f11f866514d2bc5a83dba0d0ab7e1a4fa066fe..cb44832783188ceaf0fa69d5acb6e6cc70bfbe8e 100644 (file)
@@ -1,3 +1,52 @@
+2013-05-07  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Devirtualize Document class type checking
+        https://bugs.webkit.org/show_bug.cgi?id=115755
+
+        Reviewed by Benjamin Poulain.
+
+        Merge https://chromium.googlesource.com/chromium/blink/+/dae5adc768d5ce6bff301df6515745da8ea24950
+
+        Document has a bunch of virtual bool is*Document() methods on it, but it also has
+        two bools for XHTML and HTML documents which is silly. We can merge them all
+        together into an enum of values and devirtualize the type checking methods.
+
+        * dom/Document.cpp:
+        (WebCore::Document::Document):
+        (WebCore::Document::createElement):
+        * dom/Document.h:
+        (WebCore::Document::create):
+        (WebCore::Document::createXHTML):
+        (WebCore::Document::isHTMLDocument):
+        (WebCore::Document::isXHTMLDocument):
+        (WebCore::Document::isImageDocument):
+        (WebCore::Document::isSVGDocument):
+        (WebCore::Document::isPluginDocument):
+        (WebCore::Document::isMediaDocument):
+        (WebCore::Document):
+        * html/HTMLDocument.cpp:
+        (WebCore::HTMLDocument::HTMLDocument):
+        * html/HTMLDocument.h:
+        (WebCore::HTMLDocument):
+        * html/ImageDocument.cpp:
+        (WebCore::ImageDocument::ImageDocument):
+        * html/ImageDocument.h:
+        (WebCore::ImageDocument):
+        * html/MediaDocument.cpp:
+        (WebCore::MediaDocument::MediaDocument):
+        * html/MediaDocument.h:
+        (WebCore::MediaDocument):
+        * html/PluginDocument.cpp:
+        (WebCore::PluginDocument::PluginDocument):
+        * html/PluginDocument.h:
+        (WebCore::PluginDocument):
+        * loader/PlaceholderDocument.h:
+        (WebCore::PlaceholderDocument::PlaceholderDocument):
+        * svg/SVGDocument.cpp:
+        (WebCore::SVGDocument::SVGDocument):
+        * svg/SVGDocument.h:
+        (WebCore::SVGDocument):
+
 2013-05-07  Anders Carlsson  <andersca@apple.com>
 
         Begin unraveling the mess that is QuotesData
index 6e730971c33b27f4755d6e3c03a55e69c34088ce..c6ad9e85b265aa00f6befcf0ae27ce97dc56f267 100644 (file)
@@ -413,7 +413,7 @@ static HashSet<Document*>* documentsThatNeedStyleRecalc = 0;
 
 uint64_t Document::s_globalTreeVersion = 0;
 
-Document::Document(Frame* frame, const KURL& url, bool isXHTML, bool isHTML)
+Document::Document(Frame* frame, const KURL& url, unsigned documentClasses)
     : ContainerNode(0, CreateDocument)
     , TreeScope(this)
     , m_styleResolverThrowawayTimer(this, &Document::styleResolverThrowawayTimerFired)
@@ -451,8 +451,7 @@ Document::Document(Frame* frame, const KURL& url, bool isXHTML, bool isHTML)
     , m_createRenderers(true)
     , m_inPageCache(false)
     , m_accessKeyMapValid(false)
-    , m_isXHTML(isXHTML)
-    , m_isHTML(isHTML)
+    , m_documentClasses(documentClasses)
     , m_isViewSource(false)
     , m_sawElementsInKnownNamespaces(false)
     , m_isSrcdocDocument(false)
@@ -828,7 +827,7 @@ PassRefPtr<Element> Document::createElement(const AtomicString& name, ExceptionC
         return 0;
     }
 
-    if (m_isXHTML)
+    if (isXHTMLDocument())
         return HTMLElementFactory::createHTMLElement(QualifiedName(nullAtom, name, xhtmlNamespaceURI), this, 0, false);
 
     return createElement(QualifiedName(nullAtom, name, nullAtom), false);
index 6f53c60b024d42fd4ecfe503fcdfaea75eeb4559..53f9dcc1c357fd9aaf58aac092d0e5eb21121ea9 100644 (file)
@@ -220,15 +220,27 @@ const int numNodeListInvalidationTypes = InvalidateOnAnyAttrChange + 1;
 
 typedef HashCountedSet<Node*> TouchEventTargetSet;
 
+enum DocumentClass {
+    DefaultDocumentClass = 0,
+    HTMLDocumentClass = 1,
+    XHTMLDocumentClass = 1 << 1,
+    ImageDocumentClass = 1 << 2,
+    PluginDocumentClass = 1 << 3,
+    MediaDocumentClass = 1 << 4,
+    SVGDocumentClass = 1 << 5,
+};
+
+typedef unsigned char DocumentClassFlags;
+
 class Document : public ContainerNode, public TreeScope, public ScriptExecutionContext {
 public:
     static PassRefPtr<Document> create(Frame* frame, const KURL& url)
     {
-        return adoptRef(new Document(frame, url, false, false));
+        return adoptRef(new Document(frame, url));
     }
     static PassRefPtr<Document> createXHTML(Frame* frame, const KURL& url)
     {
-        return adoptRef(new Document(frame, url, true, false));
+        return adoptRef(new Document(frame, url, XHTMLDocumentClass));
     }
     virtual ~Document();
 
@@ -427,18 +439,17 @@ public:
     PassRefPtr<HTMLCollection> documentNamedItems(const AtomicString& name);
 
     // Other methods (not part of DOM)
-    bool isHTMLDocument() const { return m_isHTML; }
-    bool isXHTMLDocument() const { return m_isXHTML; }
-    virtual bool isImageDocument() const { return false; }
+    bool isHTMLDocument() const { return m_documentClasses & HTMLDocumentClass; }
+    bool isXHTMLDocument() const { return m_documentClasses & XHTMLDocumentClass; }
+    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; }
 #if ENABLE(SVG)
-    virtual bool isSVGDocument() const { return false; }
     bool hasSVGRootNode() const;
 #else
-    static bool isSVGDocument() { return false; }
     static bool hasSVGRootNode() { return false; }
 #endif
-    virtual bool isPluginDocument() const { return false; }
-    virtual bool isMediaDocument() const { return false; }
     virtual bool isFrameSet() const { return false; }
 
     bool isSrcdocDocument() const { return m_isSrcdocDocument; }
@@ -1207,7 +1218,7 @@ public:
     void ensurePlugInsInjectedScript(DOMWrapperWorld*);
 
 protected:
-    Document(Frame*, const KURL&, bool isXHTML, bool isHTML);
+    Document(Frame*, const KURL&, unsigned = DefaultDocumentClass);
 
     virtual void didUpdateSecurityOrigin() OVERRIDE;
 
@@ -1474,8 +1485,7 @@ private:
 
     OwnPtr<SelectorQueryCache> m_selectorQueryCache;
 
-    bool m_isXHTML;
-    bool m_isHTML;
+    DocumentClassFlags m_documentClasses;
 
     bool m_isViewSource;
     bool m_sawElementsInKnownNamespaces;
index c2190d54173e3d105ca1420f7fa5b9d3f99ffc24..721822bbdaacd07b16c91be7dcdb048b9cd185fc 100644 (file)
@@ -81,8 +81,8 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-HTMLDocument::HTMLDocument(Frame* frame, const KURL& url)
-    : Document(frame, url, false, true)
+HTMLDocument::HTMLDocument(Frame* frame, const KURL& url, DocumentClassFlags documentClasses)
+    : Document(frame, url, documentClasses | HTMLDocumentClass)
 {
     clearXMLVersion();
 }
index 00627310938570476fd78c7cb78660a77378e03e..4c6a6f6b783cf599505dde96ca3ecb51207670ab 100644 (file)
@@ -75,7 +75,7 @@ public:
     static bool isCaseSensitiveAttribute(const QualifiedName&);
 
 protected:
-    HTMLDocument(Frame*, const KURL&);
+    HTMLDocument(Frame*, const KURL&, DocumentClassFlags = 0);
 
 private:
     virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
index 331daa3767b1a39090bdd4cf94bacb7eb64fcde1..f22e47bb6c42d65f225b33ea3c1afa2eb8596e1f 100644 (file)
@@ -177,7 +177,7 @@ void ImageDocumentParser::finish()
 // --------
 
 ImageDocument::ImageDocument(Frame* frame, const KURL& url)
-    : HTMLDocument(frame, url)
+    : HTMLDocument(frame, url, ImageDocumentClass)
     , m_imageElement(0)
     , m_imageSizeIsKnown(false)
     , m_didShrinkImage(false)
index f6f998e80dc86e2d0bfb084a693f3416adfae0b1..fbe067a10a6d21256452976edeb23f409cab386e 100644 (file)
@@ -51,7 +51,6 @@ private:
     ImageDocument(Frame*, const KURL&);
 
     virtual PassRefPtr<DocumentParser> createParser();
-    virtual bool isImageDocument() const { return true; }
     
     void createDocumentStructure();
     void resizeImageToFit();
index b4464c31e8b78abc0321a8f580773f71bb8b0a72..93df8deeac132e17ae9c19c5e8d5db4f10983401 100644 (file)
@@ -118,7 +118,7 @@ void MediaDocumentParser::appendBytes(DocumentWriter*, const char*, size_t)
 }
     
 MediaDocument::MediaDocument(Frame* frame, const KURL& url)
-    : HTMLDocument(frame, url)
+    : HTMLDocument(frame, url, MediaDocumentClass)
     , m_replaceMediaElementTimer(this, &MediaDocument::replaceMediaElementTimerFired)
 {
     setCompatibilityMode(QuirksMode);
index ec777aedbe387b366d49d4c6c17face1a898c1c8..e7f511166bbc826783454eb4b945cf5f0b32e27d 100644 (file)
@@ -45,7 +45,6 @@ public:
 private:
     MediaDocument(Frame*, const KURL&);
 
-    virtual bool isMediaDocument() const { return true; }        
     virtual PassRefPtr<DocumentParser> createParser();
 
     virtual void defaultEventHandler(Event*);
index 18dd3ff9453f1851ed6b5ee672ee60a2d82a77fb..278aeef1076038be73772ec4e22ffb126d22d363 100644 (file)
@@ -136,7 +136,7 @@ void PluginDocumentParser::appendBytes(DocumentWriter*, const char*, size_t)
 }
 
 PluginDocument::PluginDocument(Frame* frame, const KURL& url)
-    : HTMLDocument(frame, url)
+    : HTMLDocument(frame, url, PluginDocumentClass)
     , m_shouldLoadPluginManually(true)
 {
     setCompatibilityMode(QuirksMode);
index ccdee3f9c39dd5d015c17bd5bf5f4182c95769a0..50feafa2fe69c5f129cdfc47f11b37e6ed7064ac 100644 (file)
@@ -54,8 +54,7 @@ private:
     PluginDocument(Frame*, const KURL&);
 
     virtual PassRefPtr<DocumentParser> createParser() OVERRIDE;
-    virtual bool isPluginDocument() const OVERRIDE { return true; }    
-        
+
     void setShouldLoadPluginManually(bool loadManually) { m_shouldLoadPluginManually = loadManually; }
 
     bool m_shouldLoadPluginManually;
index 3d40a6ea39f7f676d682690c5e3a4618c49b8c05..25b893c14e24eb8f21d9e02dcf451531b2226e45 100644 (file)
@@ -40,7 +40,9 @@ public:
     virtual void attach();
 
 private:
-    PlaceholderDocument(Frame* frame, const KURL& url) : Document(frame, url, false, false) { }
+    PlaceholderDocument(Frame* frame, const KURL& url)
+        : Document(frame, url)
+    { }
 };
 
 } // namespace WebCore
index 25a4a91a868223f568b3fb90c6905d86f7e78ce0..9dcd65d139a942e76eaa5827e1b0675a62becba4 100644 (file)
@@ -37,7 +37,7 @@
 namespace WebCore {
 
 SVGDocument::SVGDocument(Frame* frame, const KURL& url)
-    : Document(frame, url, false, false)
+    : Document(frame, url, SVGDocumentClass)
 {
 }
 
index 527eab88a5fa363fd4f7dd3f2b0a3f2af795a84f..a5f9e85608c97809cf0f47a37d8537ec422fc4d3 100644 (file)
@@ -51,8 +51,6 @@ public:
 private:
     SVGDocument(Frame*, const KURL&);
 
-    virtual bool isSVGDocument() const { return true; }
-
     virtual bool childShouldCreateRenderer(const NodeRenderingContext&) const;
 
     FloatPoint m_translate;