Changed logic to add back key callback for context menu.
authorYuni Jeong <yhnet.jung@samsung.com>
Sat, 28 Sep 2013 08:08:20 +0000 (17:08 +0900)
committerYuni Jeong <yhnet.jung@samsung.com>
Sat, 28 Sep 2013 08:47:05 +0000 (17:47 +0900)
[Title]  Changed logic to add back key callback for context menu.
[Issue#] N_SE-53337
[Problem] Back key is not working after showing magnifire via long press.
[Cause] Context menu back key callback has received the signal.
[Solution] Changed logic to add back key callback for context menu.

Change-Id: Id7c08d904128cb01f04a2d2d274dc2f8e741bab7

Source/WebKit2/UIProcess/tizen/WebContextMenuProxyTizen.cpp

index c956f83..6e27005 100755 (executable)
@@ -76,8 +76,10 @@ WebContextMenuProxyTizen::WebContextMenuProxyTizen(Evas_Object* webView, WebPage
 WebContextMenuProxyTizen::~WebContextMenuProxyTizen()
 {
 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
-    if (m_popup)
+    if (m_popup) {
         evas_object_del(m_popup);
+        m_popup = 0;
+    }
 #endif
 }
 
@@ -111,8 +113,10 @@ static void contextMenuHwBackKeyCallback(void* data, Evas_Object* obj, void* eve
 
 void WebContextMenuProxyTizen::createEflMenu(const Vector<WebContextMenuItemData>& items)
 {
-    if (m_popup)
+    if (m_popup) {
         evas_object_del(m_popup);
+        m_popup = 0;
+    }
 
     Evas_Object* topWidget = elm_object_top_widget_get(elm_object_parent_widget_get(m_webView));
     if (!topWidget)
@@ -122,14 +126,6 @@ void WebContextMenuProxyTizen::createEflMenu(const Vector<WebContextMenuItemData
     if (!m_popup)
         return;
 
-#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
-    if (EflAssistHandle) {
-        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
-        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
-        (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, contextMenuHwBackKeyCallback, 0);
-    }
-#endif
-
     m_items = items;
     evas_object_data_set(m_popup, "WebContextMenuProxyTizen", this);
     elm_object_tree_focus_allow_set(m_popup, false);
@@ -144,7 +140,9 @@ void WebContextMenuProxyTizen::createEflMenu(const Vector<WebContextMenuItemData
     m_isContextMenuForTextSelection = false;
 #endif
 
+    int appendedItemSize = 0;
     for (size_t i = 0; i < size; i++) {
+        Elm_Object_Item* appendedItem = 0;
 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
         if ((m_items.at(i).action() == ContextMenuItemTagPaste || m_items.at(i).action() == ContextMenuItemTagClipboard) && !clipboardItemSize)
             continue;
@@ -169,17 +167,27 @@ void WebContextMenuProxyTizen::createEflMenu(const Vector<WebContextMenuItemData
             }
 
             if (!m_items.at(i).title().isEmpty())
-                elm_ctxpopup_item_append(m_popup, m_items.at(i).title().utf8().data(), icon,
+                appendedItem = elm_ctxpopup_item_append(m_popup, m_items.at(i).title().utf8().data(), icon,
                                          contextMenuItemSelectedCallback, &(m_items.at(i)));
             else
-                elm_ctxpopup_item_append(m_popup, 0, icon,
+                appendedItem = elm_ctxpopup_item_append(m_popup, 0, icon,
                                          contextMenuItemSelectedCallback, &(m_items.at(i)));
         }
 #else
         if (!m_items.at(i).title().isEmpty())
-            elm_ctxpopup_item_append(m_popup, m_items.at(i).title().utf8().data(), 0,
+            appendedItem = elm_ctxpopup_item_append(m_popup, m_items.at(i).title().utf8().data(), 0,
                                      contextMenuItemSelectedCallback, &(m_items.at(i)));
 #endif
+
+        if (appendedItem)
+            appendedItemSize++;
+    }
+
+    TIZEN_LOGI("appendedItemSize : %d", appendedItemSize);
+    if (!appendedItemSize) {
+        evas_object_del(m_popup);
+        m_popup = 0;
+        return;
     }
 }
 
@@ -220,49 +228,60 @@ void WebContextMenuProxyTizen::showContextMenu(const WebCore::IntPoint& position
 
     createEflMenu(items);
 
+    if (!m_popup)
+        return;
+
 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-    if (m_isContextMenuForTextSelection && !evas_object_focus_get(m_webView))
+    if (m_isContextMenuForTextSelection && !evas_object_focus_get(m_webView)) {
+        evas_object_del(m_popup);
+        m_popup = 0;
         return;
+    }
 #endif
 
-    if (m_popup) {
-        int webViewX, webViewY;
-        evas_object_geometry_get(m_webView, &webViewX, &webViewY, 0, 0);
-        IntPoint popupPosition = position;
+    int webViewX, webViewY;
+    evas_object_geometry_get(m_webView, &webViewX, &webViewY, 0, 0);
+    IntPoint popupPosition = position;
 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-        if (m_pageClientImpl) {
-            popupPosition.scale(m_pageClientImpl->scaleFactor(), m_pageClientImpl->scaleFactor());
-            IntPoint scrollPosition = m_pageClientImpl->scrollPosition();
-            popupPosition.move(-scrollPosition.x(), -scrollPosition.y());
-        }
+    if (m_pageClientImpl) {
+        popupPosition.scale(m_pageClientImpl->scaleFactor(), m_pageClientImpl->scaleFactor());
+        IntPoint scrollPosition = m_pageClientImpl->scrollPosition();
+        popupPosition.move(-scrollPosition.x(), -scrollPosition.y());
+    }
 #endif
-        popupPosition.setX(popupPosition.x() + webViewX);
-        popupPosition.setY(popupPosition.y() + webViewY);
+    popupPosition.setX(popupPosition.x() + webViewX);
+    popupPosition.setY(popupPosition.y() + webViewY);
 
 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-        if (m_isContextMenuForTextSelection) {
-            if (!m_pageClientImpl->isTextSelectionMode())
-                m_pageClientImpl->setIsTextSelectionMode(true);
+    if (m_isContextMenuForTextSelection) {
+        if (!m_pageClientImpl->isTextSelectionMode())
+            m_pageClientImpl->setIsTextSelectionMode(true);
 
-            elm_object_style_set(m_popup,"copypaste");
-            elm_ctxpopup_horizontal_set(m_popup, EINA_TRUE);
-            elm_ctxpopup_direction_priority_set(m_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT, ELM_CTXPOPUP_DIRECTION_DOWN);
+        elm_object_style_set(m_popup,"copypaste");
+        elm_ctxpopup_horizontal_set(m_popup, EINA_TRUE);
+        elm_ctxpopup_direction_priority_set(m_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT, ELM_CTXPOPUP_DIRECTION_DOWN);
 
-            m_pageClientImpl->changeContextMenuPosition(popupPosition);
-        }
+        m_pageClientImpl->changeContextMenuPosition(popupPosition);
+    }
 #endif
 
-        evas_object_move(m_popup, popupPosition.x(), popupPosition.y());
-        evas_object_show(m_popup);
+    evas_object_move(m_popup, popupPosition.x(), popupPosition.y());
+    evas_object_show(m_popup);
 
-        evas_object_smart_callback_add(m_popup, "dismissed", contextMenuPopupDismissedCallback, this);
+    evas_object_smart_callback_add(m_popup, "dismissed", contextMenuPopupDismissedCallback, this);
+#if ENABLE(TIZEN_HW_MORE_BACK_KEY)
+    if (EflAssistHandle && !m_isContextMenuForTextSelection) {
+        void (*webkit_ea_object_event_callback_add)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *);
+        webkit_ea_object_event_callback_add = (void (*)(Evas_Object *, Ea_Callback_Type , Ea_Event_Cb func, void *))dlsym(EflAssistHandle, "ea_object_event_callback_add");
+        (*webkit_ea_object_event_callback_add)(m_popup, EA_CALLBACK_BACK, contextMenuHwBackKeyCallback, 0);
+    }
+#endif
 
-        m_pageClientImpl->setIsContextMenuVisible(true);
+    m_pageClientImpl->setIsContextMenuVisible(true);
 #if ENABLE(TOUCH_EVENTS) && ENABLE(TIZEN_GESTURE)
-        // Cancel touch event when ContextMenu is shown.
-        EwkViewImpl::fromEvasObject(m_webView)->feedTouchEventsByType(EWK_TOUCH_CANCEL);
+    // Cancel touch event when ContextMenu is shown.
+    EwkViewImpl::fromEvasObject(m_webView)->feedTouchEventsByType(EWK_TOUCH_CANCEL);
 #endif
-    }
 #else
     createEflMenu();
     notImplemented();