Clean-up Multiprocess service support
[platform/framework/web/web-provider.git] / src / Plugin / AppBoxPlugin / AppBoxRenderView.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 79e7951..f609963
@@ -23,6 +23,7 @@
 #include <Eina.h>
 #include <Evas.h>
 #include <Ecore.h>
+#include <EWebKit2.h>
 #include <ewk_view.h>
 #include <ewk_context.h>
 #include <ewk_settings.h>
@@ -42,6 +43,7 @@
 #include "AppBoxRenderView.h"
 
 #define RENDER_MAX_TIME 30.0
+#define SNAPSHOT_REMOVE_TIME 1.0
 
 // injection javascript file regarding creating js object used by box and pd
 static const std::string injectionFile("/usr/share/web-provider/injection.js");
@@ -58,9 +60,11 @@ AppBoxRenderView::AppBoxRenderView(
     , m_pdWrt()
     , m_snapshot()
     , m_fireRenderTimer()
+    , m_removeSnapShotTimer()
     , m_pdHelper()
-    , m_pdFastOpen(false)
     , m_boxRenderBuffer()
+    , m_pdFastOpen(false)
+    , m_boxFinishLoad(false)
     , m_boxWrt_isSuspended(false)
 {
     LogD("enter");
@@ -70,7 +74,10 @@ AppBoxRenderView::AppBoxRenderView(
     }
 
     m_boxRenderBuffer = AppBoxObserver::Instance()->getRenderBuffer(m_instanceId);
-    m_pdFastOpen = web_provider_livebox_get_pd_fast_open(m_boxId.c_str()) ? true : false;
+
+    // use fastopen to default
+    // m_pdFastOpen = web_provider_livebox_get_pd_fast_open(m_boxId.c_str()) ? true : false;
+    m_pdFastOpen = true;
     AppBoxObserver::Instance()->registerRenderView(m_instanceId, this);
 }
 
@@ -86,16 +93,23 @@ void AppBoxRenderView::showBox(RenderInfoPtr boxRenderInfo)
 
     // stop updating render buffer
     m_boxRenderBuffer->stopCanvasUpdate();
-    clearSnapShot();
+
+    // clear snapshot if this is not the case of pd open
+    if (!m_pdHelper) {
+        clearSnapShot();
+    }
 
     // delete already running timer
-    deleteRenderTimer();
+    deleteTimer(&m_fireRenderTimer);
 
-    // stop touch timer
+    // delete touch timer
     if (web_provider_livebox_get_mouse_event(m_boxId.c_str())) {
         m_boxRenderBuffer->deleteTouchTimer();
     }
 
+    // set boxFinishLoad to false
+    m_boxFinishLoad = false;
+
     // copy to url
     std::string boxStartUrl = getStartUrl(URL_TYPE_BOX, boxRenderInfo->defaultUrlParams);
     if (m_boxWrt) {
@@ -103,7 +117,9 @@ void AppBoxRenderView::showBox(RenderInfoPtr boxRenderInfo)
         destroyBoxWrtCore();
     }
 
-    m_boxWrt = createWrtCore(boxStartUrl, boxRenderInfo->window, m_ewkContext);
+    m_boxWrt = createWrtCore(
+                URL_TYPE_BOX, boxStartUrl, 
+                boxRenderInfo->window, m_ewkContext);
     m_boxWrt_isSuspended = false;
 
     // in case of showing box by request of pd open
@@ -124,18 +140,14 @@ void AppBoxRenderView::showBox(RenderInfoPtr boxRenderInfo)
 }
 
 AppBoxRenderView::WrtCorePtr AppBoxRenderView::createWrtCore(
-        std::string& startUrl, Evas_Object* win, EwkContextPtr ewkContext)
+        UrlType type, std::string& startUrl, 
+        Evas_Object* win, EwkContextPtr ewkContext)
 {
     LogD("enter");
     
     WrtCorePtr wrt;
-#ifdef MULTIPROCESS_SERVICE_SUPPORT
-    wrt = WRT::CoreModuleSingleton::
-                Instance().getRunnableWidgetObject(m_appId, DPL::Optional<unsigned>());
-#else
     wrt = WRT::CoreModuleSingleton::
                 Instance().getRunnableWidgetObject(m_appId);
-#endif
     // prepare webview
     if (startUrl.empty()) {
         LogD("no start url");
@@ -147,7 +159,12 @@ AppBoxRenderView::WrtCorePtr AppBoxRenderView::createWrtCore(
     // set callback functions of RunnableWidgetObject
     WRT::UserDelegatesPtr cbs(new WRT::UserDelegates);
     cbs->loadStart = DPL::MakeDelegate(this, &AppBoxRenderView::startLoadCallback);
-    cbs->loadFinish = DPL::MakeDelegate(this, &AppBoxRenderView::finishLoadCallback);
+    if (type == URL_TYPE_BOX) {
+        cbs->loadFinish = DPL::MakeDelegate(this, &AppBoxRenderView::finishBoxLoadCallback);
+    } else {
+        cbs->loadFinish = DPL::MakeDelegate(this, &AppBoxRenderView::finishPdLoadCallback);
+    }
+
     cbs->bufferSet = DPL::MakeDelegate(this, &AppBoxRenderView::setBufferCallback);
     cbs->bufferUnset = DPL::MakeDelegate(this, &AppBoxRenderView::unsetBufferCallback);
     if (!m_pdFastOpen) {
@@ -164,14 +181,6 @@ AppBoxRenderView::WrtCorePtr AppBoxRenderView::createWrtCore(
 
     // set basic webview setting
     setWebViewBasicSetting(wrt->GetCurrentWebview());
-    // To know starting point for updating buffer
-    evas_object_smart_callback_add(
-            wrt->GetCurrentWebview(),
-            "load,nonemptylayout,finished",
-            //"frame,rendered", 
-            loadNonEmptyLayoutFinishedCallback,
-            this);
-
     return wrt;
 }
 
@@ -180,7 +189,8 @@ void AppBoxRenderView::destroyBoxWrtCore()
     LogD("enter");
 
     m_boxRenderBuffer->stopCanvasUpdate();
-    deleteRenderTimer();
+    deleteTimer(&m_fireRenderTimer);
+    deleteTimer(&m_removeSnapShotTimer);
     destroyWrtCore(m_boxWrt);
     m_boxWrt.reset();
 
@@ -228,12 +238,12 @@ void AppBoxRenderView::showPd(RenderInfoPtr pdRenderInfo, RenderInfoPtr boxRende
 {
     LogD("enter");
 
-    // create pd helper
     std::string pdStartUrl = getStartUrl(URL_TYPE_PD, pdRenderInfo->defaultUrlParams);
     if (m_pdFastOpen) {
         destroyPdWrtCore();
-        // if needed, last param regarding ewk context can be set to new one.
-        m_pdWrt = createWrtCore(pdStartUrl, pdRenderInfo->window, m_ewkContext);
+        // if you want to launch new Web Process for PD, use the following line.
+        // EwkContextPtr pdContext = AppBoxObserver::Instance()->getPdEwkContext();
+        m_pdWrt = createWrtCore(URL_TYPE_PD, pdStartUrl, pdRenderInfo->window, m_ewkContext);
         if (!m_pdWrt) {
             LogD("no wrt core instance");
             return;
@@ -254,7 +264,13 @@ void AppBoxRenderView::showPd(RenderInfoPtr pdRenderInfo, RenderInfoPtr boxRende
 
     // show pd window
     evas_object_show(pdRenderInfo->window);
+
+    // show box
     showBox(boxRenderInfo);
+
+    // start timer for clearing existing snapshot in case of only pd open
+    addTimer(&m_removeSnapShotTimer, SNAPSHOT_REMOVE_TIME, removeSnapShotTimerCallback);
+
 }
 
 void AppBoxRenderView::hidePd()
@@ -333,7 +349,7 @@ Evas_Object* AppBoxRenderView::getCurrentSnapShot()
     return m_snapshot;
 }
 
-void AppBoxRenderView::clearSnapShot() 
+void AppBoxRenderView::clearSnapShot()
 {
     LogD("enter");
     if (m_snapshot) {
@@ -342,31 +358,46 @@ void AppBoxRenderView::clearSnapShot()
     }
 }
 
-void AppBoxRenderView::addRenderTimer()
+void AppBoxRenderView::showSnapShot()
 {
     LogD("enter");
-    if (m_fireRenderTimer) {
-        deleteRenderTimer();
+    if (m_snapshot) {
+        evas_object_raise(m_snapshot);
+        evas_object_show(m_snapshot);
     }
+}
 
-    m_fireRenderTimer = ecore_timer_add(
-                            RENDER_MAX_TIME, 
-                            fireRenderTimerCallback,
-                            this);
+void AppBoxRenderView::hideSnapShot()
+{
+    LogD("enter");
+    if (m_snapshot) {
+        evas_object_hide(m_snapshot);
+        evas_object_lower(m_snapshot);
+    }
 }
 
-void AppBoxRenderView::deleteRenderTimer()
+void AppBoxRenderView::addTimer(Ecore_Timer** timer, double interval, Ecore_Task_Cb callback)
 {
     LogD("enter");
-    if (m_fireRenderTimer) {
-        ecore_timer_del(m_fireRenderTimer);
-        m_fireRenderTimer = NULL;
+    if (*timer) {
+        deleteTimer(timer);
+    }
+
+    *timer = ecore_timer_add(interval, callback, this);
+}
+
+void AppBoxRenderView::deleteTimer(Ecore_Timer** timer)
+{
+    LogD("enter");
+    if (*timer) {
+        ecore_timer_del(*timer);
+        *timer = NULL;
     }
 }
 
 void AppBoxRenderView::stopRenderBox()
 {
-    deleteRenderTimer();
+    deleteTimer(&m_fireRenderTimer);
     m_boxRenderBuffer->stopCanvasUpdate();
     if (web_provider_livebox_get_mouse_event(m_boxId.c_str())) {
         // stop touch timer
@@ -396,8 +427,20 @@ void AppBoxRenderView::setWebViewBasicSetting(Evas_Object* webview)
     }
     Ewk_Settings* setting = ewk_view_settings_get(webview);
     // To support transparent background
-    evas_object_color_set(webview, 0, 0, 0, 0);
+    evas_object_color_set(webview, 0, 0, 0, 1);
     ewk_view_visibility_set(webview, EINA_TRUE);
+
+    // To know starting point for updating buffer
+    evas_object_smart_callback_add(
+            webview,
+            "load,nonemptylayout,finished",
+            loadNonEmptyLayoutFinishedCallback,
+            this);
+    evas_object_smart_callback_add(
+            webview,
+            "frame,rendered",
+            frameRenderedCallback,
+            this);
 }
 
 Eina_Bool AppBoxRenderView::fireRenderTimerCallback(void* data)
@@ -411,6 +454,22 @@ Eina_Bool AppBoxRenderView::fireRenderTimerCallback(void* data)
     return ECORE_CALLBACK_CANCEL;
 }
 
+Eina_Bool AppBoxRenderView::removeSnapShotTimerCallback(void* data)
+{
+    LogD("enter");
+
+    AppBoxRenderView* This = static_cast<AppBoxRenderView*>(data);
+    if (!(This->m_boxFinishLoad)) {
+        return ECORE_CALLBACK_RENEW;
+    }
+
+    // hide snapshot because valid frame has been prepared generally.
+    This->clearSnapShot();
+
+    This->m_removeSnapShotTimer = NULL;
+    return ECORE_CALLBACK_CANCEL;
+}
+
 Eina_Bool AppBoxRenderView::openPdIdlerCallback(void* data)
 {
     LogD("enter");
@@ -425,6 +484,7 @@ void AppBoxRenderView::executeScriptCallback(
         Evas_Object* webview, const char* result, void* data)
 {
     LogD("enter");
+
     std::string resultStr(result ? result : "null");
     LogD("result: %s", resultStr.c_str());
 }
@@ -432,6 +492,9 @@ void AppBoxRenderView::executeScriptCallback(
 void AppBoxRenderView::startLoadCallback(Evas_Object* webview)
 {
     LogD("enter");
+    if(!webview) {
+        return;
+    }
     // execute injection for creating js objects
     std::ifstream jsFile(injectionFile);
     std::string script((std::istreambuf_iterator<char>(jsFile)),
@@ -441,14 +504,18 @@ void AppBoxRenderView::startLoadCallback(Evas_Object* webview)
     ewk_view_script_execute(webview, script.c_str(), executeScriptCallback, this);
 }
 
-void AppBoxRenderView::finishLoadCallback(Evas_Object* webview)
+void AppBoxRenderView::finishBoxLoadCallback(Evas_Object* webview)
 {
     LogD("enter");
+    if (!webview) {
+        return;
+    }
+
     ewk_view_visibility_set(webview, EINA_TRUE);
 
     if (!m_pdHelper) {
         // start render timer
-        addRenderTimer();
+        addTimer(&m_fireRenderTimer, RENDER_MAX_TIME, fireRenderTimerCallback);
     } else {
         if (!m_pdFastOpen) {
             if (!(m_pdHelper->isPdOpened()) && 
@@ -459,6 +526,19 @@ void AppBoxRenderView::finishLoadCallback(Evas_Object* webview)
             }
         }
     }
+
+    // set flag
+    m_boxFinishLoad = true;
+}
+
+void AppBoxRenderView::finishPdLoadCallback(Evas_Object* webview)
+{
+    LogD("enter");
+    if (!webview) {
+        return;
+    }
+
+    ewk_view_visibility_set(webview, EINA_TRUE);
 }
 
 void AppBoxRenderView::createWindowBeforeCallback(Evas** canvas, Evas_Object* parent)
@@ -482,6 +562,9 @@ void AppBoxRenderView::createWindowBeforeCallback(Evas** canvas, Evas_Object* pa
 void AppBoxRenderView::createWindowAfterCallback(Evas_Object* parent, Evas_Object* child)
 {
     LogD("enter");
+    if (!parent) {
+        return;
+    }
 
     if (m_pdHelper) {
         Evas* parentCanvas = evas_object_evas_get(parent);
@@ -535,6 +618,12 @@ void AppBoxRenderView::loadNonEmptyLayoutFinishedCallback(
         void* data, Evas_Object* webview, void* eventInfo)
 {
     LogD("enter");
+}
+
+void AppBoxRenderView::frameRenderedCallback(
+        void* data, Evas_Object* webview, void* eventInfo)
+{
+    LogD("enter");
 
     // start to update render buffer!
     AppBoxRenderView* This = static_cast<AppBoxRenderView*>(data);