- 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())