Implemented DataList interface to UI
authorKwangYong Choi <ky0.choi@samsung.com>
Thu, 9 Aug 2012 05:45:54 +0000 (14:45 +0900)
committerKwangYong Choi <ky0.choi@samsung.com>
Mon, 27 Aug 2012 09:53:13 +0000 (18:53 +0900)
[Title] Implemented DataList interface to UI
[Issue#] N/A
[Problem] DataList is not supported
[Cause] Not implemented
[Solution] Implement

Change-Id: Ifad2ebb78f349c6da47434407e88c4128b457f34

13 files changed:
Source/WTF/wtf/Platform.h
Source/WebCore/html/TextFieldInputType.cpp
Source/WebKit2/UIProcess/API/efl/InputPicker.cpp
Source/WebKit2/UIProcess/API/efl/InputPicker.h
Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp
Source/WebKit2/UIProcess/API/efl/ewk_view.cpp
Source/WebKit2/UIProcess/API/efl/ewk_view.h
Source/WebKit2/UIProcess/API/efl/ewk_view_private.h
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 866ea75..185072f 100644 (file)
 #define ENABLE_TIZEN_INPUT_TAG_SUPPORT 1 /* Eunjoong Jeon : Support input tag type - 1. Hint the input tag type to apps 2. Define appearence of each input tag type */
 #define ENABLE_TIZEN_INPUT_TAG_EXTENSION 1 /* Yuni Jeong(yhnet.jung@samsung.com) : For setting & getting focused input element value */
 #define ENABLE_TIZEN_INPUT_COLOR_PICKER 1 /* KwangYong Choi(ky0.choi@samsung.com) : Interface for input color picker on Tizen */
+#define ENABLE_TIZEN_DATALIST_ELEMENT 1 /* KwangYong Choi(ky0.choi@samsung.com) : Support datalist feature of text input field */
 #define ENABLE_TIZEN_CONTEXT_MENU_TEMPORARY_FIX 1 /* Michal Pakula(m.pakula@samsung.com) : Temporary hack to prevent from crash when calling context menu on editable fiedld */
 #define ENABLE_TIZEN_FORM_SUBMIT_SUPPORT 1 /* Gyuyoung Kim(gyuyoung.kim@samsung.com) : fix a problem when form submits data to specific window */
 #define ENABLE_TIZEN_SCROLL_ADDING_FIX 1 /* Kamil Blank(k.blank@samsung.com) : Fix for _ewk_view_scroll_add (pending repaints were wrongly updated) */
index 8189144..d6e0cfd 100644 (file)
@@ -385,7 +385,12 @@ void TextFieldInputType::handleBeforeTextInsertedEvent(BeforeTextInsertedEvent*
 
 bool TextFieldInputType::shouldRespectListAttribute()
 {
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    // FIXME: This should be checked by theme. It will be modified after upversioning of datalist element feature.
+    return true;
+#else
     return InputType::themeSupportsDataListUI(this);
+#endif
 }
 
 void TextFieldInputType::updatePlaceholderText()
index 17eef8e..fe5f895 100644 (file)
@@ -66,6 +66,18 @@ void InputPicker::show(Ewk_Input_Type inputType, const char* inputValue)
         ewk_color_popup(inputValue);
 }
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+void InputPicker::showDataList(Ewk_Input_Type inputType, Eina_List* optionList)
+{
+    // FIXME: Show DataList UI.
+}
+
+void InputPicker::hideDataList(Ewk_Input_Type inputType)
+{
+    // FIXME: Close DataList UI.
+}
+#endif
+
 #if ENABLE(ELM_COLORPALLETE)
 static void _color_palette_changed_cb(void* data, Evas_Object* obj, void* eventInfo)
 {
index 76d6a11..521f160 100644 (file)
 #if OS(TIZEN) && ENABLE(TIZEN_INPUT_TAG_EXTENSION)
 #include "ewk_view.h"
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+#include "ewk_view_private.h"
+#endif
+
 typedef struct _Evas_Object Evas_Object;
 
 struct Input_Date {
@@ -59,6 +63,12 @@ namespace WebKit {
         ~InputPicker();
 
         void show(Ewk_Input_Type, const char*);
+
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+        void showDataList(Ewk_Input_Type inputType, Eina_List* optionList);
+        void hideDataList(Ewk_Input_Type inputType);
+#endif
+
         void ewk_date_popup(const char*);
         void ewk_time_popup(const char*);
         void ewk_month_popup(const char*);
index 4102221..4c39ea5 100755 (executable)
@@ -934,6 +934,24 @@ void PageClientImpl::handleInputMethodState()
             return;
         }
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+        Vector<String> optionList = page()->getFocusedInputElementDataList();
+        if (optionList.size() > 0) {
+            if (m_inputType == "tel")
+                ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_TELEPHONE, optionList);
+            else if (m_inputType == "number")
+                ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_NUMBER, optionList);
+            else if (m_inputType == "email")
+                ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_EMAIL, optionList);
+            else if (m_inputType == "url")
+                ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_URL, optionList);
+            else
+                ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_TEXT, optionList);
+
+            return;
+        }
+#endif
+
         LOG(ISF, "editorState.inputMethodHints %d, InputType %s\n", editorState.inputMethodHints, m_inputType.utf8().data());
 
         // Allow Prediction text
index 91581ed..4ac70a3 100755 (executable)
@@ -265,6 +265,9 @@ struct _Ewk_View_Private_Data {
 #if ENABLE(TIZEN_INPUT_COLOR_PICKER)
     WebColorChooserProxyEfl* colorChooser;
 #endif // ENABLE(TIZEN_INPUT_COLOR_PICKER)
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    Eina_List* dataList;
+#endif
 #if ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT_INTERNAL)
     struct {
         Ewk_Orientation_Lock_Cb callback;
@@ -394,6 +397,11 @@ void _ewk_orientation_unlock(Ewk_View_Smart_Data *sd);
 static Eina_Bool _ewk_view_input_picker_show(Ewk_View_Smart_Data*, Ewk_Input_Type, const char* inputValue);
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+static Eina_Bool _ewk_view_data_list_show(Ewk_View_Smart_Data*, Ewk_Input_Type, Eina_List*);
+static Eina_Bool _ewk_view_data_list_hide(Ewk_View_Smart_Data*, Ewk_Input_Type);
+#endif
+
 #endif // #if OS(TIZEN)
 
 static void _ewk_view_smart_changed(Ewk_View_Smart_Data* smartData)
@@ -899,6 +907,17 @@ Eina_Bool _ewk_view_text_selection_up(Ewk_View_Smart_Data* smartData, int x, int
 }
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+static void _ewk_view_data_list_del(Eina_List* dataList)
+{
+    EINA_SAFETY_ON_NULL_RETURN(dataList);
+
+    void* item;
+    EINA_LIST_FREE(dataList, item)
+        eina_stringshare_del(static_cast<char*>(item));
+}
+#endif
+
 #endif // #if OS(TIZEN)
 
 static Evas_Smart_Class g_parentSmartClass = EVAS_SMART_CLASS_INIT_NULL;
@@ -934,6 +953,11 @@ static Ewk_View_Private_Data* _ewk_view_priv_new(Ewk_View_Smart_Data* smartData)
     priv->gestureRecognizer = GestureRecognizer::create(smartData->self);
     priv->gestureClient = GestureClient::create(smartData->self);
 #endif // #if ENABLE(TIZEN_GESTURE)
+
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    priv->dataList = 0;
+#endif
+
 #endif // #if OS(TIZEN)
 
     return priv;
@@ -981,6 +1005,11 @@ static void _ewk_view_priv_del(Ewk_View_Private_Data* priv)
 #endif
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    _ewk_view_data_list_del(priv->dataList);
+    priv->dataList = 0;
+#endif
+
 #if ENABLE(TIZEN_GEOLOCATION)
     if (priv->geolocation)
         ewkGeolocationDeleteGeolocation(priv->geolocation);
@@ -1329,6 +1358,10 @@ Eina_Bool ewk_view_smart_class_init(Ewk_View_Smart_Class* api)
 #if ENABLE(TIZEN_INPUT_TAG_EXTENSION)
     api->input_picker_show = _ewk_view_input_picker_show;
 #endif
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    api->data_list_show = _ewk_view_data_list_show;
+    api->data_list_hide = _ewk_view_data_list_hide;
+#endif
 #if ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT_INTERNAL)
     api->orientation_lock = _ewk_orientation_lock;
     api->orientation_unlock = _ewk_orientation_unlock;
@@ -1714,6 +1747,24 @@ static Eina_Bool _ewk_view_input_picker_show(Ewk_View_Smart_Data* smartData, Ewk
 }
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+static Eina_Bool _ewk_view_data_list_show(Ewk_View_Smart_Data* smartData, Ewk_Input_Type inputType, Eina_List* optionList)
+{
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false);
+
+    priv->inputPicker->showDataList(inputType, optionList);
+    return true;
+}
+
+static Eina_Bool _ewk_view_data_list_hide(Ewk_View_Smart_Data* smartData, Ewk_Input_Type inputType)
+{
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false);
+
+    priv->inputPicker->hideDataList(inputType);
+    return true;
+}
+#endif
+
 PageClientImpl* ewkViewGetPageClient(const Evas_Object* ewkView)
 {
     EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, 0);
@@ -3783,6 +3834,53 @@ void ewk_view_color_chooser_close(Evas_Object* ewkView)
 #endif // ENABLE(TIZEN_INPUT_COLOR_PICKER)
 }
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+void ewkViewDataListShowRequest(Evas_Object* ewkView, Ewk_Input_Type inputType, Vector<String> optionList)
+{
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
+    EINA_SAFETY_ON_NULL_RETURN(smartData->api);
+    EINA_SAFETY_ON_NULL_RETURN(smartData->api->data_list_show);
+
+    if (priv->dataList)
+        ewkViewDataListHideRequest(ewkView, inputType);
+
+    for (Vector<String>::const_iterator it = optionList.begin(); it != optionList.end(); ++it) {
+        String value = *it;
+        priv->dataList = eina_list_append(priv->dataList, eina_stringshare_add(value.utf8().data()));
+    }
+
+    smartData->api->data_list_show(smartData, inputType, priv->dataList);
+}
+
+void ewkViewDataListHideRequest(Evas_Object* ewkView, Ewk_Input_Type inputType)
+{
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
+    EINA_SAFETY_ON_NULL_RETURN(priv->dataList);
+    EINA_SAFETY_ON_NULL_RETURN(smartData->api);
+    EINA_SAFETY_ON_NULL_RETURN(smartData->api->data_list_hide);
+
+    _ewk_view_data_list_del(priv->dataList);
+    priv->dataList = 0;
+
+    smartData->api->data_list_hide(smartData, inputType);
+}
+#endif
+
+void ewk_view_data_list_close(Evas_Object* ewkView, const char* value)
+{
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
+
+    _ewk_view_data_list_del(priv->dataList);
+    priv->dataList = 0;
+
+    ewk_view_focused_input_element_value_set(ewkView, value);
+#endif
+}
+
 Eina_Bool ewk_view_horizontal_panning_hold_get(Evas_Object* ewkView)
 {
 #if ENABLE(TIZEN_GESTURE)
index 706f31f..fcd28a0 100755 (executable)
@@ -93,7 +93,8 @@ struct _Ewk_Touch_Point {
  * @brief   Provides type of focused input element
  */
 enum _Ewk_Input_Type {
-    EWK_INPUT_TYPE_TELEPHONE = 1, 
+    EWK_INPUT_TYPE_TEXT,
+    EWK_INPUT_TYPE_TELEPHONE,
     EWK_INPUT_TYPE_NUMBER,
     EWK_INPUT_TYPE_EMAIL,
     EWK_INPUT_TYPE_URL,
@@ -130,6 +131,11 @@ struct _Ewk_View_Smart_Class {
     Eina_Bool (*input_picker_show)(Ewk_View_Smart_Data *sd, Ewk_Input_Type inputType, const char* inputValue);
 //#endif
 
+//#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    Eina_Bool (*data_list_show)(Ewk_View_Smart_Data *sd, Ewk_Input_Type inputType, Eina_List *optionList);
+    Eina_Bool (*data_list_hide)(Ewk_View_Smart_Data *sd, Ewk_Input_Type inputType);
+// #endif
+
 // #if ENABLE(SCREEN_ORIENTATION_SUPPORT) && ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT)
     Eina_Bool (*orientation_lock)(Ewk_View_Smart_Data *sd, int orientations);
     void (*orientation_unlock)(Ewk_View_Smart_Data *sd);
@@ -191,7 +197,7 @@ typedef void (*Ewk_Web_App_Icon_URL_Get_Callback)(const char* icon_url, void* us
  * @see EWK_VIEW_SMART_CLASS_INIT_VERSION
  * @see EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION
  */
-#define EWK_VIEW_SMART_CLASS_INIT(smart_class_init) {smart_class_init, EWK_VIEW_SMART_CLASS_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+#define EWK_VIEW_SMART_CLASS_INIT(smart_class_init) {smart_class_init, EWK_VIEW_SMART_CLASS_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
 
 /**
  * Initializer to zero a whole Ewk_View_Smart_Class structure.
@@ -1178,6 +1184,17 @@ EAPI void ewk_view_color_chooser_color_set(Evas_Object* o, const char* color);
  */
 EAPI void ewk_view_color_chooser_close(Evas_Object* o);
 // #endif // ENABLE(TIZEN_INPUT_COLOR_PICKER)
+
+// #if ENABLE(TIZEN_DATALIST_ELEMENT)
+/**
+ * Closes data list picker
+ *
+ * @param o view object contains data list element
+ * @param value value to be set to the input element
+ */
+void ewk_view_data_list_close(Evas_Object *o, const char *value);
+//#endif // ENABLE(TIZEN_DATALIST_ELEMENT)
+
 // #endif // #if OS(TIZEN)
 
 /**
index a7c565b..ecd05ab 100755 (executable)
@@ -259,6 +259,11 @@ void ewkViewColorChooserRequest(Evas_Object* ewkView, WebKit::WebColorChooserPro
 #endif // ENABLE(TIZEN_INPUT_COLOR_PICKER)
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+void ewkViewDataListShowRequest(Evas_Object* ewkView, Ewk_Input_Type inputType, Vector<String> optionList);
+void ewkViewDataListHideRequest(Evas_Object* ewkView, Ewk_Input_Type inputType);
+#endif
+
 #if ENABLE(TIZEN_WEBKIT2_GET_TEXT_STYLE_FOR_SELECTION)
 void  ewkViewDidGetTextStyleStateForSelection(Evas_Object* ewkView, int underlineState, int italicState, int boldState);
 Ewk_Text_Style* ewkTextStyleCreate(int underlineState, int italicState, int boldState);
index 46379c6..2c8854f 100755 (executable)
@@ -829,6 +829,10 @@ public:
     String getFocusedInputElementValue();
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    Vector<String> getFocusedInputElementDataList();
+#endif
+
     void printMainFrame();
 #if ENABLE(TIZEN_READER)
 void checkPageForReader(PassRefPtr<DictionaryCallback>);
index 7ea8311..274c56e 100755 (executable)
@@ -369,6 +369,18 @@ String WebPageProxy::getFocusedInputElementValue()
 }
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+Vector<String> WebPageProxy::getFocusedInputElementDataList()
+{
+    if (!isValid())
+        return Vector<String>();
+
+    Vector<String> optionList;
+    process()->sendSync(Messages::WebPage::GetFocusedInputElementDataList(), Messages::WebPage::GetFocusedInputElementDataList::Reply(optionList), m_pageID);
+    return optionList;
+}
+#endif
+
 void WebPageProxy::focusedNodeChanged(const IntRect& focusedNodeRect)
 {
     static_cast<PageClientImpl*>(m_pageClient)->setFocusedNodeRect(focusedNodeRect);
index 4d21e3d..238bb17 100755 (executable)
@@ -102,6 +102,10 @@ OBJC_CLASS WKAccessibilityWebPageObject;
 #include <WebCore/HTTPHeaderMap.h>
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+#include "HTMLDataListElement.h"
+#endif
+
 namespace CoreIPC {
     class ArgumentDecoder;
     class Connection;
@@ -121,6 +125,10 @@ namespace WebCore {
     class SharedBuffer;
     class VisibleSelection;
     struct KeypressCommand;
+
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    class HTMLDataListElement;
+#endif
 }
 
 namespace WebKit {
@@ -655,6 +663,10 @@ public:
     void getFocusedInputElementValue(String& inputValue);
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    void getFocusedInputElementDataList(Vector<String>&);
+#endif
+
 #if ENABLE(TIZEN_READER)
     void checkPageForReader(uint64_t callbackID);
 #endif
index 3b83db1..b04374b 100755 (executable)
@@ -353,6 +353,10 @@ messages -> WebPage {
     GetFocusedInputElementValue() -> (String inputValue)
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+    GetFocusedInputElementDataList() -> (Vector<WTF::String> options)
+#endif
+
 #if ENABLE(TIZEN_READER)
     CheckPageForReader(uint64_t callbackID)
 #endif
index 1079e1f..67e1ff5 100755 (executable)
 #include "WebEditorClient.h"
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+#include "HTMLCollection.h"
+#include "HTMLDataListElement.h"
+#include "HTMLOptionElement.h"
+#endif
+
 #endif // #if OS(TIZEN)
 
 using namespace WebCore;
@@ -587,6 +593,35 @@ void  WebPage::getFocusedInputElementValue(String& inputValue)
 }
 #endif
 
+#if ENABLE(TIZEN_DATALIST_ELEMENT)
+void WebPage::getFocusedInputElementDataList(Vector<String>& optionList)
+{
+    Frame* frame = m_page->focusController()->focusedOrMainFrame();
+    if (!frame || !frame->document())
+        return;
+
+    Node* node = frame->document()->focusedNode();
+    if (!node)
+        return;
+
+    HTMLInputElement* input = node->toInputElement();
+    if (!input)
+        return;
+
+    HTMLDataListElement* dataList = static_cast<HTMLDataListElement*>(input->list());
+    if (!dataList)
+        return;
+
+    RefPtr<HTMLCollection> options = static_cast<HTMLDataListElement*>(dataList)->options();
+    for (unsigned i = 0; Node* node = options->item(i); i++) {
+        ASSERT(node->hasTagName(optionTag));
+        HTMLOptionElement* optionElement = static_cast<HTMLOptionElement*>(node);
+        String value = optionElement->value();
+        optionList.append(value);
+    }
+}
+#endif
+
 #if ENABLE(TIZEN_READER)
 void WebPage::checkPageForReader(uint64_t callbackID)
 {