Index: content/renderer/render_thread_impl.cc |
=================================================================== |
--- content/renderer/render_thread_impl.cc (revision 133749) |
+++ content/renderer/render_thread_impl.cc (working copy) |
@@ -57,6 +57,7 @@ |
#include "content/renderer/render_view_impl.h" |
#include "content/renderer/renderer_webkitplatformsupport_impl.h" |
#include "content/renderer/renderer_webstoragearea_impl.h" |
+#include "content/renderer/renderer_webstoragenamespace_impl.h" |
#include "grit/content_resources.h" |
#include "ipc/ipc_channel_handle.h" |
#include "ipc/ipc_platform_file.h" |
@@ -813,32 +814,40 @@ |
void RenderThreadImpl::OnDOMStorageEvent( |
const DOMStorageMsg_Event_Params& params) { |
- if (!dom_storage_event_dispatcher_.get()) { |
- EnsureWebKitInitialized(); |
- dom_storage_event_dispatcher_.reset(WebStorageEventDispatcher::create()); |
+ EnsureWebKitInitialized(); |
+ |
+ bool originated_in_process = params.connection_id != 0; |
+ RendererWebStorageAreaImpl* originating_area = NULL; |
+ if (originated_in_process) { |
+ originating_area = RendererWebStorageAreaImpl::FromConnectionId( |
+ params.connection_id); |
} |
- // TODO(michaeln): Return early until webkit/webcore is modified to not |
- // raise LocalStorage events internally. Looks like i have some multi-side |
- // patch engineering in front of me todo. |
- if (params.connection_id) |
- return; |
- |
- // TODO(michaeln): fix the webkit api so we don't need to convert from |
- // string types to url types and to pass in the 'area' which |
- // caused this event to occur and to get rid of the is_local param. |
- // RendererWebStorageAreaImpl* originating_area = |
- // RendererWebStorageAreaImpl::FromConnectionId(params.connection_id); |
- |
- // SessionStorage events are always raised internally by webkit/webcore. |
- const bool kIsLocalStorage = true; |
- dom_storage_event_dispatcher_->dispatchStorageEvent( |
- params.key, |
- params.old_value, |
- params.new_value, |
- UTF8ToUTF16(params.origin.spec()), |
- params.page_url, |
- kIsLocalStorage); |
+ if (params.namespace_id == dom_storage::kLocalStorageNamespaceId) { |
+ WebStorageEventDispatcher::dispatchLocalStorageEvent( |
+ params.key, |
+ params.old_value, |
+ params.new_value, |
+ params.origin, |
+ params.page_url, |
+ originating_area, |
+ originated_in_process); |
+ } else if (originated_in_process) { |
+ // TODO(michaeln): For now, we only raise session storage events into the |
+ // process which caused the event to occur. However there are cases where |
+ // sessions can span process boundaries, so there are correctness issues. |
+ RendererWebStorageNamespaceImpl |
+ session_namespace_for_event_dispatch(params.namespace_id); |
+ WebStorageEventDispatcher::dispatchSessionStorageEvent( |
+ params.key, |
+ params.old_value, |
+ params.new_value, |
+ params.origin, |
+ params.page_url, |
+ session_namespace_for_event_dispatch, |
+ originating_area, |
+ originated_in_process); |
+ } |
} |
bool RenderThreadImpl::OnControlMessageReceived(const IPC::Message& msg) { |