Diff
Modified: trunk/Source/WebCore/ChangeLog (148584 => 148585)
--- trunk/Source/WebCore/ChangeLog 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebCore/ChangeLog 2013-04-17 00:38:50 UTC (rev 148585)
@@ -1,3 +1,22 @@
+2013-04-16 Anders Carlsson <[email protected]>
+
+ Clone storage namespaces for window.open
+ https://bugs.webkit.org/show_bug.cgi?id=114703
+
+ Reviewed by Sam Weinig.
+
+ Pass the new page to StorageNamespace::copy.
+
+ * page/Chrome.cpp:
+ (WebCore::Chrome::createWindow):
+ * storage/StorageNamespace.h:
+ (StorageNamespace):
+ * storage/StorageNamespaceImpl.cpp:
+ (WebCore::StorageNamespaceImpl::copy):
+ * storage/StorageNamespaceImpl.h:
+ (WebCore):
+ (StorageNamespaceImpl):
+
2013-04-16 Sam Weinig <[email protected]>
Fix fallout after r148545.
Modified: trunk/Source/WebCore/page/Chrome.cpp (148584 => 148585)
--- trunk/Source/WebCore/page/Chrome.cpp 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebCore/page/Chrome.cpp 2013-04-17 00:38:50 UTC (rev 148585)
@@ -190,11 +190,11 @@
Page* Chrome::createWindow(Frame* frame, const FrameLoadRequest& request, const WindowFeatures& features, const NavigationAction& action) const
{
Page* newPage = m_client->createWindow(frame, request, features, action);
+ if (!newPage)
+ return 0;
- if (newPage) {
- if (StorageNamespace* oldSessionStorage = m_page->sessionStorage(false))
- newPage->setSessionStorage(oldSessionStorage->copy());
- }
+ if (StorageNamespace* oldSessionStorage = m_page->sessionStorage(false))
+ newPage->setSessionStorage(oldSessionStorage->copy(newPage));
return newPage;
}
Modified: trunk/Source/WebCore/storage/StorageNamespace.h (148584 => 148585)
--- trunk/Source/WebCore/storage/StorageNamespace.h 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebCore/storage/StorageNamespace.h 2013-04-17 00:38:50 UTC (rev 148585)
@@ -43,7 +43,7 @@
virtual ~StorageNamespace() { }
virtual PassRefPtr<StorageArea> storageArea(PassRefPtr<SecurityOrigin>) = 0;
- virtual PassRefPtr<StorageNamespace> copy() = 0;
+ virtual PassRefPtr<StorageNamespace> copy(Page* newPage) = 0;
virtual void close() = 0;
virtual void clearOriginForDeletion(SecurityOrigin*) = 0;
virtual void clearAllOriginsForDeletion() = 0;
Modified: trunk/Source/WebCore/storage/StorageNamespaceImpl.cpp (148584 => 148585)
--- trunk/Source/WebCore/storage/StorageNamespaceImpl.cpp 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebCore/storage/StorageNamespaceImpl.cpp 2013-04-17 00:38:50 UTC (rev 148585)
@@ -87,7 +87,7 @@
close();
}
-PassRefPtr<StorageNamespace> StorageNamespaceImpl::copy()
+PassRefPtr<StorageNamespace> StorageNamespaceImpl::copy(Page*)
{
ASSERT(isMainThread());
ASSERT(!m_isShutdown);
Modified: trunk/Source/WebCore/storage/StorageNamespaceImpl.h (148584 => 148585)
--- trunk/Source/WebCore/storage/StorageNamespaceImpl.h 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebCore/storage/StorageNamespaceImpl.h 2013-04-17 00:38:50 UTC (rev 148585)
@@ -35,43 +35,45 @@
namespace WebCore {
- class StorageAreaImpl;
+class StorageAreaImpl;
- class StorageNamespaceImpl : public StorageNamespace {
- public:
- static PassRefPtr<StorageNamespace> localStorageNamespace(const String& path, unsigned quota);
- static PassRefPtr<StorageNamespace> sessionStorageNamespace(unsigned quota);
+class StorageNamespaceImpl : public StorageNamespace {
+public:
+ static PassRefPtr<StorageNamespace> localStorageNamespace(const String& path, unsigned quota);
+ static PassRefPtr<StorageNamespace> sessionStorageNamespace(unsigned quota);
+ virtual ~StorageNamespaceImpl();
- virtual ~StorageNamespaceImpl();
- virtual PassRefPtr<StorageArea> storageArea(PassRefPtr<SecurityOrigin>);
- virtual PassRefPtr<StorageNamespace> copy();
- virtual void close();
+ virtual PassRefPtr<StorageArea> storageArea(PassRefPtr<SecurityOrigin>) OVERRIDE;
+ virtual PassRefPtr<StorageNamespace> copy(Page* newPage) OVERRIDE;
+ virtual void close() OVERRIDE;
- // Not removing the origin's StorageArea from m_storageAreaMap because
- // we're just deleting the underlying db file. If an item is added immediately
- // after file deletion, we want the same StorageArea to eventually trigger
- // a sync and for StorageAreaSync to recreate the backing db file.
- virtual void clearOriginForDeletion(SecurityOrigin*);
- virtual void clearAllOriginsForDeletion();
- virtual void sync();
- virtual void closeIdleLocalStorageDatabases();
+ // Not removing the origin's StorageArea from m_storageAreaMap because
+ // we're just deleting the underlying db file. If an item is added immediately
+ // after file deletion, we want the same StorageArea to eventually trigger
+ // a sync and for StorageAreaSync to recreate the backing db file.
+ virtual void clearOriginForDeletion(SecurityOrigin*) OVERRIDE;
+ virtual void clearAllOriginsForDeletion() OVERRIDE;
+ virtual void sync() OVERRIDE;
+ virtual void closeIdleLocalStorageDatabases() OVERRIDE;
- private:
- StorageNamespaceImpl(StorageType, const String& path, unsigned quota);
+private:
+ StorageNamespaceImpl(StorageType, const String& path, unsigned quota);
- typedef HashMap<RefPtr<SecurityOrigin>, RefPtr<StorageAreaImpl> > StorageAreaMap;
- StorageAreaMap m_storageAreaMap;
+ typedef HashMap<RefPtr<SecurityOrigin>, RefPtr<StorageAreaImpl> > StorageAreaMap;
+ StorageAreaMap m_storageAreaMap;
- StorageType m_storageType;
+ StorageType m_storageType;
- // Only used if m_storageType == LocalStorage and the path was not "" in our constructor.
- String m_path;
- RefPtr<StorageSyncManager> m_syncManager;
+ // Only used if m_storageType == LocalStorage and the path was not "" in our constructor.
+ String m_path;
+ RefPtr<StorageSyncManager> m_syncManager;
- unsigned m_quota; // The default quota for each new storage area.
- bool m_isShutdown;
- };
+ // The default quota for each new storage area.
+ unsigned m_quota;
+ bool m_isShutdown;
+};
+
} // namespace WebCore
#endif // StorageNamespaceImpl_h
Modified: trunk/Source/WebKit2/ChangeLog (148584 => 148585)
--- trunk/Source/WebKit2/ChangeLog 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebKit2/ChangeLog 2013-04-17 00:38:50 UTC (rev 148585)
@@ -1,3 +1,27 @@
+2013-04-16 Anders Carlsson <[email protected]>
+
+ Clone storage namespaces for window.open
+ https://bugs.webkit.org/show_bug.cgi?id=114703
+
+ Reviewed by Sam Weinig.
+
+ * UIProcess/Storage/StorageManager.cpp:
+ (WebKit::StorageManager::StorageArea::clone):
+ New helper function for cloning a storage area.
+
+ (WebKit::StorageManager::StorageArea::setItem):
+ Correctly handle the copy-on-write feature of StorageMap if it has multiple storage areas pointing to it.
+
+ (WebKit::StorageManager::StorageArea::removeItem):
+ Ditto.
+
+ (WebKit::StorageManager::SessionStorageNamespace::cloneTo):
+ Add cloned storage areas.
+
+ * WebProcess/Storage/StorageNamespaceImpl.cpp:
+ (WebKit::StorageNamespaceImpl::copy):
+ Create a new session storage namespace for the new page.
+
2013-04-16 Beth Dakin <[email protected]>
Need a new layout milestone to notify bundle clients when the header has been
Modified: trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp (148584 => 148585)
--- trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp 2013-04-17 00:38:50 UTC (rev 148585)
@@ -46,6 +46,8 @@
void addListener(CoreIPC::Connection*, uint64_t storageMapID);
void removeListener(CoreIPC::Connection*, uint64_t storageMapID);
+ PassRefPtr<StorageArea> clone() const;
+
void setItem(CoreIPC::Connection* sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& value, const String& urlString, bool& quotaException);
void removeItem(CoreIPC::Connection* sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& urlString);
void clear(CoreIPC::Connection* sourceConnection, uint64_t sourceStorageAreaID, const String& urlString);
@@ -90,13 +92,22 @@
m_eventListeners.remove(std::make_pair(connection, storageMapID));
}
+PassRefPtr<StorageManager::StorageArea> StorageManager::StorageArea::clone() const
+{
+ RefPtr<StorageArea> storageArea = StorageArea::create(m_quotaInBytes);
+ storageArea->m_storageMap = m_storageMap;
+
+ return storageArea.release();
+}
+
void StorageManager::StorageArea::setItem(CoreIPC::Connection* sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& value, const String& urlString, bool& quotaException)
{
- ASSERT(m_storageMap->hasOneRef());
-
String oldValue;
- m_storageMap->setItem(key, value, oldValue, quotaException);
+ RefPtr<StorageMap> newStorageMap = m_storageMap->setItem(key, value, oldValue, quotaException);
+ if (newStorageMap)
+ m_storageMap = newStorageMap.release();
+
if (!quotaException)
dispatchEvents(sourceConnection, sourceStorageAreaID, key, oldValue, value, urlString);
}
@@ -104,7 +115,9 @@
void StorageManager::StorageArea::removeItem(CoreIPC::Connection* sourceConnection, uint64_t sourceStorageAreaID, const String& key, const String& urlString)
{
String oldValue;
- m_storageMap->removeItem(key, oldValue);
+ RefPtr<StorageMap> newStorageMap = m_storageMap->removeItem(key, oldValue);
+ if (newStorageMap)
+ m_storageMap = newStorageMap.release();
if (oldValue.isNull())
return;
@@ -188,7 +201,8 @@
{
ASSERT_UNUSED(newSessionStorageNamespace, newSessionStorageNamespace.isEmpty());
- // FIXME: Implement.
+ for (HashMap<RefPtr<SecurityOrigin>, RefPtr<StorageArea> >::const_iterator it = m_storageAreaMap.begin(), end = m_storageAreaMap.end(); it != end; ++it)
+ newSessionStorageNamespace.m_storageAreaMap.add(it->key, it->value->clone());
}
PassRefPtr<StorageManager> StorageManager::create()
Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp (148584 => 148585)
--- trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp 2013-04-17 00:38:50 UTC (rev 148585)
@@ -60,11 +60,11 @@
return StorageAreaImpl::create(result.iterator->value);
}
-PassRefPtr<StorageNamespace> StorageNamespaceImpl::copy()
+PassRefPtr<StorageNamespace> StorageNamespaceImpl::copy(Page* newPage)
{
- // FIXME: Implement this.
- ASSERT_NOT_REACHED();
- return 0;
+ ASSERT(m_storageNamespaceID);
+
+ return createSessionStorageNamespace(WebPage::fromCorePage(newPage));
}
void StorageNamespaceImpl::close()
Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h (148584 => 148585)
--- trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h 2013-04-17 00:30:25 UTC (rev 148584)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h 2013-04-17 00:38:50 UTC (rev 148585)
@@ -48,7 +48,7 @@
explicit StorageNamespaceImpl(uint64_t storageNamespaceID, unsigned quotaInBytes);
virtual PassRefPtr<WebCore::StorageArea> storageArea(PassRefPtr<WebCore::SecurityOrigin>) OVERRIDE;
- virtual PassRefPtr<WebCore::StorageNamespace> copy() OVERRIDE;
+ virtual PassRefPtr<WebCore::StorageNamespace> copy(WebCore::Page*) OVERRIDE;
virtual void close() OVERRIDE;
virtual void clearOriginForDeletion(WebCore::SecurityOrigin*) OVERRIDE;
virtual void clearAllOriginsForDeletion() OVERRIDE;