Unreviewed, rolling out r190134.
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Sep 2015 23:06:24 +0000 (23:06 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Sep 2015 23:06:24 +0000 (23:06 +0000)
https://bugs.webkit.org/show_bug.cgi?id=149481

"Seems to cause crashes during garbage collection" (Requested
by cdumez on #webkit).

Reverted changeset:

"HTMLOutputElement.htmlFor should be settable"
https://bugs.webkit.org/show_bug.cgi?id=149418
http://trac.webkit.org/changeset/190134

Patch by Commit Queue <commit-queue@webkit.org> on 2015-09-22

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

19 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list-expected.txt
LayoutTests/fast/dom/HTMLOutputElement/script-tests/dom-settable-token-list.js
Source/WebCore/ChangeLog
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/ElementRareData.h
Source/WebCore/html/AttributeDOMTokenList.cpp
Source/WebCore/html/AttributeDOMTokenList.h
Source/WebCore/html/DOMSettableTokenList.cpp
Source/WebCore/html/DOMSettableTokenList.h
Source/WebCore/html/DOMTokenList.cpp
Source/WebCore/html/DOMTokenList.h
Source/WebCore/html/HTMLAnchorElement.cpp
Source/WebCore/html/HTMLAnchorElement.h
Source/WebCore/html/HTMLLinkElement.cpp
Source/WebCore/html/HTMLLinkElement.h
Source/WebCore/html/HTMLOutputElement.cpp
Source/WebCore/html/HTMLOutputElement.h
Source/WebCore/html/HTMLOutputElement.idl

index d792a2a..f53c253 100644 (file)
@@ -1,3 +1,17 @@
+2015-09-22  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, rolling out r190134.
+        https://bugs.webkit.org/show_bug.cgi?id=149481
+
+        "Seems to cause crashes during garbage collection" (Requested
+        by cdumez on #webkit).
+
+        Reverted changeset:
+
+        "HTMLOutputElement.htmlFor should be settable"
+        https://bugs.webkit.org/show_bug.cgi?id=149418
+        http://trac.webkit.org/changeset/190134
+
 2015-09-22  Zalan Bujtas  <zalan@apple.com>
 
         Mark http/tests/notifications/events.html flaky.
index 9e7ea90..b3b29f7 100644 (file)
@@ -4,10 +4,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 - Tests from http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/
-PASS element.htmlFor.__proto__ is DOMSettableTokenList.prototype
-PASS String(element.htmlFor) is "y z"
-PASS element.getAttribute("for") is "y z"
-PASS String(element.htmlFor) is "r s t"
+PASS String(element.htmlFor) is "x"
 PASS element.htmlFor.length is 0
 PASS element.htmlFor.length is 1
 PASS element.htmlFor.length is 1
index fd0f988..44dc678 100644 (file)
@@ -14,14 +14,10 @@ function createElement(tokenList)
 
 debug('- Tests from http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/');
 
-// HTMLOutputElement::htmlFor should be settable.
+// HTMLOutputElement::htmlFor is readonly attribute.
 createElement('x');
-shouldBe('element.htmlFor.__proto__', 'DOMSettableTokenList.prototype');
-element.htmlFor = 'y  z';
-shouldBeEqualToString('String(element.htmlFor)', 'y z');
-shouldBeEqualToString('element.getAttribute("for")', 'y z');
-element.setAttribute('for', 'r s t');
-shouldBeEqualToString('String(element.htmlFor)', 'r s t');
+element.htmlFor = 'y';
+shouldBeEqualToString('String(element.htmlFor)', 'x');
 
 // http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/001.htm
 createElement('');
index 41f360b..d54c6bb 100644 (file)
@@ -1,3 +1,17 @@
+2015-09-22  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, rolling out r190134.
+        https://bugs.webkit.org/show_bug.cgi?id=149481
+
+        "Seems to cause crashes during garbage collection" (Requested
+        by cdumez on #webkit).
+
+        Reverted changeset:
+
+        "HTMLOutputElement.htmlFor should be settable"
+        https://bugs.webkit.org/show_bug.cgi?id=149418
+        http://trac.webkit.org/changeset/190134
+
 2015-09-22  Chris Dumez  <cdumez@apple.com>
 
         Range.intersectsNode() does not behave according to the specification when start / end are equal
index 67deec9..abaa14f 100644 (file)
@@ -2715,7 +2715,7 @@ DOMTokenList& Element::classList()
 {
     ElementRareData& data = ensureElementRareData();
     if (!data.classList())
-        data.setClassList(AttributeDOMTokenList::create(*this, HTMLNames::classAttr));
+        data.setClassList(std::make_unique<AttributeDOMTokenList>(*this, HTMLNames::classAttr));
     return *data.classList();
 }
 
index 099e6a2..5981cf4 100644 (file)
@@ -93,7 +93,7 @@ public:
     void setComputedStyle(Ref<RenderStyle>&& computedStyle) { m_computedStyle = WTF::move(computedStyle); }
 
     AttributeDOMTokenList* classList() const { return m_classList.get(); }
-    void setClassList(RefPtr<AttributeDOMTokenList>&& classList) { m_classList = WTF::move(classList); }
+    void setClassList(std::unique_ptr<AttributeDOMTokenList> classList) { m_classList = WTF::move(classList); }
 
     DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
     void setDataset(std::unique_ptr<DatasetDOMStringMap> dataset) { m_dataset = WTF::move(dataset); }
@@ -134,7 +134,7 @@ private:
     RefPtr<RenderStyle> m_computedStyle;
 
     std::unique_ptr<DatasetDOMStringMap> m_dataset;
-    RefPtr<AttributeDOMTokenList> m_classList;
+    std::unique_ptr<AttributeDOMTokenList> m_classList;
     RefPtr<ShadowRoot> m_shadowRoot;
     std::unique_ptr<NamedNodeMap> m_attributeMap;
 
index 2164d8a..88ec6f4 100644 (file)
@@ -34,7 +34,7 @@ AttributeDOMTokenList::AttributeDOMTokenList(Element& element, const QualifiedNa
     : m_element(element)
     , m_attributeName(attributeName)
 {
-    setValueInternal(m_element.getAttribute(m_attributeName));
+    setValue(m_element.getAttribute(m_attributeName));
 }
 
 void AttributeDOMTokenList::attributeValueChanged(const AtomicString& newValue)
@@ -43,7 +43,7 @@ void AttributeDOMTokenList::attributeValueChanged(const AtomicString& newValue)
     if (m_isUpdatingAttributeValue)
         return;
 
-    setValueInternal(newValue);
+    DOMTokenList::setValue(newValue);
 }
 
 void AttributeDOMTokenList::updateAfterTokenChange()
index e735ea9..34130fd 100644 (file)
 #ifndef AttributeDOMTokenList_h
 #define AttributeDOMTokenList_h
 
-#include "DOMSettableTokenList.h"
+#include "DOMTokenList.h"
 #include "Element.h"
 
 namespace WebCore {
 
-class AttributeDOMTokenList final : public DOMSettableTokenList {
+class AttributeDOMTokenList final : public DOMTokenList {
 public:
-    static Ref<AttributeDOMTokenList> create(Element& element, const QualifiedName& attributeName)
-    {
-        return adoptRef(*new AttributeDOMTokenList(element, attributeName));
-    }
-
+    AttributeDOMTokenList(Element&, const QualifiedName& attributeName);
     void attributeValueChanged(const AtomicString&);
 
 private:
-    AttributeDOMTokenList(Element&, const QualifiedName& attributeName);
+    virtual void ref() override { m_element.ref(); }
+    virtual void deref() override { m_element.deref(); }
 
     virtual Element* element() const override { return &m_element; }
     virtual void updateAfterTokenChange() override;
index 8d32dc5..45d3b39 100644 (file)
@@ -38,10 +38,4 @@ void DOMSettableTokenList::deref()
     RefCounted<DOMSettableTokenList>::deref();
 }
 
-void DOMSettableTokenList::setValue(const String& value)
-{
-    setValueInternal(value);
-    updateAfterTokenChange();
-}
-
 } // namespace WebCore
index 3f600f1..159eb51 100644 (file)
@@ -35,7 +35,7 @@ namespace WebCore {
 
 typedef int ExceptionCode;
 
-class DOMSettableTokenList : public DOMTokenList, public RefCounted<DOMSettableTokenList> {
+class DOMSettableTokenList final : public DOMTokenList, public RefCounted<DOMSettableTokenList> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     static Ref<DOMSettableTokenList> create()
@@ -43,13 +43,12 @@ public:
         return adoptRef(*new DOMSettableTokenList);
     }
 
-    void setValue(const String&);
-
     // Make public.
     using DOMTokenList::value;
+    using DOMTokenList::setValue;
 
-    virtual void ref() override final;
-    virtual void deref() override final;
+    virtual void ref() override;
+    virtual void deref() override;
 };
 
 } // namespace WebCore
index acb4567..c86e0e2 100644 (file)
@@ -158,7 +158,7 @@ const AtomicString& DOMTokenList::value() const
     return m_cachedValue;
 }
 
-void DOMTokenList::setValueInternal(const WTF::String& value)
+void DOMTokenList::setValue(const String& value)
 {
     // Clear tokens but not capacity.
     m_tokens.shrink(0);
index a27d47b..dc6ddfe 100644 (file)
@@ -61,7 +61,7 @@ public:
 protected:
     DOMTokenList() = default;
     const AtomicString& value() const;
-    void setValueInternal(const String&);
+    void setValue(const String&);
 
     virtual void updateAfterTokenChange() { m_cachedValue = nullAtom; }
 
index ef439af..053ec45 100644 (file)
@@ -316,7 +316,7 @@ bool HTMLAnchorElement::hasRel(uint32_t relation) const
 DOMTokenList& HTMLAnchorElement::relList()
 {
     if (!m_relList) 
-        m_relList = AttributeDOMTokenList::create(*this, HTMLNames::relAttr);
+        m_relList = std::make_unique<AttributeDOMTokenList>(*this, HTMLNames::relAttr);
     return *m_relList;
 }
 
index c1fcdf2..fd9d966 100644 (file)
@@ -145,7 +145,7 @@ private:
     uint32_t m_linkRelations : 30;
     mutable LinkHash m_cachedVisitedLinkHash;
 
-    RefPtr<AttributeDOMTokenList> m_relList;
+    std::unique_ptr<AttributeDOMTokenList> m_relList;
 };
 
 inline LinkHash HTMLAnchorElement::visitedLinkHash() const
index 750346b..ac19fca 100644 (file)
@@ -403,7 +403,7 @@ void HTMLLinkElement::dispatchPendingEvent(LinkEventSender* eventSender)
 DOMTokenList& HTMLLinkElement::relList()
 {
     if (!m_relList) 
-        m_relList = AttributeDOMTokenList::create(*this, HTMLNames::relAttr);
+        m_relList = std::make_unique<AttributeDOMTokenList>(*this, HTMLNames::relAttr);
     return *m_relList;
 }
 
index be34821..091125e 100644 (file)
@@ -139,7 +139,7 @@ private:
 
     PendingSheetType m_pendingSheetType;
 
-    RefPtr<AttributeDOMTokenList> m_relList;
+    std::unique_ptr<AttributeDOMTokenList> m_relList;
 };
 
 } //namespace
index ebf766b..67b25e8 100644 (file)
 
 namespace WebCore {
 
-using namespace HTMLNames;
-
 inline HTMLOutputElement::HTMLOutputElement(const QualifiedName& tagName, Document& document, HTMLFormElement* form)
     : HTMLFormControlElement(tagName, document, form)
     , m_isDefaultValueMode(true)
     , m_isSetTextContentInProgress(false)
     , m_defaultValue("")
-    , m_tokens(AttributeDOMTokenList::create(*this, forAttr))
+    , m_tokens(DOMSettableTokenList::create())
 {
 }
 
@@ -66,12 +64,17 @@ bool HTMLOutputElement::supportsFocus() const
 
 void HTMLOutputElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
 {
-    if (name == forAttr)
-        m_tokens->attributeValueChanged(value);
+    if (name == HTMLNames::forAttr)
+        setFor(value);
     else
         HTMLFormControlElement::parseAttribute(name, value);
 }
 
+void HTMLOutputElement::setFor(const String& value)
+{
+    m_tokens->setValue(value);
+}
+
 void HTMLOutputElement::childrenChanged(const ChildChange& change)
 {
     HTMLFormControlElement::childrenChanged(change);
index 576e3f7..0c0f15e 100644 (file)
@@ -31,7 +31,7 @@
 #ifndef HTMLOutputElement_h
 #define HTMLOutputElement_h
 
-#include "AttributeDOMTokenList.h"
+#include "DOMSettableTokenList.h"
 #include "HTMLFormControlElement.h"
 
 namespace WebCore {
@@ -44,6 +44,7 @@ public:
     void setValue(const String&);
     String defaultValue() const;
     void setDefaultValue(const String&);
+    void setFor(const String&);
     DOMSettableTokenList& htmlFor() { return m_tokens.get(); }
     
     virtual bool canContainRangeEndPoint() const override { return false; }
@@ -65,7 +66,7 @@ private:
     bool m_isDefaultValueMode;
     bool m_isSetTextContentInProgress;
     String m_defaultValue;
-    Ref<AttributeDOMTokenList> m_tokens;
+    Ref<DOMSettableTokenList> m_tokens;
 };
 
 } // namespace
index bdcb0bd..4f1c6c3 100644 (file)
@@ -23,7 +23,9 @@
  */
 
 interface HTMLOutputElement : HTMLElement {
-    [PutForwards=value] readonly attribute DOMSettableTokenList htmlFor;
+    // FIXME: This is supposed to be:
+    // [PutForwards=value] readonly attribute DOMSettableTokenList htmlFor;
+    readonly attribute DOMSettableTokenList htmlFor;
 
     readonly attribute HTMLFormElement form;
     [Reflect] attribute DOMString name;