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*) { }
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);
// 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
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
+}
// 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
// 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;
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
#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()
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;
#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;
// 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;
}
// 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;
}
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
+}
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.
*
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
#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)
kWKPageTizenClientCurrentVersion,
ewkView, // clientInfo
0,
+ decidePolicyForApplicationCachePermissionRequest,
decidePolicyForUserMediaPermissionRequest,
processJSBridgePlugin,
decidePolicyForCertificateError
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);
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&);
#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)
# 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)
}
#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
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
#if ENABLE(TIZEN_FILE_SYSTEM)
bool allowFileSystem(WebPageProxy*, WebFrameProxy*, WebSecurityOrigin*);
#endif
+
+#if ENABLE(TIZEN_APPLICATION_CACHE)
+ bool decidePolicyForApplicationCachePermissionRequest(WebPageProxy*, WebSecurityOrigin*, WebFrameProxy*);
+#endif
};
} // namespace WebKit
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()
{
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;