From 4ff40ef5ad0e05c4662444ef285ce0a974fa6f9c Mon Sep 17 00:00:00 2001 From: Jihye Kang Date: Tue, 24 Sep 2013 21:04:59 +0900 Subject: [PATCH] Sync localStorage when exit context [Title] Sync localStorage when exit context [Issue#] N_SE-52462, VPSS-1163 [Problem] localStorage is not saved when the app exits right after assignment [Cause] Saving items on local storage is done asynchronously by scheduling it. But on this case, there is no enough time to store items asynchronously. [Solution] Force sync localStorage before exit context Change-Id: I6f4a995104d2cf44f727c9968a7e2a44e2d7380b --- .../UIProcess/API/C/WKKeyValueStorageManager.cpp | 7 +++++++ .../WebKit2/UIProcess/API/C/WKKeyValueStorageManager.h | 1 + Source/WebKit2/UIProcess/API/efl/ewk_context.cpp | 18 ++++++++++++++++++ Source/WebKit2/UIProcess/API/efl/ewk_context_private.h | 3 +++ .../UIProcess/WebKeyValueStorageManagerProxy.cpp | 5 +++++ .../WebKit2/UIProcess/WebKeyValueStorageManagerProxy.h | 1 + .../KeyValueStorage/WebKeyValueStorageManager.cpp | 12 ++++++++++++ .../KeyValueStorage/WebKeyValueStorageManager.h | 10 ++++++++++ .../WebKeyValueStorageManager.messages.in | 1 + Source/WebKit2/WebProcess/WebProcess.cpp | 7 +++++++ 10 files changed, 65 insertions(+) diff --git a/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp b/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp index befc481..3d5086d 100644 --- a/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp +++ b/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp @@ -64,3 +64,10 @@ void WKKeyValueStorageManagerGetKeyValueStorageUsageForOrigin(WKKeyValueStorageM toImpl(keyValueStorageManagerRef)->getKeyValueStorageUsageForOrigin(WebStorageInt64Callback::create(context, callback), toImpl(originRef)); #endif } + +void WKKeyValueStorageManagerSyncKeyValueStorage(WKKeyValueStorageManagerRef keyValueStorageManagerRef) +{ +#if ENABLE(TIZEN_WEB_STORAGE) + toImpl(keyValueStorageManagerRef)->syncLocalStorage(); +#endif +} diff --git a/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.h b/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.h index 15b0296..6f0332f 100644 --- a/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.h +++ b/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.h @@ -45,6 +45,7 @@ typedef void (*WKKeyValueStorageManagerGetKeyValueStoragePathFunction)(WKStringR WK_EXPORT void WKKeyValueStorageManagerGetKeyValueStoragePath(WKKeyValueStorageManagerRef keyValueStorageManager, void* context, WKKeyValueStorageManagerGetKeyValueStoragePathFunction function); typedef void (*WKKeyValueStorageManagerGetKeyValueStorageUsageForOriginFunction)(WKInt64Ref, WKErrorRef, void*); WK_EXPORT void WKKeyValueStorageManagerGetKeyValueStorageUsageForOrigin(WKKeyValueStorageManagerRef keyValueStorageManager, void* context, WKKeyValueStorageManagerGetKeyValueStorageUsageForOriginFunction function, WKSecurityOriginRef origin); +WK_EXPORT void WKKeyValueStorageManagerSyncKeyValueStorage(WKKeyValueStorageManagerRef keyValueStorageManager); // #endif #ifdef __cplusplus } diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp index 3fb1c92..b2deb61 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp @@ -162,6 +162,10 @@ Ewk_Context::Ewk_Context(WKContextRef context) Ewk_Context::~Ewk_Context() { ASSERT(contextMap().get(m_context.get()) == this); + +#if ENABLE(TIZEN_WEB_STORAGE) + syncLocalStorage(); +#endif contextMap().remove(m_context.get()); #if ENABLE(TIZEN_CACHE_DUMP_SYNC) dumpCache(); @@ -452,6 +456,20 @@ void Ewk_Context::dumpCache() toImpl(cacheManager)->dumpCache(); } #endif + +#if ENABLE(TIZEN_WEB_STORAGE) +/** + * @internal + * Request WebProcess to sync local storage. + * + * This sends message to WebProcess to sync local storage. + */ +void Ewk_Context::syncLocalStorage() +{ + WKKeyValueStorageManagerRef storageManager = WKContextGetKeyValueStorageManager(wkContext()); + WKKeyValueStorageManagerSyncKeyValueStorage(storageManager); +} +#endif #endif Ewk_Context* ewk_context_default_get() diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h b/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h index 6fde297..4bb7cf9 100755 --- a/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h +++ b/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h @@ -136,6 +136,9 @@ public: #if ENABLE(TIZEN_CACHE_DUMP_SYNC) void dumpCache(); #endif +#if ENABLE(TIZEN_WEB_STORAGE) + void syncLocalStorage(); +#endif #endif // #if OS(TIZEN) private: diff --git a/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.cpp b/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.cpp index 43f10a8..933e3d6 100644 --- a/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.cpp +++ b/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.cpp @@ -142,5 +142,10 @@ void WebKeyValueStorageManagerProxy::didGetKeyValueStorageUsageForOrigin(int64_t callback->performCallbackWithReturnValue(int64Object.release().leakRef()); } #endif + +void WebKeyValueStorageManagerProxy::syncLocalStorage() +{ + m_webContext->sendToAllProcessesRelaunchingThemIfNecessary(Messages::WebKeyValueStorageManager::SyncLocalStorage()); +} #endif } // namespace WebKit diff --git a/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.h b/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.h index 1f59106..f36c2ce 100644 --- a/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.h +++ b/Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.h @@ -71,6 +71,7 @@ public: #if ENABLE(TIZEN_WEB_STORAGE) void getKeyValueStoragePath(PassRefPtr); + void syncLocalStorage(); #if ENABLE(TIZEN_WEBKIT2_NUMBER_TYPE_SUPPORT) void getKeyValueStorageUsageForOrigin(PassRefPtr, WebSecurityOrigin*); #endif diff --git a/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp b/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp index 1f160d5..992d2c4 100644 --- a/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp +++ b/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp @@ -54,6 +54,13 @@ void WebKeyValueStorageManager::didReceiveMessage(CoreIPC::Connection* connectio didReceiveWebKeyValueStorageManagerMessage(connection, messageID, arguments); } +#if ENABLE(TIZEN_WEB_STORAGE) +void WebKeyValueStorageManager::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, OwnPtr& reply) +{ + didReceiveSyncWebKeyValueStorageManagerMessage(connection, messageID, arguments, reply); +} +#endif + static void keyValueStorageOriginIdentifiers(Vector& identifiers) { ASSERT(identifiers.isEmpty()); @@ -148,6 +155,11 @@ void WebKeyValueStorageManager::getKeyValueStorageUsageForOrigin(uint64_t callba WebProcess::shared().connection()->send(Messages::WebKeyValueStorageManagerProxy::DidGetKeyValueStorageUsageForOrigin(StorageTracker::tracker().diskUsageForOrigin(origin.get()), callbackID), 0); #endif } + +void WebKeyValueStorageManager::syncLocalStorage() +{ + StorageTracker::tracker().syncLocalStorage(); +} #endif } // namespace WebKit diff --git a/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h b/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h index deb585e..966bbfc 100644 --- a/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h +++ b/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h @@ -31,6 +31,9 @@ #include namespace CoreIPC { +//#if ENABLE(TIZEN_WEB_STORAGE) + class ArgumentEncoder; +//#endif class ArgumentDecoder; class Connection; class MessageID; @@ -47,6 +50,9 @@ public: static WebKeyValueStorageManager& shared(); void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*); +#if ENABLE(TIZEN_WEB_STORAGE) + void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr&); +#endif private: WebKeyValueStorageManager(); @@ -58,6 +64,7 @@ private: #if ENABLE(TIZEN_WEB_STORAGE) void getKeyValueStoragePath(uint64_t callbackID); void getKeyValueStorageUsageForOrigin(uint64_t callbackID, const SecurityOriginData&); + void syncLocalStorage(); #endif // WebCore::StorageTrackerClient @@ -65,6 +72,9 @@ private: virtual void didFinishLoadingOrigins() OVERRIDE; void didReceiveWebKeyValueStorageManagerMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*); + //#if ENABLE(TIZEN_WEB_STORAGE) + void didReceiveSyncWebKeyValueStorageManagerMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr&); + //#endif Vector m_originsRequestCallbackIDs; bool m_originsLoaded; diff --git a/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.messages.in b/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.messages.in index 1ea3b36..000eb11 100644 --- a/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.messages.in +++ b/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.messages.in @@ -27,5 +27,6 @@ messages -> WebKeyValueStorageManager { #if ENABLE(TIZEN_WEB_STORAGE) void GetKeyValueStoragePath(uint64_t callbackID) void GetKeyValueStorageUsageForOrigin(uint64_t callbackID, WebKit::SecurityOriginData originIdentifier) + void SyncLocalStorage() -> () #endif } diff --git a/Source/WebKit2/WebProcess/WebProcess.cpp b/Source/WebKit2/WebProcess/WebProcess.cpp index 86f9711..72ea5c3 100644 --- a/Source/WebKit2/WebProcess/WebProcess.cpp +++ b/Source/WebKit2/WebProcess/WebProcess.cpp @@ -707,6 +707,13 @@ void WebProcess::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC: } #endif +#if ENABLE(TIZEN_WEB_STORAGE) + if (messageID.is()) { + WebKeyValueStorageManager::shared().didReceiveSyncMessage(connection, messageID, arguments, reply); + return; + } +#endif + uint64_t pageID = arguments->destinationID(); if (!pageID) return; -- 2.7.4