Don't synchronize attributes in reflect setters when we don't need to
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2014 10:48:48 +0000 (10:48 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2014 10:48:48 +0000 (10:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=129662

Reviewed by Andreas Kling.

The vast majority of attributes don't need synchronization. Avoid calling synchronizeAttribute in setters
for those content attributes generated by "Reflect" keyword in IDL.

* bindings/scripts/CodeGenerator.pm:
(SetterExpression):
* dom/Element.cpp:
(WebCore::Element::setAttributeWithoutSynchronization): Added.
* dom/Element.h:

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

Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGenerator.pm
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h

index e70e7a71f35824d1c04f29a542e9499173969961..bd072f8ae1718a5fdfb7824131108cfc02ebf67c 100644 (file)
@@ -1,3 +1,19 @@
+2014-03-04  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Don't synchronize attributes in reflect setters when we don't need to
+        https://bugs.webkit.org/show_bug.cgi?id=129662
+
+        Reviewed by Andreas Kling.
+
+        The vast majority of attributes don't need synchronization. Avoid calling synchronizeAttribute in setters
+        for those content attributes generated by "Reflect" keyword in IDL.
+
+        * bindings/scripts/CodeGenerator.pm:
+        (SetterExpression):
+        * dom/Element.cpp:
+        (WebCore::Element::setAttributeWithoutSynchronization): Added.
+        * dom/Element.h:
+
 2014-03-04  Andreas Kling  <akling@apple.com>
 
         Remove Document::idAttributeName().
index 943959f54aaf18e4b9f1d400484d679da84fe713..84a341b309c5aa440c8aa7b9b0f0c86d4b0f88ca 100644 (file)
@@ -593,15 +593,19 @@ sub SetterExpression
         return ("set" . $generator->WK_ucfirst($generator->AttributeNameForGetterAndSetter($attribute)));
     }
 
+    my $attributeType = $attribute->signature->type;
+
     my $functionName;
-    if ($attribute->signature->type eq "boolean") {
+    if ($attributeType eq "boolean") {
         $functionName = "setBooleanAttribute";
-    } elsif ($attribute->signature->type eq "long") {
+    } elsif ($attributeType eq "long") {
         $functionName = "setIntegralAttribute";
-    } elsif ($attribute->signature->type eq "unsigned long") {
+    } elsif ($attributeType eq "unsigned long") {
         $functionName = "setUnsignedIntegralAttribute";
-    } else {
+    } elsif ($generator->IsSVGAnimatedType($attributeType)) {
         $functionName = "setAttribute";
+    } else {
+        $functionName = "setAttributeWithoutSynchronization";
     }
 
     return ($functionName, $contentAttributeName);
index 09c3890a1e04cff76c8ca2c7d0cf70041ee7d126..5c56d6e437212059f43db92a950a55df5c6feddc 100644 (file)
@@ -1007,6 +1007,12 @@ void Element::setAttribute(const QualifiedName& name, const AtomicString& value)
     setAttributeInternal(index, name, value, NotInSynchronizationOfLazyAttribute);
 }
 
+void Element::setAttributeWithoutSynchronization(const QualifiedName& name, const AtomicString& value)
+{
+    unsigned index = elementData() ? elementData()->findAttributeIndexByName(name) : ElementData::attributeNotFound;
+    setAttributeInternal(index, name, value, NotInSynchronizationOfLazyAttribute);
+}
+
 void Element::setSynchronizedLazyAttribute(const QualifiedName& name, const AtomicString& value)
 {
     unsigned index = elementData() ? elementData()->findAttributeIndexByName(name) : ElementData::attributeNotFound;
@@ -2054,7 +2060,7 @@ const AtomicString& Element::pseudo() const
 
 void Element::setPseudo(const AtomicString& value)
 {
-    setAttribute(pseudoAttr, value);
+    setAttributeWithoutSynchronization(pseudoAttr, value);
 }
 
 LayoutSize Element::minimumSizeForResizing() const
index 6fb687167513c6239a7a1c72abe7b7b43ae257a5..a1e774f2418e2ccb9fd5116e48fb6eac017cf106 100644 (file)
@@ -144,6 +144,7 @@ public:
     bool hasAttribute(const QualifiedName&) const;
     const AtomicString& getAttribute(const QualifiedName&) const;
     void setAttribute(const QualifiedName&, const AtomicString& value);
+    void setAttributeWithoutSynchronization(const QualifiedName&, const AtomicString& value);
     void setSynchronizedLazyAttribute(const QualifiedName&, const AtomicString& value);
     bool removeAttribute(const QualifiedName&);