Title: [134206] trunk/Source/WebCore
Revision
134206
Author
[email protected]
Date
2012-11-12 04:21:44 -0800 (Mon, 12 Nov 2012)

Log Message

Remove HTMLInputElement dependency from PickerIndicatorElement
https://bugs.webkit.org/show_bug.cgi?id=101913

Patch by Kunihiko Sakamoto <[email protected]> on 2012-11-12
Reviewed by Kent Tamura.

Introduced PickerIndicatorOwner interface that replaces the role of hostInput() in
PickerIndicatorElement. It makes easier to add interactions between picker indicator
and its owner without having to add functions to HTMLInputElement.

No new tests. This is just a refactor.

* html/BaseMultipleFieldsDateAndTimeInputType.cpp:
(WebCore::BaseMultipleFieldsDateAndTimeInputType::isPickerIndicatorOwnerDisabledOrReadOnly): Added.
(WebCore):
(WebCore::BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue): Added.
(WebCore::BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters): Added.
(WebCore::BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType):
(WebCore::BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree):
(WebCore::BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree):
* html/BaseMultipleFieldsDateAndTimeInputType.h:
(WebCore):
(BaseMultipleFieldsDateAndTimeInputType): Implements PickerIndicatorOwner.
* html/shadow/PickerIndicatorElement.cpp: Replaced all the use of hostInput() by using PickerIndicatorOwner.
(WebCore::PickerIndicatorElement::PickerIndicatorElement):
(WebCore::PickerIndicatorElement::create):
(WebCore::PickerIndicatorElement::defaultEventHandler):
(WebCore::PickerIndicatorElement::willRespondToMouseClickEvents):
(WebCore::PickerIndicatorElement::didChooseValue):
(WebCore::PickerIndicatorElement::openPopup):
* html/shadow/PickerIndicatorElement.h:
(PickerIndicatorElement): Added a PickerIndicatorOwner member.
(PickerIndicatorOwner): An interface class for communicating picker indicator and its owner.
(WebCore::PickerIndicatorElement::PickerIndicatorOwner::~PickerIndicatorOwner):
(WebCore::PickerIndicatorElement::removePickerIndicatorOwner):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (134205 => 134206)


--- trunk/Source/WebCore/ChangeLog	2012-11-12 12:08:15 UTC (rev 134205)
+++ trunk/Source/WebCore/ChangeLog	2012-11-12 12:21:44 UTC (rev 134206)
@@ -1,3 +1,40 @@
+2012-11-12  Kunihiko Sakamoto  <[email protected]>
+
+        Remove HTMLInputElement dependency from PickerIndicatorElement
+        https://bugs.webkit.org/show_bug.cgi?id=101913
+
+        Reviewed by Kent Tamura.
+
+        Introduced PickerIndicatorOwner interface that replaces the role of hostInput() in
+        PickerIndicatorElement. It makes easier to add interactions between picker indicator
+        and its owner without having to add functions to HTMLInputElement.
+
+        No new tests. This is just a refactor.
+
+        * html/BaseMultipleFieldsDateAndTimeInputType.cpp:
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::isPickerIndicatorOwnerDisabledOrReadOnly): Added.
+        (WebCore):
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue): Added.
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters): Added.
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::~BaseMultipleFieldsDateAndTimeInputType):
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::createShadowSubtree):
+        (WebCore::BaseMultipleFieldsDateAndTimeInputType::destroyShadowSubtree):
+        * html/BaseMultipleFieldsDateAndTimeInputType.h:
+        (WebCore):
+        (BaseMultipleFieldsDateAndTimeInputType): Implements PickerIndicatorOwner.
+        * html/shadow/PickerIndicatorElement.cpp: Replaced all the use of hostInput() by using PickerIndicatorOwner.
+        (WebCore::PickerIndicatorElement::PickerIndicatorElement):
+        (WebCore::PickerIndicatorElement::create):
+        (WebCore::PickerIndicatorElement::defaultEventHandler):
+        (WebCore::PickerIndicatorElement::willRespondToMouseClickEvents):
+        (WebCore::PickerIndicatorElement::didChooseValue):
+        (WebCore::PickerIndicatorElement::openPopup):
+        * html/shadow/PickerIndicatorElement.h:
+        (PickerIndicatorElement): Added a PickerIndicatorOwner member.
+        (PickerIndicatorOwner): An interface class for communicating picker indicator and its owner.
+        (WebCore::PickerIndicatorElement::PickerIndicatorOwner::~PickerIndicatorOwner):
+        (WebCore::PickerIndicatorElement::removePickerIndicatorOwner):
+
 2012-11-12  Mihnea Ovidenie  <[email protected]>
 
         [CSSRegions]Add support for text-shadow in region styling

Modified: trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp (134205 => 134206)


--- trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp	2012-11-12 12:08:15 UTC (rev 134205)
+++ trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.cpp	2012-11-12 12:21:44 UTC (rev 134206)
@@ -123,6 +123,21 @@
         m_dateTimeEditElement->stepUp();
 }
 
+bool BaseMultipleFieldsDateAndTimeInputType::isPickerIndicatorOwnerDisabledOrReadOnly() const
+{
+    return element()->disabled() || element()->readOnly();
+}
+
+void BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorChooseValue(const String& value)
+{
+    element()->setValue(value, DispatchChangeEvent);
+}
+
+bool BaseMultipleFieldsDateAndTimeInputType::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
+{
+    return element()->setupDateTimeChooserParameters(parameters);
+}
+
 BaseMultipleFieldsDateAndTimeInputType::BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement* element)
     : BaseDateAndTimeInputType(element)
     , m_dateTimeEditElement(0)
@@ -139,6 +154,8 @@
         m_spinButtonElement->removeSpinButtonOwner();
     if (m_dateTimeEditElement)
         m_dateTimeEditElement->removeEditControlOwner();
+    if (m_pickerIndicatorElement)
+        m_pickerIndicatorElement->removePickerIndicatorOwner();
 }
 
 void BaseMultipleFieldsDateAndTimeInputType::blur()
@@ -183,7 +200,7 @@
         m_pickerIndicatorIsAlwaysVisible = true;
     }
     if (shouldAddPickerIndicator) {
-        RefPtr<PickerIndicatorElement> pickerElement = PickerIndicatorElement::create(document);
+        RefPtr<PickerIndicatorElement> pickerElement = PickerIndicatorElement::create(document, *this);
         m_pickerIndicatorElement = pickerElement.get();
         container->appendChild(m_pickerIndicatorElement);
         m_pickerIndicatorIsVisible = true;
@@ -201,6 +218,10 @@
         m_dateTimeEditElement->removeEditControlOwner();
         m_dateTimeEditElement = 0;
     }
+    if (m_pickerIndicatorElement) {
+        m_pickerIndicatorElement->removePickerIndicatorOwner();
+        m_pickerIndicatorElement = 0;
+    }
     BaseDateAndTimeInputType::destroyShadowSubtree();
 }
 

Modified: trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h (134205 => 134206)


--- trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h	2012-11-12 12:08:15 UTC (rev 134205)
+++ trunk/Source/WebCore/html/BaseMultipleFieldsDateAndTimeInputType.h	2012-11-12 12:21:44 UTC (rev 134206)
@@ -35,13 +35,14 @@
 
 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
 #include "DateTimeEditElement.h"
+#include "PickerIndicatorElement.h"
 #include "SpinButtonElement.h"
 
 namespace WebCore {
 
-class PickerIndicatorElement;
+struct DateTimeChooserParameters;
 
-class BaseMultipleFieldsDateAndTimeInputType : public BaseDateAndTimeInputType, protected DateTimeEditElement::EditControlOwner {
+class BaseMultipleFieldsDateAndTimeInputType : public BaseDateAndTimeInputType, protected DateTimeEditElement::EditControlOwner, protected PickerIndicatorElement::PickerIndicatorOwner {
 protected:
     BaseMultipleFieldsDateAndTimeInputType(HTMLInputElement*);
     virtual ~BaseMultipleFieldsDateAndTimeInputType();
@@ -66,6 +67,11 @@
     virtual void spinButtonStepDown() OVERRIDE;
     virtual void spinButtonStepUp() OVERRIDE;
 
+    // PickerIndicatorElement::PickerIndicatorOwner functions
+    virtual bool isPickerIndicatorOwnerDisabledOrReadOnly() const OVERRIDE FINAL;
+    virtual void pickerIndicatorChooseValue(const String&) OVERRIDE FINAL;
+    virtual bool setupDateTimeChooserParameters(DateTimeChooserParameters&) OVERRIDE FINAL;
+
     // InputType functions
     virtual void blur() OVERRIDE FINAL;
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) const OVERRIDE FINAL;

Modified: trunk/Source/WebCore/html/shadow/PickerIndicatorElement.cpp (134205 => 134206)


--- trunk/Source/WebCore/html/shadow/PickerIndicatorElement.cpp	2012-11-12 12:08:15 UTC (rev 134205)
+++ trunk/Source/WebCore/html/shadow/PickerIndicatorElement.cpp	2012-11-12 12:21:44 UTC (rev 134206)
@@ -35,7 +35,6 @@
 #include "Chrome.h"
 #include "ChromeClient.h"
 #include "Event.h"
-#include "HTMLInputElement.h"
 #include "Page.h"
 #include "RenderDetailsMarker.h"
 
@@ -45,15 +44,16 @@
 
 using namespace HTMLNames;
 
-inline PickerIndicatorElement::PickerIndicatorElement(Document* document)
+inline PickerIndicatorElement::PickerIndicatorElement(Document* document, PickerIndicatorOwner& pickerIndicatorOwner)
     : HTMLDivElement(divTag, document)
+    , m_pickerIndicatorOwner(&pickerIndicatorOwner)
 {
     setPseudo(AtomicString("-webkit-calendar-picker-indicator", AtomicString::ConstructFromLiteral));
 }
 
-PassRefPtr<PickerIndicatorElement> PickerIndicatorElement::create(Document* document)
+PassRefPtr<PickerIndicatorElement> PickerIndicatorElement::create(Document* document, PickerIndicatorOwner& pickerIndicatorOwner)
 {
-    return adoptRef(new PickerIndicatorElement(document));
+    return adoptRef(new PickerIndicatorElement(document, pickerIndicatorOwner));
 }
 
 PickerIndicatorElement::~PickerIndicatorElement()
@@ -67,21 +67,11 @@
     return new (arena) RenderDetailsMarker(this);
 }
 
-inline HTMLInputElement* PickerIndicatorElement::hostInput()
-{
-    // _javascript_ code can't create PickerIndicatorElement objects. This is
-    // always in shadow of <input>.
-    ASSERT(shadowHost());
-    ASSERT(shadowHost()->hasTagName(inputTag));
-    return static_cast<HTMLInputElement*>(shadowHost());
-}
-
 void PickerIndicatorElement::defaultEventHandler(Event* event)
 {
     if (!renderer())
         return;
-    HTMLInputElement* input = hostInput();
-    if (input->readOnly() || input->disabled())
+    if (!m_pickerIndicatorOwner || m_pickerIndicatorOwner->isPickerIndicatorOwnerDisabledOrReadOnly())
         return;
 
     if (event->type() == eventNames().clickEvent) {
@@ -95,8 +85,7 @@
 
 bool PickerIndicatorElement::willRespondToMouseClickEvents()
 {
-    const HTMLInputElement* input = hostInput();
-    if (renderer() && !input->readOnly() && !input->disabled())
+    if (renderer() && m_pickerIndicatorOwner && !m_pickerIndicatorOwner->isPickerIndicatorOwnerDisabledOrReadOnly())
         return true;
 
     return HTMLDivElement::willRespondToMouseClickEvents();
@@ -104,7 +93,9 @@
 
 void PickerIndicatorElement::didChooseValue(const String& value)
 {
-    hostInput()->setValue(value, DispatchChangeEvent);
+    if (!m_pickerIndicatorOwner)
+        return;
+    m_pickerIndicatorOwner->pickerIndicatorChooseValue(value);
 }
 
 void PickerIndicatorElement::didEndChooser()
@@ -118,11 +109,13 @@
         return;
     if (!document()->page())
         return;
+    if (!m_pickerIndicatorOwner)
+        return;
     Chrome* chrome = document()->page()->chrome();
     if (!chrome)
         return;
     DateTimeChooserParameters parameters;
-    if (!hostInput()->setupDateTimeChooserParameters(parameters))
+    if (!m_pickerIndicatorOwner->setupDateTimeChooserParameters(parameters))
         return;
     m_chooser = chrome->client()->openDateTimeChooser(this, parameters);
 }

Modified: trunk/Source/WebCore/html/shadow/PickerIndicatorElement.h (134205 => 134206)


--- trunk/Source/WebCore/html/shadow/PickerIndicatorElement.h	2012-11-12 12:08:15 UTC (rev 134205)
+++ trunk/Source/WebCore/html/shadow/PickerIndicatorElement.h	2012-11-12 12:21:44 UTC (rev 134206)
@@ -44,24 +44,36 @@
 
 class PickerIndicatorElement : public HTMLDivElement, public DateTimeChooserClient {
 public:
-    static PassRefPtr<PickerIndicatorElement> create(Document*);
+    // PickerIndicatorOwner implementer must call removePickerIndicatorOwner when
+    // it doesn't handle event, e.g. at destruction.
+    class PickerIndicatorOwner {
+    public:
+        virtual ~PickerIndicatorOwner() { }
+        virtual bool isPickerIndicatorOwnerDisabledOrReadOnly() const = 0;
+        virtual void pickerIndicatorChooseValue(const String&) = 0;
+        virtual bool setupDateTimeChooserParameters(DateTimeChooserParameters&) = 0;
+    };
+
+    static PassRefPtr<PickerIndicatorElement> create(Document*, PickerIndicatorOwner&);
     virtual ~PickerIndicatorElement();
     void openPopup();
     void closePopup();
     virtual bool willRespondToMouseClickEvents() OVERRIDE;
+    void removePickerIndicatorOwner() { m_pickerIndicatorOwner = 0; }
 
     // DateTimeChooserClient implementation.
     virtual void didChooseValue(const String&) OVERRIDE;
     virtual void didEndChooser() OVERRIDE;
 
 private:
-    PickerIndicatorElement(Document*);
+    PickerIndicatorElement(Document*, PickerIndicatorOwner&);
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE;
     virtual void defaultEventHandler(Event*) OVERRIDE;
     virtual void detach() OVERRIDE;
 
     HTMLInputElement* hostInput();
 
+    PickerIndicatorOwner* m_pickerIndicatorOwner;
     RefPtr<DateTimeChooser> m_chooser;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to