- 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;
};