InputType should not interact with an HTMLInputElement is no longer associated with
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Aug 2018 23:56:42 +0000 (23:56 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Aug 2018 23:56:42 +0000 (23:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=188410

Reviewed by Ryosuke Niwa.

Clear InputType::m_element when the InputType is no longer associated with the HTMLInputElement
because the element changed type. We were already dealing with the InputType no longer being
associated with an element because the element died by using a WeakPtr. However, it is conceptually
better (more correct) to also clear this pointer if the element is still alive but associated with
another InputType.

* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::updateType):
* html/InputType.h:
(WebCore::InputType::detachFromElement):

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

Source/WebCore/ChangeLog
Source/WebCore/html/HTMLInputElement.cpp
Source/WebCore/html/InputType.h
Source/WebCore/html/RangeInputType.cpp

index 088eb61..2fceb68 100644 (file)
@@ -1,3 +1,21 @@
+2018-08-09  Chris Dumez  <cdumez@apple.com>
+
+        InputType should not interact with an HTMLInputElement is no longer associated with
+        https://bugs.webkit.org/show_bug.cgi?id=188410
+
+        Reviewed by Ryosuke Niwa.
+
+        Clear InputType::m_element when the InputType is no longer associated with the HTMLInputElement
+        because the element changed type. We were already dealing with the InputType no longer being
+        associated with an element because the element died by using a WeakPtr. However, it is conceptually
+        better (more correct) to also clear this pointer if the element is still alive but associated with
+        another InputType.
+
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::updateType):
+        * html/InputType.h:
+        (WebCore::InputType::detachFromElement):
+
 2018-08-09  Jer Noble  <jer.noble@apple.com>
 
         Video playback is using more power
index b1ff12d..dc5aa3d 100644 (file)
@@ -521,6 +521,7 @@ void HTMLInputElement::updateType()
     }
 
     m_inputType->destroyShadowSubtree();
+    m_inputType->detachFromElement();
 
     m_inputType = WTFMove(newType);
     m_inputType->createShadowSubtree();
index c994cce..fe2a40b 100644 (file)
@@ -77,6 +77,8 @@ public:
     static Ref<InputType> createText(HTMLInputElement&);
     virtual ~InputType();
 
+    void detachFromElement() { m_element = nullptr; }
+
     static bool themeSupportsDataListUI(InputType*);
 
     virtual const AtomicString& formControlType() const = 0;
@@ -314,7 +316,7 @@ private:
     // Helper for stepUp()/stepDown(). Adds step value * count to the current value.
     ExceptionOr<void> applyStep(int count, AnyStepHandling, TextFieldEventBehavior);
 
-    // Raw pointer because the HTMLInputElement object owns this InputType object.
+    // m_element is null if this InputType is no longer associated with an element (either the element died or changed input type).
     WeakPtr<HTMLInputElement> m_element;
 };
 
index 4460d71..995fcf2 100644 (file)
@@ -321,8 +321,8 @@ void RangeInputType::accessKeyAction(bool sendMouseEvents)
 {
     InputType::accessKeyAction(sendMouseEvents);
 
-    ASSERT(element());
-    element()->dispatchSimulatedClick(0, sendMouseEvents ? SendMouseUpDownEvents : SendNoEvents);
+    if (auto* element = this->element())
+        element->dispatchSimulatedClick(0, sendMouseEvents ? SendMouseUpDownEvents : SendNoEvents);
 }
 
 void RangeInputType::attributeChanged(const QualifiedName& name)