Apply permission popup for offline application cache
authorSeonae Kim <sunaeluv.kim@samsung.com>
Wed, 27 Mar 2013 04:22:46 +0000 (13:22 +0900)
committerGerrit Code Review <gerrit2@kim11>
Fri, 29 Mar 2013 08:27:30 +0000 (17:27 +0900)
[Title] Apply permission popup for offline application cache
[Problem] N/A
[Cause] N/A
[Solution] Add permission popup routine after parsing manifest file. If user doesn't want use application cache and select 'no', cacheUpdateFailed() is called.

Change-Id: I17c57aa0db97c35ae848fbcb8be6a6346f0d42dd

16 files changed:
Source/WebCore/loader/EmptyClients.h
Source/WebCore/loader/appcache/ApplicationCacheGroup.cpp
Source/WebCore/page/ChromeClient.h
Source/WebKit2/UIProcess/API/C/efl/tizen/WKPageTizen.cpp
Source/WebKit2/UIProcess/API/C/efl/tizen/WKPageTizen.h
Source/WebKit2/UIProcess/API/efl/ewk_view.cpp
Source/WebKit2/UIProcess/API/efl/ewk_view.h
Source/WebKit2/UIProcess/API/efl/ewk_view_private.h
Source/WebKit2/UIProcess/API/efl/ewk_view_tizen_client.cpp
Source/WebKit2/UIProcess/WebPageProxy.h
Source/WebKit2/UIProcess/WebPageProxy.messages.in
Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp
Source/WebKit2/UIProcess/tizen/WebTizenClient.cpp
Source/WebKit2/UIProcess/tizen/WebTizenClient.h
Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h

index 5bb298b..91b760c 100755 (executable)
@@ -182,6 +182,9 @@ public:
 
     virtual void reachedMaxAppCacheSize(int64_t) { }
     virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*, int64_t) { }
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    virtual bool requestApplicationCachePermission(Frame*) { }
+#endif
 
 #if ENABLE(DIRECTORY_UPLOAD)
     virtual void enumerateChosenDirectory(FileChooser*) { }
index 4e42938..5162425 100644 (file)
@@ -757,6 +757,13 @@ void ApplicationCacheGroup::didFinishLoadingManifest()
         return;
     }
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    if(!m_frame->page()->chrome()->client()->requestApplicationCachePermission(m_frame)) {
+        cacheUpdateFailed();
+        return;
+    }
+#endif
+
     ASSERT(!m_cacheBeingUpdated);
     m_cacheBeingUpdated = ApplicationCache::create();
     m_cacheBeingUpdated->setGroup(this);
index 39759da..f5b90c8 100755 (executable)
@@ -222,6 +222,10 @@ namespace WebCore {
         // the new cache.
         virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*, int64_t totalSpaceNeeded) = 0;
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+        virtual bool requestApplicationCachePermission(Frame*) = 0;
+#endif
+
 #if ENABLE(DASHBOARD_SUPPORT)
         virtual void dashboardRegionsChanged();
 #endif
index 9a04dd7..d3bd7d7 100644 (file)
@@ -121,3 +121,9 @@ void WKPageExecuteCommandWithArgument(WKPageRef page, WKStringRef command, WKStr
     toImpl(page)->executeEditCommandWithArgument(toImpl(command)->string(), toImpl(argument)->string());
 }
 
+void WKPageReplyApplicationCachePermission(WKPageRef page, bool allow)
+{
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    toImpl(page)->replyApplicationCachePermission(allow);
+#endif
+}
index cbf4a84..96ee413 100644 (file)
@@ -36,6 +36,9 @@ extern "C" {
 
 // html5 external video callback
 typedef void (*WKPageHTML5VideoCallback)(WKPageRef page, WKStringRef url, WKStringRef cookie, const void* clientInfo);
+// #if ENABLE(TIZEN_APPLICATION_CACHE)
+typedef bool (*WKPageDecidePolicyForApplicationCachePermissionRequestCallback)(WKPageRef page, WKSecurityOriginRef origin, WKFrameRef frame, const void *clientInfo);
+// #endif
 // #if ENABLE(TIZEN_MEDIA_STREAM)
 typedef void (*WKPageDecidePolicyForUserMediaPermissionRequestCallback)(WKPageRef page, WKUserMediaPermissionRequestRef permissionRequest, const void *clientInfo);
 // #endif
@@ -52,6 +55,9 @@ struct WKPageTizenClient {
     // Version 0
     // html5 video external player
     WKPageHTML5VideoCallback                                            processHTML5Video;
+    // #if ENABLE(TIZEN_APPLICATION_CACHE)
+    WKPageDecidePolicyForApplicationCachePermissionRequestCallback      decidePolicyForApplicationCachePermissionRequest;
+    // #endif
     // userMedia permission
     // #if ENABLE(TIZEN_MEDIA_STREAM)
     WKPageDecidePolicyForUserMediaPermissionRequestCallback             decidePolicyForUserMediaPermissionRequest;
@@ -100,6 +106,9 @@ WK_EXPORT void WKPageGetWebAppIconURLs(WKPageRef page, void* context, WKPageGetW
 
 WK_EXPORT void WKPageExecuteCommandWithArgument(WKPageRef page, WKStringRef command, WKStringRef argument);
 
+// #if ENABLE(TIZEN_APPLICATION_CACHE)
+WK_EXPORT void WKPageReplyApplicationCachePermission(WKPageRef page, bool allow);
+// #endif
 #ifdef __cplusplus
 }
 #endif
index a5c2453..748d75c 100755 (executable)
@@ -336,6 +336,12 @@ struct _Ewk_View_Private_Data {
 #if ENABLE(TIZEN_WEBKIT2_CREATE_VIEW_WITH_CREATED_PAGE_GROUP_WITH_IDENTIFIER)
     RefPtr<WebPageGroup> pageGroup;
 #endif
+
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    OwnPtr<Ewk_View_Callback_Context> applicationCachePermissionContext;
+    Ewk_Security_Origin* applicationCachePermissionOrigin;
+    bool isWaitingForApplicationCachePermission;
+#endif
 #endif // #if OS(TIZEN)
 
     _Ewk_View_Private_Data()
@@ -403,6 +409,9 @@ struct _Ewk_View_Callback_Context {
         Ewk_View_Before_Unload_Confirm_Panel_Callback beforeUnloadConfirmPanelCallback;
 #endif
         Ewk_View_Open_Panel_Callback openPanelCallback;
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+        Ewk_View_Applicacion_Cache_Permission_Callback applicationCachePermissionCallback;
+#endif
     };
 
     Evas_Object* ewkView;
@@ -1274,6 +1283,13 @@ static void _ewk_view_priv_del(Ewk_View_Private_Data* priv)
 #if ENABLE(TIZEN_ISF_PORT)
     _ewk_view_imf_context_destroy(priv);
 #endif
+
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    if (priv->applicationCachePermissionOrigin)
+        deleteSecurityOrigin(priv->applicationCachePermissionOrigin);
+    priv->isWaitingForApplicationCachePermission = false;
+    priv->applicationCachePermissionContext = nullptr;
+#endif
 #endif // #if OS(TIZEN)
 
     delete priv;
@@ -3636,7 +3652,7 @@ void ewk_view_suspend(Evas_Object* ewkView)
     // will be suspended again.
     // Multiple suspend of ActiveDOMObject makes unintended suspend/resume status of
     // the ActiveDOMObject.
-    if (!priv->suspendedResources && !priv->isWaitingForJavaScriptPopupReply) {
+    if (!priv->suspendedResources && (!priv->isWaitingForJavaScriptPopupReply || !priv->isWaitingForApplicationCachePermission)) {
         priv->pageClient->page()->suspendJavaScriptAndResource();
         priv->suspendedResources = true;
     }
@@ -3668,7 +3684,7 @@ void ewk_view_resume(Evas_Object* ewkView)
     // will be suspended again.
     // Multiple suspend of ActiveDOMObject makes unintended suspend/resume status of
     // the ActiveDOMObject.
-    if (priv->suspendedResources && !priv->isWaitingForJavaScriptPopupReply) {
+    if (priv->suspendedResources && (!priv->isWaitingForJavaScriptPopupReply || !priv->isWaitingForApplicationCachePermission)) {
         priv->pageClient->page()->resumeJavaScriptAndResource();
         priv->suspendedResources = false;
     }
@@ -5838,3 +5854,56 @@ void ewk_view_content_security_policy_set(Evas_Object* ewkView, const char* poli
     priv->pageClient->page()->setContentSecurityPolicy(String::fromUTF8(policy), static_cast<WebCore::ContentSecurityPolicy::HeaderType>(type));
 #endif
 }
+
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+Eina_Bool ewkViewRequestApplicationCachePermission(Evas_Object* ewkView, WKSecurityOriginRef origin)
+{
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false);
+
+    if (!priv->applicationCachePermissionContext || !priv->applicationCachePermissionContext->applicationCachePermissionCallback)
+        return false;
+
+    priv->isWaitingForApplicationCachePermission = true;
+    if (priv->applicationCachePermissionOrigin)
+        deleteSecurityOrigin(priv->applicationCachePermissionOrigin);
+    priv->applicationCachePermissionOrigin = createSecurityOrigin(origin);
+
+    return priv->applicationCachePermissionContext->applicationCachePermissionCallback(ewkView, priv->applicationCachePermissionOrigin, priv->applicationCachePermissionContext->userData) == EINA_TRUE;
+}
+#endif
+
+void ewk_view_application_cache_permission_callback_set(Evas_Object* ewkView, Ewk_View_Applicacion_Cache_Permission_Callback callback, void* userData)
+{
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
+
+    if (!priv->applicationCachePermissionContext)
+        priv->applicationCachePermissionContext = adoptPtr<Ewk_View_Callback_Context>(new Ewk_View_Callback_Context);
+    priv->applicationCachePermissionContext->applicationCachePermissionCallback = callback;
+    priv->applicationCachePermissionContext->userData = userData;
+#else
+    UNUSED_PARAM(ewkView);
+    UNUSED_PARAM(callback);
+    UNUSED_PARAM(userData);
+#endif
+}
+
+void ewk_view_application_cache_permission_reply(Evas_Object* ewkView, Eina_Bool allow)
+{
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
+
+    TIZEN_LOGI("allow %d", allow);
+    WKPageReplyApplicationCachePermission(toAPI(ewk_view_page_get(ewkView)), allow);
+    if (priv->applicationCachePermissionOrigin)
+        deleteSecurityOrigin(priv->applicationCachePermissionOrigin);
+    priv->applicationCachePermissionOrigin = 0;
+    priv->isWaitingForApplicationCachePermission = false;
+#else
+    UNUSED_PARAM(ewkView);
+    UNUSED_PARAM(allow);
+#endif
+}
index 63b837f..d92a24b 100644 (file)
@@ -690,6 +690,12 @@ typedef Eina_Bool (*Ewk_View_Open_Panel_Callback)(Evas_Object* o, Eina_Bool allo
 EAPI void ewk_view_open_panel_callback_set(Evas_Object* o, Ewk_View_Open_Panel_Callback callback, void* user_data);
 EAPI void ewk_view_open_panel_reply(Evas_Object* o, Eina_List* file_url, Eina_Bool result);
 
+//#if ENABLE(TIZEN_APPLICATION_CACHE)
+typedef Eina_Bool (*Ewk_View_Applicacion_Cache_Permission_Callback)(Evas_Object* o, Ewk_Security_Origin* origin,  void* user_data);
+EAPI void ewk_view_application_cache_permission_callback_set(Evas_Object* o, Ewk_View_Applicacion_Cache_Permission_Callback callback, void* user_data);
+EAPI void ewk_view_application_cache_permission_reply(Evas_Object* o, Eina_Bool allow);
+//#endif
+
 /**
  * Delivers a Web intent to the view's main frame.
  *
index f3d16d3..493c9fc 100755 (executable)
@@ -373,4 +373,7 @@ void ewkViewFocusRingHide(Evas_Object* ewkView);
 void ewkViewBackForwardListChanged(Evas_Object *ewkView);
 #endif
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+Eina_Bool ewkViewRequestApplicationCachePermission(Evas_Object* ewkView, WKSecurityOriginRef origin);
+#endif
 #endif // ewk_view_private_h
index 26dbabd..9f47738 100755 (executable)
 #include "ewk_certificate.h"
 #endif
 
+static bool decidePolicyForApplicationCachePermissionRequest(WKPageRef page, WKSecurityOriginRef origin, WKFrameRef frame, const void *clientInfo)
+{
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    return ewkViewRequestApplicationCachePermission(static_cast<Evas_Object*>(const_cast<void*>(clientInfo)), origin);
+#else
+    return false;
+#endif
+}
+
 static void decidePolicyForUserMediaPermissionRequest(WKPageRef page, WKUserMediaPermissionRequestRef permissionRequest, const void *clientInfo)
 {
 #if ENABLE(TIZEN_MEDIA_STREAM)
@@ -76,6 +85,7 @@ void ewkViewTizenClientAttachClient(Evas_Object* ewkView)
         kWKPageTizenClientCurrentVersion,
         ewkView, // clientInfo
         0,
+        decidePolicyForApplicationCachePermissionRequest,
         decidePolicyForUserMediaPermissionRequest,
         processJSBridgePlugin,
         decidePolicyForCertificateError
index fa89756..cac6d50 100755 (executable)
@@ -1019,6 +1019,10 @@ void recordingSurfaceSetEnableSet(bool enable);
     void setContentSecurityPolicy(const String& policy, WebCore::ContentSecurityPolicy::HeaderType type);
 #endif
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    void replyApplicationCachePermission(bool allow);
+#endif
+
 private:
     WebPageProxy(PageClient*, PassRefPtr<WebProcessProxy>, WebPageGroup*, uint64_t pageID);
 
@@ -1139,6 +1143,9 @@ private:
     void runOpenPanel(uint64_t frameID, const WebCore::FileChooserSettings&);
     void printFrame(uint64_t frameID);
     void exceededDatabaseQuota(uint64_t frameID, const String& originIdentifier, const String& databaseName, const String& displayName, uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage, uint64_t& newQuota);
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    void requestApplicationCachePermission(uint64_t frameID, const String& originIdentifier, PassRefPtr<Messages::WebPageProxy::RequestApplicationCachePermission::DelayedReply>);
+#endif
     void requestGeolocationPermissionForFrame(uint64_t geolocationID, uint64_t frameID, String originIdentifier);
     void runModal();
     void notifyScrollerThumbIsVisibleInRect(const WebCore::IntRect&);
@@ -1607,6 +1614,9 @@ private:
 #if ENABLE(TIZEN_SUPPORT_BEFORE_UNLOAD_CONFIRM_PANEL)
     RefPtr<Messages::WebPageProxy::RunBeforeUnloadConfirmPanel::DelayedReply> m_beforeUnloadConfirmPanelReply;
 #endif
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    RefPtr<Messages::WebPageProxy::RequestApplicationCachePermission::DelayedReply> m_applicationCacheReply;
+#endif
 #endif
 
 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
index 3878e96..f57ff42 100755 (executable)
@@ -303,6 +303,10 @@ messages -> WebPageProxy {
     # Database messages
     ExceededDatabaseQuota(uint64_t frameID, WTF::String originIdentifier, WTF::String databaseName, WTF::String databaseDisplayName, uint64_t currentQuota, uint64_t currentOriginUsage, uint64_t currentDatabaseUsage, uint64_t expectedUsage) -> (uint64_t newQuota)
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    RequestApplicationCachePermission(uint64_t frameID, WTF::String originIdentifier) -> (bool allow) Delayed
+#endif
+
     # Geolocation messages
     RequestGeolocationPermissionForFrame(uint64_t geolocationID, uint64_t frameID, WTF::String originIdentifier)
     
index 33abec6..924d426 100755 (executable)
@@ -1056,6 +1056,39 @@ void WebPageProxy::setContentSecurityPolicy(const String& policy, WebCore::Conte
 }
 #endif
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+void WebPageProxy::requestApplicationCachePermission(uint64_t frameID, const String& originIdentifier, PassRefPtr<Messages::WebPageProxy::RequestApplicationCachePermission::DelayedReply> allow)
+{
+    WebFrameProxy* frame = process()->webFrame(frameID);
+    MESSAGE_CHECK(frame);
+
+    // Since requestApplicationCachePermission() can spin a nested run loop we need to turn off the responsiveness timer.
+    process()->responsivenessTimer()->stop();
+
+    m_applicationCacheReply = allow;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+    process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(true);
+#endif
+    RefPtr<WebSecurityOrigin> origin = WebSecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
+
+    if (!m_tizenClient.decidePolicyForApplicationCachePermissionRequest(this, origin.get(), frame))
+        replyApplicationCachePermission(false);
+}
+
+void WebPageProxy::replyApplicationCachePermission(bool allow)
+{
+    if (!m_applicationCacheReply)
+        return;
+
+    m_applicationCacheReply->send(allow);
+    m_applicationCacheReply = nullptr;
+
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+    process()->connection()->setForcelySetAllAsyncMessagesToDispatchEvenWhenWaitingForSyncReply(false);
+#endif
+}
+#endif
+
 #endif // #if OS(TIZEN)
 
 } // namespace WebKit
index 33b038b..966c5d0 100644 (file)
@@ -66,4 +66,14 @@ bool WebTizenClient::decidePolicyForCertificateError(WebPageProxy* page, const S
     return m_client.decidePolicyForCertificateError(toAPI(page), toCopiedAPI(url), toCopiedAPI(certificate), error, m_client.clientInfo);
 }
 #endif
+
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+bool WebTizenClient::decidePolicyForApplicationCachePermissionRequest(WebPageProxy* page, WebSecurityOrigin* origin, WebFrameProxy* frame)
+{
+    if (!m_client.decidePolicyForApplicationCachePermissionRequest)
+        return false;
+
+    return m_client.decidePolicyForApplicationCachePermissionRequest(toAPI(page), toAPI(origin), toAPI(frame), m_client.clientInfo);
+}
+#endif
 } // namespace WebKit
index 19d7905..bf4b864 100644 (file)
@@ -59,6 +59,10 @@ public:
 #if ENABLE(TIZEN_FILE_SYSTEM)
     bool allowFileSystem(WebPageProxy*, WebFrameProxy*, WebSecurityOrigin*);
 #endif
+
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    bool decidePolicyForApplicationCachePermissionRequest(WebPageProxy*, WebSecurityOrigin*, WebFrameProxy*);
+#endif
 };
 
 } // namespace WebKit
index ed999b1..1266154 100755 (executable)
@@ -681,6 +681,25 @@ void WebChromeClient::reachedApplicationCacheOriginQuota(SecurityOrigin*, int64_
     notImplemented();
 }
 
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+bool WebChromeClient::requestApplicationCachePermission(Frame* frame)
+{
+    WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
+    SecurityOrigin* origin = frame->document()->securityOrigin();
+
+    unsigned syncSendFlags = WebCore::AXObjectCache::accessibilityEnabled() ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
+    bool allow = false;
+#if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
+    WebProcess::WaitForJavaScriptPopupFinished waiting;
+#endif
+
+    if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RequestApplicationCachePermission(webFrame->frameID(), origin->databaseIdentifier()), Messages::WebPageProxy::RequestApplicationCachePermission::Reply(allow), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
+        return false;
+
+    return allow;
+}
+#endif
+
 #if ENABLE(DASHBOARD_SUPPORT)
 void WebChromeClient::dashboardRegionsChanged()
 {
index b990992..a1aa085 100755 (executable)
@@ -142,6 +142,9 @@ private:
 
     virtual void reachedMaxAppCacheSize(int64_t spaceNeeded) OVERRIDE;
     virtual void reachedApplicationCacheOriginQuota(WebCore::SecurityOrigin*, int64_t spaceNeeded) OVERRIDE;
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+    virtual bool requestApplicationCachePermission(WebCore::Frame*);
+#endif
 
 #if ENABLE(DASHBOARD_SUPPORT)
     virtual void dashboardRegionsChanged() OVERRIDE;