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_provider_backend.h" | 5 #include "chrome/browser/history/android/android_provider_backend.h" |
6 | 6 |
7 #include "base/i18n/case_conversion.h" | 7 #include "base/i18n/case_conversion.h" |
8 #include "chrome/browser/chrome_notification_types.h" | 8 #include "chrome/browser/chrome_notification_types.h" |
9 #include "chrome/browser/favicon/favicon_changed_details.h" | |
10 #include "chrome/browser/history/android/android_time.h" | 9 #include "chrome/browser/history/android/android_time.h" |
11 #include "chrome/browser/history/android/android_urls_sql_handler.h" | 10 #include "chrome/browser/history/android/android_urls_sql_handler.h" |
12 #include "chrome/browser/history/android/bookmark_model_sql_handler.h" | 11 #include "chrome/browser/history/android/bookmark_model_sql_handler.h" |
13 #include "chrome/browser/history/android/favicon_sql_handler.h" | 12 #include "chrome/browser/history/android/favicon_sql_handler.h" |
14 #include "chrome/browser/history/android/urls_sql_handler.h" | 13 #include "chrome/browser/history/android/urls_sql_handler.h" |
15 #include "chrome/browser/history/android/visit_sql_handler.h" | 14 #include "chrome/browser/history/android/visit_sql_handler.h" |
16 #include "chrome/browser/history/history_backend.h" | 15 #include "chrome/browser/history/history_backend.h" |
17 #include "chrome/browser/history/history_database.h" | 16 #include "chrome/browser/history/history_database.h" |
18 #include "chrome/browser/history/thumbnail_database.h" | 17 #include "chrome/browser/history/thumbnail_database.h" |
19 #include "components/history/core/browser/history_client.h" | 18 #include "components/history/core/browser/history_client.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 return false; | 107 return false; |
109 | 108 |
110 if (row.last_visit_time().ToInternalValue() - | 109 if (row.last_visit_time().ToInternalValue() - |
111 row.created().ToInternalValue() < row.visit_count()) | 110 row.created().ToInternalValue() < row.visit_count()) |
112 return false; | 111 return false; |
113 } | 112 } |
114 } | 113 } |
115 return true; | 114 return true; |
116 } | 115 } |
117 | 116 |
| 117 void RunNotifyFaviconChanged(HistoryBackend::Delegate* delegate, |
| 118 scoped_ptr<std::set<GURL> > changed_favicons) { |
| 119 delegate->NotifyFaviconChanged(*changed_favicons); |
| 120 } |
| 121 |
118 } // namespace | 122 } // namespace |
119 | 123 |
120 | |
121 // AndroidProviderBackend::HistoryNotifications ------------------------------- | |
122 | |
123 AndroidProviderBackend::HistoryNotifications::HistoryNotifications() { | |
124 } | |
125 | |
126 AndroidProviderBackend::HistoryNotifications::~HistoryNotifications() { | |
127 } | |
128 | |
129 void AndroidProviderBackend::HistoryNotifications::PushBack( | |
130 int type, | |
131 scoped_ptr<HistoryDetails> detail) { | |
132 DCHECK_EQ(types_.size(), details_.size()); | |
133 types_.push_back(type); | |
134 details_.push_back(detail.release()); | |
135 } | |
136 | |
137 int AndroidProviderBackend::HistoryNotifications::PopBackType() { | |
138 DCHECK(!empty()); | |
139 int type = types_.back(); | |
140 types_.pop_back(); | |
141 return type; | |
142 } | |
143 | |
144 scoped_ptr<HistoryDetails> | |
145 AndroidProviderBackend::HistoryNotifications::PopBackDetails() { | |
146 DCHECK(!details_.empty()); | |
147 scoped_ptr<HistoryDetails> detail(details_.back()); | |
148 details_.weak_erase(details_.end() - 1); | |
149 return detail.Pass(); | |
150 } | |
151 | |
152 | |
153 // AndroidProviderBackend::ScopedTransaction ---------------------------------- | 124 // AndroidProviderBackend::ScopedTransaction ---------------------------------- |
154 | 125 |
155 AndroidProviderBackend::ScopedTransaction::ScopedTransaction( | 126 AndroidProviderBackend::ScopedTransaction::ScopedTransaction( |
156 HistoryDatabase* history_db, | 127 HistoryDatabase* history_db, |
157 ThumbnailDatabase* thumbnail_db) | 128 ThumbnailDatabase* thumbnail_db) |
158 : history_db_(history_db), | 129 : history_db_(history_db), |
159 thumbnail_db_(thumbnail_db), | 130 thumbnail_db_(thumbnail_db), |
160 committed_(false), | 131 committed_(false), |
161 history_transaction_nesting_(history_db_->transaction_nesting()), | 132 history_transaction_nesting_(history_db_->transaction_nesting()), |
162 thumbnail_transaction_nesting_( | 133 thumbnail_transaction_nesting_( |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 for (std::vector<SQLHandler*>::iterator i = | 328 for (std::vector<SQLHandler*>::iterator i = |
358 sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { | 329 sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { |
359 if ((*i)->HasColumnIn(row)) { | 330 if ((*i)->HasColumnIn(row)) { |
360 if (!(*i)->Update(row, ids_set)) | 331 if (!(*i)->Update(row, ids_set)) |
361 return false; | 332 return false; |
362 } | 333 } |
363 } | 334 } |
364 *updated_count = ids_set.size(); | 335 *updated_count = ids_set.size(); |
365 | 336 |
366 scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); | 337 scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); |
367 scoped_ptr<FaviconChangedDetails> favicon(new FaviconChangedDetails); | 338 scoped_ptr<std::set<GURL> > favicon(new std::set<GURL>); |
368 | 339 |
369 for (TableIDRows::const_iterator i = ids_set.begin(); i != ids_set.end(); | 340 for (TableIDRows::const_iterator i = ids_set.begin(); i != ids_set.end(); |
370 ++i) { | 341 ++i) { |
371 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE) || | 342 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE) || |
372 row.is_value_set_explicitly(HistoryAndBookmarkRow::VISIT_COUNT) || | 343 row.is_value_set_explicitly(HistoryAndBookmarkRow::VISIT_COUNT) || |
373 row.is_value_set_explicitly(HistoryAndBookmarkRow::LAST_VISIT_TIME)) { | 344 row.is_value_set_explicitly(HistoryAndBookmarkRow::LAST_VISIT_TIME)) { |
374 URLRow url_row; | 345 URLRow url_row; |
375 if (!history_db_->GetURLRow(i->url_id, &url_row)) | 346 if (!history_db_->GetURLRow(i->url_id, &url_row)) |
376 return false; | 347 return false; |
377 modified->changed_urls.push_back(url_row); | 348 modified->changed_urls.push_back(url_row); |
378 } | 349 } |
379 if (thumbnail_db_ && | 350 if (thumbnail_db_ && |
380 row.is_value_set_explicitly(HistoryAndBookmarkRow::FAVICON)) | 351 row.is_value_set_explicitly(HistoryAndBookmarkRow::FAVICON)) |
381 favicon->urls.insert(i->url); | 352 favicon->insert(i->url); |
382 } | 353 } |
383 | 354 |
384 if (!modified->changed_urls.empty()) { | 355 if (!modified->changed_urls.empty()) { |
385 notifications->PushBack(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 356 scoped_ptr<HistoryDetails> details = modified.PassAs<HistoryDetails>(); |
386 modified.PassAs<HistoryDetails>()); | 357 notifications->push_back( |
| 358 base::Bind(&HistoryBackend::Delegate::BroadcastNotifications, |
| 359 base::Unretained(delegate_), |
| 360 chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, |
| 361 base::Passed(&details))); |
387 } | 362 } |
388 | 363 |
389 if (!favicon->urls.empty()) { | 364 if (!favicon->empty()) { |
390 notifications->PushBack(chrome::NOTIFICATION_FAVICON_CHANGED, | 365 notifications->push_back(base::Bind(&RunNotifyFaviconChanged, |
391 favicon.PassAs<HistoryDetails>()); | 366 base::Unretained(delegate_), |
| 367 base::Passed(&favicon))); |
392 } | 368 } |
393 | 369 |
394 return true; | 370 return true; |
395 } | 371 } |
396 | 372 |
397 AndroidURLID AndroidProviderBackend::InsertHistoryAndBookmark( | 373 AndroidURLID AndroidProviderBackend::InsertHistoryAndBookmark( |
398 const HistoryAndBookmarkRow& values, | 374 const HistoryAndBookmarkRow& values, |
399 bool ensure_initialized_and_updated, | 375 bool ensure_initialized_and_updated, |
400 HistoryNotifications* notifications) { | 376 HistoryNotifications* notifications) { |
401 if (!IsHistoryAndBookmarkRowValid(values)) | 377 if (!IsHistoryAndBookmarkRowValid(values)) |
402 return false; | 378 return false; |
403 | 379 |
404 if (ensure_initialized_and_updated && !EnsureInitializedAndUpdated()) | 380 if (ensure_initialized_and_updated && !EnsureInitializedAndUpdated()) |
405 return 0; | 381 return 0; |
406 | 382 |
407 DCHECK(values.is_value_set_explicitly(HistoryAndBookmarkRow::URL)); | 383 DCHECK(values.is_value_set_explicitly(HistoryAndBookmarkRow::URL)); |
408 // Make a copy of values as we need change it during insert. | 384 // Make a copy of values as we need change it during insert. |
409 HistoryAndBookmarkRow row = values; | 385 HistoryAndBookmarkRow row = values; |
410 for (std::vector<SQLHandler*>::iterator i = | 386 for (std::vector<SQLHandler*>::iterator i = |
411 sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { | 387 sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { |
412 if (!(*i)->Insert(&row)) | 388 if (!(*i)->Insert(&row)) |
413 return 0; | 389 return 0; |
414 } | 390 } |
415 | 391 |
416 URLRow url_row; | 392 URLRow url_row; |
417 if (!history_db_->GetURLRow(row.url_id(), &url_row)) | 393 if (!history_db_->GetURLRow(row.url_id(), &url_row)) |
418 return false; | 394 return false; |
419 | 395 |
420 scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); | 396 scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); |
421 if (!modified.get()) | |
422 return false; | |
423 modified->changed_urls.push_back(url_row); | 397 modified->changed_urls.push_back(url_row); |
424 | 398 |
425 scoped_ptr<FaviconChangedDetails> favicon; | 399 scoped_ptr<std::set<GURL> > favicon; |
426 // No favicon should be changed if the thumbnail_db_ is not available. | 400 // No favicon should be changed if the thumbnail_db_ is not available. |
427 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::FAVICON) && | 401 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::FAVICON) && |
428 row.favicon_valid() && thumbnail_db_) { | 402 row.favicon_valid() && thumbnail_db_) { |
429 favicon.reset(new FaviconChangedDetails); | 403 favicon.reset(new std::set<GURL>); |
430 if (!favicon.get()) | 404 favicon->insert(url_row.url()); |
431 return false; | |
432 favicon->urls.insert(url_row.url()); | |
433 } | 405 } |
434 | 406 |
435 notifications->PushBack(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 407 scoped_ptr<HistoryDetails> details = modified.PassAs<HistoryDetails>(); |
436 modified.PassAs<HistoryDetails>()); | 408 notifications->push_back( |
| 409 base::Bind(&HistoryBackend::Delegate::BroadcastNotifications, |
| 410 base::Unretained(delegate_), |
| 411 chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, |
| 412 base::Passed(&details))); |
| 413 |
437 if (favicon) { | 414 if (favicon) { |
438 notifications->PushBack(chrome::NOTIFICATION_FAVICON_CHANGED, | 415 DCHECK(!favicon->empty()); |
439 favicon.PassAs<HistoryDetails>()); | 416 notifications->push_back(base::Bind(&RunNotifyFaviconChanged, |
| 417 base::Unretained(delegate_), |
| 418 base::Passed(&favicon))); |
440 } | 419 } |
441 | 420 |
442 return row.id(); | 421 return row.id(); |
443 } | 422 } |
444 | 423 |
445 bool AndroidProviderBackend::DeleteHistoryAndBookmarks( | 424 bool AndroidProviderBackend::DeleteHistoryAndBookmarks( |
446 const std::string& selection, | 425 const std::string& selection, |
447 const std::vector<base::string16>& selection_args, | 426 const std::vector<base::string16>& selection_args, |
448 int * deleted_count, | 427 int * deleted_count, |
449 HistoryNotifications* notifications) { | 428 HistoryNotifications* notifications) { |
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 | 982 |
1004 HistoryAndBookmarkRow new_row; | 983 HistoryAndBookmarkRow new_row; |
1005 new_row.set_last_visit_time(FromDatabaseTime( | 984 new_row.set_last_visit_time(FromDatabaseTime( |
1006 statement->statement()->ColumnInt64(0))); | 985 statement->statement()->ColumnInt64(0))); |
1007 new_row.set_created(FromDatabaseTime( | 986 new_row.set_created(FromDatabaseTime( |
1008 statement->statement()->ColumnInt64(1))); | 987 statement->statement()->ColumnInt64(1))); |
1009 new_row.set_visit_count(statement->statement()->ColumnInt(2)); | 988 new_row.set_visit_count(statement->statement()->ColumnInt(2)); |
1010 new_row.set_title(statement->statement()->ColumnString16(3)); | 989 new_row.set_title(statement->statement()->ColumnString16(3)); |
1011 | 990 |
1012 scoped_ptr<URLsDeletedDetails> deleted_details(new URLsDeletedDetails); | 991 scoped_ptr<URLsDeletedDetails> deleted_details(new URLsDeletedDetails); |
1013 scoped_ptr<FaviconChangedDetails> favicon_details(new FaviconChangedDetails); | 992 scoped_ptr<std::set<GURL> > favicons(new std::set<GURL>); |
1014 scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); | 993 scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); |
1015 URLRow old_url_row; | 994 URLRow old_url_row; |
1016 if (!history_db_->GetURLRow(ids[0].url_id, &old_url_row)) | 995 if (!history_db_->GetURLRow(ids[0].url_id, &old_url_row)) |
1017 return false; | 996 return false; |
1018 deleted_details->rows.push_back(old_url_row); | 997 deleted_details->rows.push_back(old_url_row); |
1019 | 998 |
1020 favicon_base::FaviconID favicon_id = statement->statement()->ColumnInt64(4); | 999 favicon_base::FaviconID favicon_id = statement->statement()->ColumnInt64(4); |
1021 if (favicon_id) { | 1000 if (favicon_id) { |
1022 std::vector<FaviconBitmap> favicon_bitmaps; | 1001 std::vector<FaviconBitmap> favicon_bitmaps; |
1023 if (!thumbnail_db_ || | 1002 if (!thumbnail_db_ || |
1024 !thumbnail_db_->GetFaviconBitmaps(favicon_id, &favicon_bitmaps)) | 1003 !thumbnail_db_->GetFaviconBitmaps(favicon_id, &favicon_bitmaps)) |
1025 return false; | 1004 return false; |
1026 scoped_refptr<base::RefCountedMemory> bitmap_data = | 1005 scoped_refptr<base::RefCountedMemory> bitmap_data = |
1027 favicon_bitmaps[0].bitmap_data; | 1006 favicon_bitmaps[0].bitmap_data; |
1028 if (bitmap_data.get() && bitmap_data->size()) | 1007 if (bitmap_data.get() && bitmap_data->size()) |
1029 new_row.set_favicon(bitmap_data); | 1008 new_row.set_favicon(bitmap_data); |
1030 favicon_details->urls.insert(old_url_row.url()); | 1009 favicons->insert(old_url_row.url()); |
1031 favicon_details->urls.insert(row.url()); | 1010 favicons->insert(row.url()); |
1032 } | 1011 } |
1033 new_row.set_is_bookmark(statement->statement()->ColumnBool(5)); | 1012 new_row.set_is_bookmark(statement->statement()->ColumnBool(5)); |
1034 | 1013 |
1035 // The SQLHandler vector is not used here because the row in android_url | 1014 // The SQLHandler vector is not used here because the row in android_url |
1036 // shouldn't be deleted, we need keep the AndroidUIID unchanged, so it | 1015 // shouldn't be deleted, we need keep the AndroidUIID unchanged, so it |
1037 // appears update to the client. | 1016 // appears update to the client. |
1038 if (!urls_handler_->Delete(ids)) | 1017 if (!urls_handler_->Delete(ids)) |
1039 return false; | 1018 return false; |
1040 | 1019 |
1041 if (!visit_handler_->Delete(ids)) | 1020 if (!visit_handler_->Delete(ids)) |
(...skipping 10 matching lines...) Expand all Loading... |
1052 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::LAST_VISIT_TIME)) | 1031 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::LAST_VISIT_TIME)) |
1053 new_row.set_last_visit_time(row.last_visit_time()); | 1032 new_row.set_last_visit_time(row.last_visit_time()); |
1054 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::CREATED)) | 1033 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::CREATED)) |
1055 new_row.set_created(row.created()); | 1034 new_row.set_created(row.created()); |
1056 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::VISIT_COUNT)) | 1035 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::VISIT_COUNT)) |
1057 new_row.set_visit_count(row.visit_count()); | 1036 new_row.set_visit_count(row.visit_count()); |
1058 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE)) | 1037 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE)) |
1059 new_row.set_title(row.title()); | 1038 new_row.set_title(row.title()); |
1060 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::FAVICON)) { | 1039 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::FAVICON)) { |
1061 new_row.set_favicon(row.favicon()); | 1040 new_row.set_favicon(row.favicon()); |
1062 favicon_details->urls.insert(new_row.url()); | 1041 favicons->insert(new_row.url()); |
1063 } | 1042 } |
1064 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK)) | 1043 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK)) |
1065 new_row.set_is_bookmark(row.is_bookmark()); | 1044 new_row.set_is_bookmark(row.is_bookmark()); |
1066 | 1045 |
1067 if (!urls_handler_->Insert(&new_row)) | 1046 if (!urls_handler_->Insert(&new_row)) |
1068 return false; | 1047 return false; |
1069 | 1048 |
1070 if (!visit_handler_->Insert(&new_row)) | 1049 if (!visit_handler_->Insert(&new_row)) |
1071 return false; | 1050 return false; |
1072 | 1051 |
1073 // Update the current row instead of inserting a new row in android urls | 1052 // Update the current row instead of inserting a new row in android urls |
1074 // table. We need keep the AndroidUIID unchanged, so it appears update | 1053 // table. We need keep the AndroidUIID unchanged, so it appears update |
1075 // to the client. | 1054 // to the client. |
1076 if (!android_urls_handler_->Update(new_row, ids)) | 1055 if (!android_urls_handler_->Update(new_row, ids)) |
1077 return false; | 1056 return false; |
1078 | 1057 |
1079 if (favicon_handler_ && !favicon_handler_->Insert(&new_row)) | 1058 if (favicon_handler_ && !favicon_handler_->Insert(&new_row)) |
1080 return false; | 1059 return false; |
1081 | 1060 |
1082 if (!bookmark_model_handler_->Insert(&new_row)) | 1061 if (!bookmark_model_handler_->Insert(&new_row)) |
1083 return false; | 1062 return false; |
1084 | 1063 |
1085 URLRow new_url_row; | 1064 URLRow new_url_row; |
1086 if (!history_db_->GetURLRow(new_row.url_id(), &new_url_row)) | 1065 if (!history_db_->GetURLRow(new_row.url_id(), &new_url_row)) |
1087 return false; | 1066 return false; |
1088 | 1067 |
1089 modified->changed_urls.push_back(new_url_row); | 1068 modified->changed_urls.push_back(new_url_row); |
1090 | 1069 |
1091 notifications->PushBack(chrome::NOTIFICATION_HISTORY_URLS_DELETED, | 1070 scoped_ptr<HistoryDetails> details = deleted_details.PassAs<HistoryDetails>(); |
1092 deleted_details.PassAs<HistoryDetails>()); | 1071 notifications->push_back( |
1093 if (favicon_details && !favicon_details->urls.empty()) { | 1072 base::Bind(&HistoryBackend::Delegate::BroadcastNotifications, |
1094 notifications->PushBack(chrome::NOTIFICATION_FAVICON_CHANGED, | 1073 base::Unretained(delegate_), |
1095 favicon_details.PassAs<HistoryDetails>()); | 1074 chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
| 1075 base::Passed(&details))); |
| 1076 if (favicons && !favicons->empty()) { |
| 1077 notifications->push_back(base::Bind(&RunNotifyFaviconChanged, |
| 1078 base::Unretained(delegate_), |
| 1079 base::Passed(&favicons))); |
1096 } | 1080 } |
1097 notifications->PushBack(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 1081 scoped_ptr<HistoryDetails> other_details = modified.PassAs<HistoryDetails>(); |
1098 modified.PassAs<HistoryDetails>()); | 1082 notifications->push_back( |
| 1083 base::Bind(&HistoryBackend::Delegate::BroadcastNotifications, |
| 1084 base::Unretained(delegate_), |
| 1085 chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, |
| 1086 base::Passed(&other_details))); |
1099 | 1087 |
1100 return true; | 1088 return true; |
1101 } | 1089 } |
1102 | 1090 |
1103 AndroidStatement* AndroidProviderBackend::QueryHistoryAndBookmarksInternal( | 1091 AndroidStatement* AndroidProviderBackend::QueryHistoryAndBookmarksInternal( |
1104 const std::vector<HistoryAndBookmarkRow::ColumnID>& projections, | 1092 const std::vector<HistoryAndBookmarkRow::ColumnID>& projections, |
1105 const std::string& selection, | 1093 const std::string& selection, |
1106 const std::vector<base::string16>& selection_args, | 1094 const std::vector<base::string16>& selection_args, |
1107 const std::string& sort_order) { | 1095 const std::string& sort_order) { |
1108 std::string sql; | 1096 std::string sql; |
(...skipping 23 matching lines...) Expand all Loading... |
1132 } | 1120 } |
1133 sql::Statement* result = statement.release(); | 1121 sql::Statement* result = statement.release(); |
1134 return new AndroidStatement(result, replaced_index); | 1122 return new AndroidStatement(result, replaced_index); |
1135 } | 1123 } |
1136 | 1124 |
1137 bool AndroidProviderBackend::DeleteHistoryInternal( | 1125 bool AndroidProviderBackend::DeleteHistoryInternal( |
1138 const TableIDRows& urls, | 1126 const TableIDRows& urls, |
1139 bool delete_bookmarks, | 1127 bool delete_bookmarks, |
1140 HistoryNotifications* notifications) { | 1128 HistoryNotifications* notifications) { |
1141 scoped_ptr<URLsDeletedDetails> deleted_details(new URLsDeletedDetails); | 1129 scoped_ptr<URLsDeletedDetails> deleted_details(new URLsDeletedDetails); |
1142 scoped_ptr<FaviconChangedDetails> favicon(new FaviconChangedDetails); | 1130 scoped_ptr<std::set<GURL> > favicon(new std::set<GURL>); |
1143 for (TableIDRows::const_iterator i = urls.begin(); i != urls.end(); ++i) { | 1131 for (TableIDRows::const_iterator i = urls.begin(); i != urls.end(); ++i) { |
1144 URLRow url_row; | 1132 URLRow url_row; |
1145 if (!history_db_->GetURLRow(i->url_id, &url_row)) | 1133 if (!history_db_->GetURLRow(i->url_id, &url_row)) |
1146 return false; | 1134 return false; |
1147 deleted_details->rows.push_back(url_row); | 1135 deleted_details->rows.push_back(url_row); |
1148 if (thumbnail_db_ && | 1136 if (thumbnail_db_ && |
1149 thumbnail_db_->GetIconMappingsForPageURL(url_row.url(), NULL)) | 1137 thumbnail_db_->GetIconMappingsForPageURL(url_row.url(), NULL)) |
1150 favicon->urls.insert(url_row.url()); | 1138 favicon->insert(url_row.url()); |
1151 } | 1139 } |
1152 | 1140 |
1153 // Only invoke Delete on the BookmarkModelHandler if we need | 1141 // Only invoke Delete on the BookmarkModelHandler if we need |
1154 // to delete bookmarks. | 1142 // to delete bookmarks. |
1155 for (std::vector<SQLHandler*>::iterator i = | 1143 for (std::vector<SQLHandler*>::iterator i = |
1156 sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { | 1144 sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { |
1157 if ((*i) != bookmark_model_handler_.get() || delete_bookmarks) | 1145 if ((*i) != bookmark_model_handler_.get() || delete_bookmarks) |
1158 if (!(*i)->Delete(urls)) | 1146 if (!(*i)->Delete(urls)) |
1159 return false; | 1147 return false; |
1160 } | 1148 } |
1161 | 1149 |
1162 notifications->PushBack(chrome::NOTIFICATION_HISTORY_URLS_DELETED, | 1150 scoped_ptr<HistoryDetails> details = deleted_details.PassAs<HistoryDetails>(); |
1163 deleted_details.PassAs<HistoryDetails>()); | 1151 notifications->push_back( |
1164 if (favicon && !favicon->urls.empty()) { | 1152 base::Bind(&HistoryBackend::Delegate::BroadcastNotifications, |
1165 notifications->PushBack(chrome::NOTIFICATION_FAVICON_CHANGED, | 1153 base::Unretained(delegate_), |
1166 favicon.PassAs<HistoryDetails>()); | 1154 chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
| 1155 base::Passed(&details))); |
| 1156 if (favicon && !favicon->empty()) { |
| 1157 notifications->push_back(base::Bind(&RunNotifyFaviconChanged, |
| 1158 base::Unretained(delegate_), |
| 1159 base::Passed(&favicon))); |
1167 } | 1160 } |
1168 return true; | 1161 return true; |
1169 } | 1162 } |
1170 | 1163 |
1171 void AndroidProviderBackend::BroadcastNotifications( | 1164 void AndroidProviderBackend::BroadcastNotifications( |
1172 HistoryNotifications* notifications) { | 1165 HistoryNotifications* notifications) { |
1173 while (!notifications->empty()) { | 1166 while (!notifications->empty()) { |
1174 delegate_->BroadcastNotifications(notifications->PopBackType(), | 1167 notifications->back().Run(); |
1175 notifications->PopBackDetails()); | 1168 notifications->pop_back(); |
1176 } | 1169 } |
1177 } | 1170 } |
1178 | 1171 |
1179 bool AndroidProviderBackend::AddSearchTerm(const SearchRow& values) { | 1172 bool AndroidProviderBackend::AddSearchTerm(const SearchRow& values) { |
1180 DCHECK(values.is_value_set_explicitly(SearchRow::SEARCH_TERM)); | 1173 DCHECK(values.is_value_set_explicitly(SearchRow::SEARCH_TERM)); |
1181 DCHECK(values.is_value_set_explicitly(SearchRow::KEYWORD_ID)); | 1174 DCHECK(values.is_value_set_explicitly(SearchRow::KEYWORD_ID)); |
1182 DCHECK(values.is_value_set_explicitly(SearchRow::URL)); | 1175 DCHECK(values.is_value_set_explicitly(SearchRow::URL)); |
1183 | 1176 |
1184 URLRow url_row; | 1177 URLRow url_row; |
1185 HistoryAndBookmarkRow bookmark_row; | 1178 HistoryAndBookmarkRow bookmark_row; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1221 return false; | 1214 return false; |
1222 | 1215 |
1223 if (!history_db_->SetKeywordSearchTermsForURL(bookmark_row.url_id(), | 1216 if (!history_db_->SetKeywordSearchTermsForURL(bookmark_row.url_id(), |
1224 values.keyword_id(), values.search_term())) | 1217 values.keyword_id(), values.search_term())) |
1225 return false; | 1218 return false; |
1226 } | 1219 } |
1227 return true; | 1220 return true; |
1228 } | 1221 } |
1229 | 1222 |
1230 } // namespace history | 1223 } // namespace history |
OLD | NEW |