Move attribute style invalidation to attributeChanged().
authorkling@webkit.org <kling@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Feb 2012 10:36:55 +0000 (10:36 +0000)
committerkling@webkit.org <kling@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Feb 2012 10:36:55 +0000 (10:36 +0000)
<http://webkit.org/b/78461>

Reviewed by Antti Koivisto.

Moved attribute style invalidation out of the parseAttribute() overloads
and added an "isPresentationAttribute(Attribute*) virtual to StyledElement.
Returning true for a given Attribute will cause attribute style invalidation
when that attribute passes through attributeChanged().

Removed a couple of parseAttribute() overloads whose only remaining purpose
was invalidating attribute style.

For form elements that deliberately don't map the "align" attribute, added
short-circuits in isPresentationAttribute instead of falling back to the
respective base class (which may othweise then map "align")

* dom/StyledElement.cpp:
(WebCore::StyledElement::attributeChanged):
* dom/StyledElement.h:
(WebCore::StyledElement::isPresentationAttribute):
* html/HTMLBRElement.cpp:
(WebCore::HTMLBRElement::isPresentationAttribute):
* html/HTMLBRElement.h:
* html/HTMLBodyElement.cpp:
(WebCore::HTMLBodyElement::isPresentationAttribute):
(WebCore::HTMLBodyElement::collectStyleForAttribute):
(WebCore::HTMLBodyElement::parseAttribute):
* html/HTMLBodyElement.h:
* html/HTMLButtonElement.cpp:
(WebCore::HTMLButtonElement::isPresentationAttribute):
(WebCore::HTMLButtonElement::parseAttribute):
* html/HTMLButtonElement.h:
* html/HTMLDivElement.cpp:
(WebCore::HTMLDivElement::isPresentationAttribute):
* html/HTMLDivElement.h:
* html/HTMLElement.cpp:
(WebCore::HTMLElement::isPresentationAttribute):
(WebCore::HTMLElement::parseAttribute):
* html/HTMLElement.h:
* html/HTMLEmbedElement.cpp:
(WebCore::HTMLEmbedElement::isPresentationAttribute):
(WebCore::HTMLEmbedElement::parseAttribute):
* html/HTMLEmbedElement.h:
* html/HTMLFontElement.cpp:
(WebCore::HTMLFontElement::isPresentationAttribute):
* html/HTMLFontElement.h:
* html/HTMLFrameSetElement.cpp:
(WebCore::HTMLFrameSetElement::isPresentationAttribute):
(WebCore::HTMLFrameSetElement::parseAttribute):
* html/HTMLFrameSetElement.h:
* html/HTMLHRElement.cpp:
(WebCore::HTMLHRElement::isPresentationAttribute):
(WebCore::HTMLHRElement::collectStyleForAttribute):
* html/HTMLHRElement.h:
* html/HTMLIFrameElement.cpp:
(WebCore::HTMLIFrameElement::isPresentationAttribute):
(WebCore::HTMLIFrameElement::collectStyleForAttribute):
(WebCore::HTMLIFrameElement::parseAttribute):
* html/HTMLIFrameElement.h:
* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::isPresentationAttribute):
(WebCore::HTMLImageElement::collectStyleForAttribute):
(WebCore::HTMLImageElement::parseAttribute):
* html/HTMLImageElement.h:
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::isPresentationAttribute):
(WebCore::HTMLInputElement::collectStyleForAttribute):
(WebCore::HTMLInputElement::parseAttribute):
* html/HTMLInputElement.h:
* html/HTMLLIElement.cpp:
(WebCore::HTMLLIElement::isPresentationAttribute):
(WebCore::HTMLLIElement::parseAttribute):
* html/HTMLLIElement.h:
* html/HTMLMarqueeElement.cpp:
(WebCore::HTMLMarqueeElement::isPresentationAttribute):
(WebCore::HTMLMarqueeElement::collectStyleForAttribute):
(WebCore::HTMLMarqueeElement::parseAttribute):
* html/HTMLMarqueeElement.h:
* html/HTMLOListElement.cpp:
(WebCore::HTMLOListElement::isPresentationAttribute):
(WebCore::HTMLOListElement::parseAttribute):
* html/HTMLOListElement.h:
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::isPresentationAttribute):
(WebCore::HTMLObjectElement::parseAttribute):
* html/HTMLObjectElement.h:
* html/HTMLParagraphElement.cpp:
(WebCore::HTMLParagraphElement::isPresentationAttribute):
* html/HTMLParagraphElement.h:
* html/HTMLPlugInElement.cpp:
(WebCore::HTMLPlugInElement::isPresentationAttribute):
(WebCore::HTMLPlugInElement::collectStyleForAttribute):
* html/HTMLPlugInElement.h:
* html/HTMLPreElement.cpp:
(WebCore::HTMLPreElement::isPresentationAttribute):
(WebCore::HTMLPreElement::collectStyleForAttribute):
* html/HTMLPreElement.h:
* html/HTMLSelectElement.cpp:
(WebCore::HTMLSelectElement::isPresentationAttribute):
(WebCore::HTMLSelectElement::parseAttribute):
* html/HTMLSelectElement.h:
* html/HTMLTableCaptionElement.cpp:
(WebCore::HTMLTableCaptionElement::isPresentationAttribute):
(WebCore::HTMLTableCaptionElement::parseAttribute):
* html/HTMLTableCaptionElement.h:
* html/HTMLTableCellElement.cpp:
(WebCore::HTMLTableCellElement::isPresentationAttribute):
(WebCore::HTMLTableCellElement::collectStyleForAttribute):
(WebCore::HTMLTableCellElement::parseAttribute):
* html/HTMLTableCellElement.h:
* html/HTMLTableColElement.cpp:
(WebCore::HTMLTableColElement::isPresentationAttribute):
(WebCore::HTMLTableColElement::parseAttribute):
* html/HTMLTableColElement.h:
* html/HTMLTableElement.cpp:
(WebCore::HTMLTableElement::isPresentationAttribute):
(WebCore::HTMLTableElement::parseAttribute):
* html/HTMLTableElement.h:
* html/HTMLTablePartElement.cpp:
(WebCore::HTMLTablePartElement::isPresentationAttribute):
(WebCore::HTMLTablePartElement::collectStyleForAttribute):
* html/HTMLTablePartElement.h:
* html/HTMLTextAreaElement.cpp:
(WebCore::HTMLTextAreaElement::isPresentationAttribute):
(WebCore::HTMLTextAreaElement::parseAttribute):
* html/HTMLTextAreaElement.h:
* html/HTMLUListElement.cpp:
(WebCore::HTMLUListElement::isPresentationAttribute):
(WebCore::HTMLUListElement::collectStyleForAttribute):
* html/HTMLUListElement.h:
* html/HTMLVideoElement.cpp:
(WebCore::HTMLVideoElement::isPresentationAttribute):
(WebCore::HTMLVideoElement::parseAttribute):
* html/HTMLVideoElement.h:
* mathml/MathMLElement.cpp:
(WebCore::MathMLElement::isPresentationAttribute):
(WebCore::MathMLElement::collectStyleForAttribute):
* mathml/MathMLElement.h:
* svg/SVGImageElement.cpp:
(WebCore::SVGImageElement::isPresentationAttribute):
(WebCore::SVGImageElement::parseAttribute):
* svg/SVGImageElement.h:
* svg/SVGStyledElement.cpp:
(WebCore::SVGStyledElement::isPresentationAttribute):
(WebCore::SVGStyledElement::parseAttribute):
* svg/SVGStyledElement.h:
* svg/SVGTextContentElement.cpp:
(WebCore::SVGTextContentElement::isPresentationAttribute):
(WebCore::SVGTextContentElement::parseAttribute):
* svg/SVGTextContentElement.h:

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

67 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/StyledElement.cpp
Source/WebCore/dom/StyledElement.h
Source/WebCore/html/HTMLBRElement.cpp
Source/WebCore/html/HTMLBRElement.h
Source/WebCore/html/HTMLBodyElement.cpp
Source/WebCore/html/HTMLBodyElement.h
Source/WebCore/html/HTMLButtonElement.cpp
Source/WebCore/html/HTMLButtonElement.h
Source/WebCore/html/HTMLDivElement.cpp
Source/WebCore/html/HTMLDivElement.h
Source/WebCore/html/HTMLElement.cpp
Source/WebCore/html/HTMLElement.h
Source/WebCore/html/HTMLEmbedElement.cpp
Source/WebCore/html/HTMLEmbedElement.h
Source/WebCore/html/HTMLFontElement.cpp
Source/WebCore/html/HTMLFontElement.h
Source/WebCore/html/HTMLFrameSetElement.cpp
Source/WebCore/html/HTMLFrameSetElement.h
Source/WebCore/html/HTMLHRElement.cpp
Source/WebCore/html/HTMLHRElement.h
Source/WebCore/html/HTMLIFrameElement.cpp
Source/WebCore/html/HTMLIFrameElement.h
Source/WebCore/html/HTMLImageElement.cpp
Source/WebCore/html/HTMLImageElement.h
Source/WebCore/html/HTMLInputElement.cpp
Source/WebCore/html/HTMLInputElement.h
Source/WebCore/html/HTMLLIElement.cpp
Source/WebCore/html/HTMLLIElement.h
Source/WebCore/html/HTMLMarqueeElement.cpp
Source/WebCore/html/HTMLMarqueeElement.h
Source/WebCore/html/HTMLOListElement.cpp
Source/WebCore/html/HTMLOListElement.h
Source/WebCore/html/HTMLObjectElement.cpp
Source/WebCore/html/HTMLObjectElement.h
Source/WebCore/html/HTMLParagraphElement.cpp
Source/WebCore/html/HTMLParagraphElement.h
Source/WebCore/html/HTMLPlugInElement.cpp
Source/WebCore/html/HTMLPlugInElement.h
Source/WebCore/html/HTMLPreElement.cpp
Source/WebCore/html/HTMLPreElement.h
Source/WebCore/html/HTMLSelectElement.cpp
Source/WebCore/html/HTMLSelectElement.h
Source/WebCore/html/HTMLTableCaptionElement.cpp
Source/WebCore/html/HTMLTableCaptionElement.h
Source/WebCore/html/HTMLTableCellElement.cpp
Source/WebCore/html/HTMLTableCellElement.h
Source/WebCore/html/HTMLTableColElement.cpp
Source/WebCore/html/HTMLTableColElement.h
Source/WebCore/html/HTMLTableElement.cpp
Source/WebCore/html/HTMLTableElement.h
Source/WebCore/html/HTMLTablePartElement.cpp
Source/WebCore/html/HTMLTablePartElement.h
Source/WebCore/html/HTMLTextAreaElement.cpp
Source/WebCore/html/HTMLTextAreaElement.h
Source/WebCore/html/HTMLUListElement.cpp
Source/WebCore/html/HTMLUListElement.h
Source/WebCore/html/HTMLVideoElement.cpp
Source/WebCore/html/HTMLVideoElement.h
Source/WebCore/mathml/MathMLElement.cpp
Source/WebCore/mathml/MathMLElement.h
Source/WebCore/svg/SVGImageElement.cpp
Source/WebCore/svg/SVGImageElement.h
Source/WebCore/svg/SVGStyledElement.cpp
Source/WebCore/svg/SVGStyledElement.h
Source/WebCore/svg/SVGTextContentElement.cpp
Source/WebCore/svg/SVGTextContentElement.h

index a85ee36..76320c7 100644 (file)
@@ -1,3 +1,157 @@
+2012-02-13  Andreas Kling  <awesomekling@apple.com>
+
+        Move attribute style invalidation to attributeChanged().
+        <http://webkit.org/b/78461>
+
+        Reviewed by Antti Koivisto.
+
+        Moved attribute style invalidation out of the parseAttribute() overloads
+        and added an "isPresentationAttribute(Attribute*) virtual to StyledElement.
+        Returning true for a given Attribute will cause attribute style invalidation
+        when that attribute passes through attributeChanged().
+
+        Removed a couple of parseAttribute() overloads whose only remaining purpose
+        was invalidating attribute style.
+
+        For form elements that deliberately don't map the "align" attribute, added
+        short-circuits in isPresentationAttribute instead of falling back to the
+        respective base class (which may othweise then map "align")
+
+        * dom/StyledElement.cpp:
+        (WebCore::StyledElement::attributeChanged):
+        * dom/StyledElement.h:
+        (WebCore::StyledElement::isPresentationAttribute):
+        * html/HTMLBRElement.cpp:
+        (WebCore::HTMLBRElement::isPresentationAttribute):
+        * html/HTMLBRElement.h:
+        * html/HTMLBodyElement.cpp:
+        (WebCore::HTMLBodyElement::isPresentationAttribute):
+        (WebCore::HTMLBodyElement::collectStyleForAttribute):
+        (WebCore::HTMLBodyElement::parseAttribute):
+        * html/HTMLBodyElement.h:
+        * html/HTMLButtonElement.cpp:
+        (WebCore::HTMLButtonElement::isPresentationAttribute):
+        (WebCore::HTMLButtonElement::parseAttribute):
+        * html/HTMLButtonElement.h:
+        * html/HTMLDivElement.cpp:
+        (WebCore::HTMLDivElement::isPresentationAttribute):
+        * html/HTMLDivElement.h:
+        * html/HTMLElement.cpp:
+        (WebCore::HTMLElement::isPresentationAttribute):
+        (WebCore::HTMLElement::parseAttribute):
+        * html/HTMLElement.h:
+        * html/HTMLEmbedElement.cpp:
+        (WebCore::HTMLEmbedElement::isPresentationAttribute):
+        (WebCore::HTMLEmbedElement::parseAttribute):
+        * html/HTMLEmbedElement.h:
+        * html/HTMLFontElement.cpp:
+        (WebCore::HTMLFontElement::isPresentationAttribute):
+        * html/HTMLFontElement.h:
+        * html/HTMLFrameSetElement.cpp:
+        (WebCore::HTMLFrameSetElement::isPresentationAttribute):
+        (WebCore::HTMLFrameSetElement::parseAttribute):
+        * html/HTMLFrameSetElement.h:
+        * html/HTMLHRElement.cpp:
+        (WebCore::HTMLHRElement::isPresentationAttribute):
+        (WebCore::HTMLHRElement::collectStyleForAttribute):
+        * html/HTMLHRElement.h:
+        * html/HTMLIFrameElement.cpp:
+        (WebCore::HTMLIFrameElement::isPresentationAttribute):
+        (WebCore::HTMLIFrameElement::collectStyleForAttribute):
+        (WebCore::HTMLIFrameElement::parseAttribute):
+        * html/HTMLIFrameElement.h:
+        * html/HTMLImageElement.cpp:
+        (WebCore::HTMLImageElement::isPresentationAttribute):
+        (WebCore::HTMLImageElement::collectStyleForAttribute):
+        (WebCore::HTMLImageElement::parseAttribute):
+        * html/HTMLImageElement.h:
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::isPresentationAttribute):
+        (WebCore::HTMLInputElement::collectStyleForAttribute):
+        (WebCore::HTMLInputElement::parseAttribute):
+        * html/HTMLInputElement.h:
+        * html/HTMLLIElement.cpp:
+        (WebCore::HTMLLIElement::isPresentationAttribute):
+        (WebCore::HTMLLIElement::parseAttribute):
+        * html/HTMLLIElement.h:
+        * html/HTMLMarqueeElement.cpp:
+        (WebCore::HTMLMarqueeElement::isPresentationAttribute):
+        (WebCore::HTMLMarqueeElement::collectStyleForAttribute):
+        (WebCore::HTMLMarqueeElement::parseAttribute):
+        * html/HTMLMarqueeElement.h:
+        * html/HTMLOListElement.cpp:
+        (WebCore::HTMLOListElement::isPresentationAttribute):
+        (WebCore::HTMLOListElement::parseAttribute):
+        * html/HTMLOListElement.h:
+        * html/HTMLObjectElement.cpp:
+        (WebCore::HTMLObjectElement::isPresentationAttribute):
+        (WebCore::HTMLObjectElement::parseAttribute):
+        * html/HTMLObjectElement.h:
+        * html/HTMLParagraphElement.cpp:
+        (WebCore::HTMLParagraphElement::isPresentationAttribute):
+        * html/HTMLParagraphElement.h:
+        * html/HTMLPlugInElement.cpp:
+        (WebCore::HTMLPlugInElement::isPresentationAttribute):
+        (WebCore::HTMLPlugInElement::collectStyleForAttribute):
+        * html/HTMLPlugInElement.h:
+        * html/HTMLPreElement.cpp:
+        (WebCore::HTMLPreElement::isPresentationAttribute):
+        (WebCore::HTMLPreElement::collectStyleForAttribute):
+        * html/HTMLPreElement.h:
+        * html/HTMLSelectElement.cpp:
+        (WebCore::HTMLSelectElement::isPresentationAttribute):
+        (WebCore::HTMLSelectElement::parseAttribute):
+        * html/HTMLSelectElement.h:
+        * html/HTMLTableCaptionElement.cpp:
+        (WebCore::HTMLTableCaptionElement::isPresentationAttribute):
+        (WebCore::HTMLTableCaptionElement::parseAttribute):
+        * html/HTMLTableCaptionElement.h:
+        * html/HTMLTableCellElement.cpp:
+        (WebCore::HTMLTableCellElement::isPresentationAttribute):
+        (WebCore::HTMLTableCellElement::collectStyleForAttribute):
+        (WebCore::HTMLTableCellElement::parseAttribute):
+        * html/HTMLTableCellElement.h:
+        * html/HTMLTableColElement.cpp:
+        (WebCore::HTMLTableColElement::isPresentationAttribute):
+        (WebCore::HTMLTableColElement::parseAttribute):
+        * html/HTMLTableColElement.h:
+        * html/HTMLTableElement.cpp:
+        (WebCore::HTMLTableElement::isPresentationAttribute):
+        (WebCore::HTMLTableElement::parseAttribute):
+        * html/HTMLTableElement.h:
+        * html/HTMLTablePartElement.cpp:
+        (WebCore::HTMLTablePartElement::isPresentationAttribute):
+        (WebCore::HTMLTablePartElement::collectStyleForAttribute):
+        * html/HTMLTablePartElement.h:
+        * html/HTMLTextAreaElement.cpp:
+        (WebCore::HTMLTextAreaElement::isPresentationAttribute):
+        (WebCore::HTMLTextAreaElement::parseAttribute):
+        * html/HTMLTextAreaElement.h:
+        * html/HTMLUListElement.cpp:
+        (WebCore::HTMLUListElement::isPresentationAttribute):
+        (WebCore::HTMLUListElement::collectStyleForAttribute):
+        * html/HTMLUListElement.h:
+        * html/HTMLVideoElement.cpp:
+        (WebCore::HTMLVideoElement::isPresentationAttribute):
+        (WebCore::HTMLVideoElement::parseAttribute):
+        * html/HTMLVideoElement.h:
+        * mathml/MathMLElement.cpp:
+        (WebCore::MathMLElement::isPresentationAttribute):
+        (WebCore::MathMLElement::collectStyleForAttribute):
+        * mathml/MathMLElement.h:
+        * svg/SVGImageElement.cpp:
+        (WebCore::SVGImageElement::isPresentationAttribute):
+        (WebCore::SVGImageElement::parseAttribute):
+        * svg/SVGImageElement.h:
+        * svg/SVGStyledElement.cpp:
+        (WebCore::SVGStyledElement::isPresentationAttribute):
+        (WebCore::SVGStyledElement::parseAttribute):
+        * svg/SVGStyledElement.h:
+        * svg/SVGTextContentElement.cpp:
+        (WebCore::SVGTextContentElement::isPresentationAttribute):
+        (WebCore::SVGTextContentElement::parseAttribute):
+        * svg/SVGTextContentElement.h:
+
 2012-02-13  Kentaro Hara  <haraken@chromium.org>
 
         Add [JSCustomToJSObject] IDL attribute to interfaces that have
index 8d3d8fa..b311dfa 100644 (file)
@@ -66,6 +66,11 @@ void StyledElement::attributeChanged(Attribute* attr)
     if (!(attr->name() == styleAttr && isSynchronizingStyleAttribute()))
         parseAttribute(attr);
 
+    if (isPresentationAttribute(attr)) {
+        setAttributeStyleDirty();
+        setNeedsStyleRecalc();
+    }
+
     Element::attributeChanged(attr);
 }
 
index 3fa2669..be7a17e 100644 (file)
@@ -53,12 +53,11 @@ protected:
     {
     }
 
-    void setNeedsAttributeStyleUpdate();
-
     virtual void attributeChanged(Attribute*) OVERRIDE;
     virtual void parseAttribute(Attribute*);
     virtual void copyNonAttributeProperties(const Element*);
 
+    virtual bool isPresentationAttribute(Attribute*) const { return false; }
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) { }
 
     virtual void addSubresourceAttributeURLs(ListHashSet<KURL>&) const;
@@ -99,12 +98,6 @@ inline StylePropertySet* StyledElement::attributeStyle()
     return attributeData() ? attributeData()->attributeStyle() : 0;
 }
 
-inline void StyledElement::setNeedsAttributeStyleUpdate()
-{
-    setAttributeStyleDirty();
-    setNeedsStyleRecalc();
-}
-
 } //namespace
 
 #endif
index 84ea107..051db5f 100644 (file)
@@ -48,6 +48,13 @@ PassRefPtr<HTMLBRElement> HTMLBRElement::create(const QualifiedName& tagName, Do
     return adoptRef(new HTMLBRElement(tagName, document));
 }
 
+bool HTMLBRElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == clearAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLBRElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == clearAttr) {
@@ -63,14 +70,6 @@ void HTMLBRElement::collectStyleForAttribute(Attribute* attr, StylePropertySet*
         HTMLElement::collectStyleForAttribute(attr, style);
 }
 
-void HTMLBRElement::parseAttribute(Attribute* attr)
-{
-    if (attr->name() == clearAttr)
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr);
-}
-
 RenderObject* HTMLBRElement::createRenderer(RenderArena* arena, RenderStyle* style)
 {
      if (style->hasContent())
index cb8c29c..16c1bea 100644 (file)
@@ -38,7 +38,7 @@ public:
 private:
     HTMLBRElement(const QualifiedName&, Document*);
 
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
index 696ff43..8540a13 100644 (file)
@@ -61,10 +61,11 @@ HTMLBodyElement::~HTMLBodyElement()
 {
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLBodyElement(Attribute* attr)
+bool HTMLBodyElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == backgroundAttr || attr->name() == marginwidthAttr || attr->name() == leftmarginAttr || attr->name() == marginheightAttr || attr->name() == topmarginAttr || attr->name() == bgcolorAttr || attr->name() == textAttr || attr->name() == bgpropertiesAttr;
-
+    if (attr->name() == backgroundAttr || attr->name() == marginwidthAttr || attr->name() == leftmarginAttr || attr->name() == marginheightAttr || attr->name() == topmarginAttr || attr->name() == bgcolorAttr || attr->name() == textAttr || attr->name() == bgpropertiesAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
 void HTMLBodyElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -86,17 +87,13 @@ void HTMLBodyElement::collectStyleForAttribute(Attribute* attr, StylePropertySet
     } else if (attr->name() == bgpropertiesAttr) {
         if (equalIgnoringCase(attr->value(), "fixed"))
            style->setProperty(CSSPropertyBackgroundAttachment, CSSValueFixed);
-    } else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLBodyElement(attr));
+    } else
         HTMLElement::collectStyleForAttribute(attr, style);
-    }
 }
 
 void HTMLBodyElement::parseAttribute(Attribute* attr)
 {
-    if (isRespectedPresentationAttributeForHTMLBodyElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == vlinkAttr || attr->name() == alinkAttr || attr->name() == linkAttr) {
+    if (attr->name() == vlinkAttr || attr->name() == alinkAttr || attr->name() == linkAttr) {
         if (attr->isNull()) {
             if (attr->name() == linkAttr)
                 document()->resetLinkColor();
index 32cba8a..41ba448 100644 (file)
@@ -71,6 +71,7 @@ private:
     HTMLBodyElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void insertedIntoDocument();
index 1468248..a79641a 100644 (file)
@@ -79,6 +79,17 @@ const AtomicString& HTMLButtonElement::formControlType() const
     return emptyAtom;
 }
 
+bool HTMLButtonElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr) {
+        // Don't map 'align' attribute.  This matches what Firefox and IE do, but not Opera.
+        // See http://bugs.webkit.org/show_bug.cgi?id=12071
+        return false;
+    }
+
+    return HTMLFormControlElement::isPresentationAttribute(attr);
+}
+
 void HTMLButtonElement::parseAttribute(Attribute* attr)
 {
     if (attr->name() == typeAttr) {
@@ -89,9 +100,6 @@ void HTMLButtonElement::parseAttribute(Attribute* attr)
         else
             m_type = SUBMIT;
         setNeedsWillValidateCheck();
-    } else if (attr->name() == alignAttr) {
-        // Don't map 'align' attribute.  This matches what Firefox and IE do, but not Opera.
-        // See http://bugs.webkit.org/show_bug.cgi?id=12071
     } else
         HTMLFormControlElement::parseAttribute(attr);
 }
index 9699bef..00518ea 100644 (file)
@@ -44,6 +44,7 @@ private:
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void defaultEventHandler(Event*);
     virtual bool appendFormData(FormDataList&, bool);
 
index 0ac4c5c..e793ad0 100644 (file)
@@ -48,6 +48,13 @@ PassRefPtr<HTMLDivElement> HTMLDivElement::create(const QualifiedName& tagName,
     return adoptRef(new HTMLDivElement(tagName, document));
 }
 
+bool HTMLDivElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLDivElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == alignAttr) {
@@ -63,12 +70,4 @@ void HTMLDivElement::collectStyleForAttribute(Attribute* attr, StylePropertySet*
         HTMLElement::collectStyleForAttribute(attr, style);
 }
 
-void HTMLDivElement::parseAttribute(Attribute* attr)
-{
-    if (attr->name() == alignAttr)
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr);
-}
-
 }
index 615774f..f8f4f71 100644 (file)
@@ -36,7 +36,7 @@ protected:
     HTMLDivElement(const QualifiedName&, Document*);
 
 private:
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index f12b0cb..27ce832 100644 (file)
@@ -161,6 +161,13 @@ void HTMLElement::mapLanguageAttributeToLocale(Attribute* attribute, StyleProper
     }
 }
 
+bool HTMLElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr || attr->name() == contenteditableAttr || attr->name() == hiddenAttr || attr->name() == langAttr || attr->name().matches(XMLNames::langAttr) || attr->name() == draggableAttr || attr->name() == dirAttr)
+        return true;
+    return StyledElement::isPresentationAttribute(attr);
+}
+
 void HTMLElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == alignAttr) {
@@ -212,8 +219,8 @@ void HTMLElement::parseAttribute(Attribute* attr)
     if (isIdAttributeName(attr->name()) || attr->name() == classAttr || attr->name() == styleAttr)
         return StyledElement::parseAttribute(attr);
 
-    if (attr->name() == alignAttr || attr->name() == contenteditableAttr || attr->name() == hiddenAttr || attr->name() == langAttr || attr->name().matches(XMLNames::langAttr) || attr->name() == draggableAttr)
-        setNeedsAttributeStyleUpdate();
+    if (attr->name() == dirAttr)
+        dirAttributeChanged(attr);
     else if (attr->name() == tabindexAttr) {
         int tabindex = 0;
         if (attr->isEmpty())
@@ -222,9 +229,6 @@ void HTMLElement::parseAttribute(Attribute* attr)
             // Clamp tabindex to the range of 'short' to match Firefox's behavior.
             setTabIndexExplicitly(max(static_cast<int>(std::numeric_limits<short>::min()), min(tabindex, static_cast<int>(std::numeric_limits<short>::max()))));
         }
-    } else if (attr->name() == dirAttr) {
-        setNeedsAttributeStyleUpdate();
-        dirAttributeChanged(attr);
 #if ENABLE(MICRODATA)
     } else if (attr->name() == itempropAttr) {
         setItemProp(attr->value());
index 81e7767..5db8d94 100644 (file)
@@ -98,6 +98,7 @@ protected:
     void applyBorderAttributeToStyle(Attribute*, StylePropertySet*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
index 064e1b0..9ad59a8 100644 (file)
@@ -74,6 +74,13 @@ RenderWidget* HTMLEmbedElement::renderWidgetForJSBindings()
     return findWidgetRenderer(this);
 }
 
+bool HTMLEmbedElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == hiddenAttr)
+        return true;
+    return HTMLPlugInImageElement::isPresentationAttribute(attr);
+}
+
 void HTMLEmbedElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == hiddenAttr) {
@@ -105,9 +112,7 @@ void HTMLEmbedElement::parseAttribute(Attribute* attr)
                 m_imageLoader = adoptPtr(new HTMLImageLoader(this));
             m_imageLoader->updateFromElementIgnoringPreviousError();
         }
-    } else if (attr->name() == hiddenAttr)
-        setNeedsAttributeStyleUpdate();
-    else
+    } else
         HTMLPlugInImageElement::parseAttribute(attr);
 }
 
index a8b680f..f0fca22 100644 (file)
@@ -35,6 +35,7 @@ private:
     HTMLEmbedElement(const QualifiedName&, Document*, bool createdByParser);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual bool rendererIsNeeded(const NodeRenderingContext&);
index cbde05d..a5da483 100644 (file)
@@ -158,6 +158,13 @@ bool HTMLFontElement::cssValueFromFontSizeNumber(const String& s, int& size)
     return true;
 }
 
+bool HTMLFontElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == sizeAttr || attr->name() == colorAttr || attr->name() == faceAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLFontElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == sizeAttr) {
@@ -172,12 +179,4 @@ void HTMLFontElement::collectStyleForAttribute(Attribute* attr, StylePropertySet
         HTMLElement::collectStyleForAttribute(attr, style);
 }
 
-void HTMLFontElement::parseAttribute(Attribute* attr)
-{
-    if (attr->name() == sizeAttr || attr->name() == colorAttr || attr->name() == faceAttr)
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr);
-}
-
 }
index 5fe9af8..f24332c 100644 (file)
@@ -37,7 +37,7 @@ public:
 private:
     HTMLFontElement(const QualifiedName&, Document*);
 
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index 6d80710..d3fdb97 100644 (file)
@@ -64,6 +64,13 @@ PassRefPtr<HTMLFrameSetElement> HTMLFrameSetElement::create(const QualifiedName&
     return adoptRef(new HTMLFrameSetElement(tagName, document));
 }
 
+bool HTMLFrameSetElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == bordercolorAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLFrameSetElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == bordercolorAttr)
@@ -106,10 +113,9 @@ void HTMLFrameSetElement::parseAttribute(Attribute* attr)
             m_borderSet = true;
         } else
             m_borderSet = false;
-    } else if (attr->name() == bordercolorAttr) {
+    } else if (attr->name() == bordercolorAttr)
         m_borderColorSet = !attr->isEmpty();
-        setNeedsAttributeStyleUpdate();
-    } else if (attr->name() == onloadAttr)
+    else if (attr->name() == onloadAttr)
         document()->setWindowAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(document()->frame(), attr));
     else if (attr->name() == onbeforeunloadAttr)
         document()->setWindowAttributeEventListener(eventNames().beforeunloadEvent, createAttributeEventListener(document()->frame(), attr));
index f8baf72..1cd40a2 100644 (file)
@@ -68,6 +68,7 @@ private:
     HTMLFrameSetElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void attach();
index 13fb2a8..90d929b 100644 (file)
@@ -48,9 +48,11 @@ PassRefPtr<HTMLHRElement> HTMLHRElement::create(const QualifiedName& tagName, Do
     return adoptRef(new HTMLHRElement(tagName, document));
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLHRElement(Attribute* attr)
+bool HTMLHRElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == alignAttr || attr->name() == widthAttr || attr->name() == colorAttr || attr->name() == noshadeAttr || attr->name() == sizeAttr;
+    if (attr->name() == alignAttr || attr->name() == widthAttr || attr->name() == colorAttr || attr->name() == noshadeAttr || attr->name() == sizeAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
 void HTMLHRElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -94,18 +96,8 @@ void HTMLHRElement::collectStyleForAttribute(Attribute* attr, StylePropertySet*
             style->setProperty(CSSPropertyBorderBottomWidth, String("0")); // FIXME: Pass as integer.
         else
             addHTMLLengthToStyle(style, CSSPropertyHeight, String::number(size - 2)); // FIXME: Pass as integer.
-    } else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLHRElement(attr));
+    } else
         HTMLElement::collectStyleForAttribute(attr, style);
-    }
-}
-
-void HTMLHRElement::parseAttribute(Attribute* attr)
-{
-    if (isRespectedPresentationAttributeForHTMLHRElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr);
 }
 
 }
index c9a08d1..728619a 100644 (file)
@@ -37,7 +37,7 @@ public:
 private:
     HTMLHRElement(const QualifiedName&, Document*);
 
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index db1fc4d..2eed685 100644 (file)
@@ -48,9 +48,11 @@ PassRefPtr<HTMLIFrameElement> HTMLIFrameElement::create(const QualifiedName& tag
     return adoptRef(new HTMLIFrameElement(tagName, document));
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLIFrameElement(Attribute* attr)
+bool HTMLIFrameElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == alignAttr || attr->name() == frameborderAttr;
+    if (attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == alignAttr || attr->name() == frameborderAttr)
+        return true;
+    return HTMLFrameElementBase::isPresentationAttribute(attr);
 }
 
 void HTMLIFrameElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -68,17 +70,13 @@ void HTMLIFrameElement::collectStyleForAttribute(Attribute* attr, StylePropertyS
             // Add a rule that nulls out our border width.
             addHTMLLengthToStyle(style, CSSPropertyBorderWidth, "0"); // FIXME: Pass as integer.
         }
-    } else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLIFrameElement(attr));
+    } else
         HTMLFrameElementBase::collectStyleForAttribute(attr, style);
-    }
 }
 
 void HTMLIFrameElement::parseAttribute(Attribute* attr)
 {
-    if (isRespectedPresentationAttributeForHTMLIFrameElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == nameAttr) {
+    if (attr->name() == nameAttr) {
         const AtomicString& newName = attr->value();
         if (inDocument() && document()->isHTMLDocument()) {
             HTMLDocument* document = static_cast<HTMLDocument*>(this->document());
index d89b028..0758410 100644 (file)
@@ -36,6 +36,7 @@ private:
     HTMLIFrameElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void insertedIntoDocument();
index 193505a..f8a8fd3 100644 (file)
@@ -78,9 +78,11 @@ PassRefPtr<HTMLImageElement> HTMLImageElement::createForJSConstructor(Document*
     return image.release();
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLImageElement(Attribute* attr)
+bool HTMLImageElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == borderAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr || attr->name() == valignAttr;
+    if (attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == borderAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr || attr->name() == valignAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
 void HTMLImageElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -101,18 +103,14 @@ void HTMLImageElement::collectStyleForAttribute(Attribute* attr, StylePropertySe
         applyAlignmentAttributeToStyle(attr, style);
     else if (attr->name() == valignAttr)
         style->setProperty(CSSPropertyVerticalAlign, attr->value());
-    else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLImageElement(attr));
+    else
         HTMLElement::collectStyleForAttribute(attr, style);
-    }
 }
 
 void HTMLImageElement::parseAttribute(Attribute* attr)
 {
     const QualifiedName& attrName = attr->name();
-    if (isRespectedPresentationAttributeForHTMLImageElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else if (attrName == altAttr) {
+    if (attrName == altAttr) {
         if (renderer() && renderer()->isImage())
             toRenderImage(renderer())->updateAltText();
     } else if (attrName == srcAttr)
index a8bba34..37a2377 100644 (file)
@@ -84,6 +84,7 @@ protected:
 
 private:
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void attach();
index c74e340..4377be8 100644 (file)
@@ -662,9 +662,11 @@ void HTMLInputElement::accessKeyAction(bool sendMouseEvents)
     m_inputType->accessKeyAction(sendMouseEvents);
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLInputElement(HTMLInputElement* element, Attribute* attr)
+bool HTMLInputElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr || attr->name() == widthAttr || attr->name() == heightAttr || (attr->name() == borderAttr && element->isImageButton());
+    if (attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr || attr->name() == widthAttr || attr->name() == heightAttr || (attr->name() == borderAttr && isImageButton()))
+        return true;
+    return HTMLTextFormControlElement::isPresentationAttribute(attr);
 }
 
 void HTMLInputElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -686,17 +688,13 @@ void HTMLInputElement::collectStyleForAttribute(Attribute* attr, StylePropertySe
             addHTMLLengthToStyle(style, CSSPropertyHeight, attr->value());
     } else if (attr->name() == borderAttr && isImageButton())
         applyBorderAttributeToStyle(attr, style);
-    else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLInputElement(this, attr));
+    else
         return HTMLTextFormControlElement::collectStyleForAttribute(attr, style);
-    }
 }
 
 void HTMLInputElement::parseAttribute(Attribute* attr)
 {
-    if (isRespectedPresentationAttributeForHTMLInputElement(this, attr))
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == nameAttr) {
+    if (attr->name() == nameAttr) {
         checkedRadioButtons().removeButton(this);
         m_name = attr->value();
         checkedRadioButtons().addButton(this);
index a512313..9a7a3ec 100644 (file)
@@ -276,6 +276,7 @@ private:
     virtual void accessKeyAction(bool sendMouseEvents);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual void finishParsingChildren();
 
index 5fc6b27..c845612 100644 (file)
@@ -49,6 +49,13 @@ PassRefPtr<HTMLLIElement> HTMLLIElement::create(const QualifiedName& tagName, Do
     return adoptRef(new HTMLLIElement(tagName, document));
 }
 
+bool HTMLLIElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == typeAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLLIElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == typeAttr) {
@@ -73,9 +80,7 @@ void HTMLLIElement::parseAttribute(Attribute* attr)
     if (attr->name() == valueAttr) {
         if (renderer() && renderer()->isListItem())
             parseValue(attr->value());
-    } else if (attr->name() == typeAttr)
-        setNeedsAttributeStyleUpdate();
-    else
+    } else
         HTMLElement::parseAttribute(attr);
 }
 
index 03f165e..c730408 100644 (file)
@@ -36,6 +36,7 @@ private:
     HTMLLIElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void attach();
index c5513b3..9dd9d7b 100644 (file)
@@ -53,9 +53,11 @@ PassRefPtr<HTMLMarqueeElement> HTMLMarqueeElement::create(const QualifiedName& t
     return marqueeElement.release();
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLMarqueeElement(Attribute* attr)
+bool HTMLMarqueeElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == bgcolorAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == scrollamountAttr || attr->name() == scrolldelayAttr || attr->name() == loopAttr || attr->name() == behaviorAttr || attr->name() == directionAttr;
+    if (attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == bgcolorAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == scrollamountAttr || attr->name() == scrolldelayAttr || attr->name() == loopAttr || attr->name() == behaviorAttr || attr->name() == directionAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
 void HTMLMarqueeElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -98,19 +100,16 @@ void HTMLMarqueeElement::collectStyleForAttribute(Attribute* attr, StyleProperty
     } else if (attr->name() == directionAttr) {
         if (!attr->value().isEmpty())
             style->setProperty(CSSPropertyWebkitMarqueeDirection, attr->value());
-    } else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLMarqueeElement(attr));
+    } else
         HTMLElement::collectStyleForAttribute(attr, style);
-    }
 }
 
 void HTMLMarqueeElement::parseAttribute(Attribute* attr)
 {
-    if (isRespectedPresentationAttributeForHTMLMarqueeElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == truespeedAttr)
+    if (attr->name() == truespeedAttr) {
+        // FIXME: Factor this out and remove HTMLMarqueeElement::parseAttribute().
         m_minimumDelay = !attr->isEmpty() ? 0 : defaultMinimumDelay;
-    else
+    else
         HTMLElement::parseAttribute(attr);
 }
 
index 09aef55..795e864 100644 (file)
@@ -54,6 +54,7 @@ private:
     HTMLMarqueeElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     // ActiveDOMObject
index ba2e266..8b7c373 100644 (file)
@@ -54,6 +54,13 @@ PassRefPtr<HTMLOListElement> HTMLOListElement::create(const QualifiedName& tagNa
     return adoptRef(new HTMLOListElement(tagName, document));
 }
 
+bool HTMLOListElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == typeAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLOListElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == typeAttr) {
@@ -73,9 +80,7 @@ void HTMLOListElement::collectStyleForAttribute(Attribute* attr, StylePropertySe
 
 void HTMLOListElement::parseAttribute(Attribute* attr)
 {
-    if (attr->name() == typeAttr)
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == startAttr) {
+    if (attr->name() == startAttr) {
         int oldStart = start();
         bool canParse;
         int parsedStart = attr->value().toInt(&canParse);
index 0efebea..9f0eafb 100644 (file)
@@ -54,6 +54,7 @@ private:
     void recalculateItemCount();
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     int m_start;
index 241bbd3..406a3eb 100644 (file)
@@ -77,6 +77,13 @@ RenderWidget* HTMLObjectElement::renderWidgetForJSBindings()
     return renderPart(); // This will return 0 if the renderer is not a RenderPart.
 }
 
+bool HTMLObjectElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == borderAttr)
+        return true;
+    return HTMLPlugInImageElement::isPresentationAttribute(attr);
+}
+
 void HTMLObjectElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == borderAttr)
@@ -116,8 +123,6 @@ void HTMLObjectElement::parseAttribute(Attribute* attr)
         setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr));
     else if (attr->name() == onbeforeloadAttr)
         setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
-    else if (attr->name() == borderAttr)
-        setNeedsAttributeStyleUpdate();
     else
         HTMLPlugInImageElement::parseAttribute(attr);
 }
index eefed24..112dcc6 100644 (file)
@@ -67,6 +67,7 @@ private:
     HTMLObjectElement(const QualifiedName&, Document*, HTMLFormElement*, bool createdByParser);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual void insertedIntoTree(bool deep);
index 8cf1c46..a70edc0 100644 (file)
@@ -44,6 +44,13 @@ PassRefPtr<HTMLParagraphElement> HTMLParagraphElement::create(const QualifiedNam
     return adoptRef(new HTMLParagraphElement(tagName, document));
 }
 
+bool HTMLParagraphElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLParagraphElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == alignAttr) {
@@ -59,12 +66,4 @@ void HTMLParagraphElement::collectStyleForAttribute(Attribute* attr, StyleProper
         HTMLElement::collectStyleForAttribute(attr, style);
 }
 
-void HTMLParagraphElement::parseAttribute(Attribute* attr)
-{
-    if (attr->name() == alignAttr)
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr);
-}
-
 }
index d5ceb69..86a85a6 100644 (file)
@@ -34,7 +34,7 @@ public:
 private:
     HTMLParagraphElement(const QualifiedName&, Document*);
 
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index b817b8e..8c0f302 100644 (file)
@@ -140,9 +140,11 @@ Widget* HTMLPlugInElement::pluginWidget()
     return renderWidget->widget();
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLPlugInElement(Attribute* attr)
+bool HTMLPlugInElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr;
+    if (attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr)
+        return true;
+    return HTMLFrameOwnerElement::isPresentationAttribute(attr);
 }
 
 void HTMLPlugInElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -159,18 +161,8 @@ void HTMLPlugInElement::collectStyleForAttribute(Attribute* attr, StylePropertyS
         addHTMLLengthToStyle(style, CSSPropertyMarginRight, attr->value());
     } else if (attr->name() == alignAttr)
         applyAlignmentAttributeToStyle(attr, style);
-    else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLPlugInElement(attr));
-        HTMLFrameOwnerElement::collectStyleForAttribute(attr, style);
-    }
-}
-
-void HTMLPlugInElement::parseAttribute(Attribute* attr)
-{
-    if (isRespectedPresentationAttributeForHTMLPlugInElement(attr))
-        setNeedsAttributeStyleUpdate();
     else
-        HTMLFrameOwnerElement::parseAttribute(attr);
+        HTMLFrameOwnerElement::collectStyleForAttribute(attr, style);
 }
 
 void HTMLPlugInElement::defaultEventHandler(Event* event)
index 270177b..10c1ea7 100644 (file)
@@ -58,7 +58,7 @@ protected:
 
     virtual void detach();
     virtual void removedFromDocument();
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     bool m_inBeforeLoadEventHandler;
index 5a97747..09c0897 100644 (file)
@@ -42,25 +42,19 @@ PassRefPtr<HTMLPreElement> HTMLPreElement::create(const QualifiedName& tagName,
     return adoptRef(new HTMLPreElement(tagName, document));
 }
 
-void HTMLPreElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
+bool HTMLPreElement::isPresentationAttribute(Attribute* attr) const
 {
     if (attr->name() == wrapAttr)
-        style->setProperty(CSSPropertyWhiteSpace, CSSValuePreWrap);
-    else
-        HTMLElement::collectStyleForAttribute(attr, style);
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
-void HTMLPreElement::parseAttribute(Attribute* attr)
+void HTMLPreElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
-    if (attr->name() == widthAttr) {
-        // FIXME: Implement this some day.  Width on a <pre> is the # of characters that
-        // we should size the pre to.  We basically need to take the width of a space,
-        // multiply by the value of the attribute and then set that as the width CSS
-        // property.
-    } else if (attr->name() == wrapAttr)
-        setNeedsAttributeStyleUpdate();
+    if (attr->name() == wrapAttr)
+        style->setProperty(CSSPropertyWhiteSpace, CSSValuePreWrap);
     else
-        return HTMLElement::parseAttribute(attr);
+        HTMLElement::collectStyleForAttribute(attr, style);
 }
 
 }
index 862dc63..7782048 100644 (file)
@@ -34,7 +34,7 @@ public:
 private:
     HTMLPreElement(const QualifiedName&, Document*);
 
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index 1b96d22..715d682 100644 (file)
@@ -256,6 +256,17 @@ void HTMLSelectElement::setValue(const String &value)
     setSelectedIndex(-1);
 }
 
+bool HTMLSelectElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr) {
+        // Don't map 'align' attribute. This matches what Firefox, Opera and IE do.
+        // See http://bugs.webkit.org/show_bug.cgi?id=12072
+        return false;
+    }
+
+    return HTMLFormControlElementWithState::isPresentationAttribute(attr);
+}
+
 void HTMLSelectElement::parseAttribute(Attribute* attr)
 {
     if (attr->name() == sizeAttr) {
@@ -282,9 +293,6 @@ void HTMLSelectElement::parseAttribute(Attribute* attr)
         parseMultipleAttribute(attr);
     else if (attr->name() == accesskeyAttr) {
         // FIXME: ignore for the moment.
-    } else if (attr->name() == alignAttr) {
-        // Don't map 'align' attribute. This matches what Firefox, Opera and IE do.
-        // See http://bugs.webkit.org/show_bug.cgi?id=12072
     } else if (attr->name() == onchangeAttr)
         setAttributeEventListener(eventNames().changeEvent, createAttributeEventListener(this, attr));
     else
index 8d9b738..0467724 100644 (file)
@@ -122,6 +122,7 @@ private:
     virtual void restoreFormControlState(const String&);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
 
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle *);
     virtual bool appendFormData(FormDataList&, bool);
index ec53161..0c3b05c 100644 (file)
@@ -44,6 +44,13 @@ PassRefPtr<HTMLTableCaptionElement> HTMLTableCaptionElement::create(const Qualif
     return adoptRef(new HTMLTableCaptionElement(tagName, document));
 }
 
+bool HTMLTableCaptionElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr); // Note that we are bypassing HTMLTablePartElement here.
+}
+
 void HTMLTableCaptionElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == alignAttr) {
@@ -55,10 +62,7 @@ void HTMLTableCaptionElement::collectStyleForAttribute(Attribute* attr, StylePro
 
 void HTMLTableCaptionElement::parseAttribute(Attribute* attr)
 {
-    if (attr->name() == alignAttr)
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr); // Note that we are bypassing HTMLTablePartElement here.
+    HTMLElement::parseAttribute(attr); // Note that we are bypassing HTMLTablePartElement here.
 }
 
 }
index 827cc00..3b93fab 100644 (file)
@@ -38,6 +38,7 @@ private:
     HTMLTableCaptionElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index 93517cb..f96292f 100644 (file)
@@ -75,9 +75,11 @@ int HTMLTableCellElement::cellIndex() const
     return index;
 }
 
-static inline bool isRespectedPresentationAttributeForHTMLTableCellElement(Attribute* attr)
+bool HTMLTableCellElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == nowrapAttr || attr->name() == widthAttr || attr->name() == heightAttr;
+    if (attr->name() == nowrapAttr || attr->name() == widthAttr || attr->name() == heightAttr)
+        return true;
+    return HTMLTablePartElement::isPresentationAttribute(attr);
 }
 
 void HTMLTableCellElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -96,17 +98,13 @@ void HTMLTableCellElement::collectStyleForAttribute(Attribute* attr, StyleProper
             if (heightInt > 0) // height="0" is ignored for compatibility with WinIE.
                 addHTMLLengthToStyle(style, CSSPropertyHeight, attr->value());
         }
-    } else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLTableCellElement(attr));
+    } else
         HTMLTablePartElement::collectStyleForAttribute(attr, style);
-    }
 }
 
 void HTMLTableCellElement::parseAttribute(Attribute* attr)
 {
-    if (isRespectedPresentationAttributeForHTMLTableCellElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == rowspanAttr) {
+    if (attr->name() == rowspanAttr) {
         if (renderer() && renderer()->isTableCell())
             toRenderTableCell(renderer())->colSpanOrRowSpanChanged();
     } else if (attr->name() == colspanAttr) {
index fcdf0e3..7ca1127 100644 (file)
@@ -54,6 +54,7 @@ private:
     HTMLTableCellElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     virtual StylePropertySet* additionalAttributeStyle() OVERRIDE;
index 584de3e..db75b25 100644 (file)
@@ -47,6 +47,13 @@ PassRefPtr<HTMLTableColElement> HTMLTableColElement::create(const QualifiedName&
     return adoptRef(new HTMLTableColElement(tagName, document));
 }
 
+bool HTMLTableColElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == widthAttr)
+        return true;
+    return HTMLTablePartElement::isPresentationAttribute(attr);
+}
+
 void HTMLTableColElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == widthAttr)
@@ -62,7 +69,6 @@ void HTMLTableColElement::parseAttribute(Attribute* attr)
         if (renderer() && renderer()->isTableCol())
             renderer()->updateFromElement();
     } else if (attr->name() == widthAttr) {
-        setNeedsAttributeStyleUpdate();
         if (!attr->value().isEmpty()) {
             if (renderer() && renderer()->isTableCol()) {
                 RenderTableCol* col = toRenderTableCol(renderer());
index 17f0b60..960ee84 100644 (file)
@@ -43,6 +43,7 @@ private:
     HTMLTableColElement(const QualifiedName& tagName, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual StylePropertySet* additionalAttributeStyle() OVERRIDE;
 
index 84835dc..e9d55a4 100644 (file)
@@ -354,24 +354,27 @@ void HTMLTableElement::collectStyleForAttribute(Attribute* attr, StylePropertySe
         HTMLElement::collectStyleForAttribute(attr, style);
 }
 
+bool HTMLTableElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == bgcolorAttr || attr->name() == backgroundAttr || attr->name() == valignAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr || attr->name() == cellspacingAttr || attr->name() == borderAttr || attr->name() == bordercolorAttr || attr->name() == frameAttr || attr->name() == rulesAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
+}
+
 void HTMLTableElement::parseAttribute(Attribute* attr)
 {
     CellBorders bordersBefore = cellBorders();
     unsigned short oldPadding = m_padding;
 
-    if (attr->name() == widthAttr || attr->name() == heightAttr || attr->name() == bgcolorAttr || attr->name() == backgroundAttr || attr->name() == valignAttr || attr->name() == vspaceAttr || attr->name() == hspaceAttr || attr->name() == alignAttr || attr->name() == cellspacingAttr)
-        setNeedsAttributeStyleUpdate();
-    else if (attr->name() == borderAttr)  {
+    if (attr->name() == borderAttr)  {
         // FIXME: This attribute is a mess.
         m_borderAttr = true;
         if (!attr->isNull()) {
             int border = attr->isEmpty() ? 1 : attr->value().toInt();
             m_borderAttr = border;
         }
-        setNeedsAttributeStyleUpdate();
     } else if (attr->name() == bordercolorAttr) {
         m_borderColorAttr = !attr->isEmpty();
-        setNeedsAttributeStyleUpdate();
     } else if (attr->name() == frameAttr) {
         // FIXME: This attribute is a mess.
         bool borderTop;
@@ -379,7 +382,6 @@ void HTMLTableElement::parseAttribute(Attribute* attr)
         bool borderBottom;
         bool borderLeft;
         m_frameAttr = getBordersFromFrameAttributeValue(attr->value(), borderTop, borderRight, borderBottom, borderLeft);
-        setNeedsAttributeStyleUpdate();
     } else if (attr->name() == rulesAttr) {
         m_rulesAttr = UnsetRules;
         if (equalIgnoringCase(attr->value(), "none"))
@@ -392,8 +394,6 @@ void HTMLTableElement::parseAttribute(Attribute* attr)
             m_rulesAttr = ColsRules;
         if (equalIgnoringCase(attr->value(), "all"))
             m_rulesAttr = AllRules;
-
-        setNeedsAttributeStyleUpdate();
     } else if (attr->name() == cellpaddingAttr) {
         if (!attr->value().isEmpty())
             m_padding = max(0, attr->value().toInt());
index ee08101..d9b86a8 100644 (file)
@@ -73,6 +73,7 @@ private:
     HTMLTableElement(const QualifiedName&, Document*);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual bool isURLAttribute(Attribute*) const;
 
index 19bc853..c5b04fb 100644 (file)
@@ -38,9 +38,11 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-static inline bool isRespectedPresentationAttributeForHTMLTablePartElement(Attribute* attr)
+bool HTMLTablePartElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == bgcolorAttr || attr->name() == backgroundAttr || attr->name() == bordercolorAttr || attr->name() == valignAttr || attr->name() == alignAttr || attr->name() == heightAttr;
+    if (attr->name() == bgcolorAttr || attr->name() == backgroundAttr || attr->name() == bordercolorAttr || attr->name() == valignAttr || attr->name() == alignAttr || attr->name() == heightAttr)
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
 void HTMLTablePartElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -76,18 +78,8 @@ void HTMLTablePartElement::collectStyleForAttribute(Attribute* attr, StyleProper
     } else if (attr->name() == heightAttr) {
         if (!attr->value().isEmpty())
             addHTMLLengthToStyle(style, CSSPropertyHeight, attr->value());
-    } else {
-        ASSERT(!isRespectedPresentationAttributeForHTMLTablePartElement(attr));
+    } else
         HTMLElement::collectStyleForAttribute(attr, style);
-    }
-}
-
-void HTMLTablePartElement::parseAttribute(Attribute* attr)
-{
-    if (isRespectedPresentationAttributeForHTMLTablePartElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else
-        HTMLElement::parseAttribute(attr);
 }
 
 HTMLTableElement* HTMLTablePartElement::findParentTable() const
index 98e7b7a..49f75b3 100644 (file)
@@ -38,7 +38,8 @@ protected:
         : HTMLElement(tagName, document)
     {
     }
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 
     HTMLTableElement* findParentTable() const;
index 0396f39..13cb3ec 100644 (file)
@@ -118,6 +118,19 @@ void HTMLTextAreaElement::childrenChanged(bool changedByParser, Node* beforeChan
     HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
 }
 
+bool HTMLTextAreaElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == alignAttr) {
+        // Don't map 'align' attribute.  This matches what Firefox, Opera and IE do.
+        // See http://bugs.webkit.org/show_bug.cgi?id=7075
+        return false;
+    }
+
+    if (attr->name() == wrapAttr)
+        return true;
+    return HTMLTextFormControlElement::isPresentationAttribute(attr);
+}
+
 void HTMLTextAreaElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == wrapAttr) {
@@ -164,16 +177,11 @@ void HTMLTextAreaElement::parseAttribute(Attribute* attr)
             wrap = SoftWrap;
         if (wrap != m_wrap) {
             m_wrap = wrap;
-            setNeedsAttributeStyleUpdate();
-
             if (renderer())
                 renderer()->setNeedsLayoutAndPrefWidthsRecalc();
         }
     } else if (attr->name() == accesskeyAttr) {
         // ignore for the moment
-    } else if (attr->name() == alignAttr) {
-        // Don't map 'align' attribute.  This matches what Firefox, Opera and IE do.
-        // See http://bugs.webkit.org/show_bug.cgi?id=7075
     } else if (attr->name() == maxlengthAttr)
         setNeedsValidityCheck();
     else
index 9d73496..615af25 100644 (file)
@@ -94,6 +94,7 @@ private:
 
     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
     virtual bool appendFormData(FormDataList&, bool);
index 1099490..9ad9a14 100644 (file)
@@ -47,20 +47,19 @@ PassRefPtr<HTMLUListElement> HTMLUListElement::create(const QualifiedName& tagNa
     return adoptRef(new HTMLUListElement(tagName, document));
 }
 
-void HTMLUListElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
+bool HTMLUListElement::isPresentationAttribute(Attribute* attr) const
 {
     if (attr->name() == typeAttr)
-        style->setProperty(CSSPropertyListStyleType, attr->value());
-    else
-        HTMLElement::collectStyleForAttribute(attr, style);
+        return true;
+    return HTMLElement::isPresentationAttribute(attr);
 }
 
-void HTMLUListElement::parseAttribute(Attribute* attr)
+void HTMLUListElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (attr->name() == typeAttr)
-        setNeedsAttributeStyleUpdate();
+        style->setProperty(CSSPropertyListStyleType, attr->value());
     else
-        HTMLElement::parseAttribute(attr);
+        HTMLElement::collectStyleForAttribute(attr, style);
 }
 
 }
index abb2192..ea6510d 100644 (file)
@@ -35,7 +35,7 @@ public:
 private:
     HTMLUListElement(const QualifiedName&, Document*);
 
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
 
index 2cf83a7..64428d8 100644 (file)
@@ -105,6 +105,13 @@ void HTMLVideoElement::collectStyleForAttribute(Attribute* attr, StylePropertySe
         HTMLMediaElement::collectStyleForAttribute(attr, style);
 }
 
+bool HTMLVideoElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == widthAttr || attr->name() == heightAttr)
+        return true;
+    return HTMLMediaElement::isPresentationAttribute(attr);
+}
+
 void HTMLVideoElement::parseAttribute(Attribute* attr)
 {
     const QualifiedName& attrName = attr->name();
@@ -125,9 +132,7 @@ void HTMLVideoElement::parseAttribute(Attribute* attr)
                 toRenderImage(renderer())->imageResource()->setCachedImage(0); 
         }
 #endif
-    } else if (attrName == widthAttr || attrName == heightAttr)
-        setNeedsAttributeStyleUpdate();
-    else
+    } else
         HTMLMediaElement::parseAttribute(attr);
 }
 
index fe88ab0..59efd88 100644 (file)
@@ -76,6 +76,7 @@ private:
     virtual void attach();
     virtual void detach();
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual bool isVideo() const { return true; }
     virtual bool hasVideo() const { return player() && player()->hasVideo(); }
index 2a1c0d2..3e2082a 100644 (file)
@@ -48,9 +48,11 @@ PassRefPtr<MathMLElement> MathMLElement::create(const QualifiedName& tagName, Do
     return adoptRef(new MathMLElement(tagName, document));
 }
 
-static inline bool isRespectedPresentationAttributeForMathMLElement(Attribute* attr)
+bool MathMLElement::isPresentationAttribute(Attribute* attr) const
 {
-    return attr->name() == mathbackgroundAttr || attr->name() == mathsizeAttr || attr->name() == mathcolorAttr || attr->name() == fontsizeAttr || attr->name() == backgroundAttr || attr->name() == colorAttr || attr->name() == fontstyleAttr || attr->name() == fontweightAttr || attr->name() == fontfamilyAttr;
+    if (attr->name() == mathbackgroundAttr || attr->name() == mathsizeAttr || attr->name() == mathcolorAttr || attr->name() == fontsizeAttr || attr->name() == backgroundAttr || attr->name() == colorAttr || attr->name() == fontstyleAttr || attr->name() == fontweightAttr || attr->name() == fontfamilyAttr)
+        return true;
+    return StyledElement::isPresentationAttribute(attr);
 }
 
 void MathMLElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
@@ -77,19 +79,11 @@ void MathMLElement::collectStyleForAttribute(Attribute* attr, StylePropertySet*
     else if (attr->name() == fontfamilyAttr)
         style->setProperty(CSSPropertyFontFamily, attr->value());
     else {
-        ASSERT(!isRespectedPresentationAttributeForMathMLElement(attr));
+        ASSERT(!isPresentationAttribute(attr));
         StyledElement::collectStyleForAttribute(attr, style);
     }
 }
 
-void MathMLElement::parseAttribute(Attribute* attr)
-{
-    if (isRespectedPresentationAttributeForMathMLElement(attr))
-        setNeedsAttributeStyleUpdate();
-    else
-        StyledElement::parseAttribute(attr);
-}
-    
 }
 
 #endif // ENABLE(MATHML)
index bc4a968..4b09251 100644 (file)
@@ -42,7 +42,7 @@ protected:
 
 private:    
     virtual bool isMathMLElement() const { return true; }
-    virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
 };
     
index b93580d..786f144 100644 (file)
@@ -91,6 +91,13 @@ bool SVGImageElement::isSupportedAttribute(const QualifiedName& attrName)
     return supportedAttributes.contains<QualifiedName, SVGAttributeHashTranslator>(attrName);
 }
 
+bool SVGImageElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name() == SVGNames::widthAttr || attr->name() == SVGNames::heightAttr)
+        return true;
+    return SVGStyledTransformableElement::isPresentationAttribute(attr);
+}
+
 void SVGImageElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (!isSupportedAttribute(attr->name()))
@@ -113,13 +120,11 @@ void SVGImageElement::parseAttribute(Attribute* attr)
         setYBaseValue(SVGLength::construct(LengthModeHeight, attr->value(), parseError));
     else if (attr->name() == SVGNames::preserveAspectRatioAttr)
         SVGPreserveAspectRatio::parsePreserveAspectRatio(this, attr->value());
-    else if (attr->name() == SVGNames::widthAttr) {
+    else if (attr->name() == SVGNames::widthAttr)
         setWidthBaseValue(SVGLength::construct(LengthModeWidth, attr->value(), parseError, ForbidNegativeLengths));
-        setNeedsAttributeStyleUpdate();
-    } else if (attr->name() == SVGNames::heightAttr) {
+    else if (attr->name() == SVGNames::heightAttr)
         setHeightBaseValue(SVGLength::construct(LengthModeHeight, attr->value(), parseError, ForbidNegativeLengths));
-        setNeedsAttributeStyleUpdate();
-    } else if (SVGTests::parseAttribute(attr)
+    else if (SVGTests::parseAttribute(attr)
              || SVGLangSpace::parseAttribute(attr)
              || SVGExternalResourcesRequired::parseAttribute(attr)
              || SVGURIReference::parseAttribute(attr)) {
index 4edd00d..fb1229e 100644 (file)
@@ -50,6 +50,7 @@ private:
 
     bool isSupportedAttribute(const QualifiedName&);
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual void svgAttributeChanged(const QualifiedName&);
 
index ee795f4..376551e 100644 (file)
@@ -292,6 +292,13 @@ bool SVGStyledElement::isAnimatableCSSProperty(const QualifiedName& attrName)
     return cssPropertyToTypeMap().contains(attrName);
 }
 
+bool SVGStyledElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (SVGStyledElement::cssPropertyIdForSVGAttributeName(attr->name()) > 0)
+        return true;
+    return SVGElement::isPresentationAttribute(attr);
+}
+
 void SVGStyledElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     int propertyID = SVGStyledElement::cssPropertyIdForSVGAttributeName(attr->name());
@@ -301,11 +308,6 @@ void SVGStyledElement::collectStyleForAttribute(Attribute* attr, StylePropertySe
 
 void SVGStyledElement::parseAttribute(Attribute* attr)
 {
-    if (SVGStyledElement::cssPropertyIdForSVGAttributeName(attr->name()) > 0) {
-        setNeedsAttributeStyleUpdate();
-        return;
-    }
-    
     // SVG animation has currently requires special storage of values so we set
     // the className here.  svgAttributeChanged actually causes the resulting
     // style updates (instead of StyledElement::parseAttribute). We don't
index 08498d9..7a40064 100644 (file)
@@ -66,6 +66,7 @@ protected:
     virtual bool rendererIsNeeded(const NodeRenderingContext&);
 
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual void svgAttributeChanged(const QualifiedName&);
 
index 61dfc8e..e5ba499 100644 (file)
@@ -228,6 +228,13 @@ bool SVGTextContentElement::isSupportedAttribute(const QualifiedName& attrName)
     return supportedAttributes.contains<QualifiedName, SVGAttributeHashTranslator>(attrName);
 }
 
+bool SVGTextContentElement::isPresentationAttribute(Attribute* attr) const
+{
+    if (attr->name().matches(XMLNames::spaceAttr))
+        return true;
+    return SVGStyledElement::isPresentationAttribute(attr);
+}
+
 void SVGTextContentElement::collectStyleForAttribute(Attribute* attr, StylePropertySet* style)
 {
     if (!isSupportedAttribute(attr->name()))
@@ -257,8 +264,6 @@ void SVGTextContentElement::parseAttribute(Attribute* attr)
     } else if (SVGTests::parseAttribute(attr)
                || SVGExternalResourcesRequired::parseAttribute(attr)) {
     } else if (SVGLangSpace::parseAttribute(attr)) {
-        if (attr->name().matches(XMLNames::spaceAttr))
-            setNeedsAttributeStyleUpdate();
     } else
         ASSERT_NOT_REACHED();
 
index 76d2826..91ae378 100644 (file)
@@ -104,6 +104,7 @@ protected:
 
     bool isSupportedAttribute(const QualifiedName&);
     virtual void parseAttribute(Attribute*) OVERRIDE;
+    virtual bool isPresentationAttribute(Attribute*) const OVERRIDE;
     virtual void collectStyleForAttribute(Attribute*, StylePropertySet*) OVERRIDE;
     virtual void svgAttributeChanged(const QualifiedName&);