From 7f4e4b6a5b2319576545e5fd22c99e55b7a0299a Mon Sep 17 00:00:00 2001 From: Rafal Lelusz Date: Tue, 8 Oct 2013 14:14:38 +0200 Subject: [PATCH] Put date into field that was used to activate DatePicker instead of currectly focused field. [Title] Show date in the correct field after DatePicker closes. Remember field that activated DatePicker and use it instead of focused field. [Issue] N_SE-52629 [Problem] Date value is inserted into focused fields, which might not be date field that activated DatePicker. [Cause] When asyncronic event is sent from WebProcess to UIProcess, for a short while focus chaning events are still active on page and can lead to focus move. In order to put new text into correct field, we not longer put new text into focused field, but store the target node and store new text into this target node. [Solution] Insert date value into last clicked or entered field. Change-Id: Idbe7d9dadb8d68ab2c342e249a6137d7a533eb43 --- Source/WebCore/dom/Document.cpp | 16 ++++++++++++++++ Source/WebCore/dom/Document.h | 8 ++++++++ Source/WebCore/html/HTMLInputElement.cpp | 21 +++++++++++++++------ Source/WebKit2/UIProcess/API/efl/ewk_view.cpp | 10 ++++++++++ Source/WebKit2/UIProcess/API/efl/ewk_view.h | 10 ++++++++++ .../WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp | 10 +++++----- Source/WebKit2/UIProcess/WebPageProxy.h | 1 + Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp | 8 ++++++++ Source/WebKit2/WebProcess/WebPage/WebPage.h | 1 + .../WebKit2/WebProcess/WebPage/WebPage.messages.in | 1 + .../WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp | 16 ++++++++++++++++ 11 files changed, 91 insertions(+), 11 deletions(-) diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp index 706b514..394be23 100755 --- a/Source/WebCore/dom/Document.cpp +++ b/Source/WebCore/dom/Document.cpp @@ -513,6 +513,9 @@ Document::Document(Frame* frame, const KURL& url, bool isXHTML, bool isHTML) #if ENABLE(TIZEN_GSTREAMER_AUDIO) , m_activeMediaObjectCount(0) #endif +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + , m_currentTargetNode(0) +#endif { m_document = this; @@ -720,6 +723,9 @@ void Document::removedLastRef() m_activeNode = 0; m_titleElement = 0; m_documentElement = 0; +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + m_currentTargetNode = 0; +#endif m_contextFeatures = ContextFeatures::defaultSwitch(); #if ENABLE(FULLSCREEN_API) m_fullScreenElement = 0; @@ -2102,6 +2108,13 @@ inline void Document::clearStyleResolver() m_styleResolver.clear(); } +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) +void Document::setCurrentTargetNode(PassRefPtr prpNode) +{ + m_currentTargetNode = prpNode; +} +#endif + void Document::attach() { ASSERT(!attached()); @@ -2180,6 +2193,9 @@ void Document::detach() m_hoverNode = 0; m_focusedNode = 0; m_activeNode = 0; +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + m_currentTargetNode = 0; +#endif ContainerNode::detach(); diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h index 41cb3b3..f483dee 100644 --- a/Source/WebCore/dom/Document.h +++ b/Source/WebCore/dom/Document.h @@ -719,6 +719,11 @@ public: bool setFocusedNode(PassRefPtr); Node* focusedNode() const { return m_focusedNode.get(); } +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + void setCurrentTargetNode(PassRefPtr); + Node* currentTargetNode() const { return m_currentTargetNode.get(); } +#endif + void getFocusableNodes(Vector >&); // The m_ignoreAutofocus flag specifies whether or not the document has been changed by the user enough @@ -1345,6 +1350,9 @@ private: RefPtr m_hoverNode; RefPtr m_activeNode; RefPtr m_documentElement; +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + RefPtr m_currentTargetNode; +#endif uint64_t m_domTreeVersion; static uint64_t s_globalTreeVersion; diff --git a/Source/WebCore/html/HTMLInputElement.cpp b/Source/WebCore/html/HTMLInputElement.cpp index 02f0092..ecaec94 100755 --- a/Source/WebCore/html/HTMLInputElement.cpp +++ b/Source/WebCore/html/HTMLInputElement.cpp @@ -1060,6 +1060,10 @@ void HTMLInputElement::defaultEventHandler(Event* evt) { if (evt->isMouseEvent() && evt->type() == eventNames().clickEvent && static_cast(evt)->button() == LeftButton) { m_inputType->handleClickEvent(static_cast(evt)); +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + if(shouldUsePicker()) + document()->setCurrentTargetNode(document()->focusedNode()); +#endif if (evt->defaultHandled()) return; } @@ -1076,12 +1080,17 @@ void HTMLInputElement::defaultEventHandler(Event* evt) m_inputType->handleKeydownEvent(static_cast(evt)); if (evt->defaultHandled()) return; -#if ENABLE(TIZEN_FOCUS_UI) && ENABLE(TIZEN_INPUT_TAG_EXTENSION) - if (static_cast(evt)->keyCode() == VK_RETURN && shouldUsePicker() - && document()->settings() && document()->settings()->isSpatialNavigationEnabled()) { - setSelectionRange(0, 0); - evt->setDefaultHandled(); - return; + +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + if (static_cast(evt)->keyCode() == VK_RETURN && shouldUsePicker()) { + document()->setCurrentTargetNode(document()->focusedNode()); +#if ENABLE(TIZEN_FOCUS_UI) + if (document()->settings() && document()->settings()->isSpatialNavigationEnabled()) { + setSelectionRange(0, 0); + evt->setDefaultHandled(); + return; + } +#endif } #endif } diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp index 30dd595..6b7e5b0 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp @@ -4087,6 +4087,16 @@ void ewkViewGetWindowFrame(Evas_Object* ewkView, int *x, int *y, int *w, int *h) } #endif +void ewk_view_current_target_input_element_value_set(Evas_Object* ewkView, const char* value) +{ +#if ENABLE(TIZEN_INPUT_TAG_EXTENSION) + EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData); + EWK_VIEW_IMPL_GET_OR_RETURN(smartData, impl); + + impl->pageProxy->setCurrentTargetInputElementValue(String::fromUTF8(value)); +#endif // ENABLE(TIZEN_INPUT_TAG_EXTENSION) +} + void ewk_view_focused_input_element_value_set(Evas_Object* ewkView, const char* value) { #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.h b/Source/WebKit2/UIProcess/API/efl/ewk_view.h index 914657e..8a64e8d 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view.h +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.h @@ -1300,6 +1300,16 @@ EINA_DEPRECATED EAPI Eina_Bool ewk_view_text_selection_range_clear(Evas_Object* // #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) /** + * Sets the last clicked or entered input element value + * + * @param o view object to send the value + * @param value the string value to be set + */ +EAPI void ewk_view_current_target_input_element_value_set(Evas_Object* o, const char* value); +// #endif // ENABLE(TIZEN_INPUT_TAG_EXTENSION) + +// #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) +/** * Sets the focused input element value * * @param o view object to send the value diff --git a/Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp b/Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp index 99ef5b4..412ed6a 100755 --- a/Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp +++ b/Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp @@ -1101,7 +1101,7 @@ void InputPicker::_date_popup_response_cb(void* data, Evas_Object* obj, void* e date.year = 1900 + date.year; sprintf(dateStr, "%d-%02d-%02d" , date.year, date.mon + 1, date.day); - ewk_view_focused_input_element_value_set(inputPicker->m_ewkView, dateStr); + ewk_view_current_target_input_element_value_set(inputPicker->m_ewkView, dateStr); ewk_view_command_execute(inputPicker->m_ewkView, "Unselect", 0); inputPicker->deletePopupLayout(); @@ -1147,7 +1147,7 @@ void InputPicker::_week_popup_response_cb(void* data, Evas_Object* obj, void* e date.year = 1900 + date.year; sprintf(dateStr, "%d-W%02d" , date.year, weekNum); - ewk_view_focused_input_element_value_set(inputPicker->m_ewkView, dateStr); + ewk_view_current_target_input_element_value_set(inputPicker->m_ewkView, dateStr); ewk_view_command_execute(inputPicker->m_ewkView, "Unselect", 0); inputPicker->deletePopupLayout(); @@ -1170,7 +1170,7 @@ void InputPicker::_time_popup_response_cb(void* data, Evas_Object* obj, void* e date.min = currentTime.tm_min; sprintf(dateStr, "%02d:%02d" , date.hour, date.min); - ewk_view_focused_input_element_value_set(inputPicker->m_ewkView, dateStr); + ewk_view_current_target_input_element_value_set(inputPicker->m_ewkView, dateStr); ewk_view_command_execute(inputPicker->m_ewkView, "Unselect", 0); inputPicker->deletePopupLayout(); @@ -1195,7 +1195,7 @@ void InputPicker::_month_popup_response_cb(void* data, Evas_Object* obj, void* date.year = 1900 + date.year; sprintf(dateStr, "%02d-%02d" , date.year, date.mon + 1); - ewk_view_focused_input_element_value_set(inputPicker->m_ewkView, dateStr); + ewk_view_current_target_input_element_value_set(inputPicker->m_ewkView, dateStr); ewk_view_command_execute(inputPicker->m_ewkView, "Unselect", 0); inputPicker->deletePopupLayout(); @@ -1226,7 +1226,7 @@ void InputPicker::_datetime_popup_response_cb(void* data, Evas_Object* obj, voi else sprintf(dateStr, "%d-%02d-%02dT%02d:%02dZ" , date.year, date.mon + 1, date.day, date.hour, date.min); - ewk_view_focused_input_element_value_set(inputPicker->m_ewkView, dateStr); + ewk_view_current_target_input_element_value_set(inputPicker->m_ewkView, dateStr); ewk_view_command_execute(inputPicker->m_ewkView, "Unselect", 0); inputPicker->deletePopupLayout(); diff --git a/Source/WebKit2/UIProcess/WebPageProxy.h b/Source/WebKit2/UIProcess/WebPageProxy.h index 2d508d6..2eb037a 100755 --- a/Source/WebKit2/UIProcess/WebPageProxy.h +++ b/Source/WebKit2/UIProcess/WebPageProxy.h @@ -886,6 +886,7 @@ public: void setShouldSendEventsSynchronously(bool sync) { m_shouldSendEventsSynchronously = sync; }; #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) || ENABLE(TIZEN_WEBKIT2_FORM_DATABASE) + void setCurrentTargetInputElementValue(const String& inputValue); void setFocusedInputElementValue(const String& inputValue); String getFocusedInputElementValue(); #endif diff --git a/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp b/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp index 306f328..ff397ec 100755 --- a/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp +++ b/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp @@ -402,6 +402,14 @@ void WebPageProxy::processPluginCustomRequest(const String& request, const Strin #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) || ENABLE(TIZEN_WEBKIT2_FORM_DATABASE) +void WebPageProxy::setCurrentTargetInputElementValue(const String& inputValue) +{ + if (!isValid()) + return; + + process()->send(Messages::WebPage::SetCurrentTargetInputElementValue(inputValue), m_pageID); +} + void WebPageProxy::setFocusedInputElementValue(const String& inputValue) { if (!isValid()) diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.h b/Source/WebKit2/WebProcess/WebPage/WebPage.h index e611d49..4a10552 100755 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.h +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.h @@ -776,6 +776,7 @@ public: #endif #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) || ENABLE(TIZEN_WEBKIT2_FORM_DATABASE) + void setCurrentTargetInputElementValue(const String& inputValue); void setFocusedInputElementValue(const String& inputValue); void getFocusedInputElementValue(String& inputValue); #endif diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in index 17e8629..9cac324 100755 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in @@ -371,6 +371,7 @@ messages -> WebPage { #endif #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) || ENABLE(TIZEN_WEBKIT2_FORM_DATABASE) + SetCurrentTargetInputElementValue(WTF::String inputValue) SetFocusedInputElementValue(WTF::String inputValue) GetFocusedInputElementValue() -> (String inputValue) #endif diff --git a/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp b/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp index 61d157a..9cd9ee1 100644 --- a/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp +++ b/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp @@ -724,6 +724,22 @@ bool WebPage::updateEditorStateRect(const Frame* frame, EditorState& state) cons #endif #if ENABLE(TIZEN_INPUT_TAG_EXTENSION) || ENABLE(TIZEN_WEBKIT2_FORM_DATABASE) +void WebPage::setCurrentTargetInputElementValue(const String& inputValue) +{ + Frame* frame = m_page->focusController()->focusedOrMainFrame(); + if (!frame || !frame->document() || !frame->document()->currentTargetNode()) + return; + + HTMLInputElement* inputElement = frame->document()->currentTargetNode()->toInputElement(); + if (!inputElement) + return; + + frame->document()->setCurrentTargetNode(0); + + inputElement->toNode()->dispatchFocusEvent(0); + inputElement->setValue(inputValue, DispatchChangeEvent); +} + void WebPage::setFocusedInputElementValue(const String& inputValue) { Frame* frame = m_page->focusController()->focusedOrMainFrame(); -- 2.7.4