[Workaround] Dummy button that fixes all focus issues on webview 87/77387/2
authorm.kawonczyk <m.kawonczyk@samsung.com>
Wed, 29 Jun 2016 12:40:08 +0000 (14:40 +0200)
committerHye Kyoung Hwang <cookie@samsung.com>
Thu, 30 Jun 2016 00:30:41 +0000 (17:30 -0700)
[Issue]        http://suprem.sec.samsung.net/jira/browse/TSAM-5691
[Problem]      WebView can't focus and unfocus itself using their own
               functions. Because of that every application needs
               to create button that is doing that for them.
[Solution]     Create dummy button that will notify web_view that
               they are focused and unfocused.
[Verify]       Open inout_picker_test.html > Focus on Date >
               Change Date > OK. Focus should still be in webview.

Change-Id: I8dee03fad7c4d7833fdae5ff42d0b52af0378527

core/AbstractWebEngine/AbstractWebEngine.h
services/SimpleUI/SimpleUI.cpp
services/WebEngineService/WebEngineService.cpp
services/WebEngineService/WebEngineService.h
services/WebEngineService/WebView.cpp
services/WebEngineService/WebView.h
services/WebPageUI/WebPageUI.cpp
services/WebPageUI/WebPageUI.h

index 9ad5f6dd4a7fb7f2100a02b151bd63579879a67d..5bce6330d75a07ea338576a351d3848032dc6fb4 100644 (file)
@@ -492,11 +492,6 @@ public:
      */
     boost::signals2::signal<void (basic_webengine::WebConfirmationPtr)> confirmationRequest;
 
-    /**
-     * Web Engine area clicked
-     */
-    boost::signals2::signal<void ()> webViewClicked;
-
     /**
      * All links to RSS/Atom channels were gathered from webpage.
      */
index 5b0327a30479cadae74b72376c153923a08bded3..42630a9674620b8c63208d6a3bc30c653b3e8e28 100644 (file)
@@ -334,6 +334,8 @@ void SimpleUI::connectUISignals()
     m_webPageUI->showQuickAccess.connect(boost::bind(&SimpleUI::showQuickAccess, this));
     m_webPageUI->hideQuickAccess.connect(boost::bind(&QuickAccess::hideUI, m_quickAccess));
     m_webPageUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::showBookmarkManagerUI, this));
+    m_webPageUI->focusWebView.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::setFocus, m_webEngine.get()));
+    m_webPageUI->unfocusWebView.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::clearFocus, m_webEngine.get()));
 #if PROFILE_MOBILE
     m_webPageUI->hideMoreMenu.connect(boost::bind(&SimpleUI::closeMoreMenu, this));
     m_webPageUI->getURIEntry().mobileEntryFocused.connect(boost::bind(&WebPageUI::mobileEntryFocused, m_webPageUI));
@@ -562,7 +564,6 @@ void SimpleUI::connectModelSignals()
     m_webEngine->uriChanged.connect(boost::bind(&SimpleUI::webEngineURLChanged, this, _1));
     m_webEngine->uriChanged.connect(boost::bind(&URIEntry::changeUri, &m_webPageUI->getURIEntry(), _1));
     m_webEngine->downloadStarted.connect(boost::bind(&SimpleUI::downloadStarted, this, _1));
-    m_webEngine->webViewClicked.connect(boost::bind(&URIEntry::clearFocus, &m_webPageUI->getURIEntry()));
     m_webEngine->backwardEnableChanged.connect(boost::bind(&WebPageUI::setBackButtonEnabled, m_webPageUI.get(), _1));
     m_webEngine->forwardEnableChanged.connect(boost::bind(&WebPageUI::setForwardButtonEnabled, m_webPageUI.get(), _1));
     m_webEngine->loadStarted.connect(boost::bind(&SimpleUI::loadStarted, this));
index 39386c0de04fe84e6e2ed9fe74578f432b578766..29a021fd456897f332d64eae82cc473c5d352273 100644 (file)
@@ -119,7 +119,6 @@ void WebEngineService::connectSignals(std::shared_ptr<WebView> webView)
     webView->forwardEnableChanged.connect(boost::bind(&WebEngineService::_forwardEnableChanged, this, _1));
     webView->backwardEnableChanged.connect(boost::bind(&WebEngineService::_backwardEnableChanged, this, _1));
     webView->confirmationRequest.connect(boost::bind(&WebEngineService::_confirmationRequest, this, _1));
-    webView->ewkViewClicked.connect(boost::bind(&WebEngineService::webViewClicked, this));
     webView->IMEStateChanged.connect(boost::bind(&WebEngineService::_IMEStateChanged, this, _1));
     webView->snapshotCaptured.connect(boost::bind(&WebEngineService::_snapshotCaptured, this, _1, _2));
     webView->redirectedWebPage.connect(boost::bind(&WebEngineService::_redirectedWebPage, this, _1, _2));
@@ -146,7 +145,6 @@ void WebEngineService::disconnectSignals(std::shared_ptr<WebView> webView)
     webView->forwardEnableChanged.disconnect(boost::bind(&WebEngineService::_forwardEnableChanged, this, _1));
     webView->backwardEnableChanged.disconnect(boost::bind(&WebEngineService::_backwardEnableChanged, this, _1));
     webView->confirmationRequest.disconnect(boost::bind(&WebEngineService::_confirmationRequest, this, _1));
-    webView->ewkViewClicked.disconnect(boost::bind(&WebEngineService::webViewClicked, this));
     webView->IMEStateChanged.disconnect(boost::bind(&WebEngineService::_IMEStateChanged, this, _1));
     webView->redirectedWebPage.disconnect(boost::bind(&WebEngineService::_redirectedWebPage, this, _1, _2));
 #if PROFILE_MOBILE
@@ -671,11 +669,6 @@ std::shared_ptr<tizen_browser::tools::BrowserImage> WebEngineService::getFavicon
         return std::make_shared<tizen_browser::tools::BrowserImage>();
 }
 
-void WebEngineService::webViewClicked()
-{
-    AbstractWebEngine::webViewClicked();
-}
-
 #if PROFILE_MOBILE
 void WebEngineService::setWebViewSettings(std::shared_ptr<WebView> webView) {
     webView->ewkSettingsAutoFittingSet(m_settings[WebEngineSettings::PAGE_OVERVIEW]);
index 3da197a4ea315d57be3a585573d420f6106ee540..f673a669cfc89ff7c8de4cb5ae9b0eefff4d2884 100644 (file)
@@ -236,7 +236,6 @@ private:
     void _IMEStateChanged(bool);
     void _snapshotCaptured(std::shared_ptr<tizen_browser::tools::BrowserImage> snapshot, tools::SnapshotType snapshot_type);
     void _redirectedWebPage(const std::string& oldUrl, const std::string& newUrl);
-    void webViewClicked();
     void _setCertificatePem(const std::string& uri, const std::string& pem);
     void _setWrongCertificatePem(const std::string& uri, const std::string& pem);
 #if PROFILE_MOBILE
index 081f5c50210280960e4b355ba62c53a9f42ae105..d696605e8223b99834e2689545e69a259ce1920d 100755 (executable)
@@ -229,7 +229,6 @@ void WebView::registerCallbacks()
     evas_object_smart_callback_add(m_ewkView, "request,certificate,confirm", __requestCertificationConfirm, this);
     evas_object_smart_callback_add(m_ewkView, "ssl,certificate,changed", __setCertificatePem, this);
 
-    evas_object_event_callback_add(m_ewkView, EVAS_CALLBACK_MOUSE_DOWN, __setFocusToEwkView, this);
     evas_object_smart_callback_add(m_ewkView, "icon,received", __faviconChanged, this);
 
     evas_object_smart_callback_add(m_ewkView, "editorclient,ime,closed", __IMEClosed, this);
@@ -269,7 +268,6 @@ void WebView::unregisterCallbacks()
 #endif
     evas_object_smart_callback_del_full(m_ewkView, "request,certificate,confirm", __requestCertificationConfirm, this);
 
-    evas_object_event_callback_del(m_ewkView, EVAS_CALLBACK_MOUSE_DOWN, __setFocusToEwkView);
     evas_object_smart_callback_del_full(m_ewkView, "icon,received", __faviconChanged, this);
 
     evas_object_smart_callback_del_full(m_ewkView, "editorclient,ime,closed", __IMEClosed, this);
@@ -844,16 +842,6 @@ void WebView::__screenshotCaptured(Evas_Object* image, void* data)
     snapshot_data->web_view->snapshotCaptured(std::make_shared<tools::BrowserImage>(image), snapshot_data->snapshot_type);
 }
 
-void WebView::__setFocusToEwkView(void * data, Evas * /* e */, Evas_Object * /* obj */, void * /* event_info */)
-{
-    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-
-    WebView * self = reinterpret_cast<WebView *>(data);
-
-    if(!self->hasFocus())
-        self->ewkViewClicked();
-}
-
 void WebView::__newWindowRequest(void *data, Evas_Object *, void *out)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 588333135e6600548afd1a1297e15de0bd18d62c..dd5d40076c1823469d1be92e195e7fe037c708b1 100644 (file)
@@ -284,8 +284,6 @@ public:
 
     boost::signals2::signal<void (WebConfirmationPtr)> confirmationRequest;
 
-    boost::signals2::signal<void ()> ewkViewClicked;
-
     boost::signals2::signal<void (bool)> IMEStateChanged;
 
     boost::signals2::signal<void ()> switchToWebPage;
@@ -304,7 +302,6 @@ private:
     void unregisterCallbacks();
     void setupEwkSettings();
 
-    static void __setFocusToEwkView(void * data, Evas * e, Evas_Object * obj, void * event_info);
     static void __newWindowRequest(void * data, Evas_Object *, void *out);
     static void __closeWindowRequest(void * data, Evas_Object *, void *);
 
index 7190498d0703b520a5447142943ba0d6c84ca906..9fc4e470226eb683615e2e20d353dd694180ecbc 100755 (executable)
@@ -198,7 +198,7 @@ void WebPageUI::setMainContent(Evas_Object* content)
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(content);
     hideWebView();
-    elm_object_part_content_set(m_mainLayout, "web_view", content);
+    elm_object_part_content_set(m_dummy_button, "overlay", content);
 #if PROFILE_MOBILE && GESTURE
     elm_gesture_layer_attach(m_gestureLayer, content);
 #endif
@@ -421,6 +421,17 @@ void WebPageUI::createLayout()
     evas_object_size_hint_weight_set(m_mainLayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     elm_layout_file_set(m_mainLayout, edjePath("WebPageUI/WebPageUI.edj").c_str(), "main_layout");
 
+    m_dummy_button = elm_bg_add(m_mainLayout);
+    evas_object_size_hint_align_set(m_dummy_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    evas_object_size_hint_weight_set(m_dummy_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    elm_object_focus_allow_set(m_dummy_button, EINA_TRUE);
+    elm_object_focus_set(m_dummy_button, EINA_TRUE);
+    evas_object_show(m_dummy_button);
+    elm_object_part_content_set(m_mainLayout, "web_view", m_dummy_button);
+
+    evas_object_smart_callback_add(m_dummy_button, "focused", _dummy_button_focused, this);
+    evas_object_smart_callback_add(m_dummy_button, "unfocused", _dummy_button_unfocused, this);
+
     createErrorLayout();
     createPrivateLayout();
     createActions();
@@ -462,6 +473,20 @@ void WebPageUI::createLayout()
 #endif
 }
 
+void WebPageUI::_dummy_button_focused(void *data, Evas_Object *, void *)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+    webPageUI->focusWebView();
+}
+
+void WebPageUI::_dummy_button_unfocused(void *data, Evas_Object *, void *)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+    webPageUI->unfocusWebView();
+}
+
 void WebPageUI::createErrorLayout()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -587,7 +612,7 @@ void WebPageUI::hideWebView()
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
 
     evas_object_hide(elm_object_part_content_get(m_mainLayout, "web_view"));
-    elm_object_part_content_unset(m_mainLayout, "web_view");
+    elm_object_part_content_unset(m_mainLayout, "overlay");
 }
 
 void WebPageUI::setErrorButtons()
index 33db8af13b072d9d70849af0a225163aa17c762e..66a7019f5052c00100d8f474da0d97e488f11133 100644 (file)
@@ -112,11 +112,15 @@ public:
     boost::signals2::signal<void ()> hideQuickAccess;
     boost::signals2::signal<void ()> showQuickAccess;
     boost::signals2::signal<void ()> bookmarkManagerClicked;
+    boost::signals2::signal<void ()> focusWebView;
+    boost::signals2::signal<void ()> unfocusWebView;
 
 private:
     static void faviconClicked(void* data, Evas_Object* obj, const char* emission, const char* source);
     static Eina_Bool _cb_down_pressed_on_urlbar(void *data, Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info);
     static void _bookmark_manager_clicked(void * data, Evas_Object *, void *);
+    static void _dummy_button_focused(void *data, Evas_Object *, void *);
+    static void _dummy_button_unfocused(void *data, Evas_Object *, void *);
 #if PROFILE_MOBILE
     static void _more_menu_background_clicked(void* data, Evas_Object*, const char*, const char*);
     static void _content_clicked(void * data, Evas_Object *, void *);
@@ -157,6 +161,7 @@ private:
 
     Evas_Object* m_parent;
     Evas_Object* m_mainLayout;
+    Evas_Object* m_dummy_button;
     Evas_Object* m_errorLayout;
     Evas_Object* m_privateLayout;
     Evas_Object* m_bookmarkManagerButton;