| Index: chrome/browser/extensions/extension_history_api.cc
|
| diff --git a/chrome/browser/extensions/extension_history_api.cc b/chrome/browser/extensions/extension_history_api.cc
|
| deleted file mode 100644
|
| index cdae1f4abb875fb3f7bbed19a48c9e07692f9bc1..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/extension_history_api.cc
|
| +++ /dev/null
|
| @@ -1,382 +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/extensions/extension_history_api.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/callback.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/task.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/extensions/extension_event_router.h"
|
| -#include "chrome/browser/extensions/extension_history_api_constants.h"
|
| -#include "chrome/browser/history/history.h"
|
| -#include "chrome/browser/history/history_types.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "content/public/browser/notification_details.h"
|
| -#include "content/public/browser/notification_source.h"
|
| -
|
| -namespace keys = extension_history_api_constants;
|
| -
|
| -namespace {
|
| -
|
| -double MilliSecondsFromTime(const base::Time& time) {
|
| - return 1000 * time.ToDoubleT();
|
| -}
|
| -
|
| -void GetHistoryItemDictionary(const history::URLRow& row,
|
| - DictionaryValue* value) {
|
| - value->SetString(keys::kIdKey, base::Int64ToString(row.id()));
|
| - value->SetString(keys::kUrlKey, row.url().spec());
|
| - value->SetString(keys::kTitleKey, row.title());
|
| - value->SetDouble(keys::kLastVisitdKey,
|
| - MilliSecondsFromTime(row.last_visit()));
|
| - value->SetInteger(keys::kTypedCountKey, row.typed_count());
|
| - value->SetInteger(keys::kVisitCountKey, row.visit_count());
|
| -}
|
| -
|
| -void AddHistoryNode(const history::URLRow& row, ListValue* list) {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - GetHistoryItemDictionary(row, dict);
|
| - list->Append(dict);
|
| -}
|
| -
|
| -void GetVisitInfoDictionary(const history::VisitRow& row,
|
| - DictionaryValue* value) {
|
| - value->SetString(keys::kIdKey, base::Int64ToString(row.url_id));
|
| - value->SetString(keys::kVisitId, base::Int64ToString(row.visit_id));
|
| - value->SetDouble(keys::kVisitTime, MilliSecondsFromTime(row.visit_time));
|
| - value->SetString(keys::kReferringVisitId,
|
| - base::Int64ToString(row.referring_visit));
|
| -
|
| - const char* trans =
|
| - content::PageTransitionGetCoreTransitionString(row.transition);
|
| - DCHECK(trans) << "Invalid transition.";
|
| - value->SetString(keys::kTransition, trans);
|
| -}
|
| -
|
| -void AddVisitNode(const history::VisitRow& row, ListValue* list) {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - GetVisitInfoDictionary(row, dict);
|
| - list->Append(dict);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -ExtensionHistoryEventRouter::ExtensionHistoryEventRouter() {}
|
| -
|
| -ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {}
|
| -
|
| -void ExtensionHistoryEventRouter::ObserveProfile(Profile* profile) {
|
| - CHECK(registrar_.IsEmpty());
|
| - const content::Source<Profile> source = content::Source<Profile>(profile);
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_HISTORY_URL_VISITED,
|
| - source);
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_HISTORY_URLS_DELETED,
|
| - source);
|
| -}
|
| -
|
| -void ExtensionHistoryEventRouter::Observe(
|
| - int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - switch (type) {
|
| - case chrome::NOTIFICATION_HISTORY_URL_VISITED:
|
| - HistoryUrlVisited(
|
| - content::Source<Profile>(source).ptr(),
|
| - content::Details<const history::URLVisitedDetails>(details).ptr());
|
| - break;
|
| - case chrome::NOTIFICATION_HISTORY_URLS_DELETED:
|
| - HistoryUrlsRemoved(
|
| - content::Source<Profile>(source).ptr(),
|
| - content::Details<const history::URLsDeletedDetails>(details).ptr());
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -void ExtensionHistoryEventRouter::HistoryUrlVisited(
|
| - Profile* profile,
|
| - const history::URLVisitedDetails* details) {
|
| - ListValue args;
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - GetHistoryItemDictionary(details->row, dict);
|
| - args.Append(dict);
|
| -
|
| - std::string json_args;
|
| - base::JSONWriter::Write(&args, false, &json_args);
|
| - DispatchEvent(profile, keys::kOnVisited, json_args);
|
| -}
|
| -
|
| -void ExtensionHistoryEventRouter::HistoryUrlsRemoved(
|
| - Profile* profile,
|
| - const history::URLsDeletedDetails* details) {
|
| - ListValue args;
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - dict->SetBoolean(keys::kAllHistoryKey, details->all_history);
|
| - ListValue* urls = new ListValue();
|
| - for (std::set<GURL>::const_iterator iterator = details->urls.begin();
|
| - iterator != details->urls.end();
|
| - ++iterator) {
|
| - urls->Append(new StringValue(iterator->spec()));
|
| - }
|
| - dict->Set(keys::kUrlsKey, urls);
|
| - args.Append(dict);
|
| -
|
| - std::string json_args;
|
| - base::JSONWriter::Write(&args, false, &json_args);
|
| - DispatchEvent(profile, keys::kOnVisitRemoved, json_args);
|
| -}
|
| -
|
| -void ExtensionHistoryEventRouter::DispatchEvent(Profile* profile,
|
| - const char* event_name,
|
| - const std::string& json_args) {
|
| - if (profile && profile->GetExtensionEventRouter()) {
|
| - profile->GetExtensionEventRouter()->DispatchEventToRenderers(
|
| - event_name, json_args, profile, GURL());
|
| - }
|
| -}
|
| -
|
| -void HistoryFunction::Run() {
|
| - if (!RunImpl()) {
|
| - SendResponse(false);
|
| - }
|
| -}
|
| -
|
| -bool HistoryFunction::GetUrlFromValue(Value* value, GURL* url) {
|
| - std::string url_string;
|
| - if (!value->GetAsString(&url_string)) {
|
| - bad_message_ = true;
|
| - return false;
|
| - }
|
| -
|
| - GURL temp_url(url_string);
|
| - if (!temp_url.is_valid()) {
|
| - error_ = keys::kInvalidUrlError;
|
| - return false;
|
| - }
|
| - url->Swap(&temp_url);
|
| - return true;
|
| -}
|
| -
|
| -bool HistoryFunction::GetTimeFromValue(Value* value, base::Time* time) {
|
| - double ms_from_epoch = 0.0;
|
| - if (!value->GetAsDouble(&ms_from_epoch))
|
| - return false;
|
| - // The history service has seconds resolution, while javascript Date() has
|
| - // milliseconds resolution.
|
| - double seconds_from_epoch = ms_from_epoch / 1000.0;
|
| - // Time::FromDoubleT converts double time 0 to empty Time object. So we need
|
| - // to do special handling here.
|
| - *time = (seconds_from_epoch == 0) ?
|
| - base::Time::UnixEpoch() : base::Time::FromDoubleT(seconds_from_epoch);
|
| - return true;
|
| -}
|
| -
|
| -HistoryFunctionWithCallback::HistoryFunctionWithCallback() {
|
| -}
|
| -
|
| -HistoryFunctionWithCallback::~HistoryFunctionWithCallback() {
|
| -}
|
| -
|
| -bool HistoryFunctionWithCallback::RunImpl() {
|
| - AddRef(); // Balanced in SendAysncRepose() and below.
|
| - bool retval = RunAsyncImpl();
|
| - if (false == retval)
|
| - Release();
|
| - return retval;
|
| -}
|
| -
|
| -void HistoryFunctionWithCallback::SendAsyncResponse() {
|
| - MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - NewRunnableMethod(
|
| - this,
|
| - &HistoryFunctionWithCallback::SendResponseToCallback));
|
| -}
|
| -
|
| -void HistoryFunctionWithCallback::SendResponseToCallback() {
|
| - SendResponse(true);
|
| - Release(); // Balanced in RunImpl().
|
| -}
|
| -
|
| -bool GetVisitsHistoryFunction::RunAsyncImpl() {
|
| - DictionaryValue* json;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json));
|
| -
|
| - Value* value;
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kUrlKey, &value));
|
| -
|
| - GURL url;
|
| - if (!GetUrlFromValue(value, &url))
|
| - return false;
|
| -
|
| - HistoryService* hs = profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
|
| - hs->QueryURL(url,
|
| - true, // Retrieve full history of a URL.
|
| - &cancelable_consumer_,
|
| - base::Bind(&GetVisitsHistoryFunction::QueryComplete,
|
| - base::Unretained(this)));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void GetVisitsHistoryFunction::QueryComplete(
|
| - HistoryService::Handle request_service,
|
| - bool success,
|
| - const history::URLRow* url_row,
|
| - history::VisitVector* visits) {
|
| - ListValue* list = new ListValue();
|
| - if (visits && !visits->empty()) {
|
| - for (history::VisitVector::iterator iterator = visits->begin();
|
| - iterator != visits->end();
|
| - ++iterator) {
|
| - AddVisitNode(*iterator, list);
|
| - }
|
| - }
|
| - result_.reset(list);
|
| - SendAsyncResponse();
|
| -}
|
| -
|
| -bool SearchHistoryFunction::RunAsyncImpl() {
|
| - DictionaryValue* json;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json));
|
| -
|
| - // Initialize the HistoryQuery
|
| - string16 search_text;
|
| - EXTENSION_FUNCTION_VALIDATE(json->GetString(keys::kTextKey, &search_text));
|
| -
|
| - history::QueryOptions options;
|
| - options.SetRecentDayRange(1);
|
| - options.max_count = 100;
|
| -
|
| - if (json->HasKey(keys::kStartTimeKey)) { // Optional.
|
| - Value* value;
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kStartTimeKey, &value));
|
| - EXTENSION_FUNCTION_VALIDATE(GetTimeFromValue(value, &options.begin_time));
|
| - }
|
| - if (json->HasKey(keys::kEndTimeKey)) { // Optional.
|
| - Value* value;
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kEndTimeKey, &value));
|
| - EXTENSION_FUNCTION_VALIDATE(GetTimeFromValue(value, &options.end_time));
|
| - }
|
| - if (json->HasKey(keys::kMaxResultsKey)) { // Optional.
|
| - EXTENSION_FUNCTION_VALIDATE(json->GetInteger(keys::kMaxResultsKey,
|
| - &options.max_count));
|
| - }
|
| -
|
| - HistoryService* hs = profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
|
| - hs->QueryHistory(search_text, options, &cancelable_consumer_,
|
| - base::Bind(&SearchHistoryFunction::SearchComplete,
|
| - base::Unretained(this)));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void SearchHistoryFunction::SearchComplete(
|
| - HistoryService::Handle request_handle,
|
| - history::QueryResults* results) {
|
| - ListValue* list = new ListValue();
|
| - if (results && !results->empty()) {
|
| - for (history::QueryResults::URLResultVector::const_iterator iterator =
|
| - results->begin();
|
| - iterator != results->end();
|
| - ++iterator) {
|
| - AddHistoryNode(**iterator, list);
|
| - }
|
| - }
|
| - result_.reset(list);
|
| - SendAsyncResponse();
|
| -}
|
| -
|
| -bool AddUrlHistoryFunction::RunImpl() {
|
| - DictionaryValue* json;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json));
|
| -
|
| - Value* value;
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kUrlKey, &value));
|
| -
|
| - GURL url;
|
| - if (!GetUrlFromValue(value, &url))
|
| - return false;
|
| -
|
| - HistoryService* hs = profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
|
| - hs->AddPage(url, history::SOURCE_EXTENSION);
|
| -
|
| - SendResponse(true);
|
| - return true;
|
| -}
|
| -
|
| -bool DeleteUrlHistoryFunction::RunImpl() {
|
| - DictionaryValue* json;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json));
|
| -
|
| - Value* value;
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kUrlKey, &value));
|
| -
|
| - GURL url;
|
| - if (!GetUrlFromValue(value, &url))
|
| - return false;
|
| -
|
| - HistoryService* hs = profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
|
| - hs->DeleteURL(url);
|
| -
|
| - SendResponse(true);
|
| - return true;
|
| -}
|
| -
|
| -bool DeleteRangeHistoryFunction::RunAsyncImpl() {
|
| - DictionaryValue* json;
|
| - EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &json));
|
| -
|
| - Value* value = NULL;
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kStartTimeKey, &value));
|
| - base::Time begin_time;
|
| - EXTENSION_FUNCTION_VALIDATE(GetTimeFromValue(value, &begin_time));
|
| -
|
| - EXTENSION_FUNCTION_VALIDATE(json->Get(keys::kEndTimeKey, &value));
|
| - base::Time end_time;
|
| - EXTENSION_FUNCTION_VALIDATE(GetTimeFromValue(value, &end_time));
|
| -
|
| - std::set<GURL> restrict_urls;
|
| - HistoryService* hs = profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
|
| - hs->ExpireHistoryBetween(
|
| - restrict_urls,
|
| - begin_time,
|
| - end_time,
|
| - &cancelable_consumer_,
|
| - base::Bind(&DeleteRangeHistoryFunction::DeleteComplete,
|
| - base::Unretained(this)));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void DeleteRangeHistoryFunction::DeleteComplete() {
|
| - SendAsyncResponse();
|
| -}
|
| -
|
| -bool DeleteAllHistoryFunction::RunAsyncImpl() {
|
| - std::set<GURL> restrict_urls;
|
| - HistoryService* hs = profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
|
| - hs->ExpireHistoryBetween(
|
| - restrict_urls,
|
| - base::Time::UnixEpoch(), // From the beginning of the epoch.
|
| - base::Time::Now(), // To the current time.
|
| - &cancelable_consumer_,
|
| - base::Bind(&DeleteAllHistoryFunction::DeleteComplete,
|
| - base::Unretained(this)));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void DeleteAllHistoryFunction::DeleteComplete() {
|
| - SendAsyncResponse();
|
| -}
|
|
|