[Release] livebox.web-provider-1.28 submit/tizen_2.2/20130606.112448 submit/tizen_2.2/20130613.164212
authorJihoon Chung <jihoon.chung@samsung.com>
Thu, 6 Jun 2013 11:23:07 +0000 (20:23 +0900)
committerJihoon Chung <jihoon.chung@samsung.com>
Thu, 6 Jun 2013 11:24:23 +0000 (20:24 +0900)
Change-Id: I7774fa53aa74855b075a67558784f40496fc8edf

20 files changed:
livebox.web-provider.manifest
packaging/livebox.web-provider.spec [changed mode: 0644->0755]
src/API/web_provider_plugin_info.cpp [changed mode: 0644->0755]
src/API/web_provider_plugin_info.h [changed mode: 0644->0755]
src/Core/Box.cpp
src/Core/Box.h
src/Core/BoxManager.cpp
src/Core/Buffer/RenderBuffer.cpp
src/Core/Buffer/RenderBuffer.h
src/Core/Service/AppControl.cpp
src/Core/Service/AppControl.h
src/Core/Service/CMakeLists.txt [changed mode: 0644->0755]
src/Core/Service/PeriodChanger.cpp [changed mode: 0644->0755]
src/Core/Service/PeriodChanger.h [changed mode: 0644->0755]
src/Core/View/WebView.cpp
src/Core/View/injection.js
src/Daemon/BoxDaemonImpl.cpp [changed mode: 0644->0755]
src/Plugin/AppBoxPlugin/AppBoxRenderView.cpp
src/Plugin/AppBoxPlugin/AppBoxRenderView.h
src/Plugin/AppBoxPlugin/app.json

index e450b12..fbd5739 100644 (file)
@@ -35,7 +35,6 @@
             <smack request="app-svc" type="rwxat"/>
             <smack request="app-svc::db" type="rwxat"/>
             <smack request="svi-data" type="rwxat"/>
-            <smack request="mobileprint" type="rwxat"/>
             <smack request="sound_server" type="rwxat"/>
             <smack request="pkgmgr::db" type="rwxat"/>
             <!-- <smack request="immvibed" type="rwxa"/> -->
old mode 100644 (file)
new mode 100755 (executable)
index aee8c2a..c6dfa18
@@ -1,6 +1,7 @@
+#git:framework/web/web-provider
 Name: livebox.web-provider
 Summary: web framework for livebox 
-Version: 1.22.1
+Version: 1.28
 Release: 1
 Group: main/app
 License: Flora License, Version 1.1
old mode 100644 (file)
new mode 100755 (executable)
index 2f776a0..1f9b71b
@@ -52,10 +52,12 @@ static const std::string jsonMemberType("type");
 static const std::string jsonMemberPath("path");
 static const std::string jsonMemberBoxId("service_boxid");
 static const std::string jsonMemberBoxScrollable("box_scrollable");
+static const std::string jsonMemberBoxSize("supported_size");
 
 static const std::string jsonValueBoolTrue("true");
 static const std::string jsonValueBoolFalse("false");
 static const std::string jsonFileExtension(".json");
+static const std::string mendatoryBoxSize("1x1");
 
 web_provider_plugin_info** web_provider_plugin_get_installed_list(int* count)
 {
@@ -201,7 +203,11 @@ static web_provider_plugin_info* get_parsed_json_data(std::string& configPath)
         static_cast<const char*>(
             json_object_get_string_member(object, jsonMemberPath.c_str()));
 
-    if (!type || !path) {
+    JsonArray* size =
+        json_object_get_array_member(object, jsonMemberBoxSize.c_str());
+    int sizeCount = static_cast<int>(json_array_get_length(size));
+
+    if (!type || !path || !sizeCount) {
         LogD("mandatory members don't exist");
         g_error_free(error);
         g_object_unref(parser);
@@ -215,6 +221,13 @@ static web_provider_plugin_info* get_parsed_json_data(std::string& configPath)
 
     info->type = strdup(type);
     info->path = strdup(path);
+    info->box_size = static_cast<char**>(malloc(sizeof(char*) * sizeCount));
+
+    for (int i = 0; i < sizeCount; i++) {
+        info->box_size[i] =
+            strdup(static_cast<const char*>(json_array_get_string_element(size, i)));
+    }
+    info->box_size_count = sizeCount;
 
     gboolean hasBoxId = json_object_has_member(object, jsonMemberBoxId.c_str());
     if (hasBoxId == TRUE) {
@@ -250,7 +263,7 @@ static web_provider_plugin_info* get_parsed_json_data(std::string& configPath)
     g_error_free(error);
     g_object_unref(parser);
 
-    return info; 
+    return info;
 }
 
 bool web_provider_plugin_release_info(web_provider_plugin_info* info)
@@ -265,7 +278,60 @@ bool web_provider_plugin_release_info(web_provider_plugin_info* info)
     delete info->type;
     delete info->path;
     delete info->service_boxid;
+    for(int i = 0; i < info->box_size_count; i++) {
+        delete[] info->box_size[i];
+    }
     delete info;
 
     return true;
 }
+
+int web_provider_plugin_check_supported_size(
+    const char* plugin_type, char** size, int sizeCount)
+{
+    bool mendatoryChk = false;
+
+    // read plugin directory and store plugin config path
+    std::string configPath;
+    configPath = installedPluginDirPath;
+    configPath += plugin_type;
+    configPath += jsonFileExtension;
+
+    // get the json datas
+    web_provider_plugin_info* jsonData = get_parsed_json_data(configPath);
+    if (!jsonData) {
+        LogD("failed to get the json file");
+        return false;
+    }
+
+    // compare the parsed config data with the parsed json data
+    for (int configCnt = 0; configCnt < sizeCount; configCnt++) {
+        bool supportedSizeChk = false;
+
+        for (int jsonCnt = 0; jsonCnt < jsonData->box_size_count; jsonCnt++) {
+
+            // check mendatory size
+            if (!strcmp(mendatoryBoxSize.c_str(), size[configCnt])) {
+                mendatoryChk = true;
+            }
+
+            // check supported size
+            if (!strcmp(jsonData->box_size[jsonCnt], size[configCnt])) {
+                supportedSizeChk = true;
+                break;
+            }
+        }
+
+        if (!supportedSizeChk) {
+            LogD("Not supported size: %s", size[configCnt]);
+            return false;
+        }
+    }
+
+    if (!mendatoryChk) {
+        LogD("Mandatory members don't exist ");
+        return false;
+    }
+
+    return true;
+}
old mode 100644 (file)
new mode 100755 (executable)
index a00e2d4..28ed01b
@@ -30,7 +30,9 @@ struct _web_provider_plugin_info {
     const char* type;
     const char* path;
     const char* service_boxid;
+    char** box_size;
     int box_scrollable;
+    int box_size_count;
 };
 typedef _web_provider_plugin_info web_provider_plugin_info;
 
@@ -40,7 +42,7 @@ EXPORT_API void web_provider_plugin_release_installed_list(
                 web_provider_plugin_info** info_list, 
                 int count);
 EXPORT_API int web_provider_plugin_get_box_scrollable(const char* plugin_type);
-
+EXPORT_API int web_provider_plugin_check_supported_size(const char* plugin_type, char** size, int sizeCount);
 #ifdef __cplusplus
 }
 #endif
index cefcce6..d4729be 100644 (file)
  * @author  Yunchan Cho (yunchan.cho@samsung.com)
  */
 #include <string>
+#include <Ecore.h>
 #include <Plugin/IBoxPluginFactory.h>
 #include "Buffer/IRenderBuffer.h"
+#include "Buffer/RenderBuffer.h"
 #include "Buffer/RenderBufferFactory.h"
 #include "Util/Log.h"
 #include "BoxData.h"
@@ -40,6 +42,8 @@ Box::Box(BoxInfoPtr boxInfo, IBoxPluginFactoryPtr factory, EwkContextPtr ewkCont
     : m_boxInfo(boxInfo)
     , m_factory(factory)
     , m_currentTab(true)
+    , m_paused(false)
+    , m_updateNeeded(false)
 {
     LogD("enter");
     try {
@@ -81,9 +85,10 @@ bool Box::show()
 
     try {
         m_updateTimer->start();
-        m_boxBuffer->startCanvasUpdate();
         RenderInfoPtr renderInfo = makeRenderInfo(renderTypeCreate);
+        m_boxBuffer->stopCanvasUpdate();
         m_view->showBox(renderInfo);
+        ecore_idler_add(startUpdateRenderBufferIdlerCallback, m_boxBuffer.get());
     } catch (...) {
         return false;
     }
@@ -140,8 +145,14 @@ bool Box::resume()
 
     try {
         m_currentTab = true;
-        m_updateTimer->resume();
-        m_view->resumeBox();
+        m_paused = false;
+
+        if (m_updateNeeded) {
+            m_updateNeeded = false;
+            return update();
+        } else {
+            m_view->resumeBox();
+        }
     } catch (...) {
         return false;
     }
@@ -159,7 +170,7 @@ bool Box::pause(bool background)
         if (!background) {
             m_currentTab = false;
         }
-        m_updateTimer->pause();
+        m_paused = true;
         m_view->pauseBox();
     } catch (...) {
         return false;
@@ -189,7 +200,9 @@ bool Box::openPd(int width, int height, double x, double y)
                             m_boxInfo->pdHeight);
         m_pdBuffer->allocate();
         RenderInfoPtr renderInfo = makeRenderInfo(renderTypeOpenPd);
+        m_pdBuffer->stopCanvasUpdate();
         m_view->showPd(m_pdBuffer->getWindow(), renderInfo);
+        ecore_idler_add(startUpdateRenderBufferIdlerCallback, m_pdBuffer.get());
     } catch (...) {
         return false;
     }
@@ -206,7 +219,7 @@ bool Box::closePd()
     try {
         m_view->hidePd();
         m_pdBuffer->free();
-        m_updateTimer->start();
+        m_updateTimer->restart();
     } catch (...) {
         return false;
     }
@@ -219,6 +232,12 @@ bool Box::update()
 {
     LogD("enter");
 
+    if (m_paused) {
+        // update is dalayed until this box goes to current tab
+        m_updateNeeded = true;
+        return true;
+    }
+
     m_boxBuffer->startCanvasUpdate();
     RenderInfoPtr renderInfo = makeRenderInfo(renderTypeUpdate);
     m_view->showBox(renderInfo);
@@ -302,3 +321,15 @@ Eina_Bool Box::updateCallback(void* data)
     return ECORE_CALLBACK_RENEW;
 }
 
+Eina_Bool Box::startUpdateRenderBufferIdlerCallback(void* data)
+{
+    LogD("enter");
+    RenderBuffer* buffer = static_cast<RenderBuffer*>(data);
+    if (!buffer) {
+        LogD("no buffer");
+    } else {
+        buffer->startCanvasUpdate();
+    }
+
+    return ECORE_CALLBACK_CANCEL;
+}
index 0ab2f18..fff3f49 100644 (file)
@@ -62,6 +62,7 @@ class Box: public IBox, public IBoxContext {
 
         // static callbacks
         static Eina_Bool updateCallback(void* data);
+        static Eina_Bool startUpdateRenderBufferIdlerCallback(void* data);
 
         // constructor
         explicit Box(
@@ -75,7 +76,12 @@ class Box: public IBox, public IBoxContext {
         IRenderBufferPtr m_pdBuffer;
         IRenderViewPtr m_view;
         ITimerPtr m_updateTimer;
+        // flag for knowing this box is on current tab
         bool m_currentTab;
+        // flag for knowing this box has been already paused
+        bool m_paused;
+        // flag for knowing this box should be updated when the box is resumed
+        bool m_updateNeeded;
         //IBoxStatePtr m_state;
 
         friend class BoxSchemeHandler;
index 28efcca..c0ac7d8 100644 (file)
@@ -17,6 +17,7 @@
  * @file    BoxManager.cpp
  * @author  Yunchan Cho (yunchan.cho@samsung.com)
  */
+#include <string>
 #include <map>
 #include <ewk_context.h>
 #include <Plugin/IBoxPluginFactory.h>
@@ -76,7 +77,7 @@ bool BoxManager::doCommand(const request_cmd_type type, const BoxInfoPtr& boxInf
         result = requestChangePeriod(boxInfo->instanceId, boxInfo->period);
         break;
     case REQUEST_CMD_UPDATE_BOX:
-        result = requestUpdateBox(boxInfo->instanceId);
+        result = requestUpdateBox(boxInfo->boxId);
         break;
     default:
         LogD("not available request type");
@@ -223,15 +224,21 @@ bool BoxManager::requestChangePeriod(std::string& instanceId, float period)
     return box->changePeriod(period);
 }
 
-bool BoxManager::requestUpdateBox(std::string& instanceId)
+bool BoxManager::requestUpdateBox(std::string& boxId)
 {
     LogD("enter");
-    IBoxPtr box = searchBoxMap(instanceId);
-    if (!box) {
-        return false;
+
+    IBoxPtr box;
+    box.reset();
+    for (auto it = m_boxMap.begin(); it != m_boxMap.end(); ++it) {
+        if (it->first.find(boxId) == std::string::npos) {
+            continue;
+        }
+        box = it->second;
+        box->update();
     }
 
-    return box->update();
+    return true;
 }
 
 void BoxManager::insertBoxMap(std::string& instanceId, IBoxPtr box)
index 9bae32a..6013fac 100644 (file)
@@ -74,6 +74,7 @@ bool RenderBuffer::allocate()
     LogD("Using %s engine!", ecore_evas_engine_name_get(ee));
 
     Evas* e = ecore_evas_get(ee);
+    evas_image_cache_flush(e);
     Evas_Object *eo = evas_object_rectangle_add(e);
     evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_color_set(eo, 0, 0, 0, 0);
@@ -215,10 +216,9 @@ void RenderBuffer::paintColor(unsigned int color)
         provider_buffer_sync(m_bufferInfo);
         updateBuffer();
     } else {
-        provider_buffer_pre_render(m_bufferInfo);
+        preRenderCallback(this, m_canvas, NULL);
         memset(m_bufferAddr, color, getWidth() * getHeight() * 4);
-        provider_buffer_post_render(m_bufferInfo);
-        updateBuffer();
+        postRenderCallback(this, m_canvas, NULL);
     }
 }
 
index a3397b8..b275e70 100644 (file)
@@ -40,6 +40,8 @@ class EXPORT_CLASS RenderBuffer: public IRenderBuffer {
         bool reallocate(int width, int height);
         bool free();  
         Evas_Object* getWindow();
+        void startCanvasUpdate();
+        void stopCanvasUpdate();
 
         static void preRenderCallback(void* data, Evas* canvas, void* eventInfo);
         static void postRenderCallback(void* data, Evas* canvas, void* eventInfo);
@@ -47,8 +49,6 @@ class EXPORT_CLASS RenderBuffer: public IRenderBuffer {
         virtual ~RenderBuffer();
 
     protected:
-        void startCanvasUpdate();
-        void stopCanvasUpdate();
         void paintColor(unsigned int color);
         Evas* getCanvas();
         Evas_Object* getSnapshot();
index 87cfea6..761dd93 100644 (file)
@@ -66,5 +66,59 @@ bool launchBrowser(std::string& url)
     return true;
 }
 
+bool launchDownloader(std::string& url, std::string& cookie)
+{
+    LogD("enter");
+
+    service_h handle = NULL;
+    int ret = SERVICE_ERROR_NONE;
+
+    if (url.empty()) {
+        LogD("invalid arguments");
+        return false;
+    }
+
+    ret = service_create(&handle);
+    if (ret != SERVICE_ERROR_NONE) {
+        LogD("failed to create service");
+        return false;
+    }
+
+    ret = service_set_operation(handle, SERVICE_OPERATION_DOWNLOAD);
+    if (ret != SERVICE_ERROR_NONE) {
+        LogD("failed to set operation");
+        service_destroy(handle);
+        return false;
+    }
+
+    ret = service_set_uri(handle, url.c_str());
+    if (ret != SERVICE_ERROR_NONE) {
+        LogD("failed to set url");
+        service_destroy(handle);
+        return false;
+    }
+
+    if (!cookie.empty()) {
+        ret = service_add_extra_data(handle, "cookie", cookie.c_str());
+        if (ret != SERVICE_ERROR_NONE) {
+            LogD("failed to set cookie");
+            service_destroy(handle);
+            return false;
+        }
+    }
+
+    ret = service_send_launch_request(handle, NULL, NULL);
+    if (ret != SERVICE_ERROR_NONE) {
+        LogD("failed to request launch");
+        service_destroy(handle);
+        return false;
+    }
+
+    LogD("success to launch downloader");
+    service_destroy(handle);
+
+    return true;
+}
+
 } // AppControl
 } // Service
index 151940f..5693873 100644 (file)
@@ -24,6 +24,7 @@ namespace Service {
 namespace AppControl {
 
 bool launchBrowser(std::string& url);
+bool launchDownloader(std::string& url, std::string& cookie);
 
 }
 } // Service
old mode 100644 (file)
new mode 100755 (executable)
index 0a4c9a4..abc3c72
@@ -26,6 +26,7 @@ PKG_CHECK_MODULES(${DEPS}
     ecore-x
     elementary
     provider
+    ecore
     REQUIRED
 )
 ADD_DEFINITIONS(${${DEPS}_CFLAGS})
old mode 100644 (file)
new mode 100755 (executable)
index c754fb5..b58719e
@@ -21,6 +21,7 @@
 #include <string>
 #include <Evas.h>
 #include <Ecore_X.h>
+#include <Ecore.h>
 #include <Elementary.h>
 #include <livebox-service.h>
 #include <Core/Util/Log.h>
@@ -101,7 +102,6 @@ void PeriodChanger::showPeriodPopup()
 
     Evas_Object* window = createWindow();
     Evas_Object* periodList = elm_list_add(window);
-    Evas_Object* radio;
 
     if (!periodList) {
         LogD("failed to add elm_list_add");
@@ -111,12 +111,12 @@ void PeriodChanger::showPeriodPopup()
     setPopupListData();
     // TODO Language ID should be used, not static string
     for(int i = 0 ; i < sizeof(m_hour) / sizeof(PopupListData); i++) {
-        radio = elm_radio_add(periodList);
-        elm_radio_state_value_set(radio,
+        m_hour[i].radio = elm_radio_add(periodList);
+        elm_radio_state_value_set(m_hour[i].radio,
             m_currentPeriod == m_hour[i].newPeriod ? EINA_FALSE : EINA_TRUE);
         elm_list_item_append(periodList,
             m_hour[i].period,
-            radio,
+            m_hour[i].radio,
             NULL,
             selectPeriodCallback, &m_hour[i]);
     }
@@ -248,7 +248,7 @@ void PeriodChanger::selectPeriodCallback(void *data, Evas_Object *obj, void *eve
 
     LogD("Update period is set to %f", popupData->newPeriod);
     popupData->periodChanger->requestToPlatform(popupData->newPeriod);
-    popupData->periodChanger->destroyPeriodPopup(obj);
+    ecore_idler_add(popupDestroyIdlerCallback, popupData);
 }
 
 void PeriodChanger::cancelButtonCallback(void *data, Evas_Object *obj, void *event_info)
@@ -258,4 +258,11 @@ void PeriodChanger::cancelButtonCallback(void *data, Evas_Object *obj, void *eve
     This->destroyPeriodPopup(obj);
 }
 
+Eina_Bool PeriodChanger::popupDestroyIdlerCallback(void *data)
+{
+    LogD("enter");
+    PopupListData* popupData = static_cast<PopupListData*>(data);
+    popupData->periodChanger->destroyPeriodPopup(popupData->radio);
+    return ECORE_CALLBACK_CANCEL;
+}
 } // Service
old mode 100644 (file)
new mode 100755 (executable)
index 06cfbfb..aabf1e7
@@ -50,6 +50,7 @@ class PeriodChanger {
 
         static void selectPeriodCallback(void *data, Evas_Object *obj, void *event_info);
         static void cancelButtonCallback(void *data, Evas_Object *obj, void *event_info);
+        static Eina_Bool popupDestroyIdlerCallback(void *data);
 
         PeriodChanger(
                 std::string& boxId, std::string& instanceId,
@@ -66,6 +67,7 @@ class PeriodChanger {
             PeriodChanger* periodChanger;
             float newPeriod;
             const char* period;
+            Evas_Object* radio;
         };
 
         PopupListData m_hour[5];
index 2241906..e96272a 100644 (file)
@@ -24,7 +24,9 @@
 #include <Eina.h>
 #include <ewk_context.h>
 #include <ewk_view.h>
+#include <ewk_policy_decision.h>
 #include <Core/Util/Log.h>
+#include <Core/Service/AppControl.h>
 #include "WebView.h"
 
 // injection javascript file regarding creating js object used by box and pd
@@ -326,6 +328,41 @@ void WebView::pageResponseDecideCallback(
 {
     LogD("enter");
 
+    Ewk_Policy_Decision *policyDecision = static_cast<Ewk_Policy_Decision *>(eventInfo);
+    Ewk_Policy_Decision_Type policyType = ewk_policy_decision_type_get(policyDecision);
+    std::string url(ewk_policy_decision_url_get(policyDecision));
+    std::string cookie(ewk_policy_decision_cookie_get(policyDecision));
+    const char* contentType = ewk_policy_decision_response_mime_get(policyDecision);
+
+    switch (policyType) {
+    case EWK_POLICY_DECISION_USE:
+        LogD("policy use");
+        ewk_policy_decision_use(policyDecision);
+        break;
+
+    case EWK_POLICY_DECISION_DOWNLOAD:
+        LogD("policy download: %s, %s, %s", url.c_str(), cookie.c_str(), contentType);
+        ewk_policy_decision_suspend(policyDecision);
+        Service::AppControl::launchDownloader(url, cookie);
+        ewk_policy_decision_ignore(policyDecision);
+        break;
+
+    case EWK_POLICY_DECISION_IGNORE:
+    default:
+        LogD("policy ignore");
+        ewk_policy_decision_ignore(policyDecision);
+        break;
+    }
+
+    if (policyType == EWK_POLICY_DECISION_DOWNLOAD) {
+        if (ewk_view_back_possible(obj)) {
+            ewk_view_back(obj);
+        } else {
+            // TODO Add handling code in case that new window is opened
+            //ecore_idler_add(windowCloseIdlerCallback, data);
+        }
+    }
+
     WebView* This = static_cast<WebView*>(data);
     This->didPageResponseDecide(obj);
 }
index 3b50cc4..0780755 100644 (file)
@@ -1,8 +1,10 @@
 // set javascript objects for Web APIs of Tizen appwidget
+var appTizenObject = 0;
 if (typeof window.tizen == 'undefined') {
-    console.log("window.tizen object not exists");
     window.tizen = new Object();
     window.tizen.appwidget = new Object();
+} else {
+    appTizenObject = 1;
 }
 
 // For future, only window.appwidget will be used
@@ -41,7 +43,7 @@ window.removeEventListener = function(event, callback, capture) {
 
 window.appwidget.reload = function() {
     window.location.href = "box://reload";
-}
+};
 
 window.appwidget.changePeriod = function(period) {
     switch (arguments.length) {
@@ -55,27 +57,27 @@ window.appwidget.changePeriod = function(period) {
         window.location.href = "box://change-period";
         break;
     }
-}
+};
 
 window.appwidget.launchBrowser = function(url) {
     window.location.href = "box://launch-browser?url=" + url;
-}
+};
 
 window.appwidget.scrollStart = function() {
     window.location.href = "box://scroll-start";
-}
+};
 
 window.appwidget.scrollStop = function() {
     window.location.href = "box://scroll-stop";
-}
+};
 
 window.appwidget.sendMessageToBox = function(message) {
     window.location.href = "box://send-message-to-box?message=" + message;
-}
+};
 
 window.appwidget.sendMessageToPd = function(message) {
     window.location.href = "box://send-message-to-pd?message=" + message;
-}
+};
 
 var webprovider = {
     // define specific function for registering appwidget event
@@ -95,15 +97,22 @@ var webprovider = {
             console.log("unknown appwidget event: " + event);
         }
     },
-}
+};
 
 // register custom events for appwidget
 webprovider.registerAppWidgetEvent("pdmessage");
 webprovider.registerAppWidgetEvent("boxmessage");
 
 // These objects will be deprecated soon
-window.tizen.appwidget.reload = window.appwidget.reload;
-window.tizen.appwidget.changePeriod = window.appwidget.changePeriod;
-window.tizen.appwidget.launchBrowser = window.appwidget.launchBrowser;
-window.tizen.appwidget.scrollStart = window.appwidget.scrollStart;
-window.tizen.appwidget.scrollStop = window.appwidget.scrollStop;
+if (!appTizenObject) {
+    window.tizen.appwidget.reload = window.appwidget.reload;
+    window.tizen.appwidget.changePeriod = window.appwidget.changePeriod;
+    window.tizen.appwidget.launchBrowser = window.appwidget.launchBrowser;
+    window.tizen.appwidget.scrollStart = window.appwidget.scrollStart;
+    window.tizen.appwidget.scrollStop = window.appwidget.scrollStop;
+}
+
+// If every functionalities of appwidget are initialized, fire appwidget ready event
+var readyevent = document.createEvent("CustomEvent");
+readyevent.initCustomEvent("appwidgetready", true, true);
+document.dispatchEvent(readyevent);
old mode 100644 (file)
new mode 100755 (executable)
index f0bec40..cd2ca13 100644 (file)
@@ -85,6 +85,10 @@ void AppBoxRenderView::showBox(RenderInfoPtr renderInfo)
 {
     LogD("enter");
 
+    // stop updating render buffer
+    m_renderBuffer->stopCanvasUpdate();
+    clearSnapShot();
+
     // delete already running timer
     deleteRenderTimer();
 
@@ -97,7 +101,7 @@ void AppBoxRenderView::showBox(RenderInfoPtr renderInfo)
     std::string boxStartUrl = getStartUrl(URL_TYPE_BOX, renderInfo->defaultUrlParams);
     if (m_boxWrt) {
         LogD("existing wrt core is removed");
-        destroyWrtCore(m_boxWrt);
+        destroyBoxWrtCore();
     }
 
     m_boxWrt = createWrtCore(boxStartUrl, m_boxWin, m_ewkContext); 
@@ -158,7 +162,15 @@ AppBoxRenderView::WrtCorePtr AppBoxRenderView::createWrtCore(
 
     // To support transparent background
     evas_object_color_set(wrt->GetCurrentWebview(), 0, 0, 0, 0);
-    evas_object_layer_set(wrt->GetCurrentWebview(), EVAS_LAYER_MAX);
+    //evas_object_layer_set(wrt->GetCurrentWebview(), EVAS_LAYER_MAX);
+
+    // To know starting point for updating buffer
+    evas_object_smart_callback_add(
+            wrt->GetCurrentWebview(),
+            "load,nonemptylayout,finished",
+            //"frame,rendered", 
+            loadNonEmptyLayoutFinishedCallback,
+            this);
 
     return wrt;
 }
@@ -320,8 +332,7 @@ void AppBoxRenderView::clearSnapShot()
 {
     LogD("enter");
     if (m_snapshot) {
-        evas_object_layer_set(m_snapshot, EVAS_LAYER_MIN);
-        //evas_object_hide(m_snapshot);
+        //evas_object_layer_set(m_snapshot, EVAS_LAYER_MIN);
         evas_object_del(m_snapshot);
         m_snapshot = NULL;
     }
@@ -393,7 +404,6 @@ void AppBoxRenderView::executeScriptCallback(
 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)),
@@ -495,3 +505,13 @@ void AppBoxRenderView::crashWebProcessCallback()
     ewk_shutdown();
     elm_exit();
 }
+
+void AppBoxRenderView::loadNonEmptyLayoutFinishedCallback(
+        void* data, Evas_Object* webview, void* eventInfo)
+{
+    LogD("enter");
+
+    // start to update render buffer!
+    AppBoxRenderView* This = static_cast<AppBoxRenderView*>(data);
+    This->m_renderBuffer->startCanvasUpdate();
+}
index 7f34326..0ee7b0e 100644 (file)
@@ -81,6 +81,8 @@ class AppBoxRenderView: public IRenderView {
         // ewk view callback
         static void executeScriptCallback(
                 Evas_Object* webview, const char* result, void* data);
+        static void loadNonEmptyLayoutFinishedCallback(
+                void* data, Evas_Object* webview, void* eventInfo);
 
         // user Callbacks of RunnableWidgetObject
         void startLoadCallback(Evas_Object* webview);
index cd946f5..6388702 100644 (file)
@@ -1,4 +1,5 @@
 {
      "type" : "app",
-     "path" : "/usr/lib/web-provider/libweb-provider-plugin-app.so"
+     "path" : "/usr/lib/web-provider/libweb-provider-plugin-app.so",
+     "supported_size" : ["1x1","2x1","2x2"]
 }