RenderInfoPtr renderInfo = makeRenderInfo(renderTypeResize);
m_view->showBox(renderInfo);
} catch (...) {
+ LogD("resize exception");
return false;
}
#define I_PD_HELPER_H
#include <Evas.h>
+#include <memory>
class IPdHelper {
public:
virtual void startOpen() = 0;
- virtual void finishOpen(Evas_Object*& child) = 0;
+ virtual void finishOpen(Evas_Object* child) = 0;
virtual void close() = 0;
- virtual void setBaseWebView(Evas_Object*& base) = 0;
- virtual Evas_Object* getBaseWebView() const = 0;
+ virtual void setBoxWebView(Evas_Object* webview) = 0;
+ virtual void setPdWebView(Evas_Object* webview) = 0;
+ virtual Evas_Object* getBoxWebView() const = 0;
virtual Evas_Object* getPdWebView() const = 0;
virtual Evas* getPdCanvas() const = 0;
virtual bool isPdOpened() const = 0;
PdHelper::PdHelper(Evas_Object* pdWin, std::string pdStartUrl, RenderInfoPtr pdRenderInfo)
: m_win(pdWin)
- , m_baseWebView()
+ , m_boxWebView()
, m_pdWebView()
, m_startUrl(pdStartUrl)
, m_renderInfo(pdRenderInfo)
void PdHelper::startOpen()
{
LogD("enter");
- if (!m_baseWebView) {
+ if (!m_boxWebView) {
return;
}
// execute javascript for opening new webview for pd
LogD("executed script: %s", script.c_str());
ewk_view_script_execute(
- m_baseWebView, script.c_str(), executeScriptCallback, this);
+ m_boxWebView, script.c_str(), executeScriptCallback, this);
}
-void PdHelper::finishOpen(Evas_Object*& child)
+void PdHelper::finishOpen(Evas_Object* child)
{
LogD("enter");
evas_object_del(m_pdWebView);
}
-void PdHelper::setBaseWebView(Evas_Object*& parent)
+void PdHelper::setBoxWebView(Evas_Object* webview)
{
LogD("enter");
- m_baseWebView = parent;
+ m_boxWebView = webview;
}
-Evas_Object* PdHelper::getBaseWebView() const
+void PdHelper::setPdWebView(Evas_Object* webview)
{
LogD("enter");
- return m_baseWebView;
+ m_pdWebView = webview;
+}
+
+Evas_Object* PdHelper::getBoxWebView() const
+{
+ LogD("enter");
+ return m_boxWebView;
}
Evas_Object* PdHelper::getPdWebView() const
* @author Yunchan Cho (yunchan.cho@samsung.com)
*/
+#ifndef PD_HELPER_H
+#define PD_HELPER_H
+
#include <string>
#include <Evas.h>
#include "IRenderView.h"
return IPdHelperPtr(new PdHelper(pdWin, pdStartUrl, pdRenderInfo));
}
virtual void startOpen();
- virtual void finishOpen(Evas_Object*& child);
+ virtual void finishOpen(Evas_Object* child);
virtual void close();
- virtual void setBaseWebView(Evas_Object*& parent);
- virtual Evas_Object* getBaseWebView() const;
+ virtual void setBoxWebView(Evas_Object* webview);
+ virtual void setPdWebView(Evas_Object* webview);
+ virtual Evas_Object* getBoxWebView() const;
virtual Evas_Object* getPdWebView() const;
virtual Evas* getPdCanvas() const;
virtual bool isPdOpened() const;
//members
Evas_Object* m_win;
- Evas_Object* m_baseWebView;
+ Evas_Object* m_boxWebView;
Evas_Object* m_pdWebView;
std::string m_startUrl;
RenderInfoPtr m_renderInfo;
bool m_opened;
};
+
+#endif // PD_HELPER_H
+
if (typeof window.tizen == 'undefined') {
console.log("window.tizen object not exists");
window.tizen = new Object();
+ window.tizen.appwidget = new Object();
}
-window.tizen.appwidget = new Object();
+// For future, only window.appwidget will be used
+window.appwidget = new Object();
// these are functions for overriding standard javascript functions regarding event
var original_addEventListener = window.addEventListener;
}
};
-// Define tizen appwidget APIs
-window.tizen.appwidget.reload = function() {
- window.location.href = "box://reload";
-}
-
-window.tizen.appwidget.changePeriod = function(period) {
- switch (arguments.length) {
- case 0:
- window.location.href = "box://change-period";
- break;
- case 1:
- window.location.href = "box://change-period?period=" + period;
- break;
- default:
- window.location.href = "box://change-period";
- break;
- }
-}
-
-window.tizen.appwidget.launchBrowser = function(url) {
- window.location.href = "box://launch-browser?url=" + url;
-}
-
-window.tizen.appwidget.scrollStart = function() {
- window.location.href = "box://scroll-start";
-}
-
-window.tizen.appwidget.scrollStop = function() {
- window.location.href = "box://scroll-stop";
-}
-
-window.tizen.appwidget.sendMessageToBox = function(message) {
+window.appwidget.sendMessageToBox = function(message) {
window.location.href = "box://send-message-to-box?message=" + message;
}
-window.tizen.appwidget.sendMessageToPd = function(message) {
+window.appwidget.sendMessageToPd = function(message) {
window.location.href = "box://send-message-to-pd?message=" + message;
}
// register custom events for appwidget
webprovider.registerAppWidgetEvent("pdmessage");
webprovider.registerAppWidgetEvent("boxmessage");
+
+// Define appwidget APIs
+// window.tizen.appwidget should be changed to window.appwidget
+//
+//
+window.tizen.appwidget.reload = function() {
+ window.location.href = "box://reload";
+}
+
+window.tizen.appwidget.changePeriod = function(period) {
+ switch (arguments.length) {
+ case 0:
+ window.location.href = "box://change-period";
+ break;
+ case 1:
+ window.location.href = "box://change-period?period=" + period;
+ break;
+ default:
+ window.location.href = "box://change-period";
+ break;
+ }
+}
+
+window.tizen.appwidget.launchBrowser = function(url) {
+ window.location.href = "box://launch-browser?url=" + url;
+}
+
+window.tizen.appwidget.scrollStart = function() {
+ window.location.href = "box://scroll-start";
+}
+
+window.tizen.appwidget.scrollStop = function() {
+ window.location.href = "box://scroll-stop";
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * @file AppBoxPdHelper.cpp
+ * @author Yunchan Cho (yunchan.cho@samsung.com)
+ */
+#include <string>
+#include <Evas.h>
+#include <ewk_view.h>
+#include <Core/Util/Log.h>
+#include "AppBoxPdHelper.h"
+
+AppBoxPdHelper::AppBoxPdHelper(Evas_Object* pdWin)
+ : m_win(pdWin)
+ , m_boxWebView()
+ , m_pdWebView()
+ , m_opened(false)
+{
+}
+
+AppBoxPdHelper::~AppBoxPdHelper()
+{
+}
+
+void AppBoxPdHelper::startOpen()
+{
+ LogD("enter");
+}
+
+void AppBoxPdHelper::finishOpen(Evas_Object* child)
+{
+ LogD("enter");
+ m_opened = true;
+ setPdWebView(child);
+}
+
+void AppBoxPdHelper::close()
+{
+ LogD("enter");
+}
+
+void AppBoxPdHelper::setBoxWebView(Evas_Object* webview)
+{
+ LogD("enter");
+ m_boxWebView = webview;
+}
+
+void AppBoxPdHelper::setPdWebView(Evas_Object* webview)
+{
+ LogD("enter");
+ m_pdWebView = webview;
+}
+
+Evas_Object* AppBoxPdHelper::getBoxWebView() const
+{
+ LogD("enter");
+ return m_boxWebView;
+}
+
+Evas_Object* AppBoxPdHelper::getPdWebView() const
+{
+ LogD("enter");
+ return m_pdWebView;
+}
+
+Evas* AppBoxPdHelper::getPdCanvas() const
+{
+ LogD("enter");
+ evas_object_evas_get(m_win);
+}
+
+bool AppBoxPdHelper::isPdOpened() const
+{
+ LogD("enter");
+ return m_opened;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * @file AppBoxPdHelper.h
+ * @author Yunchan Cho (yunchan.cho@samsung.com)
+ */
+
+#ifndef APP_BOX_PD_HELPER_H
+#define APP_BOX_PD_HELPER_H
+
+#include <string>
+#include <Evas.h>
+#include <Core/View/IPdHelper.h>
+
+class AppBoxPdHelper: public IPdHelper {
+ public:
+ static IPdHelperPtr create(Evas_Object* pdWin)
+ {
+ return IPdHelperPtr(new AppBoxPdHelper(pdWin));
+ }
+ virtual void startOpen();
+ virtual void finishOpen(Evas_Object* child);
+ virtual void close();
+ virtual void setBoxWebView(Evas_Object* webview);
+ virtual void setPdWebView(Evas_Object* webview);
+ virtual Evas_Object* getBoxWebView() const;
+ virtual Evas_Object* getPdWebView() const;
+ virtual Evas* getPdCanvas() const;
+ virtual bool isPdOpened() const;
+ virtual ~AppBoxPdHelper();
+
+ private:
+ AppBoxPdHelper(Evas_Object* pdWin);
+
+ //members
+ Evas_Object* m_win;
+ Evas_Object* m_boxWebView;
+ Evas_Object* m_pdWebView;
+ bool m_opened;
+};
+
+#endif // APP_BOX_PD_HELPER_H
m_renderView = AppBoxObserver::Instance()->getRenderView(m_instanceId);
- if (!m_renderView || !(m_renderView->m_view)) {
+ if (!m_renderView || !(m_renderView->m_boxWrt)) {
LogD("no matched render view");
return;
}
} else {
if (!m_touchTimer) {
startCanvasUpdate();
- m_renderView->m_view->Resume();
+ m_renderView->m_boxWrt->Resume();
} else {
deleteTouchTimer();
}
LogD("enter");
AppBoxRenderBuffer* This = static_cast<AppBoxRenderBuffer*>(data);
This->stopCanvasUpdate();
- This->m_renderView->m_view->Suspend();
+ This->m_renderView->m_boxWrt->Suspend();
This->m_touchTimer = NULL;
return ECORE_CALLBACK_CANCEL;
#include <Evas.h>
#include <Ecore.h>
#include <ewk_view.h>
+#include <ewk_context.h>
#include <livebox-service.h>
#include <i_runnable_widget_object.h>
#include <core_module.h>
#include <Core/Util/Log.h>
#include "AppBoxObserver.h"
#include "AppBoxRenderBuffer.h"
+#include "AppBoxPdHelper.h"
#include "AppBoxRenderView.h"
#define RENDER_MAX_TIME 10.0
, m_boxId(boxId)
, m_instanceId(instanceId)
, m_boxWin(boxWin)
- , m_baseWebView()
, m_snapshot()
, m_renderInfo()
- , m_view()
- , m_startUrl()
+ , m_boxWrt()
+ , m_pdWrt()
, m_fireRenderTimer()
, m_pdHelper()
+ , m_pdFastOpen(false)
, m_ewkContext(ewkContext)
+ , m_renderBuffer()
{
LogD("enter");
m_appId = getAppId(m_boxId);
evas_object_show(m_boxWin);
m_renderBuffer = 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);
}
}
// copy to url
- m_startUrl = getStartUrl(URL_TYPE_BOX, renderInfo->defaultUrlParams);
-
- if (!createView()) {
- LogD("can't create view instance");
- return;
+ std::string boxStartUrl = getStartUrl(URL_TYPE_BOX, renderInfo->defaultUrlParams);
+ if (m_boxWrt) {
+ LogD("existing wrt core is removed");
+ destroyWrtCore(m_boxWrt);
}
+ m_boxWrt = createWrtCore(boxStartUrl, m_boxWin, m_ewkContext);
+
// in case of showing box by request of pd open
if (m_pdHelper) {
- m_pdHelper->setBaseWebView(m_baseWebView);
+ m_pdHelper->setBoxWebView(m_boxWrt->GetCurrentWebview());
}
// resize webview fitted to width, height of Box
evas_object_resize(
- m_baseWebView,
+ m_boxWrt->GetCurrentWebview(),
renderInfo->width,
renderInfo->height);
- clearSnapShot();
- m_renderBuffer->startCanvasUpdate();
- m_view->Show();
+ m_boxWrt->Show();
m_renderInfo = renderInfo;
}
-bool AppBoxRenderView::createView()
+AppBoxRenderView::WrtCorePtr AppBoxRenderView::createWrtCore(
+ std::string& startUrl, Evas_Object* win, EwkContextPtr ewkContext)
{
LogD("enter");
- if (m_view) {
- m_view->Hide();
- m_view.reset();
- m_baseWebView = NULL;
- }
+ WrtCorePtr wrt;
#ifdef MULTIPROCESS_SERVICE_SUPPORT
- m_view = WRT::CoreModuleSingleton::
+ wrt = WRT::CoreModuleSingleton::
Instance().getRunnableWidgetObject(m_appId, DPL::Optional<unsigned>());
#else
- m_view = WRT::CoreModuleSingleton::
+ wrt = WRT::CoreModuleSingleton::
Instance().getRunnableWidgetObject(m_appId);
#endif
// prepare webview
- if (m_startUrl.empty()) {
+ if (startUrl.empty()) {
LogD("no start url");
- return false;
+ return WrtCorePtr();
}
- m_view->PrepareView(m_startUrl, m_boxWin, m_ewkContext.get());
- m_view->CheckBeforeLaunch();
+ wrt->PrepareView(startUrl, win, ewkContext.get());
+ wrt->CheckBeforeLaunch();
// set callback functions of RunnableWidgetObject
WRT::UserDelegatesPtr cbs(new WRT::UserDelegates);
cbs->loadFinish = DPL::MakeDelegate(this, &AppBoxRenderView::finishLoadCallback);
cbs->bufferSet = DPL::MakeDelegate(this, &AppBoxRenderView::setBufferCallback);
cbs->bufferUnset = DPL::MakeDelegate(this, &AppBoxRenderView::unsetBufferCallback);
- cbs->windowCreateBefore = DPL::MakeDelegate(this, &AppBoxRenderView::createWindowBeforeCallback);
- cbs->windowCreateAfter = DPL::MakeDelegate(this, &AppBoxRenderView::createWindowAfterCallback);
- cbs->navigationDecide = DPL::MakeDelegate(this, &AppBoxRenderView::decideNavigationCallback);
- m_view->SetUserDelegates(cbs);
+ if (!m_pdFastOpen) {
+ cbs->windowCreateBefore =
+ DPL::MakeDelegate(this, &AppBoxRenderView::createWindowBeforeCallback);
+ cbs->windowCreateAfter =
+ DPL::MakeDelegate(this, &AppBoxRenderView::createWindowAfterCallback);
+ }
- // set base webview
- m_baseWebView = m_view->GetCurrentWebview();
+ cbs->navigationDecide =
+ DPL::MakeDelegate(this, &AppBoxRenderView::decideNavigationCallback);
+ wrt->SetUserDelegates(cbs);
// To support transparent background
- evas_object_color_set(m_baseWebView, 0, 0, 0, 0);
- evas_object_layer_set(m_baseWebView, EVAS_LAYER_MAX);
- return true;
+ evas_object_color_set(wrt->GetCurrentWebview(), 0, 0, 0, 0);
+ evas_object_layer_set(wrt->GetCurrentWebview(), EVAS_LAYER_MAX);
+
+ return wrt;
}
-bool AppBoxRenderView::destroyView()
+void AppBoxRenderView::destroyBoxWrtCore()
{
LogD("enter");
m_renderBuffer->stopCanvasUpdate();
deleteRenderTimer();
- if (m_view) {
- m_view->Hide();
- m_view.reset();
- m_baseWebView = NULL;
- }
+ destroyWrtCore(m_boxWrt);
+ m_boxWrt.reset();
+}
- return true;
+void AppBoxRenderView::destroyPdWrtCore()
+{
+ LogD("enter");
+
+ destroyWrtCore(m_pdWrt);
+ m_pdWrt.reset();
+}
+
+void AppBoxRenderView::destroyWrtCore(WrtCorePtr wrt)
+{
+ LogD("enter");
+
+ if (wrt) {
+ wrt->Hide();
+ }
}
void AppBoxRenderView::hideBox()
{
LogD("enter");
- destroyView();
+ destroyBoxWrtCore();
}
void AppBoxRenderView::pauseBox()
// create pd helper
std::string pdStartUrl = getStartUrl(URL_TYPE_PD, renderInfo->defaultUrlParams);
- m_pdHelper = PdHelper::create(pdWin, pdStartUrl, renderInfo);
+ if (m_pdFastOpen) {
+ destroyPdWrtCore();
+ // if needed, last param regarding ewk context can be set to new one.
+ m_pdWrt = createWrtCore(pdStartUrl, pdWin, m_ewkContext);
+ if (!m_pdWrt) {
+ LogD("no wrt core instance");
+ return;
+ }
+ m_pdHelper = AppBoxPdHelper::create(pdWin);
+
+ // resize webview fitted to width, height of pd
+ evas_object_resize(
+ m_pdWrt->GetCurrentWebview(),
+ renderInfo->width,
+ renderInfo->height);
+ // show pd
+ m_pdWrt->Show();
+ m_pdHelper->finishOpen(m_pdWrt->GetCurrentWebview());
+ } else {
+ m_pdHelper = PdHelper::create(pdWin, pdStartUrl, renderInfo);
+ }
// show pd window
evas_object_show(pdWin);
{
LogD("enter");
+ if (m_pdFastOpen) {
+ destroyPdWrtCore();
+ }
m_pdHelper->close();
m_pdHelper.reset();
Evas_Object* AppBoxRenderView::getBoxWebView()
{
- return m_baseWebView;
+ return m_boxWrt->GetCurrentWebview();
}
Evas_Object* AppBoxRenderView::getPdWebView()
if (web_provider_livebox_get_mouse_event(This->m_boxId.c_str())) {
// stop touch timer
This->m_renderBuffer->deleteTouchTimer();
- This->m_view->Suspend();
+ This->m_boxWrt->Suspend();
} else {
// Before webview should be removed,
// new evas object with last render data should be created
// otherwise, after webview is removed, box is white screen.
evas_object_show(This->getCurrentSnapShot());
- This->destroyView();
+ This->destroyBoxWrtCore();
}
return ECORE_CALLBACK_CANCEL;
void AppBoxRenderView::startLoadCallback(Evas_Object* webview)
{
LogD("enter");
+ m_renderBuffer->startCanvasUpdate();
// execute injection for creating js objects
std::ifstream jsFile(injectionFile);
std::string script((std::istreambuf_iterator<char>(jsFile)),
// start render timer
addRenderTimer();
} else {
- if (!(m_pdHelper->isPdOpened()) &&
- webview == m_pdHelper->getBaseWebView())
- {
- // open pd
- ecore_idler_add(openPdIdlerCallback, this);
+ if (!m_pdFastOpen) {
+ if (!(m_pdHelper->isPdOpened()) &&
+ webview == m_pdHelper->getBoxWebView())
+ {
+ // open pd
+ ecore_idler_add(openPdIdlerCallback, this);
+ }
}
}
}
if (m_pdHelper) {
if (!(m_pdHelper->isPdOpened()) &&
- parent == m_pdHelper->getBaseWebView())
+ parent == m_pdHelper->getBoxWebView())
{
LogD("pd canvas is used");
*canvas = m_pdHelper->getPdCanvas();
return;
}
- }
+ }
LogD("canvas of this webview is used");
*canvas = evas_object_evas_get(parent);
class AppBoxRenderView: public IRenderView {
public:
typedef std::shared_ptr<Ewk_Context> EwkContextPtr;
+
static IRenderViewPtr create(
std::string boxId, std::string instanceId,
Evas_Object* boxWin, EwkContextPtr ewkContext)
private:
// type definition
+ typedef std::shared_ptr<WRT::IRunnableWidgetObject> WrtCorePtr;
enum UrlType {
URL_TYPE_BOX,
URL_TYPE_PD
};
- typedef std::shared_ptr<WRT::IRunnableWidgetObject> ViewPtr;
-
- bool createView();
- bool destroyView();
+
+ WrtCorePtr createWrtCore(
+ std::string& startUrl, Evas_Object* win, EwkContextPtr ewkContext);
+ void destroyWrtCore(WrtCorePtr wrt);
+ void destroyBoxWrtCore();
+ void destroyPdWrtCore();
std::string getAppId(std::string& boxId);
std::string getStartUrl(UrlType type, std::string& defaultParams);
Evas_Object* getCurrentSnapShot();
std::string m_boxId;
std::string m_instanceId;
Evas_Object* m_boxWin;
- Evas_Object* m_baseWebView;
Evas_Object* m_snapshot;
RenderInfoPtr m_renderInfo;
- ViewPtr m_view;
- std::string m_startUrl;
+ WrtCorePtr m_boxWrt;
+ WrtCorePtr m_pdWrt;
Ecore_Timer* m_fireRenderTimer;
IPdHelperPtr m_pdHelper;
+ bool m_pdFastOpen;
EwkContextPtr m_ewkContext;
AppBoxRenderBuffer* m_renderBuffer;
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Flora License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * @file AppPdHelper.cpp
- * @author Yunchan Cho (yunchan.cho@samsung.com)
- */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Flora License, Version 1.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * @file AppPdHelper.h
- * @author Yunchan Cho (yunchan.cho@samsung.com)
- */
${CMAKE_CURRENT_SOURCE_DIR}/AppBoxPluginFactory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AppBoxRenderView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AppBoxRenderBuffer.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/AppPdHelper.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/AppBoxPdHelper.cpp
)
SET(HEADERS