Sync localStorage when exit context
authorJihye Kang <jye.kang@samsung.com>
Tue, 24 Sep 2013 12:04:59 +0000 (21:04 +0900)
committerJihye Kang <jye.kang@samsung.com>
Tue, 24 Sep 2013 12:50:32 +0000 (21:50 +0900)
[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

Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp
Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.h
Source/WebKit2/UIProcess/API/efl/ewk_context.cpp
Source/WebKit2/UIProcess/API/efl/ewk_context_private.h
Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.cpp
Source/WebKit2/UIProcess/WebKeyValueStorageManagerProxy.h
Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp
Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h
Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.messages.in
Source/WebKit2/WebProcess/WebProcess.cpp

index befc481..3d5086d 100644 (file)
@@ -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
+}
index 15b0296..6f0332f 100644 (file)
@@ -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
 }
index 3fb1c92..b2deb61 100755 (executable)
@@ -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()
index 6fde297..4bb7cf9 100755 (executable)
@@ -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:
index 43f10a8..933e3d6 100644 (file)
@@ -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
index 1f59106..f36c2ce 100644 (file)
@@ -71,6 +71,7 @@ public:
 
 #if ENABLE(TIZEN_WEB_STORAGE)
     void getKeyValueStoragePath(PassRefPtr<WebStorageStringCallback>);
+    void syncLocalStorage();
 #if ENABLE(TIZEN_WEBKIT2_NUMBER_TYPE_SUPPORT)
     void getKeyValueStorageUsageForOrigin(PassRefPtr<WebStorageInt64Callback>, WebSecurityOrigin*);
 #endif
index 1f160d5..992d2c4 100644 (file)
@@ -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<CoreIPC::ArgumentEncoder>& reply)
+{
+    didReceiveSyncWebKeyValueStorageManagerMessage(connection, messageID, arguments, reply);
+}
+#endif
+
 static void keyValueStorageOriginIdentifiers(Vector<SecurityOriginData>& 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
index deb585e..966bbfc 100644 (file)
@@ -31,6 +31,9 @@
 #include <wtf/text/WTFString.h>
 
 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<CoreIPC::ArgumentEncoder>&);
+#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<CoreIPC::ArgumentEncoder>&);
+    //#endif
 
     Vector<uint64_t> m_originsRequestCallbackIDs;
     bool m_originsLoaded;
index 1ea3b36..000eb11 100644 (file)
@@ -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
 }
index 86f9711..72ea5c3 100644 (file)
@@ -707,6 +707,13 @@ void WebProcess::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC:
     }
 #endif
 
+#if ENABLE(TIZEN_WEB_STORAGE)
+    if (messageID.is<CoreIPC::MessageClassWebKeyValueStorageManager>()) {
+        WebKeyValueStorageManager::shared().didReceiveSyncMessage(connection, messageID, arguments, reply);
+        return;
+    }
+#endif
+
     uint64_t pageID = arguments->destinationID();
     if (!pageID)
         return;