OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/in_process_webkit/indexed_db_key_utility_client.h" | 5 #include "content/browser/in_process_webkit/indexed_db_key_utility_client.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/synchronization/waitable_event.h" | 8 #include "base/synchronization/waitable_event.h" |
9 #include "chrome/browser/utility_process_host.h" | 9 #include "content/browser/utility_process_host.h" |
10 #include "content/common/indexed_db_key.h" | 10 #include "content/common/indexed_db_key.h" |
| 11 #include "content/common/indexed_db_messages.h" |
| 12 #include "content/common/utility_messages.h" |
11 #include "content/common/serialized_script_value.h" | 13 #include "content/common/serialized_script_value.h" |
12 | 14 |
13 // This class is used to obtain IndexedDBKeys from SerializedScriptValues | 15 // This class is used to obtain IndexedDBKeys from SerializedScriptValues |
14 // given an IDBKeyPath. It uses UtilityProcess to do this inside a sandbox | 16 // given an IDBKeyPath. It uses UtilityProcess to do this inside a sandbox |
15 // (a V8 lock is required there). At this level, all methods are synchronous | 17 // (a V8 lock is required there). At this level, all methods are synchronous |
16 // as required by the caller. The public API is used on WEBKIT thread, | 18 // as required by the caller. The public API is used on WEBKIT thread, |
17 // but internally it moves around to UI and IO as needed. | 19 // but internally it moves around to UI and IO as needed. |
18 class KeyUtilityClientImpl | 20 class KeyUtilityClientImpl |
19 : public base::RefCountedThreadSafe<KeyUtilityClientImpl> { | 21 : public base::RefCountedThreadSafe<KeyUtilityClientImpl> { |
20 public: | 22 public: |
(...skipping 18 matching lines...) Expand all Loading... |
39 const SerializedScriptValue& value, | 41 const SerializedScriptValue& value, |
40 const string16& key_path); | 42 const string16& key_path); |
41 | 43 |
42 private: | 44 private: |
43 class Client : public UtilityProcessHost::Client { | 45 class Client : public UtilityProcessHost::Client { |
44 public: | 46 public: |
45 explicit Client(KeyUtilityClientImpl* parent); | 47 explicit Client(KeyUtilityClientImpl* parent); |
46 | 48 |
47 // UtilityProcessHost::Client | 49 // UtilityProcessHost::Client |
48 virtual void OnProcessCrashed(int exit_code); | 50 virtual void OnProcessCrashed(int exit_code); |
49 virtual void OnIDBKeysFromValuesAndKeyPathSucceeded( | 51 virtual bool OnMessageReceived(const IPC::Message& message); |
| 52 |
| 53 // IPC message handlers |
| 54 void OnIDBKeysFromValuesAndKeyPathSucceeded( |
50 int id, const std::vector<IndexedDBKey>& keys); | 55 int id, const std::vector<IndexedDBKey>& keys); |
51 virtual void OnIDBKeysFromValuesAndKeyPathFailed(int id); | 56 void OnIDBKeysFromValuesAndKeyPathFailed(int id); |
52 virtual void OnInjectIDBKeyFinished(const SerializedScriptValue& value); | 57 void OnInjectIDBKeyFinished(const SerializedScriptValue& value); |
53 | 58 |
54 private: | 59 private: |
55 KeyUtilityClientImpl* parent_; | 60 KeyUtilityClientImpl* parent_; |
56 | 61 |
57 DISALLOW_COPY_AND_ASSIGN(Client); | 62 DISALLOW_COPY_AND_ASSIGN(Client); |
58 }; | 63 }; |
59 | 64 |
60 friend class base::RefCountedThreadSafe<KeyUtilityClientImpl>; | 65 friend class base::RefCountedThreadSafe<KeyUtilityClientImpl>; |
61 ~KeyUtilityClientImpl(); | 66 ~KeyUtilityClientImpl(); |
62 | 67 |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 BrowserThread::PostTask( | 305 BrowserThread::PostTask( |
301 BrowserThread::IO, FROM_HERE, | 306 BrowserThread::IO, FROM_HERE, |
302 NewRunnableMethod(this, | 307 NewRunnableMethod(this, |
303 &KeyUtilityClientImpl:: | 308 &KeyUtilityClientImpl:: |
304 CallStartIDBKeyFromValueAndKeyPathFromIOThread, | 309 CallStartIDBKeyFromValueAndKeyPathFromIOThread, |
305 values, key_path)); | 310 values, key_path)); |
306 return; | 311 return; |
307 } | 312 } |
308 | 313 |
309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
310 utility_process_host_->StartIDBKeysFromValuesAndKeyPath( | 315 utility_process_host_->Send(new UtilityMsg_IDBKeysFromValuesAndKeyPath( |
311 0, values, key_path); | 316 0, values, key_path)); |
312 } | 317 } |
313 | 318 |
314 void KeyUtilityClientImpl::CallStartInjectIDBKeyFromIOThread( | 319 void KeyUtilityClientImpl::CallStartInjectIDBKeyFromIOThread( |
315 const IndexedDBKey& key, | 320 const IndexedDBKey& key, |
316 const SerializedScriptValue& value, | 321 const SerializedScriptValue& value, |
317 const string16& key_path) { | 322 const string16& key_path) { |
318 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 323 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
319 BrowserThread::PostTask( | 324 BrowserThread::PostTask( |
320 BrowserThread::IO, FROM_HERE, | 325 BrowserThread::IO, FROM_HERE, |
321 NewRunnableMethod(this, | 326 NewRunnableMethod(this, |
322 &KeyUtilityClientImpl:: | 327 &KeyUtilityClientImpl:: |
323 CallStartInjectIDBKeyFromIOThread, | 328 CallStartInjectIDBKeyFromIOThread, |
324 key, value, key_path)); | 329 key, value, key_path)); |
325 return; | 330 return; |
326 } | 331 } |
327 | 332 |
328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
329 utility_process_host_->StartInjectIDBKey(key, value, key_path); | 334 utility_process_host_->Send(new UtilityMsg_InjectIDBKey( |
| 335 key, value, key_path)); |
330 } | 336 } |
331 | 337 |
332 void KeyUtilityClientImpl::SetKeys(const std::vector<IndexedDBKey>& keys) { | 338 void KeyUtilityClientImpl::SetKeys(const std::vector<IndexedDBKey>& keys) { |
333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
334 keys_ = keys; | 340 keys_ = keys; |
335 } | 341 } |
336 | 342 |
337 void KeyUtilityClientImpl::FinishCreatingKeys() { | 343 void KeyUtilityClientImpl::FinishCreatingKeys() { |
338 DCHECK(state_ == STATE_CREATING_KEYS); | 344 DCHECK(state_ == STATE_CREATING_KEYS); |
339 state_ = STATE_INITIALIZED; | 345 state_ = STATE_INITIALIZED; |
(...skipping 14 matching lines...) Expand all Loading... |
354 | 360 |
355 KeyUtilityClientImpl::Client::Client(KeyUtilityClientImpl* parent) | 361 KeyUtilityClientImpl::Client::Client(KeyUtilityClientImpl* parent) |
356 : parent_(parent) { | 362 : parent_(parent) { |
357 } | 363 } |
358 | 364 |
359 void KeyUtilityClientImpl::Client::OnProcessCrashed(int exit_code) { | 365 void KeyUtilityClientImpl::Client::OnProcessCrashed(int exit_code) { |
360 if (parent_->state_ == STATE_CREATING_KEYS) | 366 if (parent_->state_ == STATE_CREATING_KEYS) |
361 parent_->FinishCreatingKeys(); | 367 parent_->FinishCreatingKeys(); |
362 } | 368 } |
363 | 369 |
| 370 bool KeyUtilityClientImpl::Client::OnMessageReceived( |
| 371 const IPC::Message& message) { |
| 372 bool handled = true; |
| 373 IPC_BEGIN_MESSAGE_MAP(KeyUtilityClientImpl::Client, message) |
| 374 IPC_MESSAGE_HANDLER(UtilityHostMsg_IDBKeysFromValuesAndKeyPath_Succeeded, |
| 375 OnIDBKeysFromValuesAndKeyPathSucceeded) |
| 376 IPC_MESSAGE_HANDLER(UtilityHostMsg_IDBKeysFromValuesAndKeyPath_Failed, |
| 377 OnIDBKeysFromValuesAndKeyPathFailed) |
| 378 IPC_MESSAGE_HANDLER(UtilityHostMsg_InjectIDBKey_Finished, |
| 379 OnInjectIDBKeyFinished) |
| 380 IPC_MESSAGE_UNHANDLED(handled = false) |
| 381 IPC_END_MESSAGE_MAP_EX() |
| 382 return handled; |
| 383 } |
| 384 |
364 void KeyUtilityClientImpl::Client::OnIDBKeysFromValuesAndKeyPathSucceeded( | 385 void KeyUtilityClientImpl::Client::OnIDBKeysFromValuesAndKeyPathSucceeded( |
365 int id, const std::vector<IndexedDBKey>& keys) { | 386 int id, const std::vector<IndexedDBKey>& keys) { |
366 parent_->SetKeys(keys); | 387 parent_->SetKeys(keys); |
367 parent_->FinishCreatingKeys(); | 388 parent_->FinishCreatingKeys(); |
368 } | 389 } |
369 | 390 |
370 void KeyUtilityClientImpl::Client::OnInjectIDBKeyFinished( | 391 void KeyUtilityClientImpl::Client::OnInjectIDBKeyFinished( |
371 const SerializedScriptValue& value) { | 392 const SerializedScriptValue& value) { |
372 parent_->SetValueAfterInjection(value); | 393 parent_->SetValueAfterInjection(value); |
373 parent_->FinishInjectingKey(); | 394 parent_->FinishInjectingKey(); |
374 } | 395 } |
375 | 396 |
376 void KeyUtilityClientImpl::Client::OnIDBKeysFromValuesAndKeyPathFailed( | 397 void KeyUtilityClientImpl::Client::OnIDBKeysFromValuesAndKeyPathFailed( |
377 int id) { | 398 int id) { |
378 parent_->FinishCreatingKeys(); | 399 parent_->FinishCreatingKeys(); |
379 } | 400 } |
OLD | NEW |