diff options
Diffstat (limited to 'chrome/browser/history/android/android_provider_backend.cc')
-rw-r--r-- | chrome/browser/history/android/android_provider_backend.cc | 126 |
1 files changed, 98 insertions, 28 deletions
diff --git a/chrome/browser/history/android/android_provider_backend.cc b/chrome/browser/history/android/android_provider_backend.cc index 74662a5..264d54a 100644 --- a/chrome/browser/history/android/android_provider_backend.cc +++ b/chrome/browser/history/android/android_provider_backend.cc @@ -26,7 +26,7 @@ namespace history { namespace { -const char* kVirtualBookmarkTable = +const char* kVirtualHistoryAndBookmarkTable = "SELECT android_urls.id AS _id, " "android_cache_db.bookmark_cache.created_time AS created, " "urls.title AS title, android_urls.raw_url AS url, " @@ -199,6 +199,22 @@ bool AndroidProviderBackend::DeleteHistoryAndBookmarks( return true; } +bool AndroidProviderBackend::DeleteHistory( + const std::string& selection, + const std::vector<string16>& selection_args, + int* deleted_count) { + HistoryNotifications notifications; + + ScopedTransaction transaction(history_db_, thumbnail_db_); + + if (!DeleteHistory(selection, selection_args, deleted_count, + ¬ifications)) + return false; + + transaction.Commit(); + BroadcastNotifications(notifications); + return true; +} AndroidProviderBackend::HistoryNotification::HistoryNotification( int type, @@ -250,8 +266,7 @@ bool AndroidProviderBackend::UpdateHistoryAndBookmarks( return false; TableIDRows ids_set; - if (!GetSelectedURLs(selection, selection_args, kVirtualBookmarkTable, - &ids_set)) + if (!GetSelectedURLs(selection, selection_args, &ids_set)) return false; if (ids_set.empty()) { @@ -364,40 +379,65 @@ bool AndroidProviderBackend::DeleteHistoryAndBookmarks( return false; TableIDRows ids_set; - if (!GetSelectedURLs(selection, selection_args, kVirtualBookmarkTable, - &ids_set)) + if (!GetSelectedURLs(selection, selection_args, &ids_set)) return false; if (ids_set.empty()) { - deleted_count = 0; + *deleted_count = 0; return true; } - scoped_ptr<URLsDeletedDetails> deleted_details(new URLsDeletedDetails); - scoped_ptr<FaviconChangeDetails> favicon(new FaviconChangeDetails); + if (!DeleteHistoryInternal(ids_set, notifications)) + return false; + + *deleted_count = ids_set.size(); + + return true; +} + +bool AndroidProviderBackend::DeleteHistory( + const std::string& selection, + const std::vector<string16>& selection_args, + int* deleted_count, + HistoryNotifications* notifications) { + if (!EnsureInitializedAndUpdated()) + return false; + + TableIDRows ids_set; + if (!GetSelectedURLs(selection, selection_args, &ids_set)) + return false; + + if (ids_set.empty()) { + *deleted_count = 0; + return true; + } + + *deleted_count = ids_set.size(); + + // Get the rows bookmarked. + TableIDRows bookmark_rows; for (TableIDRows::const_iterator i = ids_set.begin(); i != ids_set.end(); ++i) { - URLRow url_row; - if (!history_db_->GetURLRow(i->url_id, &url_row)) - return false; - deleted_details->rows.push_back(url_row); - deleted_details->urls.insert(url_row.url()); - if (thumbnail_db_->GetIconMappingsForPageURL(url_row.url(), NULL)) - favicon->urls.insert(url_row.url()); + if (i->bookmarked) + bookmark_rows.push_back(*i); } - for (std::vector<SQLHandler*>::iterator i = - sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { - if (!(*i)->Delete(ids_set)) + if (!DeleteHistoryInternal(ids_set, notifications)) + return false; + + scoped_ptr<URLsModifiedDetails> modified(new URLsModifiedDetails); + for (TableIDRows::const_iterator i = bookmark_rows.begin(); + i != bookmark_rows.end(); ++i) { + URLRow row(i->url); + // Set visit time as UnixEpoch because the Android's system time start from + // the unix epoch. + row.set_last_visit(Time::UnixEpoch()); + if (!history_db_->AddURL(row)) return false; + modified->changed_urls.push_back(row); } - *deleted_count = ids_set.size(); notifications->push_back(HistoryNotification( - chrome::NOTIFICATION_HISTORY_URLS_DELETED, - deleted_details.release())); - if (favicon.get() && !favicon->urls.empty()) - notifications->push_back(HistoryNotification( - chrome::NOTIFICATION_FAVICON_CHANGED, favicon.release())); + chrome::NOTIFICATION_HISTORY_TYPED_URLS_MODIFIED, modified.release())); return true; } @@ -751,10 +791,9 @@ int AndroidProviderBackend::AppendBookmarkResultColumn( bool AndroidProviderBackend::GetSelectedURLs( const std::string& selection, const std::vector<string16>& selection_args, - const char* virtual_table, TableIDRows* rows) { - std::string sql("SELECT url_id, urls_url FROM ("); - sql.append(virtual_table); + std::string sql("SELECT url_id, urls_url, bookmark FROM ("); + sql.append(kVirtualHistoryAndBookmarkTable); sql.append(" )"); if (!selection.empty()) { @@ -773,6 +812,7 @@ bool AndroidProviderBackend::GetSelectedURLs( TableIDRow row; row.url_id = statement.ColumnInt64(0); row.url = GURL(statement.ColumnString(1)); + row.bookmarked = statement.ColumnBool(2); rows->push_back(row); } return true; @@ -951,7 +991,7 @@ AndroidStatement* AndroidProviderBackend::QueryHistoryAndBookmarksInternal( sql.append("SELECT "); int replaced_index = AppendBookmarkResultColumn(projections, &sql); sql.append(" FROM ("); - sql.append(kVirtualBookmarkTable); + sql.append(kVirtualHistoryAndBookmarkTable); sql.append(")"); if (!selection.empty()) { @@ -976,6 +1016,36 @@ AndroidStatement* AndroidProviderBackend::QueryHistoryAndBookmarksInternal( return new AndroidStatement(result, replaced_index); } +bool AndroidProviderBackend::DeleteHistoryInternal( + const TableIDRows& urls, + HistoryNotifications* notifications) { + scoped_ptr<URLsDeletedDetails> deleted_details(new URLsDeletedDetails); + scoped_ptr<FaviconChangeDetails> favicon(new FaviconChangeDetails); + for (TableIDRows::const_iterator i = urls.begin(); i != urls.end(); ++i) { + URLRow url_row; + if (!history_db_->GetURLRow(i->url_id, &url_row)) + return false; + deleted_details->rows.push_back(url_row); + deleted_details->urls.insert(url_row.url()); + if (thumbnail_db_->GetIconMappingsForPageURL(url_row.url(), NULL)) + favicon->urls.insert(url_row.url()); + } + + for (std::vector<SQLHandler*>::iterator i = + sql_handlers_.begin(); i != sql_handlers_.end(); ++i) { + if (!(*i)->Delete(urls)) + return false; + } + + notifications->push_back(HistoryNotification( + chrome::NOTIFICATION_HISTORY_URLS_DELETED, + deleted_details.release())); + if (favicon.get() && !favicon->urls.empty()) + notifications->push_back(HistoryNotification( + chrome::NOTIFICATION_FAVICON_CHANGED, favicon.release())); + return true; +} + void AndroidProviderBackend::BroadcastNotifications( const HistoryNotifications& notifications) { for (HistoryNotifications::const_iterator i = notifications.begin(); |