Index: content/browser/dom_storage/dom_storage_message_filter_new.cc |
=================================================================== |
--- content/browser/dom_storage/dom_storage_message_filter_new.cc (revision 0) |
+++ content/browser/dom_storage/dom_storage_message_filter_new.cc (working copy) |
@@ -2,88 +2,78 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "content/browser/in_process_webkit/dom_storage_message_filter.h" |
+#include "content/browser/dom_storage/dom_storage_message_filter_new.h" |
+#ifdef ENABLE_NEW_DOM_STORAGE_BACKEND |
+ |
+#include "base/auto_reset.h" |
#include "base/bind.h" |
#include "base/nullable_string16.h" |
-#include "content/browser/in_process_webkit/dom_storage_area.h" |
-#include "content/browser/in_process_webkit/dom_storage_context_impl.h" |
-#include "content/browser/in_process_webkit/dom_storage_namespace.h" |
+#include "base/threading/sequenced_worker_pool.h" |
+#include "base/utf_string_conversions.h" |
+#include "content/browser/dom_storage/dom_storage_context_impl_new.h" |
#include "content/common/dom_storage_messages.h" |
-#include "content/public/browser/browser_thread.h" |
#include "googleurl/src/gurl.h" |
+#include "webkit/dom_storage/dom_storage_area.h" |
+#include "webkit/dom_storage/dom_storage_host.h" |
+#include "webkit/dom_storage/dom_storage_task_runner.h" |
-using content::BrowserMessageFilter; |
using content::BrowserThread; |
using WebKit::WebStorageArea; |
-DOMStorageMessageFilter* DOMStorageMessageFilter::storage_event_message_filter = |
- NULL; |
-const GURL* DOMStorageMessageFilter::storage_event_url_ = NULL; |
+DOMStorageMessageFilter::DOMStorageMessageFilter( |
+ int unused, |
+ DOMStorageContextImpl* context) |
+ : context_(context->context()), |
+ is_dispatching_message_(false) { |
+} |
-DOMStorageMessageFilter:: |
-ScopedStorageEventContext::ScopedStorageEventContext( |
- DOMStorageMessageFilter* dispatcher_message_filter, const GURL* url) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DCHECK(!storage_event_message_filter); |
- DCHECK(!storage_event_url_); |
- storage_event_message_filter = dispatcher_message_filter; |
- storage_event_url_ = url; |
- DCHECK(storage_event_message_filter); |
- DCHECK(storage_event_url_); |
+DOMStorageMessageFilter::~DOMStorageMessageFilter() { |
+ DCHECK(!host_.get()); |
} |
-DOMStorageMessageFilter:: |
-ScopedStorageEventContext::~ScopedStorageEventContext() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DCHECK(storage_event_message_filter); |
- DCHECK(storage_event_url_); |
- storage_event_message_filter = NULL; |
- storage_event_url_ = NULL; |
+void DOMStorageMessageFilter::InitializeInSequence() { |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ host_.reset(new dom_storage::DomStorageHost(context_)); |
+ context_->AddEventObserver(this); |
} |
-DOMStorageMessageFilter::DOMStorageMessageFilter( |
- int process_id, DOMStorageContextImpl* dom_storage_context) |
- : dom_storage_context_(dom_storage_context), |
- process_id_(process_id) { |
+void DOMStorageMessageFilter::UninitializeInSequence() { |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ context_->RemoveEventObserver(this); |
+ host_.reset(); |
} |
-DOMStorageMessageFilter::~DOMStorageMessageFilter() { |
- if (peer_handle()) |
- Context()->UnregisterMessageFilter(this); |
+void DOMStorageMessageFilter::OnFilterAdded(IPC::Channel* channel) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserMessageFilter::OnFilterAdded(channel); |
+ context_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DOMStorageMessageFilter::InitializeInSequence, this)); |
} |
-void DOMStorageMessageFilter::OnChannelConnected(int32 peer_pid) { |
- BrowserMessageFilter::OnChannelConnected(peer_pid); |
- if (peer_handle()) |
- Context()->RegisterMessageFilter(this); |
+void DOMStorageMessageFilter::OnFilterRemoved() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserMessageFilter::OnFilterRemoved(); |
+ context_->task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DOMStorageMessageFilter::UninitializeInSequence, this)); |
} |
-/* static */ |
-void DOMStorageMessageFilter::DispatchStorageEvent(const NullableString16& key, |
- const NullableString16& old_value, const NullableString16& new_value, |
- const string16& origin, const GURL& url, bool is_local_storage) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DCHECK(is_local_storage); // Only LocalStorage is implemented right now. |
- DCHECK(storage_event_message_filter); |
- DOMStorageMsg_Event_Params params; |
- params.key = key; |
- params.old_value = old_value; |
- params.new_value = new_value; |
- params.origin = origin; |
- params.url = *storage_event_url_; // The url passed in is junk. |
- params.storage_type = is_local_storage ? DOM_STORAGE_LOCAL |
- : DOM_STORAGE_SESSION; |
- // The storage_event_message_filter is the DOMStorageMessageFilter that is up |
- // in the current call stack since it caused the storage event to fire. |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&DOMStorageMessageFilter::OnStorageEvent, |
- storage_event_message_filter, params)); |
+base::TaskRunner* DOMStorageMessageFilter::OverrideTaskRunnerForMessage( |
+ const IPC::Message& message) { |
+ if (IPC_MESSAGE_CLASS(message) == DOMStorageMsgStart) |
+ return context_->task_runner(); |
+ return NULL; |
} |
bool DOMStorageMessageFilter::OnMessageReceived(const IPC::Message& message, |
bool* message_was_ok) { |
+ if (IPC_MESSAGE_CLASS(message) != DOMStorageMsgStart) |
+ return false; |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(host_.get()); |
+ AutoReset<bool> auto_reset(&is_dispatching_message_, true); |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP_EX(DOMStorageMessageFilter, message, *message_was_ok) |
IPC_MESSAGE_HANDLER(DOMStorageHostMsg_OpenStorageArea, OnOpenStorageArea) |
@@ -96,128 +86,120 @@ |
IPC_MESSAGE_HANDLER(DOMStorageHostMsg_Clear, OnClear) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
- |
return handled; |
} |
-void DOMStorageMessageFilter::OnDestruct() const { |
- BrowserThread::DeleteOnIOThread::Destruct(this); |
-} |
- |
-void DOMStorageMessageFilter::OverrideThreadForMessage( |
- const IPC::Message& message, |
- BrowserThread::ID* thread) { |
- if (IPC_MESSAGE_CLASS(message) == DOMStorageMsgStart) |
- *thread = BrowserThread::WEBKIT_DEPRECATED; |
-} |
- |
void DOMStorageMessageFilter::OnOpenStorageArea(int64 namespace_id, |
const string16& origin, |
- int64* storage_area_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- |
- DOMStorageNamespace* storage_namespace = |
- Context()->GetStorageNamespace(namespace_id, true); |
- if (!storage_namespace) { |
- *storage_area_id = DOMStorageContextImpl::kInvalidStorageId; |
- return; |
- } |
- DOMStorageArea* storage_area = storage_namespace->GetStorageArea(origin); |
- *storage_area_id = storage_area->id(); |
+ int64* connection_id) { |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *connection_id = host_->OpenStorageArea(namespace_id, GURL(origin)); |
} |
-void DOMStorageMessageFilter::OnCloseStorageArea(int64 storage_area_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- // TODO(michaeln): make use of this message in the new backend. |
+void DOMStorageMessageFilter::OnCloseStorageArea(int64 connection_id) { |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ host_->CloseStorageArea(connection_id); |
} |
-void DOMStorageMessageFilter::OnLength(int64 storage_area_id, |
+void DOMStorageMessageFilter::OnLength(int64 connection_id, |
unsigned* length) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DOMStorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
- if (!storage_area) { |
- *length = 0; |
- } else { |
- *length = storage_area->Length(); |
- } |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *length = host_->GetAreaLength(connection_id); |
} |
-void DOMStorageMessageFilter::OnKey(int64 storage_area_id, unsigned index, |
+void DOMStorageMessageFilter::OnKey(int64 connection_id, unsigned index, |
NullableString16* key) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DOMStorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
- if (!storage_area) { |
- *key = NullableString16(true); |
- } else { |
- *key = storage_area->Key(index); |
- } |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *key = host_->GetAreaKey(connection_id, index); |
} |
-void DOMStorageMessageFilter::OnGetItem(int64 storage_area_id, |
+void DOMStorageMessageFilter::OnGetItem(int64 connection_id, |
const string16& key, |
NullableString16* value) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DOMStorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
- if (!storage_area) { |
- *value = NullableString16(true); |
- } else { |
- *value = storage_area->GetItem(key); |
- } |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *value = host_->GetAreaItem(connection_id, key); |
} |
void DOMStorageMessageFilter::OnSetItem( |
- int64 storage_area_id, const string16& key, |
- const string16& value, const GURL& url, |
+ int64 connection_id, const string16& key, |
+ const string16& value, const GURL& page_url, |
WebKit::WebStorageArea::Result* result, NullableString16* old_value) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DOMStorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
- if (!storage_area) { |
- *old_value = NullableString16(true); |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *old_value = NullableString16(true); |
+ if (host_->SetAreaItem(connection_id, key, value, page_url, old_value)) |
*result = WebKit::WebStorageArea::ResultOK; |
- return; |
- } |
- |
- ScopedStorageEventContext scope(this, &url); |
- *old_value = storage_area->SetItem(key, value, result); |
+ else |
+ *result = WebKit::WebStorageArea::ResultBlockedByQuota; |
} |
void DOMStorageMessageFilter::OnRemoveItem( |
- int64 storage_area_id, const string16& key, const GURL& url, |
+ int64 connection_id, const string16& key, const GURL& pageUrl, |
NullableString16* old_value) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DOMStorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
- if (!storage_area) { |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ string16 old_string_value; |
+ if (host_->RemoveAreaItem(connection_id, key, pageUrl, &old_string_value)) |
+ *old_value = NullableString16(old_string_value, false); |
+ else |
*old_value = NullableString16(true); |
- return; |
- } |
- |
- ScopedStorageEventContext scope(this, &url); |
- *old_value = storage_area->RemoveItem(key); |
} |
-void DOMStorageMessageFilter::OnClear(int64 storage_area_id, const GURL& url, |
+void DOMStorageMessageFilter::OnClear(int64 connection_id, const GURL& page_url, |
bool* something_cleared) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED)); |
- DOMStorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
- if (!storage_area) { |
- *something_cleared = false; |
- return; |
- } |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *something_cleared = host_->ClearArea(connection_id, page_url); |
+} |
- ScopedStorageEventContext scope(this, &url); |
- *something_cleared = storage_area->Clear(); |
+void DOMStorageMessageFilter::OnDomStorageItemSet( |
+ const dom_storage::DomStorageArea* area, |
+ const string16& key, |
+ const string16& new_value, |
+ const NullableString16& old_value, |
+ const GURL& page_url) { |
+ SendDomStorageEvent(area, page_url, |
+ NullableString16(key, false), |
+ NullableString16(new_value, false), |
+ old_value); |
} |
-void DOMStorageMessageFilter::OnStorageEvent( |
- const DOMStorageMsg_Event_Params& params) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- const DOMStorageContextImpl::MessageFilterSet* set = |
- Context()->GetMessageFilterSet(); |
- DOMStorageContextImpl::MessageFilterSet::const_iterator cur = set->begin(); |
- while (cur != set->end()) { |
- // The renderer that generates the event handles it itself. |
- if (*cur != this) |
- (*cur)->Send(new DOMStorageMsg_Event(params)); |
- ++cur; |
- } |
+void DOMStorageMessageFilter::OnDomStorageItemRemoved( |
+ const dom_storage::DomStorageArea* area, |
+ const string16& key, |
+ const string16& old_value, |
+ const GURL& page_url) { |
+ SendDomStorageEvent(area, page_url, |
+ NullableString16(key, false), |
+ NullableString16(true), |
+ NullableString16(old_value, false)); |
} |
+ |
+void DOMStorageMessageFilter::OnDomStorageAreaCleared( |
+ const dom_storage::DomStorageArea* area, |
+ const GURL& page_url) { |
+ SendDomStorageEvent(area, page_url, |
+ NullableString16(true), |
+ NullableString16(true), |
+ NullableString16(true)); |
+} |
+ |
+void DOMStorageMessageFilter::SendDomStorageEvent( |
+ const dom_storage::DomStorageArea* area, |
+ const GURL& page_url, |
+ const NullableString16& key, |
+ const NullableString16& new_value, |
+ const NullableString16& old_value) { |
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ // Only send if this renderer is not the source of the event. |
+ if (is_dispatching_message_) |
+ return; |
+ DOMStorageMsg_Event_Params params; |
+ // TODO(michaeln): change the origin type to be GURL in ipc params. |
+ params.origin = UTF8ToUTF16(area->origin().spec()); |
+ params.url = page_url; |
+ params.storage_type = DOM_STORAGE_LOCAL; |
+ params.key = key; |
+ params.new_value = new_value; |
+ params.old_value = old_value; |
+ Send(new DOMStorageMsg_Event(params)); |
+} |
+ |
+#endif // ENABLE_NEW_DOM_STORAGE_BACKEND |