#include <Eina.h>
#include <Evas.h>
#include <Ecore.h>
+#include <EWebKit2.h>
#include <ewk_view.h>
#include <ewk_context.h>
#include <ewk_settings.h>
#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");
, 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");
}
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);
}
// 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) {
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
}
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");
// 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) {
// 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;
}
LogD("enter");
m_boxRenderBuffer->stopCanvasUpdate();
- deleteRenderTimer();
+ deleteTimer(&m_fireRenderTimer);
+ deleteTimer(&m_removeSnapShotTimer);
destroyWrtCore(m_boxWrt);
m_boxWrt.reset();
{
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;
// 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()
return m_snapshot;
}
-void AppBoxRenderView::clearSnapShot()
+void AppBoxRenderView::clearSnapShot()
{
LogD("enter");
if (m_snapshot) {
}
}
-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
}
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)
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");
Evas_Object* webview, const char* result, void* data)
{
LogD("enter");
+
std::string resultStr(result ? result : "null");
LogD("result: %s", resultStr.c_str());
}
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)),
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()) &&
}
}
}
+
+ // 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)
void AppBoxRenderView::createWindowAfterCallback(Evas_Object* parent, Evas_Object* child)
{
LogD("enter");
+ if (!parent) {
+ return;
+ }
if (m_pdHelper) {
Evas* parentCanvas = evas_object_evas_get(parent);
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);