The dummy button 22/90622/7
authorm.kawonczyk <m.kawonczyk@samsung.com>
Mon, 3 Oct 2016 08:32:43 +0000 (10:32 +0200)
committerMaciej Kawo?czyk <m.kawonczyk@samsung.com>
Mon, 3 Oct 2016 12:53:37 +0000 (05:53 -0700)
[Issue]        http://suprem.sec.samsung.net/jira/browse/TWF-2222
[Problem]      The dummy button is needed by webview for focus
               managment.
[Solution]     Add #ifdefed the dummy button feature.
[Verify]       Open any webpage, dlogutil browser. Check if the
               dummy button is properly focused/unfocused and if
               webview focus is ok.

Change-Id: Ibc434ae269f8233c84ae0bcb1115ca2c76657cbb

CMakeLists.txt
cmake/EDCCompile.cmake
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
services/WebPageUI/edc/WebPageUI.edc

index 6e75d8ed6d0eee9df7818127d349d6f46ebbecc8..18c4636410c21bb8feb8efdbbb2399a4fde89f3a 100755 (executable)
@@ -119,6 +119,7 @@ if(TIZEN_BUILD)
     if (${PROFILE} MATCHES "mobile")
         ADD_DEFINITIONS(-DPROFILE_MOBILE=1)
         ADD_DEFINITIONS(-DPWA=0)
+        ADD_DEFINITIONS(-DDUMMY_BUTTON=1)
     endif (${PROFILE} MATCHES "mobile")
 
 endif(TIZEN_BUILD)
index 5dfb6e8689e030f8cb4477168fdc2b73de9637ab..6f9a340956b209388c851b3bd47a9b8e605ecb43 100644 (file)
@@ -34,6 +34,7 @@ IF(EDJE_CC_EXECUTABLE)
                                 ARGS -id ${CMAKE_CURRENT_SOURCE_DIR}/${IMAGES_URL}/
                                 -DBROWSER_RESOLUTION_${resolution}=1
                                 -DPROFILE_MOBILE=${IF_PROFILE_MOBILE}
+                                -DDUMMY_BUTTON=${IF_DUMMY_BUTTON}
                                 ${Edc_Input} ${tmp_output}
                                 MAIN_DEPENDENCY ${Edc_Input}
                                 DEPENDS ${EDJE_TARGET_depends}
index c528bf364ca5e49aa0c97148eec69a6e1ebde14e..732f73346f1056e3908b6907b0ad247731d672de 100644 (file)
@@ -55,12 +55,13 @@ public:
      */
     virtual Evas_Object* getLayout() = 0;
 
+#if !DUMMY_BUTTON
     /**
      * Remember that there must be at least 1 tab created to return layout
      * @return pointer to Evas_Object widget connected with a current WebView.
      */
     virtual Evas_Object* getWidget() = 0;
-
+#endif
     /**
      * Initialize WebEngine.
      * @param guiParent GUI parent object
index b712724dd464ede2351200fae80dae0278deada7..bafeb93e6cbbbcf27d458d47a6185f26849dee2d 100755 (executable)
@@ -136,6 +136,9 @@ void SimpleUI::resume()
         m_isSessionRestored = true;
     }
     m_webEngine->preinitializeWebViewCache();
+#if DUMMY_BUTTON
+    m_webPageUI->createDummyButton();
+#endif
     m_webEngine->resume();
     if (m_findOnPageUI && m_findOnPageUI->isVisible())
         m_findOnPageUI->show_ime();
@@ -813,8 +816,7 @@ void SimpleUI::onOpenURL(const std::string& url, const std::string& title, bool
         if (tabsCount() == 0 || m_webPageUI->stateEquals(WPUState::QUICK_ACCESS))
             openNewTab(url, title, boost::none, desktopMode, basic_webengine::TabOrigin::QUICKACCESS);
         else {
-            M_ASSERT(m_webEngine->getWidget());
-            m_webPageUI->switchViewToWebPage(m_webEngine->getWidget(), url, false);
+            m_webPageUI->switchViewToWebPage(m_webEngine->getLayout(), url, false);
             m_webEngine->setURI(url);
             m_webPageUI->getURIEntry().clearFocus();
         }
index 69a91abc050b1541139001dd343a0d7a64a45368..9f4d9eaef90c6253692e0d6ae0280e185c5683a2 100755 (executable)
@@ -82,7 +82,8 @@ Evas_Object * WebEngineService::getLayout()
     return m_currentWebView->getLayout();
 }
 
-Evas_Object* WebEngineService::getWidget()
+#if !DUMMY_BUTTON
+Evas_Object * WebEngineService::getWidget()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     M_ASSERT(m_currentWebView);
@@ -92,7 +93,7 @@ Evas_Object* WebEngineService::getWidget()
     }
     return m_currentWebView->getWidget();
 }
-
+#endif
 void WebEngineService::init(Evas_Object* guiParent)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 6d652955f9683c7d082684ab4ca371e8fc190ef4..a1d47657e2401618581984591198ceeb4cf06c7b 100644 (file)
@@ -52,8 +52,10 @@ public:
     virtual std::string getName();
 
     Evas_Object * getLayout();
-    Evas_Object* getWidget();
-    void init(Evas_Object* guiParent);
+#if !DUMMY_BUTTON
+    Evas_Object * getWidget();
+#endif
+    void init(Evas_Object *guiParent);
     void preinitializeWebViewCache();
 
     void setURI(const std::string &);
index 323bb6a0f0ee9193f6d3ac632b7506ba2f49f693..2d4b665377a1162f5342b55062a5478f1c0ee1d0 100755 (executable)
@@ -631,10 +631,12 @@ Evas_Object * WebView::getLayout()
     return m_ewkView;
 }
 
-Evas_Object* WebView::getWidget()
+#if !DUMMY_BUTTON
+Evas_Object * WebView::getWidget()
 {
     return ewk_view_widget_get(m_ewkView);
 }
+#endif
 
 void WebView::setURI(const std::string & uri)
 {
index 5f21082e64c295847304ad217ec52756e71c4c1b..1e763c5f4889e056a91ecdec19878a3c12087df4 100644 (file)
@@ -103,8 +103,9 @@ public:
     std::map<std::string, std::vector<std::string> > parse_uri(const char *uriToParse);
 
     Evas_Object * getLayout();
+#if !DUMMY_BUTTON
     Evas_Object * getWidget();
-
+#endif
     void confirmationResult(WebConfirmationPtr);
 
     std::shared_ptr<tizen_browser::tools::BrowserImage> captureSnapshot(int width, int height, bool async,
index 59f653970729c13dcb06225cc63a15faed50a910..fd5f478ac49b2afdce8e9c64a21cee7d68d372f1 100755 (executable)
@@ -39,6 +39,9 @@ EXPORT_SERVICE(WebPageUI, "org.tizen.browser.webpageui")
 WebPageUI::WebPageUI()
     : m_parent(nullptr)
     , m_mainLayout(nullptr)
+#if DUMMY_BUTTON
+    , m_dummy_button(nullptr)
+#endif
     , m_errorLayout(nullptr)
     , m_bookmarkManagerButton(nullptr)
     , m_statesMgr(std::make_shared<WebPageUIStatesManager>(WPUState::MAIN_WEB_PAGE))
@@ -62,6 +65,10 @@ WebPageUI::WebPageUI()
 WebPageUI::~WebPageUI()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+#if DUMMY_BUTTON
+    evas_object_smart_callback_del(m_dummy_button, "focused", _dummy_button_focused);
+    evas_object_smart_callback_del(m_dummy_button, "unfocused", _dummy_button_unfocused);
+#endif
 }
 
 void WebPageUI::init(Evas_Object* parent)
@@ -208,7 +215,9 @@ void WebPageUI::setMainContent(Evas_Object* content)
 #if GESTURE
     elm_gesture_layer_attach(m_gestureLayer, content);
 #endif
+#if !DUMMY_BUTTON
     evas_object_smart_callback_add(content, "mouse,down", _content_clicked, this);
+#endif
     updateManualRotation();
     evas_object_show(content);
 }
@@ -588,6 +597,45 @@ void WebPageUI::createLayout()
 #endif
 }
 
+#if DUMMY_BUTTON
+void WebPageUI::createDummyButton()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (!m_dummy_button) {
+        M_ASSERT(m_mainLayout);
+        m_dummy_button = elm_button_add(m_mainLayout);
+        elm_object_style_set(m_dummy_button, "invisible_button");
+        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_dummy_button", 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);
+    }
+}
+
+void WebPageUI::_dummy_button_focused(void *data, Evas_Object *, void *)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        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__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        webPageUI->unfocusWebView();
+    }
+}
+
+#endif
 void WebPageUI::createErrorLayout()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 0de78d60feee27ee6219a575c1d14bf44aa5d067..29f5dced2cb21113f51efe375fda4de02ed25968 100755 (executable)
@@ -84,6 +84,9 @@ public:
     UrlHistoryPtr getUrlHistoryList();
     virtual void showUI();
     virtual void hideUI();
+#if DUMMY_BUTTON
+    void createDummyButton();
+#endif
     void fullscreenModeSet(bool state);
     virtual void orientationChanged() override;
     //AbstractContextMenu interface implementation
@@ -164,7 +167,10 @@ 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 _more_menu_background_clicked(void* data, Evas_Object*, const char*, const char*);
+#if DUMMY_BUTTON
+    static void _dummy_button_focused(void *data, Evas_Object *, void *);
+    static void _dummy_button_unfocused(void *data, Evas_Object *, void *);
+#endif
     static void _content_clicked(void * data, Evas_Object *, void *);
 #if GESTURE
     static Evas_Event_Flags _gesture_move(void *data, void *event_info);
@@ -209,6 +215,9 @@ private:
 
     Evas_Object* m_parent;
     Evas_Object* m_mainLayout;
+#if DUMMY_BUTTON
+    Evas_Object* m_dummy_button;
+#endif
     Evas_Object* m_errorLayout;
     Evas_Object* m_bookmarkManagerButton;
 
index e73a6992d512dcd84b7e80d609caa5e787c92728..56b82c951fe33a4ab6e73cf6d81e43b86cb0778f 100644 (file)
@@ -331,6 +331,21 @@ collections { base_scale: 2.6;
                     rel2 { relative: 1.0 1.0; to: "bg"; }
                 }
             }
+#if DUMMY_BUTTON
+            swallow { "web_view_dummy_button"; scale;
+                mouse_events: 1;
+                repeat_events: 1;
+                description { "default";
+                    visible: 1;
+                    align: 0.0 0.0;
+                    fixed: 0 0;
+                    min: 0 0;
+                    max: -1 -1;
+                    rel1 { relative: 0.0 0.0; to: "web_view"; }
+                    rel2 { relative: 1.0 1.0; to: "web_view"; }
+                }
+            }
+#endif
             part { name: "progressbar_bg";
                 type: IMAGE;
                 scale: 1;