Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/history/android/android_history_provider_service.h" | 5 #include "chrome/browser/history/android/android_history_provider_service.h" |
| 6 | 6 |
| 7 #include "chrome/browser/favicon/favicon_service.h" | 7 #include "chrome/browser/favicon/favicon_service.h" |
| 8 #include "chrome/browser/favicon/favicon_service_factory.h" | 8 #include "chrome/browser/favicon/favicon_service_factory.h" |
| 9 #include "chrome/browser/history/android/android_provider_backend.h" | |
| 9 #include "chrome/browser/history/history_backend.h" | 10 #include "chrome/browser/history/history_backend.h" |
| 10 #include "chrome/browser/history/history_service.h" | 11 #include "chrome/browser/history/history_service.h" |
| 11 #include "chrome/browser/history/history_service_factory.h" | 12 #include "chrome/browser/history/history_service_factory.h" |
| 12 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
| 13 | 14 #include "components/history/core/browser/android/android_history_types.h" |
| 14 using history::HistoryBackend; | 15 #include "components/history/core/browser/history_db_task.h" |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 // AndroidProviderTask wraps two callbacks into an HistoryDBTask so that they | |
| 20 // can be passed to HistoryService::ScheduleDBTask. ResultType must be default | |
| 21 // constructible and copyable. | |
| 22 template <typename ResultType> | |
| 23 class AndroidProviderTask : public history::HistoryDBTask { | |
| 24 public: | |
| 25 typedef base::Callback<ResultType(history::AndroidProviderBackend*)> | |
| 26 RequestCallback; | |
| 27 typedef base::Callback<void(ResultType)> ResultCallback; | |
| 28 | |
| 29 AndroidProviderTask(const RequestCallback& request_cb, | |
| 30 const ResultCallback& result_cb) | |
| 31 : request_cb_(request_cb), result_cb_(result_cb), result_(ResultType{}) { | |
|
droger
2015/02/18 14:04:01
ResultType{}:
That "(Uniform) Initialization Synta
| |
| 32 DCHECK(!request_cb_.is_null()); | |
| 33 DCHECK(!result_cb_.is_null()); | |
| 34 } | |
| 35 | |
| 36 ~AndroidProviderTask() override {} | |
| 37 | |
| 38 private: | |
| 39 // history::HistoryDBTask implementation. | |
| 40 bool RunOnDBThread(history::HistoryBackend* backend, | |
| 41 history::HistoryDatabase* db) override { | |
| 42 if (backend->android_provider_backend()) | |
| 43 result_ = request_cb_.Run(backend->android_provider_backend()); | |
| 44 return true; | |
| 45 } | |
| 46 | |
| 47 void DoneRunOnMainThread() override { result_cb_.Run(result_); } | |
| 48 | |
| 49 RequestCallback request_cb_; | |
| 50 ResultCallback result_cb_; | |
| 51 ResultType result_; | |
| 52 }; | |
| 53 | |
| 54 // Creates an instance of AndroidProviderTask using the two callback and using | |
| 55 // type deduction. | |
| 56 template <typename ResultType> | |
| 57 scoped_ptr<history::HistoryDBTask> CreateAndroidProviderTask( | |
| 58 const base::Callback<ResultType(history::AndroidProviderBackend*)>& | |
| 59 request_cb, | |
| 60 const base::Callback<void(ResultType)>& result_cb) { | |
| 61 return scoped_ptr<history::HistoryDBTask>( | |
| 62 new AndroidProviderTask<ResultType>(request_cb, result_cb)); | |
| 63 } | |
| 64 | |
| 65 // History and bookmarks ---------------------------------------------------- | |
| 66 | |
| 67 // Inserts the given values into android provider backend. | |
| 68 history::AndroidURLID InsertHistoryAndBookmarkAdapter( | |
| 69 const history::HistoryAndBookmarkRow& row, | |
| 70 history::AndroidProviderBackend* backend) { | |
| 71 return backend->InsertHistoryAndBookmark(row); | |
| 72 } | |
| 73 | |
| 74 // Runs the given query on android provider backend and returns the result. | |
| 75 // | |
| 76 // |projections| is the vector of the result columns. | |
| 77 // |selection| is the SQL WHERE clause without 'WHERE'. | |
| 78 // |selection_args| is the arguments for WHERE clause. | |
| 79 // |sort_order| is the SQL ORDER clause. | |
| 80 history::AndroidStatement* QueryHistoryAndBookmarksAdapter( | |
| 81 const std::vector<history::HistoryAndBookmarkRow::ColumnID>& projections, | |
| 82 const std::string& selection, | |
| 83 const std::vector<base::string16>& selection_args, | |
| 84 const std::string& sort_order, | |
| 85 history::AndroidProviderBackend* backend) { | |
| 86 return backend->QueryHistoryAndBookmarks(projections, selection, | |
| 87 selection_args, sort_order); | |
| 88 } | |
| 89 | |
| 90 // Returns the number of row updated by the update query. | |
| 91 // | |
| 92 // |row| is the value to update. | |
| 93 // |selection| is the SQL WHERE clause without 'WHERE'. | |
| 94 // |selection_args| is the arguments for the WHERE clause. | |
| 95 int UpdateHistoryAndBookmarksAdapter( | |
| 96 const history::HistoryAndBookmarkRow& row, | |
| 97 const std::string& selection, | |
| 98 const std::vector<base::string16>& selection_args, | |
| 99 history::AndroidProviderBackend* backend) { | |
| 100 int count = 0; | |
| 101 backend->UpdateHistoryAndBookmarks(row, selection, selection_args, &count); | |
| 102 return count; | |
| 103 } | |
| 104 | |
| 105 // Deletes the specified rows and returns the number of rows deleted. | |
| 106 // | |
| 107 // |selection| is the SQL WHERE clause without 'WHERE'. | |
| 108 // |selection_args| is the arguments for the WHERE clause. | |
| 109 // | |
| 110 // If |selection| is empty all history and bookmarks are deleted. | |
| 111 int DeleteHistoryAndBookmarksAdapter( | |
| 112 const std::string& selection, | |
| 113 const std::vector<base::string16>& selection_args, | |
| 114 history::AndroidProviderBackend* backend) { | |
| 115 int count = 0; | |
| 116 backend->DeleteHistoryAndBookmarks(selection, selection_args, &count); | |
| 117 return count; | |
| 118 } | |
| 119 | |
| 120 // Deletes the matched history and returns the number of rows deleted. | |
| 121 int DeleteHistoryAdapter(const std::string& selection, | |
| 122 const std::vector<base::string16>& selection_args, | |
| 123 history::AndroidProviderBackend* backend) { | |
| 124 int count = 0; | |
| 125 backend->DeleteHistory(selection, selection_args, &count); | |
| 126 return count; | |
| 127 } | |
| 128 | |
| 129 // Statement ---------------------------------------------------------------- | |
| 130 | |
| 131 // Move the statement's current position. | |
| 132 int MoveStatementAdapter(history::AndroidStatement* statement, | |
| 133 int current_pos, | |
| 134 int destination, | |
| 135 history::AndroidProviderBackend* backend) { | |
| 136 DCHECK_LE(-1, current_pos); | |
| 137 DCHECK_LE(-1, destination); | |
| 138 | |
| 139 int cur = current_pos; | |
| 140 if (current_pos > destination) { | |
| 141 statement->statement()->Reset(false); | |
| 142 cur = -1; | |
| 143 } | |
| 144 for (; cur < destination; ++cur) { | |
| 145 if (!statement->statement()->Step()) | |
| 146 break; | |
| 147 } | |
| 148 | |
| 149 return cur; | |
| 150 } | |
| 151 | |
| 152 // CloseStatementTask delete the passed |statement| in the DB thread (or in the | |
| 153 // UI thread if the HistoryBackend is destroyed before the task is executed). | |
| 154 class CloseStatementTask : public history::HistoryDBTask { | |
| 155 public: | |
| 156 // Close the given statement. The ownership is transfered. | |
| 157 CloseStatementTask(history::AndroidStatement* statement) | |
| 158 : statement_(statement) { | |
| 159 DCHECK(statement_); | |
| 160 } | |
| 161 | |
| 162 ~CloseStatementTask() override { delete statement_; } | |
| 163 | |
| 164 // Returns the cancelable task tracker to use for this task. The task owns it, | |
| 165 // so it can never be cancelled. This is required due to be compatible with | |
| 166 // HistoryService::ScheduleDBTask() interface. | |
| 167 base::CancelableTaskTracker* tracker() { return &tracker_; } | |
| 168 | |
| 169 private: | |
| 170 // history::HistoryDBTask implementation. | |
| 171 bool RunOnDBThread(history::HistoryBackend* backend, | |
| 172 history::HistoryDatabase* db) override { | |
| 173 delete statement_; | |
| 174 statement_ = nullptr; | |
| 175 return true; | |
| 176 } | |
| 177 | |
| 178 void DoneRunOnMainThread() override {} | |
| 179 | |
| 180 history::AndroidStatement* statement_; | |
| 181 base::CancelableTaskTracker tracker_; | |
| 182 }; | |
| 183 | |
| 184 // Search terms ------------------------------------------------------------- | |
| 185 | |
| 186 // Inserts the given values and returns the SearchTermID of the inserted row. | |
| 187 history::SearchTermID InsertSearchTermAdapter( | |
| 188 const history::SearchRow& row, | |
| 189 history::AndroidProviderBackend* backend) { | |
| 190 return backend->InsertSearchTerm(row); | |
| 191 } | |
| 192 | |
| 193 // Returns the number of row updated by the update query. | |
| 194 // | |
| 195 // |row| is the value to update. | |
| 196 // |selection| is the SQL WHERE clause without 'WHERE'. | |
| 197 // |selection_args| is the arguments for the WHERE clause. | |
| 198 int UpdateSearchTermsAdapter(const history::SearchRow& row, | |
| 199 const std::string& selection, | |
| 200 const std::vector<base::string16> selection_args, | |
| 201 history::AndroidProviderBackend* backend) { | |
| 202 int count = 0; | |
| 203 backend->UpdateSearchTerms(row, selection, selection_args, &count); | |
| 204 return count; | |
| 205 } | |
| 206 | |
| 207 // Deletes the matched rows and returns the number of deleted rows. | |
| 208 // | |
| 209 // |selection| is the SQL WHERE clause without 'WHERE'. | |
| 210 // |selection_args| is the arguments for WHERE clause. | |
| 211 // | |
| 212 // If |selection| is empty all search terms will be deleted. | |
| 213 int DeleteSearchTermsAdapter(const std::string& selection, | |
| 214 const std::vector<base::string16> selection_args, | |
| 215 history::AndroidProviderBackend* backend) { | |
| 216 int count = 0; | |
| 217 backend->DeleteSearchTerms(selection, selection_args, &count); | |
| 218 return count; | |
| 219 } | |
| 220 | |
| 221 // Returns the result of the given query. | |
| 222 // | |
| 223 // |projections| specifies the result columns. | |
| 224 // |selection| is the SQL WHERE clause without 'WHERE'. | |
| 225 // |selection_args| is the arguments for WHERE clause. | |
| 226 // |sort_order| is the SQL ORDER clause. | |
| 227 history::AndroidStatement* QuerySearchTermsAdapter( | |
| 228 const std::vector<history::SearchRow::ColumnID>& projections, | |
| 229 const std::string& selection, | |
| 230 const std::vector<base::string16>& selection_args, | |
| 231 const std::string& sort_order, | |
| 232 history::AndroidProviderBackend* backend) { | |
| 233 return backend->QuerySearchTerms(projections, selection, selection_args, | |
| 234 sort_order); | |
| 235 } | |
| 236 | |
| 237 } // namespace | |
| 15 | 238 |
| 16 AndroidHistoryProviderService::AndroidHistoryProviderService(Profile* profile) | 239 AndroidHistoryProviderService::AndroidHistoryProviderService(Profile* profile) |
| 17 : profile_(profile) { | 240 : profile_(profile) { |
| 18 } | 241 } |
| 19 | 242 |
| 20 AndroidHistoryProviderService::~AndroidHistoryProviderService() { | 243 AndroidHistoryProviderService::~AndroidHistoryProviderService() { |
| 21 } | 244 } |
| 22 | 245 |
| 23 base::CancelableTaskTracker::TaskId | 246 base::CancelableTaskTracker::TaskId |
| 24 AndroidHistoryProviderService::QueryHistoryAndBookmarks( | 247 AndroidHistoryProviderService::QueryHistoryAndBookmarks( |
| 25 const std::vector<history::HistoryAndBookmarkRow::ColumnID>& projections, | 248 const std::vector<history::HistoryAndBookmarkRow::ColumnID>& projections, |
| 26 const std::string& selection, | 249 const std::string& selection, |
| 27 const std::vector<base::string16>& selection_args, | 250 const std::vector<base::string16>& selection_args, |
| 28 const std::string& sort_order, | 251 const std::string& sort_order, |
| 29 const QueryCallback& callback, | 252 const QueryCallback& callback, |
| 30 base::CancelableTaskTracker* tracker) { | 253 base::CancelableTaskTracker* tracker) { |
| 31 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 254 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 32 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 255 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 33 if (hs) { | 256 if (!hs) { |
| 34 DCHECK(hs->thread_) << "History service being called after cleanup"; | 257 callback.Run(nullptr); |
| 35 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 36 return tracker->PostTaskAndReplyWithResult( | |
| 37 hs->thread_->message_loop_proxy().get(), | |
| 38 FROM_HERE, | |
| 39 base::Bind(&HistoryBackend::QueryHistoryAndBookmarks, | |
| 40 hs->history_backend_.get(), | |
| 41 projections, | |
| 42 selection, | |
| 43 selection_args, | |
| 44 sort_order), | |
| 45 callback); | |
| 46 } else { | |
| 47 callback.Run(NULL); | |
| 48 return base::CancelableTaskTracker::kBadTaskId; | 258 return base::CancelableTaskTracker::kBadTaskId; |
| 49 } | 259 } |
| 260 return hs->ScheduleDBTask( | |
| 261 CreateAndroidProviderTask( | |
| 262 base::Bind(&QueryHistoryAndBookmarksAdapter, projections, selection, | |
| 263 selection_args, sort_order), | |
| 264 callback), | |
| 265 tracker); | |
| 50 } | 266 } |
| 51 | 267 |
| 52 base::CancelableTaskTracker::TaskId | 268 base::CancelableTaskTracker::TaskId |
| 53 AndroidHistoryProviderService::UpdateHistoryAndBookmarks( | 269 AndroidHistoryProviderService::UpdateHistoryAndBookmarks( |
| 54 const history::HistoryAndBookmarkRow& row, | 270 const history::HistoryAndBookmarkRow& row, |
| 55 const std::string& selection, | 271 const std::string& selection, |
| 56 const std::vector<base::string16>& selection_args, | 272 const std::vector<base::string16>& selection_args, |
| 57 const UpdateCallback& callback, | 273 const UpdateCallback& callback, |
| 58 base::CancelableTaskTracker* tracker) { | 274 base::CancelableTaskTracker* tracker) { |
| 59 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 275 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 60 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 276 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 61 if (hs) { | 277 if (!hs) { |
| 62 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 63 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 64 return tracker->PostTaskAndReplyWithResult( | |
| 65 hs->thread_->message_loop_proxy().get(), | |
| 66 FROM_HERE, | |
| 67 base::Bind(&HistoryBackend::UpdateHistoryAndBookmarks, | |
| 68 hs->history_backend_.get(), | |
| 69 row, | |
| 70 selection, | |
| 71 selection_args), | |
| 72 callback); | |
| 73 } else { | |
| 74 callback.Run(0); | 278 callback.Run(0); |
| 75 return base::CancelableTaskTracker::kBadTaskId; | 279 return base::CancelableTaskTracker::kBadTaskId; |
| 76 } | 280 } |
| 281 return hs->ScheduleDBTask( | |
| 282 CreateAndroidProviderTask(base::Bind(&UpdateHistoryAndBookmarksAdapter, | |
| 283 row, selection, selection_args), | |
| 284 callback), | |
| 285 tracker); | |
| 77 } | 286 } |
| 78 | 287 |
| 79 base::CancelableTaskTracker::TaskId | 288 base::CancelableTaskTracker::TaskId |
| 80 AndroidHistoryProviderService::DeleteHistoryAndBookmarks( | 289 AndroidHistoryProviderService::DeleteHistoryAndBookmarks( |
| 81 const std::string& selection, | 290 const std::string& selection, |
| 82 const std::vector<base::string16>& selection_args, | 291 const std::vector<base::string16>& selection_args, |
| 83 const DeleteCallback& callback, | 292 const DeleteCallback& callback, |
| 84 base::CancelableTaskTracker* tracker) { | 293 base::CancelableTaskTracker* tracker) { |
| 85 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 294 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 86 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 295 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 87 if (hs) { | 296 if (!hs) { |
| 88 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 89 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 90 return tracker->PostTaskAndReplyWithResult( | |
| 91 hs->thread_->message_loop_proxy().get(), | |
| 92 FROM_HERE, | |
| 93 base::Bind(&HistoryBackend::DeleteHistoryAndBookmarks, | |
| 94 hs->history_backend_.get(), | |
| 95 selection, | |
| 96 selection_args), | |
| 97 callback); | |
| 98 } else { | |
| 99 callback.Run(0); | 297 callback.Run(0); |
| 100 return base::CancelableTaskTracker::kBadTaskId; | 298 return base::CancelableTaskTracker::kBadTaskId; |
| 101 } | 299 } |
| 300 return hs->ScheduleDBTask( | |
| 301 CreateAndroidProviderTask(base::Bind(&DeleteHistoryAndBookmarksAdapter, | |
| 302 selection, selection_args), | |
| 303 callback), | |
| 304 tracker); | |
| 102 } | 305 } |
| 103 | 306 |
| 104 base::CancelableTaskTracker::TaskId | 307 base::CancelableTaskTracker::TaskId |
| 105 AndroidHistoryProviderService::InsertHistoryAndBookmark( | 308 AndroidHistoryProviderService::InsertHistoryAndBookmark( |
| 106 const history::HistoryAndBookmarkRow& values, | 309 const history::HistoryAndBookmarkRow& values, |
| 107 const InsertCallback& callback, | 310 const InsertCallback& callback, |
| 108 base::CancelableTaskTracker* tracker) { | 311 base::CancelableTaskTracker* tracker) { |
| 109 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 312 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 110 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 313 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 111 if (hs) { | 314 if (!hs) { |
| 112 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 113 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 114 return tracker->PostTaskAndReplyWithResult( | |
| 115 hs->thread_->message_loop_proxy().get(), | |
| 116 FROM_HERE, | |
| 117 base::Bind(&HistoryBackend::InsertHistoryAndBookmark, | |
| 118 hs->history_backend_.get(), | |
| 119 values), | |
| 120 callback); | |
| 121 } else { | |
| 122 callback.Run(0); | 315 callback.Run(0); |
| 123 return base::CancelableTaskTracker::kBadTaskId; | 316 return base::CancelableTaskTracker::kBadTaskId; |
| 124 } | 317 } |
| 318 return hs->ScheduleDBTask( | |
| 319 CreateAndroidProviderTask( | |
| 320 base::Bind(&InsertHistoryAndBookmarkAdapter, values), callback), | |
| 321 tracker); | |
| 125 } | 322 } |
| 126 | 323 |
| 127 base::CancelableTaskTracker::TaskId | 324 base::CancelableTaskTracker::TaskId |
| 128 AndroidHistoryProviderService::DeleteHistory( | 325 AndroidHistoryProviderService::DeleteHistory( |
| 129 const std::string& selection, | 326 const std::string& selection, |
| 130 const std::vector<base::string16>& selection_args, | 327 const std::vector<base::string16>& selection_args, |
| 131 const DeleteCallback& callback, | 328 const DeleteCallback& callback, |
| 132 base::CancelableTaskTracker* tracker) { | 329 base::CancelableTaskTracker* tracker) { |
| 133 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 330 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 134 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 331 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 135 if (hs) { | 332 if (!hs) { |
| 136 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 137 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 138 return tracker->PostTaskAndReplyWithResult( | |
| 139 hs->thread_->message_loop_proxy().get(), | |
| 140 FROM_HERE, | |
| 141 base::Bind(&HistoryBackend::DeleteHistory, | |
| 142 hs->history_backend_.get(), | |
| 143 selection, | |
| 144 selection_args), | |
| 145 callback); | |
| 146 } else { | |
| 147 callback.Run(0); | 333 callback.Run(0); |
| 148 return base::CancelableTaskTracker::kBadTaskId; | 334 return base::CancelableTaskTracker::kBadTaskId; |
| 149 } | 335 } |
| 336 return hs->ScheduleDBTask( | |
| 337 CreateAndroidProviderTask( | |
| 338 base::Bind(&DeleteHistoryAdapter, selection, selection_args), | |
| 339 callback), | |
| 340 tracker); | |
| 150 } | 341 } |
| 151 | 342 |
| 152 base::CancelableTaskTracker::TaskId | 343 base::CancelableTaskTracker::TaskId |
| 153 AndroidHistoryProviderService::MoveStatement( | 344 AndroidHistoryProviderService::MoveStatement( |
| 154 history::AndroidStatement* statement, | 345 history::AndroidStatement* statement, |
| 155 int current_pos, | 346 int current_pos, |
| 156 int destination, | 347 int destination, |
| 157 const MoveStatementCallback& callback, | 348 const MoveStatementCallback& callback, |
| 158 base::CancelableTaskTracker* tracker) { | 349 base::CancelableTaskTracker* tracker) { |
| 159 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 350 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 160 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 351 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 161 if (hs) { | 352 if (!hs) { |
| 162 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 163 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 164 return tracker->PostTaskAndReplyWithResult( | |
| 165 hs->thread_->message_loop_proxy().get(), | |
| 166 FROM_HERE, | |
| 167 base::Bind(&HistoryBackend::MoveStatement, | |
| 168 hs->history_backend_.get(), | |
| 169 statement, | |
| 170 current_pos, | |
| 171 destination), | |
| 172 callback); | |
| 173 } else { | |
| 174 callback.Run(current_pos); | 353 callback.Run(current_pos); |
| 175 return base::CancelableTaskTracker::kBadTaskId; | 354 return base::CancelableTaskTracker::kBadTaskId; |
| 176 } | 355 } |
| 356 return hs->ScheduleDBTask( | |
| 357 CreateAndroidProviderTask(base::Bind(&MoveStatementAdapter, statement, | |
| 358 current_pos, destination), | |
| 359 callback), | |
| 360 tracker); | |
| 177 } | 361 } |
| 178 | 362 |
| 179 void AndroidHistoryProviderService::CloseStatement( | 363 void AndroidHistoryProviderService::CloseStatement( |
| 180 history::AndroidStatement* statement) { | 364 history::AndroidStatement* statement) { |
| 181 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 365 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 182 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 366 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 183 if (hs) { | 367 if (!hs) { |
| 184 hs->ScheduleTask(HistoryService::PRIORITY_NORMAL, | |
| 185 base::Bind(&HistoryBackend::CloseStatement, | |
| 186 hs->history_backend_.get(), statement)); | |
| 187 } else { | |
| 188 delete statement; | 368 delete statement; |
| 369 return; | |
| 189 } | 370 } |
| 371 scoped_ptr<CloseStatementTask> task(new CloseStatementTask(statement)); | |
| 372 base::CancelableTaskTracker* tracker = task->tracker(); | |
| 373 hs->ScheduleDBTask(task.Pass(), tracker); | |
| 190 } | 374 } |
| 191 | 375 |
| 192 base::CancelableTaskTracker::TaskId | 376 base::CancelableTaskTracker::TaskId |
| 193 AndroidHistoryProviderService::InsertSearchTerm( | 377 AndroidHistoryProviderService::InsertSearchTerm( |
| 194 const history::SearchRow& row, | 378 const history::SearchRow& row, |
| 195 const InsertCallback& callback, | 379 const InsertCallback& callback, |
| 196 base::CancelableTaskTracker* tracker) { | 380 base::CancelableTaskTracker* tracker) { |
| 197 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 381 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 198 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 382 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 199 if (hs) { | 383 if (!hs) { |
| 200 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 201 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 202 return tracker->PostTaskAndReplyWithResult( | |
| 203 hs->thread_->message_loop_proxy().get(), | |
| 204 FROM_HERE, | |
| 205 base::Bind( | |
| 206 &HistoryBackend::InsertSearchTerm, hs->history_backend_.get(), row), | |
| 207 callback); | |
| 208 } else { | |
| 209 callback.Run(0); | 384 callback.Run(0); |
| 210 return base::CancelableTaskTracker::kBadTaskId; | 385 return base::CancelableTaskTracker::kBadTaskId; |
| 211 } | 386 } |
| 387 return hs->ScheduleDBTask( | |
| 388 CreateAndroidProviderTask(base::Bind(&InsertSearchTermAdapter, row), | |
| 389 callback), | |
| 390 tracker); | |
| 212 } | 391 } |
| 213 | 392 |
| 214 base::CancelableTaskTracker::TaskId | 393 base::CancelableTaskTracker::TaskId |
| 215 AndroidHistoryProviderService::UpdateSearchTerms( | 394 AndroidHistoryProviderService::UpdateSearchTerms( |
| 216 const history::SearchRow& row, | 395 const history::SearchRow& row, |
| 217 const std::string& selection, | 396 const std::string& selection, |
| 218 const std::vector<base::string16>& selection_args, | 397 const std::vector<base::string16>& selection_args, |
| 219 const UpdateCallback& callback, | 398 const UpdateCallback& callback, |
| 220 base::CancelableTaskTracker* tracker) { | 399 base::CancelableTaskTracker* tracker) { |
| 221 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 400 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 222 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 401 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 223 if (hs) { | 402 if (!hs) { |
| 224 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 225 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 226 return tracker->PostTaskAndReplyWithResult( | |
| 227 hs->thread_->message_loop_proxy().get(), | |
| 228 FROM_HERE, | |
| 229 base::Bind(&HistoryBackend::UpdateSearchTerms, | |
| 230 hs->history_backend_.get(), | |
| 231 row, | |
| 232 selection, | |
| 233 selection_args), | |
| 234 callback); | |
| 235 } else { | |
| 236 callback.Run(0); | 403 callback.Run(0); |
| 237 return base::CancelableTaskTracker::kBadTaskId; | 404 return base::CancelableTaskTracker::kBadTaskId; |
| 238 } | 405 } |
| 406 return hs->ScheduleDBTask( | |
| 407 CreateAndroidProviderTask( | |
| 408 base::Bind(&UpdateSearchTermsAdapter, row, selection, selection_args), | |
| 409 callback), | |
| 410 tracker); | |
| 239 } | 411 } |
| 240 | 412 |
| 241 base::CancelableTaskTracker::TaskId | 413 base::CancelableTaskTracker::TaskId |
| 242 AndroidHistoryProviderService::DeleteSearchTerms( | 414 AndroidHistoryProviderService::DeleteSearchTerms( |
| 243 const std::string& selection, | 415 const std::string& selection, |
| 244 const std::vector<base::string16>& selection_args, | 416 const std::vector<base::string16>& selection_args, |
| 245 const DeleteCallback& callback, | 417 const DeleteCallback& callback, |
| 246 base::CancelableTaskTracker* tracker) { | 418 base::CancelableTaskTracker* tracker) { |
| 247 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 419 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 248 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 420 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 249 if (hs) { | 421 if (!hs) { |
| 250 DCHECK(hs->thread_) << "History service being called after cleanup"; | |
| 251 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 252 return tracker->PostTaskAndReplyWithResult( | |
| 253 hs->thread_->message_loop_proxy().get(), | |
| 254 FROM_HERE, | |
| 255 base::Bind(&HistoryBackend::DeleteSearchTerms, | |
| 256 hs->history_backend_.get(), | |
| 257 selection, | |
| 258 selection_args), | |
| 259 callback); | |
| 260 } else { | |
| 261 callback.Run(0); | 422 callback.Run(0); |
| 262 return base::CancelableTaskTracker::kBadTaskId; | 423 return base::CancelableTaskTracker::kBadTaskId; |
| 263 } | 424 } |
| 425 return hs->ScheduleDBTask( | |
| 426 CreateAndroidProviderTask( | |
| 427 base::Bind(&DeleteSearchTermsAdapter, selection, selection_args), | |
| 428 callback), | |
| 429 tracker); | |
| 264 } | 430 } |
| 265 | 431 |
| 266 base::CancelableTaskTracker::TaskId | 432 base::CancelableTaskTracker::TaskId |
| 267 AndroidHistoryProviderService::QuerySearchTerms( | 433 AndroidHistoryProviderService::QuerySearchTerms( |
| 268 const std::vector<history::SearchRow::ColumnID>& projections, | 434 const std::vector<history::SearchRow::ColumnID>& projections, |
| 269 const std::string& selection, | 435 const std::string& selection, |
| 270 const std::vector<base::string16>& selection_args, | 436 const std::vector<base::string16>& selection_args, |
| 271 const std::string& sort_order, | 437 const std::string& sort_order, |
| 272 const QueryCallback& callback, | 438 const QueryCallback& callback, |
| 273 base::CancelableTaskTracker* tracker) { | 439 base::CancelableTaskTracker* tracker) { |
| 274 HistoryService* hs = HistoryServiceFactory::GetForProfile( | 440 HistoryService* hs = HistoryServiceFactory::GetForProfile( |
| 275 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 441 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 276 if (hs) { | 442 if (!hs) { |
| 277 DCHECK(hs->thread_) << "History service being called after cleanup"; | 443 callback.Run(nullptr); |
| 278 DCHECK(hs->thread_checker_.CalledOnValidThread()); | |
| 279 return tracker->PostTaskAndReplyWithResult( | |
| 280 hs->thread_->message_loop_proxy().get(), | |
| 281 FROM_HERE, | |
| 282 base::Bind(&HistoryBackend::QuerySearchTerms, | |
| 283 hs->history_backend_.get(), | |
| 284 projections, | |
| 285 selection, | |
| 286 selection_args, | |
| 287 sort_order), | |
| 288 callback); | |
| 289 } else { | |
| 290 callback.Run(NULL); | |
| 291 return base::CancelableTaskTracker::kBadTaskId; | 444 return base::CancelableTaskTracker::kBadTaskId; |
| 292 } | 445 } |
| 446 return hs->ScheduleDBTask( | |
| 447 CreateAndroidProviderTask( | |
| 448 base::Bind(&QuerySearchTermsAdapter, projections, selection, | |
| 449 selection_args, sort_order), | |
| 450 callback), | |
| 451 tracker); | |
| 293 } | 452 } |
| 294 | 453 |
| 295 base::CancelableTaskTracker::TaskId | 454 base::CancelableTaskTracker::TaskId |
| 296 AndroidHistoryProviderService::GetLargestRawFaviconForID( | 455 AndroidHistoryProviderService::GetLargestRawFaviconForID( |
| 297 favicon_base::FaviconID favicon_id, | 456 favicon_base::FaviconID favicon_id, |
| 298 const favicon_base::FaviconRawBitmapCallback& callback, | 457 const favicon_base::FaviconRawBitmapCallback& callback, |
| 299 base::CancelableTaskTracker* tracker) { | 458 base::CancelableTaskTracker* tracker) { |
| 300 FaviconService* fs = FaviconServiceFactory::GetForProfile( | 459 FaviconService* fs = FaviconServiceFactory::GetForProfile( |
| 301 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 460 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 302 DCHECK(fs); | 461 DCHECK(fs); |
| 303 return fs->GetLargestRawFaviconForID(favicon_id, callback, tracker); | 462 return fs->GetLargestRawFaviconForID(favicon_id, callback, tracker); |
| 304 } | 463 } |
| OLD | NEW |