OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #include "chrome/browser/in_process_webkit/dom_storage_dispatcher_host.h" | 5 #include "chrome/browser/in_process_webkit/dom_storage_dispatcher_host.h" |
6 | 6 |
7 #include "base/nullable_string16.h" | 7 #include "base/nullable_string16.h" |
8 #include "chrome/browser/chrome_thread.h" | 8 #include "chrome/browser/chrome_thread.h" |
9 #include "chrome/browser/in_process_webkit/dom_storage_context.h" | 9 #include "chrome/browser/in_process_webkit/dom_storage_context.h" |
10 #include "chrome/browser/in_process_webkit/storage_area.h" | 10 #include "chrome/browser/in_process_webkit/storage_area.h" |
11 #include "chrome/browser/in_process_webkit/storage_namespace.h" | 11 #include "chrome/browser/in_process_webkit/storage_namespace.h" |
12 #include "chrome/browser/in_process_webkit/webkit_thread.h" | 12 #include "chrome/browser/in_process_webkit/webkit_thread.h" |
13 #include "chrome/browser/renderer_host/browser_render_process_host.h" | 13 #include "chrome/browser/renderer_host/browser_render_process_host.h" |
14 #include "chrome/common/render_messages.h" | 14 #include "chrome/common/render_messages.h" |
15 | 15 |
16 DOMStorageDispatcherHost* DOMStorageDispatcherHost::current_ = NULL; | 16 DOMStorageDispatcherHost* DOMStorageDispatcherHost::storage_event_host_ = NULL; |
17 | 17 |
18 DOMStorageDispatcherHost:: | 18 DOMStorageDispatcherHost:: |
19 AutoSetCurrentDispatcherHost::AutoSetCurrentDispatcherHost( | 19 ScopedStorageEventContext::ScopedStorageEventContext( |
20 DOMStorageDispatcherHost* dispatcher_host) { | 20 DOMStorageDispatcherHost* dispatcher_host) { |
21 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 21 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
22 DCHECK(!current_); | 22 DCHECK(!storage_event_host_); |
23 current_ = dispatcher_host; | 23 storage_event_host_ = dispatcher_host; |
| 24 DCHECK(storage_event_host_); |
24 } | 25 } |
25 | 26 |
26 DOMStorageDispatcherHost:: | 27 DOMStorageDispatcherHost:: |
27 AutoSetCurrentDispatcherHost::~AutoSetCurrentDispatcherHost() { | 28 ScopedStorageEventContext::~ScopedStorageEventContext() { |
28 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 29 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
29 DCHECK(current_); | 30 DCHECK(storage_event_host_); |
30 current_ = NULL; | 31 storage_event_host_ = NULL; |
31 } | 32 } |
32 | 33 |
33 DOMStorageDispatcherHost::DOMStorageDispatcherHost( | 34 DOMStorageDispatcherHost::DOMStorageDispatcherHost( |
34 IPC::Message::Sender* message_sender, WebKitContext* webkit_context, | 35 IPC::Message::Sender* message_sender, WebKitContext* webkit_context, |
35 WebKitThread* webkit_thread) | 36 WebKitThread* webkit_thread) |
36 : webkit_context_(webkit_context), | 37 : webkit_context_(webkit_context), |
37 webkit_thread_(webkit_thread), | 38 webkit_thread_(webkit_thread), |
38 message_sender_(message_sender), | 39 message_sender_(message_sender), |
39 process_handle_(0) { | 40 process_handle_(0) { |
40 DCHECK(webkit_context_.get()); | 41 DCHECK(webkit_context_.get()); |
(...skipping 28 matching lines...) Expand all Loading... |
69 | 70 |
70 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 71 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
71 DCHECK(!message_sender_); | 72 DCHECK(!message_sender_); |
72 | 73 |
73 // TODO(jorlow): Do stuff that needs to be run on the WebKit thread. Locks | 74 // TODO(jorlow): Do stuff that needs to be run on the WebKit thread. Locks |
74 // and others will likely need this, so let's not delete this | 75 // and others will likely need this, so let's not delete this |
75 // code even though it doesn't do anyting yet. | 76 // code even though it doesn't do anyting yet. |
76 } | 77 } |
77 | 78 |
78 /* static */ | 79 /* static */ |
79 void DOMStorageDispatcherHost::DispatchStorageEvent(const string16& key, | 80 void DOMStorageDispatcherHost::DispatchStorageEvent(const NullableString16& key, |
80 const NullableString16& old_value, const NullableString16& new_value, | 81 const NullableString16& old_value, const NullableString16& new_value, |
81 const string16& origin, bool is_local_storage) { | 82 const string16& origin, bool is_local_storage) { |
82 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 83 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
83 DCHECK(current_); | 84 DCHECK(is_local_storage); // Only LocalStorage is implemented right now. |
84 ChromeThread::PostTask( | 85 DCHECK(storage_event_host_); |
85 ChromeThread::IO, FROM_HERE, | 86 ViewMsg_DOMStorageEvent_Params params; |
86 NewRunnableMethod( | 87 params.key_ = key; |
87 current_, &DOMStorageDispatcherHost::OnStorageEvent, key, old_value, | 88 params.old_value_ = old_value; |
88 new_value, origin, is_local_storage)); | 89 params.new_value_ = new_value; |
| 90 params.origin_ = origin; |
| 91 params.storage_type_ = is_local_storage ? DOM_STORAGE_LOCAL |
| 92 : DOM_STORAGE_SESSION; |
| 93 // The storage_event_host_ is the DOMStorageDispatcherHost that is up in the |
| 94 // current call stack since it caused the storage event to fire. |
| 95 ChromeThread::PostTask(ChromeThread::IO, FROM_HERE, |
| 96 NewRunnableMethod(storage_event_host_, |
| 97 &DOMStorageDispatcherHost::OnStorageEvent, params)); |
89 } | 98 } |
90 | 99 |
91 bool DOMStorageDispatcherHost::OnMessageReceived(const IPC::Message& message, | 100 bool DOMStorageDispatcherHost::OnMessageReceived(const IPC::Message& message, |
92 bool *msg_is_ok) { | 101 bool *msg_is_ok) { |
93 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); | 102 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
94 DCHECK(process_handle_); | 103 DCHECK(process_handle_); |
95 | 104 |
96 bool handled = true; | 105 bool handled = true; |
97 IPC_BEGIN_MESSAGE_MAP_EX(DOMStorageDispatcherHost, message, *msg_is_ok) | 106 IPC_BEGIN_MESSAGE_MAP_EX(DOMStorageDispatcherHost, message, *msg_is_ok) |
98 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_DOMStorageNamespaceId, | 107 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_DOMStorageNamespaceId, |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 | 284 |
276 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 285 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
277 bool quota_exception = false; | 286 bool quota_exception = false; |
278 StorageArea* storage_area = Context()->GetStorageArea(storage_area_id); | 287 StorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
279 if (!storage_area) { | 288 if (!storage_area) { |
280 BrowserRenderProcessHost::BadMessageTerminateProcess( | 289 BrowserRenderProcessHost::BadMessageTerminateProcess( |
281 ViewHostMsg_DOMStorageSetItem::ID, process_handle_); | 290 ViewHostMsg_DOMStorageSetItem::ID, process_handle_); |
282 return; | 291 return; |
283 } | 292 } |
284 | 293 |
285 AutoSetCurrentDispatcherHost auto_set(this); | 294 ScopedStorageEventContext scope(this); |
286 storage_area->SetItem(key, value, "a_exception); | 295 storage_area->SetItem(key, value, "a_exception); |
287 ViewHostMsg_DOMStorageSetItem::WriteReplyParams(reply_msg, quota_exception); | 296 ViewHostMsg_DOMStorageSetItem::WriteReplyParams(reply_msg, quota_exception); |
288 Send(reply_msg); | 297 Send(reply_msg); |
289 } | 298 } |
290 | 299 |
291 void DOMStorageDispatcherHost::OnRemoveItem(int64 storage_area_id, | 300 void DOMStorageDispatcherHost::OnRemoveItem( |
292 const string16& key) { | 301 int64 storage_area_id, const string16& key) { |
293 if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { | 302 if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { |
294 PostTaskToWebKitThread(FROM_HERE, NewRunnableMethod(this, | 303 PostTaskToWebKitThread(FROM_HERE, NewRunnableMethod(this, |
295 &DOMStorageDispatcherHost::OnRemoveItem, storage_area_id, key)); | 304 &DOMStorageDispatcherHost::OnRemoveItem, storage_area_id, key)); |
296 return; | 305 return; |
297 } | 306 } |
298 | 307 |
299 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 308 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
300 StorageArea* storage_area = Context()->GetStorageArea(storage_area_id); | 309 StorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
301 if (!storage_area) { | 310 if (!storage_area) { |
302 BrowserRenderProcessHost::BadMessageTerminateProcess( | 311 BrowserRenderProcessHost::BadMessageTerminateProcess( |
303 ViewHostMsg_DOMStorageRemoveItem::ID, process_handle_); | 312 ViewHostMsg_DOMStorageRemoveItem::ID, process_handle_); |
304 return; | 313 return; |
305 } | 314 } |
306 | 315 |
307 AutoSetCurrentDispatcherHost auto_set(this); | 316 ScopedStorageEventContext scope(this); |
308 storage_area->RemoveItem(key); | 317 storage_area->RemoveItem(key); |
309 } | 318 } |
310 | 319 |
311 void DOMStorageDispatcherHost::OnClear(int64 storage_area_id) { | 320 void DOMStorageDispatcherHost::OnClear(int64 storage_area_id) { |
312 if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { | 321 if (ChromeThread::CurrentlyOn(ChromeThread::IO)) { |
313 PostTaskToWebKitThread(FROM_HERE, NewRunnableMethod(this, | 322 PostTaskToWebKitThread(FROM_HERE, NewRunnableMethod(this, |
314 &DOMStorageDispatcherHost::OnClear, storage_area_id)); | 323 &DOMStorageDispatcherHost::OnClear, storage_area_id)); |
315 return; | 324 return; |
316 } | 325 } |
317 | 326 |
318 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 327 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
319 StorageArea* storage_area = Context()->GetStorageArea(storage_area_id); | 328 StorageArea* storage_area = Context()->GetStorageArea(storage_area_id); |
320 if (!storage_area) { | 329 if (!storage_area) { |
321 BrowserRenderProcessHost::BadMessageTerminateProcess( | 330 BrowserRenderProcessHost::BadMessageTerminateProcess( |
322 ViewHostMsg_DOMStorageClear::ID, process_handle_); | 331 ViewHostMsg_DOMStorageClear::ID, process_handle_); |
323 return; | 332 return; |
324 } | 333 } |
325 | 334 |
326 AutoSetCurrentDispatcherHost auto_set(this); | 335 ScopedStorageEventContext scope(this); |
327 storage_area->Clear(); | 336 storage_area->Clear(); |
328 } | 337 } |
329 | 338 |
330 void DOMStorageDispatcherHost::OnStorageEvent(const string16& key, | 339 void DOMStorageDispatcherHost::OnStorageEvent( |
331 const NullableString16& old_value, const NullableString16& new_value, | 340 const ViewMsg_DOMStorageEvent_Params& params) { |
332 const string16& origin, bool is_local_storage) { | |
333 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); | 341 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
334 DCHECK(is_local_storage); // Only LocalStorage is implemented right now. | |
335 DOMStorageType dom_storage_type = is_local_storage ? DOM_STORAGE_LOCAL | |
336 : DOM_STORAGE_SESSION; | |
337 const DOMStorageContext::DispatcherHostSet* set = | 342 const DOMStorageContext::DispatcherHostSet* set = |
338 Context()->GetDispatcherHostSet(); | 343 Context()->GetDispatcherHostSet(); |
339 DOMStorageContext::DispatcherHostSet::const_iterator cur = set->begin(); | 344 DOMStorageContext::DispatcherHostSet::const_iterator cur = set->begin(); |
340 while (cur != set->end()) { | 345 while (cur != set->end()) { |
341 (*cur)->Send(new ViewMsg_DOMStorageEvent(key, old_value, new_value, origin, | 346 (*cur)->Send(new ViewMsg_DOMStorageEvent(params)); |
342 dom_storage_type)); | |
343 ++cur; | 347 ++cur; |
344 } | 348 } |
345 } | 349 } |
346 | 350 |
347 void DOMStorageDispatcherHost::PostTaskToWebKitThread( | 351 void DOMStorageDispatcherHost::PostTaskToWebKitThread( |
348 const tracked_objects::Location& from_here, Task* task) { | 352 const tracked_objects::Location& from_here, Task* task) { |
349 webkit_thread_->EnsureInitialized(); | 353 webkit_thread_->EnsureInitialized(); |
350 ChromeThread::PostTask(ChromeThread::WEBKIT, FROM_HERE, task); | 354 ChromeThread::PostTask(ChromeThread::WEBKIT, FROM_HERE, task); |
351 } | 355 } |
OLD | NEW |