From: KwangYong Choi Date: Thu, 9 Aug 2012 05:45:54 +0000 (+0900) Subject: Implemented DataList interface to UI X-Git-Tag: accepted/2.0/20130307.072448~88 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a8d7a1eef1bf730de5fb31c5938b89c2bc416f9;p=profile%2Fivi%2Fwebkit-efl.git Implemented DataList interface to UI [Title] Implemented DataList interface to UI [Issue#] N/A [Problem] DataList is not supported [Cause] Not implemented [Solution] Implement Change-Id: Ifad2ebb78f349c6da47434407e88c4128b457f34 --- diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h index 866ea75..185072f 100644 --- a/Source/WTF/wtf/Platform.h +++ b/Source/WTF/wtf/Platform.h @@ -426,6 +426,7 @@ #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) */ diff --git a/Source/WebCore/html/TextFieldInputType.cpp b/Source/WebCore/html/TextFieldInputType.cpp index 8189144a..d6e0cfd 100644 --- a/Source/WebCore/html/TextFieldInputType.cpp +++ b/Source/WebCore/html/TextFieldInputType.cpp @@ -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() diff --git a/Source/WebKit2/UIProcess/API/efl/InputPicker.cpp b/Source/WebKit2/UIProcess/API/efl/InputPicker.cpp index 17eef8e..fe5f895 100644 --- a/Source/WebKit2/UIProcess/API/efl/InputPicker.cpp +++ b/Source/WebKit2/UIProcess/API/efl/InputPicker.cpp @@ -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) { diff --git a/Source/WebKit2/UIProcess/API/efl/InputPicker.h b/Source/WebKit2/UIProcess/API/efl/InputPicker.h index 76d6a11..521f160 100644 --- a/Source/WebKit2/UIProcess/API/efl/InputPicker.h +++ b/Source/WebKit2/UIProcess/API/efl/InputPicker.h @@ -23,6 +23,10 @@ #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*); diff --git a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp index 4102221..4c39ea5 100755 --- a/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp +++ b/Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp @@ -934,6 +934,24 @@ void PageClientImpl::handleInputMethodState() return; } +#if ENABLE(TIZEN_DATALIST_ELEMENT) + Vector 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 diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp index 91581ed..4ac70a3 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp @@ -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(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 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::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) diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.h b/Source/WebKit2/UIProcess/API/efl/ewk_view.h index 706f31f..fcd28a0 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view.h +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.h @@ -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) /** diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h b/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h index a7c565b..ecd05ab 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h @@ -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 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); diff --git a/Source/WebKit2/UIProcess/WebPageProxy.h b/Source/WebKit2/UIProcess/WebPageProxy.h index 46379c6..2c8854f 100755 --- a/Source/WebKit2/UIProcess/WebPageProxy.h +++ b/Source/WebKit2/UIProcess/WebPageProxy.h @@ -829,6 +829,10 @@ public: String getFocusedInputElementValue(); #endif +#if ENABLE(TIZEN_DATALIST_ELEMENT) + Vector getFocusedInputElementDataList(); +#endif + void printMainFrame(); #if ENABLE(TIZEN_READER) void checkPageForReader(PassRefPtr); diff --git a/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp b/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp index 7ea8311..274c56e 100755 --- a/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp +++ b/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp @@ -369,6 +369,18 @@ String WebPageProxy::getFocusedInputElementValue() } #endif +#if ENABLE(TIZEN_DATALIST_ELEMENT) +Vector WebPageProxy::getFocusedInputElementDataList() +{ + if (!isValid()) + return Vector(); + + Vector optionList; + process()->sendSync(Messages::WebPage::GetFocusedInputElementDataList(), Messages::WebPage::GetFocusedInputElementDataList::Reply(optionList), m_pageID); + return optionList; +} +#endif + void WebPageProxy::focusedNodeChanged(const IntRect& focusedNodeRect) { static_cast(m_pageClient)->setFocusedNodeRect(focusedNodeRect); diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.h b/Source/WebKit2/WebProcess/WebPage/WebPage.h index 4d21e3d..238bb17 100755 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.h +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.h @@ -102,6 +102,10 @@ OBJC_CLASS WKAccessibilityWebPageObject; #include #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&); +#endif + #if ENABLE(TIZEN_READER) void checkPageForReader(uint64_t callbackID); #endif diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in index 3b83db1..b04374b 100755 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in @@ -353,6 +353,10 @@ messages -> WebPage { GetFocusedInputElementValue() -> (String inputValue) #endif +#if ENABLE(TIZEN_DATALIST_ELEMENT) + GetFocusedInputElementDataList() -> (Vector options) +#endif + #if ENABLE(TIZEN_READER) CheckPageForReader(uint64_t callbackID) #endif diff --git a/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp b/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp index 1079e1f..67e1ff5 100755 --- a/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp +++ b/Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp @@ -109,6 +109,12 @@ #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& 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(input->list()); + if (!dataList) + return; + + RefPtr options = static_cast(dataList)->options(); + for (unsigned i = 0; Node* node = options->item(i); i++) { + ASSERT(node->hasTagName(optionTag)); + HTMLOptionElement* optionElement = static_cast(node); + String value = optionElement->value(); + optionList.append(value); + } +} +#endif + #if ENABLE(TIZEN_READER) void WebPage::checkPageForReader(uint64_t callbackID) {