Index: content/browser/in_process_webkit/dom_storage_message_filter.cc |
diff --git a/content/browser/in_process_webkit/dom_storage_message_filter.cc b/content/browser/in_process_webkit/dom_storage_message_filter.cc |
index 8a327131b99001bd5d30d8ddb374605de9c8408c..5808289d23c6b0b1e3fc7738102b6145b88c54d6 100644 |
--- a/content/browser/in_process_webkit/dom_storage_message_filter.cc |
+++ b/content/browser/in_process_webkit/dom_storage_message_filter.cc |
@@ -83,7 +83,8 @@ bool DOMStorageMessageFilter::OnMessageReceived(const IPC::Message& message, |
bool* message_was_ok) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP_EX(DOMStorageMessageFilter, message, *message_was_ok) |
- IPC_MESSAGE_HANDLER(DOMStorageHostMsg_StorageAreaId, OnStorageAreaId) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY( |
+ DOMStorageHostMsg_StorageAreaId, OnStorageAreaId) |
IPC_MESSAGE_HANDLER(DOMStorageHostMsg_Length, OnLength) |
IPC_MESSAGE_HANDLER(DOMStorageHostMsg_Key, OnKey) |
IPC_MESSAGE_HANDLER(DOMStorageHostMsg_GetItem, OnGetItem) |
@@ -103,23 +104,58 @@ void DOMStorageMessageFilter::OnDestruct() const { |
void DOMStorageMessageFilter::OverrideThreadForMessage( |
const IPC::Message& message, |
BrowserThread::ID* thread) { |
+ if (message.type() == DOMStorageHostMsg_StorageAreaId::ID) |
+ return; |
if (IPC_MESSAGE_CLASS(message) == DOMStorageMsgStart) |
*thread = BrowserThread::WEBKIT; |
} |
void DOMStorageMessageFilter::OnStorageAreaId(int64 namespace_id, |
const string16& origin, |
- int64* storage_area_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
+ IPC::Message* reply_msg) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ content::ContentBrowserClient* content_browser_client = |
+ content::GetContentClient()->browser(); |
+ bool enforce_session_only_storage = |
+ content_browser_client->EnforceSessionOnlyStorage( |
+ GURL(origin), |
+ // TODO(marja): Get the first party URL |
+ GURL(origin), |
+ Context()->GetResourceContext()); |
michaeln
2011/08/04 20:21:51
I think this is the only place you actually need a
marja
2011/08/05 13:15:53
Done.
|
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::WEBKIT, |
+ FROM_HERE, |
+ NewRunnableMethod( |
+ this, |
+ &DOMStorageMessageFilter::OnStorageAreaIdOnWebKitThread, |
+ namespace_id, |
+ origin, |
+ enforce_session_only_storage, |
+ reply_msg)); |
+} |
+ |
+void DOMStorageMessageFilter::OnStorageAreaIdOnWebKitThread( |
+ int64 namespace_id, |
+ const string16& origin, |
+ bool enforce_session_only_storage, |
+ IPC::Message* reply_msg) { |
DOMStorageNamespace* storage_namespace = |
Context()->GetStorageNamespace(namespace_id, true); |
if (!storage_namespace) { |
- *storage_area_id = DOMStorageContext::kInvalidStorageId; |
- return; |
+ DOMStorageHostMsg_StorageAreaId::WriteReplyParams( |
+ reply_msg, |
+ DOMStorageContext::kInvalidStorageId); |
+ } else { |
+ DOMStorageArea* storage_area = |
+ storage_namespace->GetStorageArea(origin, |
+ enforce_session_only_storage); |
+ DCHECK(storage_area != NULL); |
+ DOMStorageHostMsg_StorageAreaId::WriteReplyParams(reply_msg, |
+ storage_area->id()); |
} |
- DOMStorageArea* storage_area = storage_namespace->GetStorageArea(origin); |
- *storage_area_id = storage_area->id(); |
+ Send(reply_msg); |
} |
void DOMStorageMessageFilter::OnLength(int64 storage_area_id, |