Index: chrome/browser/ui/webui/history2_ui.cc |
diff --git a/chrome/browser/ui/webui/history2_ui.cc b/chrome/browser/ui/webui/history2_ui.cc |
deleted file mode 100644 |
index cf6988b26c110c1ccf239e64102bb262296c8b7a..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/webui/history2_ui.cc |
+++ /dev/null |
@@ -1,406 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/ui/webui/history2_ui.h" |
- |
-#include <set> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback_old.h" |
-#include "base/i18n/time_formatting.h" |
-#include "base/memory/singleton.h" |
-#include "base/message_loop.h" |
-#include "base/string16.h" |
-#include "base/string_number_conversions.h" |
-#include "base/string_piece.h" |
-#include "base/threading/thread.h" |
-#include "base/time.h" |
-#include "base/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "chrome/browser/bookmarks/bookmark_model.h" |
-#include "chrome/browser/history/history_notifications.h" |
-#include "chrome/browser/history/history_types.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/webui/chrome_web_ui_data_source.h" |
-#include "chrome/browser/ui/webui/favicon_source.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "chrome/common/time_format.h" |
-#include "chrome/common/url_constants.h" |
-#include "content/browser/tab_contents/tab_contents.h" |
-#include "content/browser/tab_contents/tab_contents_delegate.h" |
-#include "content/browser/user_metrics.h" |
-#include "content/public/browser/notification_details.h" |
-#include "content/public/browser/notification_source.h" |
-#include "grit/browser_resources.h" |
-#include "grit/chromium_strings.h" |
-#include "grit/generated_resources.h" |
-#include "grit/locale_settings.h" |
-#include "grit/theme_resources.h" |
-#include "grit/theme_resources_standard.h" |
-#include "net/base/escape.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
- |
-// Maximum number of search results to return in a given search. We should |
-// eventually remove this. |
-static const int kMaxSearchResults = 100; |
- |
-namespace { |
- |
-ChromeWebUIDataSource* CreateHistory2UIHTMLSource() { |
- ChromeWebUIDataSource* source = |
- new ChromeWebUIDataSource(chrome::kChromeUIHistory2Host); |
- |
- source->AddLocalizedString("loading", IDS_HISTORY_LOADING); |
- source->AddLocalizedString("title", IDS_HISTORY_TITLE); |
- source->AddLocalizedString("newest", IDS_HISTORY_NEWEST); |
- source->AddLocalizedString("newer", IDS_HISTORY_NEWER); |
- source->AddLocalizedString("older", IDS_HISTORY_OLDER); |
- source->AddLocalizedString("searchresultsfor", IDS_HISTORY_SEARCHRESULTSFOR); |
- source->AddLocalizedString("history", IDS_HISTORY_BROWSERESULTS); |
- source->AddLocalizedString("cont", IDS_HISTORY_CONTINUED); |
- source->AddLocalizedString("searchbutton", IDS_HISTORY_SEARCH_BUTTON); |
- source->AddLocalizedString("noresults", IDS_HISTORY_NO_RESULTS); |
- source->AddLocalizedString("noitems", IDS_HISTORY_NO_ITEMS); |
- source->AddLocalizedString("edithistory", IDS_HISTORY_START_EDITING_HISTORY); |
- source->AddLocalizedString("doneediting", IDS_HISTORY_STOP_EDITING_HISTORY); |
- source->AddLocalizedString("removeselected", |
- IDS_HISTORY_REMOVE_SELECTED_ITEMS); |
- source->AddLocalizedString("clearallhistory", |
- IDS_HISTORY_OPEN_CLEAR_BROWSING_DATA_DIALOG); |
- source->AddLocalizedString("deletewarning", |
- IDS_HISTORY_DELETE_PRIOR_VISITS_WARNING); |
- source->AddLocalizedString("actionMenuDescription", |
- IDS_HISTORY_ACTION_MENU_DESCRIPTION); |
- source->AddLocalizedString("removeFromHistory", IDS_HISTORY_REMOVE_PAGE); |
- source->AddLocalizedString("moreFromSite", IDS_HISTORY_MORE_FROM_SITE); |
- source->set_json_path("strings.js"); |
- source->add_resource_path("history2.js", IDR_HISTORY2_JS); |
- source->set_default_resource(IDR_HISTORY2_HTML); |
- return source; |
-}; |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// |
-// HistoryHandler |
-// |
-//////////////////////////////////////////////////////////////////////////////// |
-BrowsingHistoryHandler2::BrowsingHistoryHandler2() |
- : search_text_() { |
-} |
- |
-BrowsingHistoryHandler2::~BrowsingHistoryHandler2() { |
- cancelable_search_consumer_.CancelAllRequests(); |
- cancelable_delete_consumer_.CancelAllRequests(); |
-} |
- |
-WebUIMessageHandler* BrowsingHistoryHandler2::Attach(WebUI* web_ui) { |
- // Create our favicon data source. |
- Profile* profile = Profile::FromWebUI(web_ui); |
- profile->GetChromeURLDataManager()->AddDataSource( |
- new FaviconSource(profile, FaviconSource::FAVICON)); |
- |
- // Get notifications when history is cleared. |
- registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
- content::Source<Profile>(profile->GetOriginalProfile())); |
- return WebUIMessageHandler::Attach(web_ui); |
-} |
- |
-void BrowsingHistoryHandler2::RegisterMessages() { |
- web_ui_->RegisterMessageCallback("getHistory", |
- base::Bind(&BrowsingHistoryHandler2::HandleGetHistory, |
- base::Unretained(this))); |
- web_ui_->RegisterMessageCallback("searchHistory", |
- base::Bind(&BrowsingHistoryHandler2::HandleSearchHistory, |
- base::Unretained(this))); |
- web_ui_->RegisterMessageCallback("removeURLsOnOneDay", |
- base::Bind(&BrowsingHistoryHandler2::HandleRemoveURLsOnOneDay, |
- base::Unretained(this))); |
- web_ui_->RegisterMessageCallback("clearBrowsingData", |
- base::Bind(&BrowsingHistoryHandler2::HandleClearBrowsingData, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingHistoryHandler2::HandleGetHistory(const ListValue* args) { |
- // Anything in-flight is invalid. |
- cancelable_search_consumer_.CancelAllRequests(); |
- |
- // Get arguments (if any). |
- int day = 0; |
- ExtractIntegerValue(args, &day); |
- |
- // Set our query options. |
- history::QueryOptions options; |
- options.begin_time = base::Time::Now().LocalMidnight(); |
- options.begin_time -= base::TimeDelta::FromDays(day); |
- options.end_time = base::Time::Now().LocalMidnight(); |
- options.end_time -= base::TimeDelta::FromDays(day - 1); |
- |
- // Need to remember the query string for our results. |
- search_text_ = string16(); |
- |
- HistoryService* hs = |
- Profile::FromWebUI(web_ui_)->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- hs->QueryHistory(search_text_, |
- options, |
- &cancelable_search_consumer_, |
- base::Bind(&BrowsingHistoryHandler2::QueryComplete, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingHistoryHandler2::HandleSearchHistory(const ListValue* args) { |
- // Anything in-flight is invalid. |
- cancelable_search_consumer_.CancelAllRequests(); |
- |
- // Get arguments (if any). |
- int month = 0; |
- string16 query; |
- ExtractSearchHistoryArguments(args, &month, &query); |
- |
- // Set the query ranges for the given month. |
- history::QueryOptions options = CreateMonthQueryOptions(month); |
- |
- // When searching, limit the number of results returned. |
- options.max_count = kMaxSearchResults; |
- |
- // Need to remember the query string for our results. |
- search_text_ = query; |
- HistoryService* hs = |
- Profile::FromWebUI(web_ui_)->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- hs->QueryHistory(search_text_, |
- options, |
- &cancelable_search_consumer_, |
- base::Bind(&BrowsingHistoryHandler2::QueryComplete, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingHistoryHandler2::HandleRemoveURLsOnOneDay(const ListValue* args) { |
- if (cancelable_delete_consumer_.HasPendingRequests()) { |
- web_ui_->CallJavascriptFunction("deleteFailed"); |
- return; |
- } |
- |
- // Get day to delete data from. |
- int visit_time = 0; |
- if (!ExtractIntegerValue(args, &visit_time)) { |
- LOG(ERROR) << "Unable to extract integer argument."; |
- web_ui_->CallJavascriptFunction("deleteFailed"); |
- return; |
- } |
- base::Time::Exploded exploded; |
- base::Time::FromTimeT( |
- static_cast<time_t>(visit_time)).LocalExplode(&exploded); |
- exploded.hour = exploded.minute = exploded.second = exploded.millisecond = 0; |
- base::Time begin_time = base::Time::FromLocalExploded(exploded); |
- base::Time end_time = begin_time + base::TimeDelta::FromDays(1); |
- |
- // Get URLs. |
- DCHECK(urls_to_be_deleted_.empty()); |
- for (ListValue::const_iterator v = args->begin() + 1; |
- v != args->end(); ++v) { |
- if ((*v)->GetType() != Value::TYPE_STRING) |
- continue; |
- const StringValue* string_value = static_cast<const StringValue*>(*v); |
- string16 string16_value; |
- if (!string_value->GetAsString(&string16_value)) |
- continue; |
- |
- urls_to_be_deleted_.insert(GURL(string16_value)); |
- } |
- |
- HistoryService* hs = |
- Profile::FromWebUI(web_ui_)->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- hs->ExpireHistoryBetween( |
- urls_to_be_deleted_, begin_time, end_time, &cancelable_delete_consumer_, |
- base::Bind(&BrowsingHistoryHandler2::RemoveComplete, |
- base::Unretained(this))); |
-} |
- |
-void BrowsingHistoryHandler2::HandleClearBrowsingData(const ListValue* args) { |
- // TODO(beng): This is an improper direct dependency on Browser. Route this |
- // through some sort of delegate. |
- Profile* profile = Profile::FromWebUI(web_ui_); |
- Browser* browser = BrowserList::FindBrowserWithProfile(profile); |
- if (browser) |
- browser->OpenClearBrowsingDataDialog(); |
-} |
- |
-void BrowsingHistoryHandler2::QueryComplete( |
- HistoryService::Handle request_handle, |
- history::QueryResults* results) { |
- |
- ListValue results_value; |
- base::Time midnight_today = base::Time::Now().LocalMidnight(); |
- |
- for (size_t i = 0; i < results->size(); ++i) { |
- history::URLResult const &page = (*results)[i]; |
- DictionaryValue* page_value = new DictionaryValue(); |
- SetURLAndTitle(page_value, page.title(), page.url()); |
- |
- // Need to pass the time in epoch time (fastest JS conversion). |
- page_value->SetInteger("time", |
- static_cast<int>(page.visit_time().ToTimeT())); |
- |
- // Until we get some JS i18n infrastructure, we also need to |
- // pass the dates in as strings. This could use some |
- // optimization. |
- |
- // Only pass in the strings we need (search results need a shortdate |
- // and snippet, browse results need day and time information). |
- if (search_text_.empty()) { |
- // Figure out the relative date string. |
- string16 date_str = TimeFormat::RelativeDate(page.visit_time(), |
- &midnight_today); |
- if (date_str.empty()) { |
- date_str = base::TimeFormatFriendlyDate(page.visit_time()); |
- } else { |
- date_str = l10n_util::GetStringFUTF16( |
- IDS_HISTORY_DATE_WITH_RELATIVE_TIME, |
- date_str, |
- base::TimeFormatFriendlyDate(page.visit_time())); |
- } |
- page_value->SetString("dateRelativeDay", date_str); |
- page_value->SetString("dateTimeOfDay", |
- base::TimeFormatTimeOfDay(page.visit_time())); |
- } else { |
- page_value->SetString("dateShort", |
- base::TimeFormatShortDate(page.visit_time())); |
- page_value->SetString("snippet", page.snippet().text()); |
- } |
- Profile* profile = Profile::FromWebUI(web_ui_); |
- page_value->SetBoolean("starred", |
- profile->GetBookmarkModel()->IsBookmarked(page.url())); |
- results_value.Append(page_value); |
- } |
- |
- DictionaryValue info_value; |
- info_value.SetString("term", search_text_); |
- info_value.SetBoolean("finished", results->reached_beginning()); |
- |
- web_ui_->CallJavascriptFunction("historyResult", info_value, results_value); |
-} |
- |
-void BrowsingHistoryHandler2::RemoveComplete() { |
- urls_to_be_deleted_.clear(); |
- |
- // Notify the page that the deletion request succeeded. |
- web_ui_->CallJavascriptFunction("deleteComplete"); |
-} |
- |
-void BrowsingHistoryHandler2::ExtractSearchHistoryArguments( |
- const ListValue* args, |
- int* month, |
- string16* query) { |
- *month = 0; |
- Value* list_member; |
- |
- // Get search string. |
- if (args->Get(0, &list_member) && |
- list_member->GetType() == Value::TYPE_STRING) { |
- const StringValue* string_value = |
- static_cast<const StringValue*>(list_member); |
- string_value->GetAsString(query); |
- } |
- |
- // Get search month. |
- if (args->Get(1, &list_member) && |
- list_member->GetType() == Value::TYPE_STRING) { |
- const StringValue* string_value = |
- static_cast<const StringValue*>(list_member); |
- string16 string16_value; |
- if (string_value->GetAsString(&string16_value)) |
- base::StringToInt(string16_value, month); |
- } |
-} |
- |
-history::QueryOptions BrowsingHistoryHandler2::CreateMonthQueryOptions( |
- int month) { |
- history::QueryOptions options; |
- |
- // Configure the begin point of the search to the start of the |
- // current month. |
- base::Time::Exploded exploded; |
- base::Time::Now().LocalMidnight().LocalExplode(&exploded); |
- exploded.day_of_month = 1; |
- |
- if (month == 0) { |
- options.begin_time = base::Time::FromLocalExploded(exploded); |
- |
- // Set the end time of this first search to null (which will |
- // show results from the future, should the user's clock have |
- // been set incorrectly). |
- options.end_time = base::Time(); |
- } else { |
- // Set the end-time of this search to the end of the month that is |
- // |depth| months before the search end point. The end time is not |
- // inclusive, so we should feel free to set it to midnight on the |
- // first day of the following month. |
- exploded.month -= month - 1; |
- while (exploded.month < 1) { |
- exploded.month += 12; |
- exploded.year--; |
- } |
- options.end_time = base::Time::FromLocalExploded(exploded); |
- |
- // Set the begin-time of the search to the start of the month |
- // that is |depth| months prior to search_start_. |
- if (exploded.month > 1) { |
- exploded.month--; |
- } else { |
- exploded.month = 12; |
- exploded.year--; |
- } |
- options.begin_time = base::Time::FromLocalExploded(exploded); |
- } |
- |
- return options; |
-} |
- |
-void BrowsingHistoryHandler2::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (type != chrome::NOTIFICATION_HISTORY_URLS_DELETED) { |
- NOTREACHED(); |
- return; |
- } |
- history::URLsDeletedDetails* deletedDetails = |
- content::Details<history::URLsDeletedDetails>(details).ptr(); |
- if (deletedDetails->urls != urls_to_be_deleted_) { |
- // Notify the page that someone else deleted from the history. |
- web_ui_->CallJavascriptFunction("historyDeleted"); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// |
-// HistoryUIContents |
-// |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-HistoryUI2::HistoryUI2(TabContents* contents) : ChromeWebUI(contents) { |
- AddMessageHandler((new BrowsingHistoryHandler2())->Attach(this)); |
- |
- // Set up the chrome://history2/ source. |
- Profile* profile = Profile::FromBrowserContext(contents->browser_context()); |
- profile->GetChromeURLDataManager()->AddDataSource( |
- CreateHistory2UIHTMLSource()); |
-} |
- |
-// static |
-const GURL HistoryUI2::GetHistoryURLWithSearchText(const string16& text) { |
- return GURL(std::string(chrome::kChromeUIHistory2URL) + "#q=" + |
- net::EscapeQueryParamValue(UTF16ToUTF8(text), true)); |
-} |
- |
-// static |
-RefCountedMemory* HistoryUI2::GetFaviconResourceBytes() { |
- return ResourceBundle::GetSharedInstance(). |
- LoadDataResourceBytes(IDR_HISTORY_FAVICON); |
-} |