[Release] livebox.web-provider-1.37 submit/tizen_2.2/20130629.131014
authorYunchan Cho <yunchan.cho@samsung.com>
Fri, 28 Jun 2013 08:44:30 +0000 (17:44 +0900)
committerYunchan Cho <yunchan.cho@samsung.com>
Sat, 29 Jun 2013 12:45:02 +0000 (21:45 +0900)
Change-Id: I5e81f14607535579fa40d75ee653fffe4965a752

packaging/livebox.web-provider.spec
src/Core/Box.cpp
src/Core/Box.h
src/Core/View/IRenderView.h
src/Core/View/PdHelper.cpp
src/Core/View/PdHelper.h
src/Plugin/AppBoxPlugin/AppBoxPluginFactory.cpp
src/Plugin/AppBoxPlugin/AppBoxPluginFactory.h
src/Plugin/AppBoxPlugin/AppBoxRenderView.cpp
src/Plugin/AppBoxPlugin/AppBoxRenderView.h
src/Plugin/IBoxPluginFactory.h

index 4f29e0f..8f4a057 100755 (executable)
@@ -1,7 +1,7 @@
 #git:framework/web/web-provider
 Name: livebox.web-provider
 Summary: web framework for livebox 
-Version: 1.36
+Version: 1.37
 Release: 1
 Group: main/app
 License: Flora License, Version 1.1
index bf5001f..695a2b6 100644 (file)
@@ -56,8 +56,8 @@ Box::Box(BoxInfoPtr boxInfo, IBoxPluginFactoryPtr factory, EwkContextPtr ewkCont
                             boxInfo->contentInfo);
         m_boxBuffer->allocate();
         m_view = m_factory->createRenderView(
-                boxInfo->boxId, boxInfo->instanceId,
-                m_boxBuffer->getWindow(),
+                boxInfo->boxId,
+                boxInfo->instanceId,
                 ewkContext);
         m_updateTimer = BoxUpdateTimer::create(
                 boxInfo->period,
@@ -86,7 +86,7 @@ bool Box::show()
 
     try {
         m_updateTimer->start();
-        RenderInfoPtr renderInfo = makeRenderInfo(renderTypeCreate);
+        RenderInfoPtr renderInfo = makeRenderInfo(renderTypeCreate, URL_TYPE_BOX);
         m_boxBuffer->stopCanvasUpdate();
         m_view->showBox(renderInfo);
         ecore_idler_add(startUpdateRenderBufferIdlerCallback, m_boxBuffer.get());
@@ -130,7 +130,7 @@ bool Box::resize(int width, int height)
         m_updateTimer->restart();
         m_boxBuffer->reallocate(
                 m_boxInfo->boxWidth, m_boxInfo->boxHeight);
-        RenderInfoPtr renderInfo = makeRenderInfo(renderTypeResize);
+        RenderInfoPtr renderInfo = makeRenderInfo(renderTypeResize, URL_TYPE_BOX);
         m_view->showBox(renderInfo);
     } catch (...) {
         LogD("resize exception");
@@ -203,8 +203,9 @@ bool Box::openPd(int width, int height, double x, double y)
                             m_boxInfo->pdHeight);
         m_pdBuffer->allocate();
         m_pdBuffer->stopCanvasUpdate();
-        RenderInfoPtr renderInfo = makeRenderInfo(renderTypeOpenPd);
-        m_view->showPd(m_pdBuffer->getWindow(), renderInfo);
+        RenderInfoPtr pdRenderInfo = makeRenderInfo(renderTypeOpenPd, URL_TYPE_PD);
+        RenderInfoPtr boxRenderInfo = makeRenderInfo(renderTypeOpenPd, URL_TYPE_BOX);
+        m_view->showPd(pdRenderInfo, boxRenderInfo);
         ecore_idler_add(startUpdateRenderBufferIdlerCallback, m_pdBuffer.get());
     } catch (...) {
         return false;
@@ -275,7 +276,7 @@ time_t Box::getLastUpdateRequestTime()
     return m_lastUpdateRequestTime;
 }
 
-RenderInfoPtr Box::makeRenderInfo(const std::string& renderType) const
+RenderInfoPtr Box::makeRenderInfo(const std::string& renderType, UrlType urlType) const
 {
     LogD("enter");
     RenderInfoPtr renderInfo(new RenderInfo);
@@ -284,13 +285,22 @@ RenderInfoPtr Box::makeRenderInfo(const std::string& renderType) const
     renderInfo->defaultUrlParams = "?type=" + renderType;
 
     // set width, height
-    if (renderType == renderTypeOpenPd) {
-        renderInfo->width = m_boxInfo->pdWidth;
-        renderInfo->height = m_boxInfo->pdHeight;
-    } else {
+    switch (urlType) {
+    case URL_TYPE_BOX:
+        renderInfo->window = m_boxBuffer->getWindow();
         renderInfo->width = m_boxInfo->boxWidth;
         renderInfo->height = m_boxInfo->boxHeight;
+        break;
+    case URL_TYPE_PD:
+        renderInfo->window = m_pdBuffer->getWindow();
+        renderInfo->width = m_boxInfo->pdWidth;
+        renderInfo->height = m_boxInfo->pdHeight;
+        break;
+    default:
+        LogD("error url type");
+        return RenderInfoPtr();
     }
+
     char buff[32];
     sprintf(buff, "&width=%d&height=%d", renderInfo->width, renderInfo->height);
     renderInfo->defaultUrlParams += buff;
@@ -323,7 +333,7 @@ RenderInfoPtr Box::makeRenderInfo(const std::string& renderType) const
 void Box::updateInternal()
 {
     LogD("enter");
-    RenderInfoPtr renderInfo = makeRenderInfo(renderTypeUpdate);
+    RenderInfoPtr renderInfo = makeRenderInfo(renderTypeUpdate, URL_TYPE_BOX);
     m_boxBuffer->stopCanvasUpdate();
     m_view->showBox(renderInfo);
     ecore_idler_add(startUpdateRenderBufferIdlerCallback, m_boxBuffer.get());
index 41cb8ba..915afb5 100644 (file)
@@ -58,7 +58,12 @@ class Box: public IBox, public IBoxContext {
         ~Box();
 
     private:
-        RenderInfoPtr makeRenderInfo(const std::string& renderType) const;
+        enum UrlType {
+            URL_TYPE_BOX = 0,
+            URL_TYPE_PD
+        };
+
+        RenderInfoPtr makeRenderInfo(const std::string& renderType, UrlType urlType) const;
         void updateInternal();
 
         // IBoxContext
index 6a4dec3..9e24ed0 100644 (file)
@@ -27,6 +27,7 @@
 struct RenderInfo {
     int width;
     int height;
+    Evas_Object* window;
     std::string defaultUrlParams;
 };
 typedef std::shared_ptr<RenderInfo> RenderInfoPtr;
@@ -37,11 +38,11 @@ class IRenderView {
             URL_TYPE_BOX,
             URL_TYPE_PD
         };
-        virtual void showBox(RenderInfoPtr renderInfo) = 0;
+        virtual void showBox(RenderInfoPtr boxRenderInfo) = 0;
         virtual void hideBox() = 0;
         virtual void pauseBox() = 0;
         virtual void resumeBox() = 0;
-        virtual void showPd(Evas_Object* pdWin, RenderInfoPtr renderInfo) = 0;
+        virtual void showPd(RenderInfoPtr pdRenderInfo, RenderInfoPtr boxRenderInfo) = 0;
         virtual void hidePd() = 0;
         virtual Evas_Object* getBoxWebView() = 0;
         virtual Evas_Object* getPdWebView() = 0;
index 00b8f44..106ba3e 100644 (file)
 #include "IPdHelper.h"
 #include "PdHelper.h"
 
-PdHelper::PdHelper(Evas_Object* pdWin, std::string pdStartUrl, RenderInfoPtr pdRenderInfo)
-    : m_win(pdWin)
-    , m_boxWebView()
+PdHelper::PdHelper(RenderInfoPtr pdRenderInfo, std::string pdStartUrl)
+    : m_boxWebView()
     , m_pdWebView()
+    , m_pdRenderInfo(pdRenderInfo)
     , m_startUrl(pdStartUrl)
-    , m_renderInfo(pdRenderInfo)
     , m_opened(false)
 {
 }
@@ -63,7 +62,7 @@ void PdHelper::finishOpen(Evas_Object* child)
 
     // pd webview set and resize
     m_pdWebView = child;
-    evas_object_resize(m_pdWebView, m_renderInfo->width, m_renderInfo->height);
+    evas_object_resize(m_pdWebView, m_pdRenderInfo->width, m_pdRenderInfo->height);
     m_opened = true;
 }
 
@@ -100,7 +99,7 @@ Evas_Object* PdHelper::getPdWebView() const
 Evas* PdHelper::getPdCanvas() const  
 {
     LogD("enter");
-    evas_object_evas_get(m_win);
+    evas_object_evas_get(m_pdRenderInfo->window);
 }
 
 bool PdHelper::isPdOpened() const
index 16d74ed..6879ba3 100644 (file)
 class EXPORT_CLASS PdHelper: public IPdHelper {
     public:
         static IPdHelperPtr create(
-                Evas_Object* pdWin, 
-                std::string pdStartUrl, 
-                RenderInfoPtr pdRenderInfo) 
+                RenderInfoPtr pdRenderInfo,
+                std::string pdStartUrl)
         {
-            return IPdHelperPtr(new PdHelper(pdWin, pdStartUrl, pdRenderInfo));
+            return IPdHelperPtr(new PdHelper(pdRenderInfo, pdStartUrl));
         }
         virtual void startOpen();
         virtual void finishOpen(Evas_Object* child);
@@ -56,14 +55,13 @@ class EXPORT_CLASS PdHelper: public IPdHelper {
         static void executeScriptCallback(
             Evas_Object* webview, const char* result, void* data);
 
-        PdHelper(Evas_Object* pdWin, std::string pdStartUrl, RenderInfoPtr pdRenderInfo); 
+        PdHelper(RenderInfoPtr pdRenderInfo, std::string pdStartUrl);
 
         //members
-        Evas_Object* m_win;
         Evas_Object* m_boxWebView;
         Evas_Object* m_pdWebView;
+        RenderInfoPtr m_pdRenderInfo;
         std::string m_startUrl;
-        RenderInfoPtr m_renderInfo;
         bool m_opened;
 };
 
index cc9ead1..8f0bfb2 100644 (file)
 
 IRenderViewPtr AppBoxPluginFactory::createRenderView(
         std::string boxId, std::string instanceId, 
-        Evas_Object* boxWin, 
         std::shared_ptr<Ewk_Context> ewkContext)
 {
-    return AppBoxRenderView::create(boxId, instanceId, boxWin, ewkContext);
+    return AppBoxRenderView::create(boxId, instanceId, ewkContext);
 }
 
 IRenderBufferPtr AppBoxPluginFactory::createBoxRenderBuffer(
index 09cf37d..ca5a5f2 100644 (file)
@@ -32,7 +32,6 @@ class AppBoxPluginFactory: public IBoxPluginFactory {
     public:
         IRenderViewPtr createRenderView(
                 std::string boxId, std::string instanceId, 
-                Evas_Object* boxWin, 
                 std::shared_ptr<Ewk_Context> ewkContext);
 
         IRenderBufferPtr createBoxRenderBuffer(
index d9fb9d7..3b6593c 100644 (file)
 
 // injection javascript file regarding creating js object used by box and pd
 static const std::string injectionFile("/usr/share/web-provider/injection.js");
+static const std::string renderReadyKey("ready");
 
 AppBoxRenderView::AppBoxRenderView(
         std::string boxId, std::string instanceId,
-        Evas_Object* boxWin, EwkContextPtr ewkContext)
+        EwkContextPtr ewkContext)
     : m_appId()
     , m_boxId(boxId)
     , m_instanceId(instanceId)
-    , m_boxWin(boxWin)
-    , m_snapshot()
-    , m_renderInfo()
+    , m_ewkContext(ewkContext)
+    , m_boxRenderInfo()
     , m_boxWrt()
-    , m_boxWrt_isSuspended(false)
     , m_pdWrt()
+    , m_snapshot()
     , m_fireRenderTimer()
     , m_pdHelper()
     , m_pdFastOpen(false)
-    , m_ewkContext(ewkContext)
-    , m_renderBuffer()
+    , m_boxRenderBuffer()
+    , m_boxWrt_isSuspended(false)
 {
     LogD("enter");
     m_appId = getAppId(m_boxId);
@@ -70,7 +70,7 @@ AppBoxRenderView::AppBoxRenderView(
         throw; //exception throw!
     }
 
-    m_renderBuffer = AppBoxObserver::Instance()->getRenderBuffer(m_instanceId);
+    m_boxRenderBuffer = AppBoxObserver::Instance()->getRenderBuffer(m_instanceId);
     m_pdFastOpen = web_provider_livebox_get_pd_fast_open(m_boxId.c_str()) ? true : false;
     AppBoxObserver::Instance()->registerRenderView(m_instanceId, this);
 }
@@ -81,16 +81,12 @@ AppBoxRenderView::~AppBoxRenderView()
     AppBoxObserver::Instance()->unregisterRenderView(m_instanceId);
 }
 
-void AppBoxRenderView::showBox(RenderInfoPtr renderInfo)
+void AppBoxRenderView::showBox(RenderInfoPtr boxRenderInfo)
 {
     LogD("enter");
 
-    if (!m_boxWin) {
-        return;
-    }
-
     // stop updating render buffer
-    m_renderBuffer->stopCanvasUpdate();
+    m_boxRenderBuffer->stopCanvasUpdate();
     clearSnapShot();
 
     // delete already running timer
@@ -98,17 +94,17 @@ void AppBoxRenderView::showBox(RenderInfoPtr renderInfo)
 
     // stop touch timer
     if (web_provider_livebox_get_mouse_event(m_boxId.c_str())) {
-        m_renderBuffer->deleteTouchTimer();
+        m_boxRenderBuffer->deleteTouchTimer();
     }
 
     // copy to url
-    std::string boxStartUrl = getStartUrl(URL_TYPE_BOX, renderInfo->defaultUrlParams);
+    std::string boxStartUrl = getStartUrl(URL_TYPE_BOX, boxRenderInfo->defaultUrlParams);
     if (m_boxWrt) {
         LogD("existing wrt core is removed");
         destroyBoxWrtCore();
     }
 
-    m_boxWrt = createWrtCore(boxStartUrl, m_boxWin, m_ewkContext); 
+    m_boxWrt = createWrtCore(boxStartUrl, boxRenderInfo->window, m_ewkContext);
     m_boxWrt_isSuspended = false;
 
     // in case of showing box by request of pd open
@@ -119,13 +115,13 @@ void AppBoxRenderView::showBox(RenderInfoPtr renderInfo)
     // resize webview fitted to width, height of Box
     evas_object_resize(
             m_boxWrt->GetCurrentWebview(), 
-            renderInfo->width,
-            renderInfo->height);
+            boxRenderInfo->width,
+            boxRenderInfo->height);
 
 
-    evas_object_show(m_boxWin);
+    evas_object_show(boxRenderInfo->window);
     m_boxWrt->Show();
-    m_renderInfo = renderInfo;
+    m_boxRenderInfo = boxRenderInfo;
 }
 
 AppBoxRenderView::WrtCorePtr AppBoxRenderView::createWrtCore(
@@ -169,14 +165,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;
 }
 
@@ -184,7 +172,7 @@ void AppBoxRenderView::destroyBoxWrtCore()
 {
     LogD("enter");
 
-    m_renderBuffer->stopCanvasUpdate();
+    m_boxRenderBuffer->stopCanvasUpdate();
     deleteRenderTimer();
     destroyWrtCore(m_boxWrt);
     m_boxWrt.reset();
@@ -214,9 +202,8 @@ void AppBoxRenderView::hideBox()
 {
     LogD("enter");
     destroyBoxWrtCore();
-    if (m_boxWin) {
-        evas_object_hide(m_boxWin);
-        m_boxWin = NULL;
+    if (m_boxRenderInfo->window) {
+        evas_object_hide(m_boxRenderInfo->window);
     }
 }
 
@@ -230,43 +217,37 @@ void AppBoxRenderView::resumeBox()
     LogD("enter");
 }
 
-void AppBoxRenderView::showPd(Evas_Object* pdWin, RenderInfoPtr renderInfo)
+void AppBoxRenderView::showPd(RenderInfoPtr pdRenderInfo, RenderInfoPtr boxRenderInfo)
 {
     LogD("enter");
 
-    if (!pdWin) {
-        return;
-    }
-
     // create pd helper
-    std::string pdStartUrl = getStartUrl(URL_TYPE_PD, renderInfo->defaultUrlParams);
+    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, pdWin, m_ewkContext);
+        m_pdWrt = createWrtCore(pdStartUrl, pdRenderInfo->window, m_ewkContext);
         if (!m_pdWrt) {
             LogD("no wrt core instance");
             return;
         }
-        m_pdHelper = AppBoxPdHelper::create(pdWin);
+        m_pdHelper = AppBoxPdHelper::create(pdRenderInfo->window);
 
         // resize webview fitted to width, height of pd
         evas_object_resize(
                 m_pdWrt->GetCurrentWebview(), 
-                renderInfo->width,
-                renderInfo->height);
+                pdRenderInfo->width,
+                pdRenderInfo->height);
         // show pd
         m_pdWrt->Show();
         m_pdHelper->finishOpen(m_pdWrt->GetCurrentWebview());
     } else {
-        m_pdHelper = PdHelper::create(pdWin, pdStartUrl, renderInfo);
+        m_pdHelper = PdHelper::create(pdRenderInfo, pdStartUrl);
     }
 
     // show pd window
-    evas_object_show(pdWin);
-    // set exiting box url query to new one
-    m_renderInfo->defaultUrlParams = renderInfo->defaultUrlParams;
-    showBox(m_renderInfo);
+    evas_object_show(pdRenderInfo->window);
+    showBox(boxRenderInfo);
 }
 
 void AppBoxRenderView::hidePd()
@@ -340,7 +321,7 @@ Evas_Object* AppBoxRenderView::getCurrentSnapShot()
 {
     LogD("enter");
     clearSnapShot();
-    m_snapshot = m_renderBuffer->getSnapshot();
+    m_snapshot = m_boxRenderBuffer->getSnapshot();
 
     return m_snapshot;
 }
@@ -379,10 +360,10 @@ void AppBoxRenderView::deleteRenderTimer()
 void AppBoxRenderView::stopRenderBox()
 {
     deleteRenderTimer();
-    m_renderBuffer->stopCanvasUpdate();
+    m_boxRenderBuffer->stopCanvasUpdate();
     if (web_provider_livebox_get_mouse_event(m_boxId.c_str())) {
         // stop touch timer
-        m_renderBuffer->deleteTouchTimer();
+        m_boxRenderBuffer->deleteTouchTimer();
 
         // temp condition
         if (m_boxWrt_isSuspended == false)
@@ -410,6 +391,19 @@ void AppBoxRenderView::setWebViewBasicSetting(Evas_Object* webview)
     // To support transparent background
     evas_object_color_set(webview, 0, 0, 0, 0);
     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);
+    evas_object_data_set(webview, renderReadyKey.c_str(), "0");
 }
 
 Eina_Bool AppBoxRenderView::fireRenderTimerCallback(void* data)
@@ -547,8 +541,23 @@ void AppBoxRenderView::loadNonEmptyLayoutFinishedCallback(
         void* data, Evas_Object* webview, void* eventInfo)
 {
     LogD("enter");
+}
+
+void AppBoxRenderView::frameRenderedCallback(
+        void* data, Evas_Object* webview, void* eventInfo)
+{
+    LogD("enter");
+
+    // TODO keep this temp code by merging webkit rendering patch
+    // skip first frame (transparent) from webkit
+    if(!strcmp("0", static_cast<const char*>(
+                    evas_object_data_get(webview, renderReadyKey.c_str()))))
+    {
+        evas_object_data_set(webview, renderReadyKey.c_str(), "1");
+        return;
+    }
 
     // start to update render buffer!
     AppBoxRenderView* This = static_cast<AppBoxRenderView*>(data);
-    This->m_renderBuffer->startCanvasUpdate();
+    This->m_boxRenderBuffer->startCanvasUpdate();
 }
index 8a36821..2ebaadd 100644 (file)
@@ -38,17 +38,17 @@ class AppBoxRenderView: public IRenderView {
 
         static IRenderViewPtr create(
                 std::string boxId, std::string instanceId, 
-                Evas_Object* boxWin, EwkContextPtr ewkContext)
+                EwkContextPtr ewkContext)
         {
             return IRenderViewPtr(
                     new AppBoxRenderView(
-                        boxId, instanceId, boxWin, ewkContext));
+                        boxId, instanceId, ewkContext));
         };
-        virtual void showBox(RenderInfoPtr renderInfo);
+        virtual void showBox(RenderInfoPtr boxRenderInfo);
         virtual void hideBox();
         virtual void pauseBox();
         virtual void resumeBox();
-        virtual void showPd(Evas_Object* pdWin, RenderInfoPtr renderInfo);
+        virtual void showPd(RenderInfoPtr pdRenderInfo, RenderInfoPtr boxRenderInfo);
         virtual void hidePd();
         Evas_Object* getBoxWebView();
         Evas_Object* getPdWebView();
@@ -85,6 +85,8 @@ class AppBoxRenderView: public IRenderView {
                 Evas_Object* webview, const char* result, void* data);
         static void loadNonEmptyLayoutFinishedCallback(
                 void* data, Evas_Object* webview, void* eventInfo);
+        static void frameRenderedCallback(
+                void* data, Evas_Object* webview, void* eventInfo);
 
         // user Callbacks of RunnableWidgetObject
         void startLoadCallback(Evas_Object* webview);
@@ -99,23 +101,24 @@ class AppBoxRenderView: public IRenderView {
         // constructor
         explicit AppBoxRenderView(
                 std::string boxId, std::string instanceId,
-                Evas_Object* boxWin, EwkContextPtr ewkContext);
+                EwkContextPtr ewkContext);
 
         // members
         std::string m_appId;
         std::string m_boxId;
         std::string m_instanceId;
-        Evas_Object* m_boxWin;
-        Evas_Object* m_snapshot;
-        RenderInfoPtr m_renderInfo;
+        EwkContextPtr m_ewkContext;
+        RenderInfoPtr m_boxRenderInfo;
         WrtCorePtr m_boxWrt;
-        bool m_boxWrt_isSuspended;
         WrtCorePtr m_pdWrt;
+        Evas_Object* m_snapshot;
         Ecore_Timer* m_fireRenderTimer;
         IPdHelperPtr m_pdHelper;
         bool m_pdFastOpen;
-        EwkContextPtr m_ewkContext;
-        AppBoxRenderBuffer* m_renderBuffer;
+        AppBoxRenderBuffer* m_boxRenderBuffer;
+
+        // TODO this temporary flag should removed!
+        bool m_boxWrt_isSuspended;
 
         friend class AppBoxRenderBuffer;
 };
index d05f602..bbcb1ec 100644 (file)
@@ -33,7 +33,6 @@ class IBoxPluginFactory {
     public:
         virtual std::shared_ptr<IRenderView> createRenderView(
                 std::string boxId, std::string instanceId,
-                Evas_Object* boxWin,
                 std::shared_ptr<Ewk_Context> ewkContext) = 0;
 
         virtual std::shared_ptr<IRenderBuffer> createBoxRenderBuffer(