Unregister bundle callbacks to avoid abort
authorGrzegorz Krawczyk <g.krawczyk@samsung.com>
Mon, 12 Nov 2012 16:16:33 +0000 (17:16 +0100)
committerGerrit Code Review <gerrit2@kim11>
Mon, 19 Nov 2012 09:45:37 +0000 (18:45 +0900)
[Issue#] N_SE-13058
[Problem] WRT abort occurs when emula
[Cause] Webkit invoke callbacks on object which is not available.
[Solution] Unregister callbacks from webkit
[SCMRequest] N/A

Verification :
(On emulator)
1. Run Intel hangonman
2. Right click on emulator window
3. Close (emulator)
4. Ok (to confirm)
5. Start the emulator again
6. Go SLP bugs folder in connection explorer
(/opt/share/hidden_storage/SLP_debug) check that new file with bug trace
does not appear

Change-Id: Iab5c211822dcec748cb2f3765d90a007d4e669f4

src/view/webkit/bundles/messages_names.h
src/view/webkit/bundles/plugin_module_support.cpp
src/view/webkit/bundles/plugin_module_support.h
src/view/webkit/bundles/wrt-wk2-bundle.cpp
src/view/webkit/bundles/wrt-wk2-bundle.h
src/view/webkit/view_logic.cpp
src/wrt-client/wrt-client.cpp

index 7e33e0b..6200174 100644 (file)
 namespace BundleMessages {
 const char * const START = "PluginModule::start";
 const char * const SHUTDOWN = "PluginModule::shutdown";
+
+const char * const SUSPEND = "PluginModule::suspend";
+const char * const RESUME = "PluginModule::resume";
+
 const char * const SET_CUSTOM_PROPERTIES =
     "PluginModule::setCustomProperties";
 const char * const DISPATCH_JAVASCRIPT_EVENT =
index 146d73f..e67945c 100644 (file)
@@ -146,4 +146,16 @@ void dispatchJavaScriptEvent(
     ewk_context_message_post_to_injected_bundle(ewkContext, name, msg);
 }
 
+void suspend(Ewk_Context* ewkContext)
+{
+    const char* name = BundleMessages::SUSPEND;
+    ewk_context_message_post_to_injected_bundle(ewkContext, name, name);
+}
+
+void resume(Ewk_Context* ewkContext)
+{
+    const char* name = BundleMessages::RESUME;
+    ewk_context_message_post_to_injected_bundle(ewkContext, name, name);
+}
+
 }//namespace PluginModuleSupport
index d90720b..9a99aa9 100644 (file)
@@ -34,6 +34,10 @@ void start(Ewk_Context* ewkContext,
            const char *theme,
            bool encrypted);
 void shutdown(Ewk_Context* ewkContext);
+
+void suspend(Ewk_Context* ewkContext);
+void resume(Ewk_Context* ewkContext);
+
 void setCustomProperties(
         Ewk_Context* ewkContext,
         double* scale = NULL,
index aeefceb..1bc730f 100644 (file)
@@ -166,42 +166,7 @@ void Bundle::didCreatePage(WKBundlePageRef page)
     };
     WKBundlePageSetResourceLoadClient(page, &resourceLoadClient);
 
-    WKBundlePageLoaderClient loaderClient = {
-        kWKBundlePageLoaderClientCurrentVersion,
-        this, /* clientinfo */
-        didStartProvisionalLoadForFrameCallback, /* didStartProvisionalLoadForFrame */
-        0, /* didReceiveServerRedirectForProvisionalLoadForFrame */
-        0, /* didFailProvisionalLoadWithErrorForFrame */
-        didCommitLoadForFrameCallback, /* didCommitLoadForFrame */
-        0, /* didFinishDocumentLoadForFrame */
-        0, /* didFinishLoadForFrame */
-        0, /* didFailLoadWithErrorForFrame */
-        0, /* didSameDocumentNavigationForFrame */
-        0, /* didReceiveTitleForFrame */
-        0, /* didFirstLayoutForFrame */
-        0, /* didFirstVisuallyNonEmptyLayoutForFrame */
-        didRemoveFrameFromHierarchyCallback, /* didRemoveFrameFromHierarchy */
-        0, /* didDisplayInsecureContentForFrame */
-        0, /* didRunInsecureContentForFrame */
-        0, /* didClearWindowObjectForFrame */
-        0, /* didCancelClientRedirectForFrame */
-        0, /* willPerformClientRedirectForFrame */
-        0, /* didHandleOnloadEventsForFrame */
-        0, /* didLayoutForFrame */
-        0, /* didNewFirstVisuallyNonEmptyLayout */
-        0, /* didDetectXSSForFrame */
-        0, /* shouldGoToBackForwardListItem */
-        0, /* globalObjectIsAvailableForFrame */
-        0, /* willDisconnectDOMWindowExtensionFromGlobalObject */
-        0, /* didReconnectDOMWindowExtensionToGlobalObject */
-        0, /* willDestroyGlobalObjectForDOMWindowExtension */
-        0, /* didFinishProgress */
-        0, /* shouldForceUniversalAccessFromLocalURL */
-        0, /* didReceiveIntentForFrame */
-        0, /* registerIntentServiceForFrame */
-    };
-    WKBundlePageSetPageLoaderClient(page, &loaderClient);
-
+    connectLoaderClientCallbacksToPage(page);
 
     WKBundlePagePolicyClient policyClient = {
         kWKBundlePagePolicyClientCurrentVersion,        /* version */
@@ -317,6 +282,7 @@ void Bundle::didReceiveMessage(WKStringRef messageName, WKTypeRef messageBody)
                                           BundleMessages::SHUTDOWN))
     {
         LogDebug("shutdown plugins");
+
         if (m_pagesList.empty())
         {
             PluginModule::shutdown();
@@ -327,6 +293,18 @@ void Bundle::didReceiveMessage(WKStringRef messageName, WKTypeRef messageBody)
         }
     }
     else if (WKStringIsEqualToUTF8CString(messageName,
+                                          BundleMessages::SUSPEND))
+    {
+        LogDebug("suspend plugins");
+        requestSuspend();
+    }
+    else if (WKStringIsEqualToUTF8CString(messageName,
+                                          BundleMessages::RESUME))
+    {
+        LogDebug("resume plugins");
+        requestResume();
+    }
+    else if (WKStringIsEqualToUTF8CString(messageName,
                                           BundleMessages::SET_CUSTOM_PROPERTIES))
     {
         LogDebug("reset custom properties of window objects");
@@ -936,6 +914,63 @@ std::string Bundle::DecryptResource(std::string resource, int size)
     return std::string();
 }
 
+void Bundle::requestSuspend()
+{
+    LogDebug("Unregister callbacks");
+    FOREACH(page, m_pagesList)
+    {
+        WKBundlePageSetPageLoaderClient(*page,NULL);
+    }
+}
+
+void Bundle::requestResume()
+{
+    LogDebug("Register callbacks");
+    FOREACH(page, m_pagesList)
+    {
+        connectLoaderClientCallbacksToPage(*page);
+    }
+}
+
+void Bundle::connectLoaderClientCallbacksToPage(WKBundlePageRef page)
+{
+    LogDebug("");
+
+    WKBundlePageLoaderClient loaderClient = {
+        kWKBundlePageLoaderClientCurrentVersion,
+        this, /* clientinfo */
+        didStartProvisionalLoadForFrameCallback, /* didStartProvisionalLoadForFrame */
+        0, /* didReceiveServerRedirectForProvisionalLoadForFrame */
+        0, /* didFailProvisionalLoadWithErrorForFrame */
+        didCommitLoadForFrameCallback, /* didCommitLoadForFrame */
+        0, /* didFinishDocumentLoadForFrame */
+        0, /* didFinishLoadForFrame */
+        0, /* didFailLoadWithErrorForFrame */
+        0, /* didSameDocumentNavigationForFrame */
+        0, /* didReceiveTitleForFrame */
+        0, /* didFirstLayoutForFrame */
+        0, /* didFirstVisuallyNonEmptyLayoutForFrame */
+        didRemoveFrameFromHierarchyCallback, /* didRemoveFrameFromHierarchy */
+        0, /* didDisplayInsecureContentForFrame */
+        0, /* didRunInsecureContentForFrame */
+        0, /* didClearWindowObjectForFrame */
+        0, /* didCancelClientRedirectForFrame */
+        0, /* willPerformClientRedirectForFrame */
+        0, /* didHandleOnloadEventsForFrame */
+        0, /* didLayoutForFrame */
+        0, /* didNewFirstVisuallyNonEmptyLayout */
+        0, /* didDetectXSSForFrame */
+        0, /* shouldGoToBackForwardListItem */
+        0, /* globalObjectIsAvailableForFrame */
+        0, /* willDisconnectDOMWindowExtensionFromGlobalObject */
+        0, /* didReconnectDOMWindowExtensionToGlobalObject */
+        0, /* willDestroyGlobalObjectForDOMWindowExtension */
+        0, /* didFinishProgress */
+        0, /* shouldForceUniversalAccessFromLocalURL */
+    };
+    WKBundlePageSetPageLoaderClient(page, &loaderClient);
+}
+
 
 extern "C"
 {
index 53dd8d1..de4a089 100644 (file)
@@ -156,6 +156,11 @@ class Bundle {
     bool isEncryptedResource(std::string Url, int &size);
     std::string DecryptResource(std::string resource, int size);
 
+    void requestSuspend();
+    void requestResume();
+
+    void connectLoaderClientCallbacksToPage(WKBundlePageRef page);
+
 
 };
 
index 2ea67ee..c227120 100644 (file)
@@ -231,6 +231,9 @@ void ViewLogic::suspendWidget()
     LogInfo("Pausing widget");
     Assert(m_model);
 
+    LogDebug("Request bundle to suspend");
+    PluginModuleSupport::suspend(m_ewkContext);
+
     if (!m_currentEwkView) {
         LogWarning("Cannot suspend widget without view");
     } else {
@@ -248,6 +251,9 @@ void ViewLogic::resumeWidget()
     LogInfo("Resume widget");
     Assert(m_model);
 
+    LogDebug("Request bundle to resume");
+    PluginModuleSupport::resume(m_ewkContext);
+
     if (m_currentEwkView) {
         resumeWebkit(m_currentEwkView);
     }
@@ -899,6 +905,7 @@ void ViewLogic::suspendEwkView(Evas_Object *wkView)
 
     // unregister webview callbacks
     ewkClientDeinit(wkView);
+
     return;
 }
 
index 7834ec9..36d9668 100755 (executable)
@@ -90,6 +90,8 @@ void WrtClient::OnResume()
 
 void WrtClient::OnPause()
 {
+    LogDebug("On pause");
+
     if (m_widgetState != WidgetState_Running) {
         LogWarning("Widget is not running to be suspended");
         return;