Put date into field that was used to activate DatePicker instead of currectly focused...
authorRafal Lelusz <r.lelusz@samsung.com>
Tue, 8 Oct 2013 12:14:38 +0000 (14:14 +0200)
committerRafal Lelusz <r.lelusz@samsung.com>
Mon, 14 Oct 2013 12:10:59 +0000 (14:10 +0200)
[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
Source/WebCore/dom/Document.h
Source/WebCore/html/HTMLInputElement.cpp
Source/WebKit2/UIProcess/API/efl/ewk_view.cpp
Source/WebKit2/UIProcess/API/efl/ewk_view.h
Source/WebKit2/UIProcess/API/efl/tizen/InputPicker.cpp
Source/WebKit2/UIProcess/WebPageProxy.h
Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp
Source/WebKit2/WebProcess/WebPage/WebPage.h
Source/WebKit2/WebProcess/WebPage/WebPage.messages.in
Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp

index 706b514..394be23 100755 (executable)
@@ -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<Node> 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();
 
index 41cb3b3..f483dee 100644 (file)
@@ -719,6 +719,11 @@ public:
     bool setFocusedNode(PassRefPtr<Node>);
     Node* focusedNode() const { return m_focusedNode.get(); }
 
+#if ENABLE(TIZEN_INPUT_TAG_EXTENSION)
+    void setCurrentTargetNode(PassRefPtr<Node>);
+    Node* currentTargetNode() const { return m_currentTargetNode.get(); }
+#endif
+
     void getFocusableNodes(Vector<RefPtr<Node> >&);
     
     // The m_ignoreAutofocus flag specifies whether or not the document has been changed by the user enough 
@@ -1345,6 +1350,9 @@ private:
     RefPtr<Node> m_hoverNode;
     RefPtr<Node> m_activeNode;
     RefPtr<Element> m_documentElement;
+#if ENABLE(TIZEN_INPUT_TAG_EXTENSION)
+    RefPtr<Node> m_currentTargetNode;
+#endif
 
     uint64_t m_domTreeVersion;
     static uint64_t s_globalTreeVersion;
index 02f0092..ecaec94 100755 (executable)
@@ -1060,6 +1060,10 @@ void HTMLInputElement::defaultEventHandler(Event* evt)
 {
     if (evt->isMouseEvent() && evt->type() == eventNames().clickEvent && static_cast<MouseEvent*>(evt)->button() == LeftButton) {
         m_inputType->handleClickEvent(static_cast<MouseEvent*>(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<KeyboardEvent*>(evt));
         if (evt->defaultHandled())
             return;
-#if ENABLE(TIZEN_FOCUS_UI) && ENABLE(TIZEN_INPUT_TAG_EXTENSION)
-        if (static_cast<KeyboardEvent*>(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<KeyboardEvent*>(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
     }
index 30dd595..6b7e5b0 100755 (executable)
@@ -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)
index 914657e..8a64e8d 100755 (executable)
@@ -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
index 99ef5b4..412ed6a 100755 (executable)
@@ -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();
index 2d508d6..2eb037a 100755 (executable)
@@ -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
index 306f328..ff397ec 100755 (executable)
@@ -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())
index e611d49..4a10552 100755 (executable)
@@ -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
index 17e8629..9cac324 100755 (executable)
@@ -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
index 61d157a..9cd9ee1 100644 (file)
@@ -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();