OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome/browser/in_process_webkit/indexed_db_key_utility_client.h" | 5 #include "chrome/browser/in_process_webkit/indexed_db_key_utility_client.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
10 #include "chrome/common/indexed_db_key.h" | 10 #include "chrome/common/indexed_db_key.h" |
11 #include "chrome/common/serialized_script_value.h" | 11 #include "chrome/common/serialized_script_value.h" |
12 | 12 |
| 13 IndexedDBKeyUtilityClient* IndexedDBKeyUtilityClient::Get() { |
| 14 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
| 15 AutoLock auto_lock(instantiation_lock_); |
| 16 |
| 17 if (!instance_.get()) { |
| 18 instance_ = new IndexedDBKeyUtilityClient(); |
| 19 instance_->StartUtilityProcess(); |
| 20 } |
| 21 |
| 22 return instance_.get(); |
| 23 } |
| 24 |
| 25 void IndexedDBKeyUtilityClient::Shutdown() { |
| 26 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 27 AutoLock autolock(instantiation_lock_); |
| 28 |
| 29 if (!instance_.get()) |
| 30 return; |
| 31 |
| 32 instance_->utility_process_host_->EndBatchMode(); |
| 33 instance_->utility_process_host_ = NULL; |
| 34 instance_->client_ = NULL; |
| 35 instance_->state_ = STATE_SHUTDOWN; |
| 36 instance_ = NULL; |
| 37 } |
| 38 |
13 IndexedDBKeyUtilityClient::IndexedDBKeyUtilityClient() | 39 IndexedDBKeyUtilityClient::IndexedDBKeyUtilityClient() |
14 : waitable_event_(false, false), | 40 : waitable_event_(false, false), |
15 state_(STATE_UNINITIALIZED), | 41 state_(STATE_UNINITIALIZED), |
16 utility_process_host_(NULL) { | 42 utility_process_host_(NULL) { |
17 } | 43 } |
18 | 44 |
19 IndexedDBKeyUtilityClient::~IndexedDBKeyUtilityClient() { | 45 IndexedDBKeyUtilityClient::~IndexedDBKeyUtilityClient() { |
20 DCHECK(state_ == STATE_UNINITIALIZED || state_ == STATE_SHUTDOWN); | 46 DCHECK(state_ == STATE_UNINITIALIZED || state_ == STATE_SHUTDOWN); |
21 DCHECK(!utility_process_host_); | 47 DCHECK(!utility_process_host_); |
22 DCHECK(!client_.get()); | 48 DCHECK(!client_.get()); |
23 } | 49 } |
24 | 50 |
25 void IndexedDBKeyUtilityClient::StartUtilityProcess() { | 51 void IndexedDBKeyUtilityClient::StartUtilityProcess() { |
26 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); | 52 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
27 DCHECK(state_ == STATE_UNINITIALIZED); | 53 DCHECK(state_ == STATE_UNINITIALIZED); |
28 | 54 |
29 GetRDHAndStartUtilityProcess(); | 55 GetRDHAndStartUtilityProcess(); |
30 bool ret = waitable_event_.Wait(); | 56 bool ret = waitable_event_.Wait(); |
31 | 57 |
32 DCHECK(ret && state_ == STATE_INITIALIZED); | 58 DCHECK(ret && state_ == STATE_INITIALIZED); |
33 } | 59 } |
34 | 60 |
35 void IndexedDBKeyUtilityClient::EndUtilityProcess() { | |
36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); | |
37 DCHECK(state_ == STATE_INITIALIZED); | |
38 | |
39 EndUtilityProcessInternal(); | |
40 bool ret = waitable_event_.Wait(); | |
41 | |
42 DCHECK(ret && state_ == STATE_SHUTDOWN); | |
43 } | |
44 | |
45 void IndexedDBKeyUtilityClient::CreateIDBKeysFromSerializedValuesAndKeyPath( | 61 void IndexedDBKeyUtilityClient::CreateIDBKeysFromSerializedValuesAndKeyPath( |
46 const std::vector<SerializedScriptValue>& values, | 62 const std::vector<SerializedScriptValue>& values, |
47 const string16& key_path, | 63 const string16& key_path, |
48 std::vector<IndexedDBKey>* keys) { | 64 std::vector<IndexedDBKey>* keys) { |
49 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); | 65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); |
| 66 if (state_ == STATE_SHUTDOWN) { |
| 67 keys->clear(); |
| 68 return; |
| 69 } |
| 70 |
50 DCHECK(state_ == STATE_INITIALIZED); | 71 DCHECK(state_ == STATE_INITIALIZED); |
51 | 72 |
52 state_ = STATE_CREATING_KEYS; | 73 state_ = STATE_CREATING_KEYS; |
53 CallStartIDBKeyFromValueAndKeyPathFromIOThread(values, key_path); | 74 CallStartIDBKeyFromValueAndKeyPathFromIOThread(values, key_path); |
54 bool ret = waitable_event_.Wait(); | 75 bool ret = waitable_event_.Wait(); |
55 DCHECK(ret && state_ == STATE_INITIALIZED); | 76 DCHECK(ret && state_ == STATE_INITIALIZED); |
56 | 77 |
57 *keys = keys_; | 78 *keys = keys_; |
58 } | 79 } |
59 | 80 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 void IndexedDBKeyUtilityClient::Client::OnIDBKeysFromValuesAndKeyPathSucceeded( | 178 void IndexedDBKeyUtilityClient::Client::OnIDBKeysFromValuesAndKeyPathSucceeded( |
158 int id, const std::vector<IndexedDBKey>& keys) { | 179 int id, const std::vector<IndexedDBKey>& keys) { |
159 parent_->SetKeys(keys); | 180 parent_->SetKeys(keys); |
160 parent_->FinishCreatingKeys(); | 181 parent_->FinishCreatingKeys(); |
161 } | 182 } |
162 | 183 |
163 void IndexedDBKeyUtilityClient::Client::OnIDBKeysFromValuesAndKeyPathFailed( | 184 void IndexedDBKeyUtilityClient::Client::OnIDBKeysFromValuesAndKeyPathFailed( |
164 int id) { | 185 int id) { |
165 parent_->FinishCreatingKeys(); | 186 parent_->FinishCreatingKeys(); |
166 } | 187 } |
| 188 |
| 189 scoped_refptr<IndexedDBKeyUtilityClient> IndexedDBKeyUtilityClient::instance_; |
| 190 base::Lock IndexedDBKeyUtilityClient::instantiation_lock_; |
OLD | NEW |