Title: [101441] trunk/Source
Revision
101441
Author
jber...@webkit.org
Date
2011-11-29 18:29:06 -0800 (Tue, 29 Nov 2011)

Log Message

WKKeyValueStorageManagerGetKeyValueStorageOrigins may not report the correct list of origins
the first time it is called.
https://bugs.webkit.org/show_bug.cgi?id=73374 (<rdar://problem/10196057>)

Reviewed by Brady Eidson.

Source/WebCore:

Add a callback for when the Storage Tracker is done loading the list of origins with Local
Storage.

* storage/StorageTracker.cpp:
(WebCore::StorageTracker::StorageTracker):
Keep track of whether the import from disk has been completed.
(WebCore::StorageTracker::notifyFinishedImportingOriginIdentifiersOnMainThread):
(WebCore::StorageTracker::finishedImportingOriginIdentifiers):
Set m_finishedImportingOriginIdentifiers to true and tell the client.
(WebCore::StorageTracker::syncImportOriginIdentifiers):
When finished, notify the shared StorageTracker on the main thread.
* storage/StorageTracker.h:
(WebCore::StorageTracker::originsLoaded):

* storage/StorageTrackerClient.h:
Add didFinishLoadingOrigins.

Source/WebKit/mac:

* Storage/WebStorageTrackerClient.h:
* Storage/WebStorageTrackerClient.mm:
(WebStorageTrackerClient::didFinishLoadingOrigins):

Source/WebKit2:

Queue any requests for the origins that have Local Storage until the StorageTracker is done
loading the list of those origins from disk.

* WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp:
(WebKit::keyValueStorageOriginIdentifiers):
Refactored here from getKeyValueStorageOrigins so it can be used by didFinishLoadingOrigins.
(WebKit::dispatchDidGetKeyValueStorageOrigins):
Ditto.
(WebKit::WebKeyValueStorageManager::getKeyValueStorageOrigins):
If the StorageTracker is not done loading the list of origins from disk, queue up the
request to be handled later.
(WebKit::WebKeyValueStorageManager::didFinishLoadingOrigins):
Dispatch the results for any requests that were make before the StorageTracker was done
loading the list of origins from disk.
(WebKit::WebKeyValueStorageManager::dispatchDidModifyOrigin):
* WebProcess/KeyValueStorage/WebKeyValueStorageManager.h:

* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeWebProcess):
Set the WebKeyValueStorageManager as the StorageTrackerClient.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (101440 => 101441)


--- trunk/Source/WebCore/ChangeLog	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebCore/ChangeLog	2011-11-30 02:29:06 UTC (rev 101441)
@@ -1,3 +1,28 @@
+2011-11-29  Jessie Berlin  <jber...@apple.com>
+
+        WKKeyValueStorageManagerGetKeyValueStorageOrigins may not report the correct list of origins
+        the first time it is called.
+        https://bugs.webkit.org/show_bug.cgi?id=73374 (<rdar://problem/10196057>)
+
+        Reviewed by Brady Eidson.
+
+        Add a callback for when the Storage Tracker is done loading the list of origins with Local
+        Storage.
+
+        * storage/StorageTracker.cpp:
+        (WebCore::StorageTracker::StorageTracker):
+        Keep track of whether the import from disk has been completed.
+        (WebCore::StorageTracker::notifyFinishedImportingOriginIdentifiersOnMainThread):
+        (WebCore::StorageTracker::finishedImportingOriginIdentifiers):
+        Set m_finishedImportingOriginIdentifiers to true and tell the client.
+        (WebCore::StorageTracker::syncImportOriginIdentifiers):
+        When finished, notify the shared StorageTracker on the main thread.
+        * storage/StorageTracker.h:
+        (WebCore::StorageTracker::originsLoaded):
+
+        * storage/StorageTrackerClient.h:
+        Add didFinishLoadingOrigins.
+
 2011-11-18  Nat Duca  <nd...@chromium.org>
 
         [chromium] Enable threaded compositing via CCThreadProxy::hasThread only

Modified: trunk/Source/WebCore/storage/StorageTracker.cpp (101440 => 101441)


--- trunk/Source/WebCore/storage/StorageTracker.cpp	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebCore/storage/StorageTracker.cpp	2011-11-30 02:29:06 UTC (rev 101441)
@@ -90,6 +90,7 @@
     , m_thread(LocalStorageThread::create())
     , m_isActive(false)
     , m_needsInitialization(false)
+    , m_finishedImportingOriginIdentifiers(false)
 {
 }
 
@@ -140,6 +141,19 @@
     m_thread->scheduleTask(LocalStorageTask::createOriginIdentifiersImport());
 }
 
+void StorageTracker::notifyFinishedImportingOriginIdentifiersOnMainThread(void*)
+{
+    tracker().finishedImportingOriginIdentifiers();
+}
+
+void StorageTracker::finishedImportingOriginIdentifiers()
+{
+    m_finishedImportingOriginIdentifiers = true;
+    MutexLocker lockClient(m_clientGuard);
+    if (m_client)
+        m_client->didFinishLoadingOrigins();
+}
+
 void StorageTracker::syncImportOriginIdentifiers()
 {
     ASSERT(m_isActive);
@@ -188,6 +202,8 @@
                 m_client->dispatchDidModifyOrigin(*it);
         }
     }
+
+    callOnMainThread(notifyFinishedImportingOriginIdentifiersOnMainThread, 0);
 }
     
 void StorageTracker::syncFileSystemAndTrackerDatabase()

Modified: trunk/Source/WebCore/storage/StorageTracker.h (101440 => 101441)


--- trunk/Source/WebCore/storage/StorageTracker.h	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebCore/storage/StorageTracker.h	2011-11-30 02:29:06 UTC (rev 101441)
@@ -52,6 +52,7 @@
     void deleteAllOrigins();
     void deleteOrigin(SecurityOrigin*);
     void deleteOrigin(const String& originIdentifier);
+    bool originsLoaded() const { return m_finishedImportingOriginIdentifiers; }
     void origins(Vector<RefPtr<SecurityOrigin> >& result);
     long long diskUsageForOrigin(SecurityOrigin*);
     
@@ -80,6 +81,8 @@
     void openTrackerDatabase(bool createIfDoesNotExist);
 
     void importOriginIdentifiers();
+    static void notifyFinishedImportingOriginIdentifiersOnMainThread(void*);
+    void finishedImportingOriginIdentifiers();
     
     void deleteTrackerFiles();
     String databasePathForOrigin(const String& originIdentifier);
@@ -111,6 +114,7 @@
     
     bool m_isActive;
     bool m_needsInitialization;
+    bool m_finishedImportingOriginIdentifiers;
 };
     
 } // namespace WebCore

Modified: trunk/Source/WebCore/storage/StorageTrackerClient.h (101440 => 101441)


--- trunk/Source/WebCore/storage/StorageTrackerClient.h	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebCore/storage/StorageTrackerClient.h	2011-11-30 02:29:06 UTC (rev 101441)
@@ -34,6 +34,7 @@
 public:
     virtual ~StorageTrackerClient() { }
     virtual void dispatchDidModifyOrigin(const String& originIdentifier) = 0;
+    virtual void didFinishLoadingOrigins() = 0;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebKit/mac/ChangeLog (101440 => 101441)


--- trunk/Source/WebKit/mac/ChangeLog	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit/mac/ChangeLog	2011-11-30 02:29:06 UTC (rev 101441)
@@ -1,3 +1,15 @@
+2011-11-29  Jessie Berlin  <jber...@apple.com>
+
+        WKKeyValueStorageManagerGetKeyValueStorageOrigins may not report the correct list of origins
+        the first time it is called.
+        https://bugs.webkit.org/show_bug.cgi?id=73374 (<rdar://problem/10196057>)
+
+        Reviewed by Brady Eidson.
+
+        * Storage/WebStorageTrackerClient.h:
+        * Storage/WebStorageTrackerClient.mm:
+        (WebStorageTrackerClient::didFinishLoadingOrigins):
+
 2011-11-15  Anders Carlsson  <ander...@apple.com>
 
         DragClient::dragSourceActionMaskForPoint should use root view coordinates

Modified: trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.h (101440 => 101441)


--- trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.h	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.h	2011-11-30 02:29:06 UTC (rev 101441)
@@ -36,6 +36,10 @@
     virtual ~WebStorageTrackerClient();
     virtual void dispatchDidModifyOrigin(const String& originIdentifier);
     virtual void dispatchDidModifyOrigin(PassRefPtr<SecurityOrigin>);
+
 private:
     WebStorageTrackerClient();
+
+    // WebCore::StorageTrackerClient
+    virtual void didFinishLoadingOrigins() OVERRIDE;
 };

Modified: trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm (101440 => 101441)


--- trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm	2011-11-30 02:29:06 UTC (rev 101441)
@@ -76,3 +76,7 @@
 
     dispatchDidModifyOrigin(origin);
 }
+
+void WebStorageTrackerClient::didFinishLoadingOrigins()
+{
+}

Modified: trunk/Source/WebKit2/ChangeLog (101440 => 101441)


--- trunk/Source/WebKit2/ChangeLog	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit2/ChangeLog	2011-11-30 02:29:06 UTC (rev 101441)
@@ -1,3 +1,32 @@
+2011-11-29  Jessie Berlin  <jber...@apple.com>
+
+        WKKeyValueStorageManagerGetKeyValueStorageOrigins may not report the correct list of origins
+        the first time it is called.
+        https://bugs.webkit.org/show_bug.cgi?id=73374 (<rdar://problem/10196057>)
+
+        Reviewed by Brady Eidson.
+
+        Queue any requests for the origins that have Local Storage until the StorageTracker is done
+        loading the list of those origins from disk.
+
+        * WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp:
+        (WebKit::keyValueStorageOriginIdentifiers):
+        Refactored here from getKeyValueStorageOrigins so it can be used by didFinishLoadingOrigins.
+        (WebKit::dispatchDidGetKeyValueStorageOrigins):
+        Ditto.
+        (WebKit::WebKeyValueStorageManager::getKeyValueStorageOrigins):
+        If the StorageTracker is not done loading the list of origins from disk, queue up the
+        request to be handled later.
+        (WebKit::WebKeyValueStorageManager::didFinishLoadingOrigins):
+        Dispatch the results for any requests that were make before the StorageTracker was done
+        loading the list of origins from disk.
+        (WebKit::WebKeyValueStorageManager::dispatchDidModifyOrigin):
+        * WebProcess/KeyValueStorage/WebKeyValueStorageManager.h:
+
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::initializeWebProcess):
+        Set the WebKeyValueStorageManager as the StorageTrackerClient.
+
 2011-11-29  Anders Carlsson  <ander...@apple.com>
 
         Decorate adoptWK with WARN_UNUSED_RETURN

Modified: trunk/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp (101440 => 101441)


--- trunk/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.cpp	2011-11-30 02:29:06 UTC (rev 101441)
@@ -54,31 +54,65 @@
     didReceiveWebKeyValueStorageManagerMessage(connection, messageID, arguments);
 }
 
-void WebKeyValueStorageManager::getKeyValueStorageOrigins(uint64_t callbackID)
+static void keyValueStorageOriginIdentifiers(Vector<SecurityOriginData>& identifiers)
 {
-    WebProcess::LocalTerminationDisabler terminationDisabler(WebProcess::shared());
+    ASSERT(identifiers.isEmpty());
 
     Vector<RefPtr<SecurityOrigin> > coreOrigins;
 
     StorageTracker::tracker().origins(coreOrigins);
 
     size_t size = coreOrigins.size();
-    Vector<SecurityOriginData> identifiers;
     identifiers.reserveCapacity(size);
 
-    for (size_t i = 0; i < size; ++i) {        
+    for (size_t i = 0; i < size; ++i) {
         SecurityOriginData originData;
-        
+
         originData.protocol = coreOrigins[i]->protocol();
         originData.host = coreOrigins[i]->host();
         originData.port = coreOrigins[i]->port();
 
         identifiers.uncheckedAppend(originData);
     }
+}
 
+static void dispatchDidGetKeyValueStorageOrigins(const Vector<SecurityOriginData>& identifiers, uint64_t callbackID)
+{
     WebProcess::shared().connection()->send(Messages::WebKeyValueStorageManagerProxy::DidGetKeyValueStorageOrigins(identifiers, callbackID), 0);
 }
 
+void WebKeyValueStorageManager::getKeyValueStorageOrigins(uint64_t callbackID)
+{
+    WebProcess::LocalTerminationDisabler terminationDisabler(WebProcess::shared());
+
+    if (!StorageTracker::tracker().originsLoaded()) {
+        m_originsRequestCallbackIDs.append(callbackID);
+        return;
+    }
+
+    Vector<SecurityOriginData> identifiers;
+    keyValueStorageOriginIdentifiers(identifiers);
+    dispatchDidGetKeyValueStorageOrigins(identifiers, callbackID);
+}
+
+void WebKeyValueStorageManager::didFinishLoadingOrigins()
+{
+    if (m_originsRequestCallbackIDs.isEmpty())
+        return;
+
+    Vector<SecurityOriginData> identifiers;
+    keyValueStorageOriginIdentifiers(identifiers);
+
+    for (size_t i = 0; i < m_originsRequestCallbackIDs.size(); ++i)
+        dispatchDidGetKeyValueStorageOrigins(identifiers, m_originsRequestCallbackIDs[i]);
+
+    m_originsRequestCallbackIDs.clear();
+}
+
+void WebKeyValueStorageManager::dispatchDidModifyOrigin(const String&)
+{
+}
+
 void WebKeyValueStorageManager::deleteEntriesForOrigin(const SecurityOriginData& originData)
 {
     WebProcess::LocalTerminationDisabler terminationDisabler(WebProcess::shared());

Modified: trunk/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h (101440 => 101441)


--- trunk/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit2/WebProcess/KeyValueStorage/WebKeyValueStorageManager.h	2011-11-30 02:29:06 UTC (rev 101441)
@@ -26,6 +26,7 @@
 #ifndef WebKeyValueStorageManager_h
 #define WebKeyValueStorageManager_h
 
+#include <WebCore/StorageTrackerClient.h>
 #include <wtf/Noncopyable.h>
 #include <wtf/text/WTFString.h>
 
@@ -39,7 +40,7 @@
 
 struct SecurityOriginData;
 
-class WebKeyValueStorageManager {
+class WebKeyValueStorageManager : public WebCore::StorageTrackerClient {
     WTF_MAKE_NONCOPYABLE(WebKeyValueStorageManager);
 
 public:
@@ -54,7 +55,14 @@
     void deleteEntriesForOrigin(const SecurityOriginData&);
     void deleteAllEntries();
 
+    // WebCore::StorageTrackerClient
+    virtual void dispatchDidModifyOrigin(const String&) OVERRIDE;
+    virtual void didFinishLoadingOrigins() OVERRIDE;
+
     void didReceiveWebKeyValueStorageManagerMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
+
+    Vector<uint64_t> m_originsRequestCallbackIDs;
+    bool m_originsLoaded;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (101440 => 101441)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2011-11-30 02:09:26 UTC (rev 101440)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2011-11-30 02:29:06 UTC (rev 101441)
@@ -204,7 +204,7 @@
     m_iconDatabaseProxy.setEnabled(parameters.iconDatabaseEnabled);
 #endif
 
-    StorageTracker::initializeTracker(parameters.localStorageDirectory, 0);
+    StorageTracker::initializeTracker(parameters.localStorageDirectory, &WebKeyValueStorageManager::shared());
     m_localStorageDirectory = parameters.localStorageDirectory;
 
     if (!parameters.applicationCacheDirectory.isEmpty())
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to