OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/webdata/common/web_database_service.h" | 5 #include "components/webdata/common/web_database_service.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "components/webdata/common/web_data_request_manager.h" | 9 #include "components/webdata/common/web_data_request_manager.h" |
10 #include "components/webdata/common/web_data_results.h" | 10 #include "components/webdata/common/web_data_results.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 const base::WeakPtr<WebDatabaseService> web_database_service_; | 36 const base::WeakPtr<WebDatabaseService> web_database_service_; |
37 scoped_refptr<base::MessageLoopProxy> callback_thread_; | 37 scoped_refptr<base::MessageLoopProxy> callback_thread_; |
38 }; | 38 }; |
39 | 39 |
40 WebDatabaseService::WebDatabaseService( | 40 WebDatabaseService::WebDatabaseService( |
41 const base::FilePath& path, | 41 const base::FilePath& path, |
42 const scoped_refptr<base::MessageLoopProxy>& ui_thread, | 42 const scoped_refptr<base::MessageLoopProxy>& ui_thread, |
43 const scoped_refptr<base::MessageLoopProxy>& db_thread) | 43 const scoped_refptr<base::MessageLoopProxy>& db_thread) |
44 : base::RefCountedDeleteOnMessageLoop<WebDatabaseService>(ui_thread), | 44 : base::RefCountedDeleteOnMessageLoop<WebDatabaseService>(ui_thread), |
45 path_(path), | 45 path_(path), |
46 weak_ptr_factory_(this), | |
47 db_loaded_(false), | 46 db_loaded_(false), |
48 db_thread_(db_thread) { | 47 db_thread_(db_thread), |
| 48 weak_ptr_factory_(this) { |
49 // WebDatabaseService should be instantiated on UI thread. | 49 // WebDatabaseService should be instantiated on UI thread. |
50 DCHECK(ui_thread->BelongsToCurrentThread()); | 50 DCHECK(ui_thread->BelongsToCurrentThread()); |
51 // WebDatabaseService requires DB thread if instantiated. | 51 // WebDatabaseService requires DB thread if instantiated. |
52 DCHECK(db_thread.get()); | 52 DCHECK(db_thread.get()); |
53 } | 53 } |
54 | 54 |
55 WebDatabaseService::~WebDatabaseService() { | 55 WebDatabaseService::~WebDatabaseService() { |
56 } | 56 } |
57 | 57 |
58 void WebDatabaseService::AddTable(scoped_ptr<WebDatabaseTable> table) { | 58 void WebDatabaseService::AddTable(scoped_ptr<WebDatabaseTable> table) { |
59 if (!wds_backend_.get()) { | 59 if (!wds_backend_) { |
60 wds_backend_ = new WebDataServiceBackend( | 60 wds_backend_ = new WebDataServiceBackend( |
61 path_, new BackendDelegate(weak_ptr_factory_.GetWeakPtr()), | 61 path_, new BackendDelegate(weak_ptr_factory_.GetWeakPtr()), |
62 db_thread_); | 62 db_thread_); |
63 } | 63 } |
64 wds_backend_->AddTable(table.Pass()); | 64 wds_backend_->AddTable(table.Pass()); |
65 } | 65 } |
66 | 66 |
67 void WebDatabaseService::LoadDatabase() { | 67 void WebDatabaseService::LoadDatabase() { |
68 DCHECK(wds_backend_.get()); | 68 DCHECK(wds_backend_); |
69 | |
70 db_thread_->PostTask( | 69 db_thread_->PostTask( |
71 FROM_HERE, | 70 FROM_HERE, |
72 Bind(&WebDataServiceBackend::InitDatabase, wds_backend_)); | 71 Bind(&WebDataServiceBackend::InitDatabase, wds_backend_)); |
73 } | 72 } |
74 | 73 |
75 void WebDatabaseService::UnloadDatabase() { | 74 void WebDatabaseService::UnloadDatabase() { |
76 db_loaded_ = false; | 75 db_loaded_ = false; |
77 if (!wds_backend_.get()) | 76 if (!wds_backend_) |
78 return; | 77 return; |
79 db_thread_->PostTask(FROM_HERE, | 78 db_thread_->PostTask(FROM_HERE, |
80 Bind(&WebDataServiceBackend::ShutdownDatabase, | 79 Bind(&WebDataServiceBackend::ShutdownDatabase, |
81 wds_backend_, true)); | 80 wds_backend_, true)); |
82 } | 81 } |
83 | 82 |
84 void WebDatabaseService::ShutdownDatabase() { | 83 void WebDatabaseService::ShutdownDatabase() { |
85 db_loaded_ = false; | 84 db_loaded_ = false; |
86 weak_ptr_factory_.InvalidateWeakPtrs(); | |
87 loaded_callbacks_.clear(); | 85 loaded_callbacks_.clear(); |
88 error_callbacks_.clear(); | 86 error_callbacks_.clear(); |
89 if (!wds_backend_.get()) | 87 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 88 if (!wds_backend_) |
90 return; | 89 return; |
91 db_thread_->PostTask(FROM_HERE, | 90 db_thread_->PostTask(FROM_HERE, |
92 Bind(&WebDataServiceBackend::ShutdownDatabase, | 91 Bind(&WebDataServiceBackend::ShutdownDatabase, |
93 wds_backend_, false)); | 92 wds_backend_, false)); |
94 } | 93 } |
95 | 94 |
96 WebDatabase* WebDatabaseService::GetDatabaseOnDB() const { | 95 WebDatabase* WebDatabaseService::GetDatabaseOnDB() const { |
97 DCHECK(db_thread_->BelongsToCurrentThread()); | 96 DCHECK(db_thread_->BelongsToCurrentThread()); |
98 if (!wds_backend_.get()) | 97 return wds_backend_ ? wds_backend_->database() : NULL; |
99 return NULL; | |
100 return wds_backend_->database(); | |
101 } | 98 } |
102 | 99 |
103 scoped_refptr<WebDataServiceBackend> WebDatabaseService::GetBackend() const { | 100 scoped_refptr<WebDataServiceBackend> WebDatabaseService::GetBackend() const { |
104 return wds_backend_; | 101 return wds_backend_; |
105 } | 102 } |
106 | 103 |
107 void WebDatabaseService::ScheduleDBTask( | 104 void WebDatabaseService::ScheduleDBTask( |
108 const tracked_objects::Location& from_here, | 105 const tracked_objects::Location& from_here, |
109 const WriteTask& task) { | 106 const WriteTask& task) { |
110 if (!wds_backend_.get()) { | 107 DCHECK(wds_backend_); |
111 NOTREACHED() << "Task scheduled after Shutdown()"; | |
112 return; | |
113 } | |
114 | |
115 scoped_ptr<WebDataRequest> request( | 108 scoped_ptr<WebDataRequest> request( |
116 new WebDataRequest(NULL, wds_backend_->request_manager().get())); | 109 new WebDataRequest(NULL, wds_backend_->request_manager().get())); |
117 | |
118 db_thread_->PostTask(from_here, | 110 db_thread_->PostTask(from_here, |
119 Bind(&WebDataServiceBackend::DBWriteTaskWrapper, wds_backend_, | 111 Bind(&WebDataServiceBackend::DBWriteTaskWrapper, |
120 task, base::Passed(&request))); | 112 wds_backend_, task, base::Passed(&request))); |
121 } | 113 } |
122 | 114 |
123 WebDataServiceBase::Handle WebDatabaseService::ScheduleDBTaskWithResult( | 115 WebDataServiceBase::Handle WebDatabaseService::ScheduleDBTaskWithResult( |
124 const tracked_objects::Location& from_here, | 116 const tracked_objects::Location& from_here, |
125 const ReadTask& task, | 117 const ReadTask& task, |
126 WebDataServiceConsumer* consumer) { | 118 WebDataServiceConsumer* consumer) { |
127 DCHECK(consumer); | 119 DCHECK(consumer); |
128 WebDataServiceBase::Handle handle = 0; | 120 DCHECK(wds_backend_); |
129 | |
130 if (!wds_backend_.get()) { | |
131 NOTREACHED() << "Task scheduled after Shutdown()"; | |
132 return handle; | |
133 } | |
134 | |
135 scoped_ptr<WebDataRequest> request( | 121 scoped_ptr<WebDataRequest> request( |
136 new WebDataRequest(consumer, wds_backend_->request_manager().get())); | 122 new WebDataRequest(consumer, wds_backend_->request_manager().get())); |
137 handle = request->GetHandle(); | 123 WebDataServiceBase::Handle handle = request->GetHandle(); |
138 | |
139 db_thread_->PostTask(from_here, | 124 db_thread_->PostTask(from_here, |
140 Bind(&WebDataServiceBackend::DBReadTaskWrapper, wds_backend_, | 125 Bind(&WebDataServiceBackend::DBReadTaskWrapper, |
141 task, base::Passed(&request))); | 126 wds_backend_, task, base::Passed(&request))); |
142 | |
143 return handle; | 127 return handle; |
144 } | 128 } |
145 | 129 |
146 void WebDatabaseService::CancelRequest(WebDataServiceBase::Handle h) { | 130 void WebDatabaseService::CancelRequest(WebDataServiceBase::Handle h) { |
147 if (!wds_backend_.get()) | 131 if (!wds_backend_) |
148 return; | 132 return; |
149 wds_backend_->request_manager()->CancelRequest(h); | 133 wds_backend_->request_manager()->CancelRequest(h); |
150 } | 134 } |
151 | 135 |
152 void WebDatabaseService::RegisterDBLoadedCallback( | 136 void WebDatabaseService::RegisterDBLoadedCallback( |
153 const DBLoadedCallback& callback) { | 137 const DBLoadedCallback& callback) { |
154 loaded_callbacks_.push_back(callback); | 138 loaded_callbacks_.push_back(callback); |
155 } | 139 } |
156 | 140 |
157 void WebDatabaseService::RegisterDBErrorCallback( | 141 void WebDatabaseService::RegisterDBErrorCallback( |
(...skipping 14 matching lines...) Expand all Loading... |
172 } else { | 156 } else { |
173 // Notify that the database load failed. | 157 // Notify that the database load failed. |
174 for (size_t i = 0; i < error_callbacks_.size(); i++) { | 158 for (size_t i = 0; i < error_callbacks_.size(); i++) { |
175 if (!error_callbacks_[i].is_null()) | 159 if (!error_callbacks_[i].is_null()) |
176 error_callbacks_[i].Run(status); | 160 error_callbacks_[i].Run(status); |
177 } | 161 } |
178 | 162 |
179 error_callbacks_.clear(); | 163 error_callbacks_.clear(); |
180 } | 164 } |
181 } | 165 } |
OLD | NEW |