Index: chrome/browser/search_engines/template_url_fetcher.cc |
diff --git a/chrome/browser/search_engines/template_url_fetcher.cc b/chrome/browser/search_engines/template_url_fetcher.cc |
deleted file mode 100644 |
index 0022b50d8b442424560c22e6d2bffe7871fe00a5..0000000000000000000000000000000000000000 |
--- a/chrome/browser/search_engines/template_url_fetcher.cc |
+++ /dev/null |
@@ -1,265 +0,0 @@ |
-// Copyright (c) 2012 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 "build/build_config.h" |
- |
-#include "chrome/browser/search_engines/template_url_fetcher.h" |
- |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/search_engines/template_url_parser.h" |
-#include "components/search_engines/template_url.h" |
-#include "components/search_engines/template_url_service.h" |
-#include "net/base/load_flags.h" |
-#include "net/url_request/url_fetcher.h" |
-#include "net/url_request/url_fetcher_delegate.h" |
-#include "net/url_request/url_request_context_getter.h" |
-#include "net/url_request/url_request_status.h" |
- |
-// RequestDelegate ------------------------------------------------------------ |
-class TemplateURLFetcher::RequestDelegate : public net::URLFetcherDelegate { |
- public: |
- RequestDelegate( |
- TemplateURLFetcher* fetcher, |
- const base::string16& keyword, |
- const GURL& osdd_url, |
- const GURL& favicon_url, |
- const URLFetcherCustomizeCallback& url_fetcher_customize_callback, |
- const ConfirmAddSearchProviderCallback& confirm_add_callback, |
- ProviderType provider_type); |
- |
- // net::URLFetcherDelegate: |
- // If data contains a valid OSDD, a TemplateURL is created and added to |
- // the TemplateURLService. |
- virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; |
- |
- // URL of the OSDD. |
- GURL url() const { return osdd_url_; } |
- |
- // Keyword to use. |
- base::string16 keyword() const { return keyword_; } |
- |
- // The type of search provider being fetched. |
- ProviderType provider_type() const { return provider_type_; } |
- |
- private: |
- void OnLoaded(); |
- void AddSearchProvider(); |
- |
- scoped_ptr<net::URLFetcher> url_fetcher_; |
- TemplateURLFetcher* fetcher_; |
- scoped_ptr<TemplateURL> template_url_; |
- base::string16 keyword_; |
- const GURL osdd_url_; |
- const GURL favicon_url_; |
- const ProviderType provider_type_; |
- ConfirmAddSearchProviderCallback confirm_add_callback_; |
- |
- scoped_ptr<TemplateURLService::Subscription> template_url_subscription_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RequestDelegate); |
-}; |
- |
-TemplateURLFetcher::RequestDelegate::RequestDelegate( |
- TemplateURLFetcher* fetcher, |
- const base::string16& keyword, |
- const GURL& osdd_url, |
- const GURL& favicon_url, |
- const URLFetcherCustomizeCallback& url_fetcher_customize_callback, |
- const ConfirmAddSearchProviderCallback& confirm_add_callback, |
- ProviderType provider_type) |
- : url_fetcher_(net::URLFetcher::Create( |
- osdd_url, net::URLFetcher::GET, this)), |
- fetcher_(fetcher), |
- keyword_(keyword), |
- osdd_url_(osdd_url), |
- favicon_url_(favicon_url), |
- provider_type_(provider_type), |
- confirm_add_callback_(confirm_add_callback) { |
- TemplateURLService* model = fetcher_->template_url_service_; |
- DCHECK(model); // TemplateURLFetcher::ScheduleDownload verifies this. |
- |
- if (!model->loaded()) { |
- // Start the model load and set-up waiting for it. |
- template_url_subscription_ = model->RegisterOnLoadedCallback( |
- base::Bind(&TemplateURLFetcher::RequestDelegate::OnLoaded, |
- base::Unretained(this))); |
- model->Load(); |
- } |
- |
- if (!url_fetcher_customize_callback.is_null()) |
- url_fetcher_customize_callback.Run(url_fetcher_.get()); |
- |
- url_fetcher_->SetRequestContext(fetcher->request_context_.get()); |
- url_fetcher_->Start(); |
-} |
- |
-void TemplateURLFetcher::RequestDelegate::OnLoaded() { |
- template_url_subscription_.reset(); |
- if (!template_url_.get()) |
- return; |
- AddSearchProvider(); |
- // WARNING: AddSearchProvider deletes us. |
-} |
- |
-void TemplateURLFetcher::RequestDelegate::OnURLFetchComplete( |
- const net::URLFetcher* source) { |
- // Validation checks. |
- // Make sure we can still replace the keyword, i.e. the fetch was successful. |
- // If the OSDD file was loaded HTTP, we also have to check the response_code. |
- // For other schemes, e.g. when the OSDD file is bundled with an extension, |
- // the response_code is not applicable and should be -1. Also, ensure that |
- // the returned information results in a valid search URL. |
- std::string data; |
- if (!source->GetStatus().is_success() || |
- ((source->GetResponseCode() != -1) && |
- (source->GetResponseCode() != 200)) || |
- !source->GetResponseAsString(&data)) { |
- fetcher_->RequestCompleted(this); |
- // WARNING: RequestCompleted deletes us. |
- return; |
- } |
- |
- template_url_.reset(TemplateURLParser::Parse( |
- fetcher_->template_url_service_->search_terms_data(), false, |
- data.data(), data.length(), NULL)); |
- if (!template_url_.get() || |
- !template_url_->url_ref().SupportsReplacement( |
- fetcher_->template_url_service_->search_terms_data())) { |
- fetcher_->RequestCompleted(this); |
- // WARNING: RequestCompleted deletes us. |
- return; |
- } |
- |
- if (provider_type_ != AUTODETECTED_PROVIDER || keyword_.empty()) { |
- // Use the parser-generated new keyword from the URL in the OSDD for the |
- // non-autodetected case. The existing |keyword_| was generated from the |
- // URL that hosted the OSDD, which results in the wrong keyword when the |
- // OSDD was located on a third-party site that has nothing in common with |
- // search engine described by OSDD. |
- keyword_ = template_url_->keyword(); |
- DCHECK(!keyword_.empty()); |
- } |
- |
- // Wait for the model to be loaded before adding the provider. |
- if (!fetcher_->template_url_service_->loaded()) |
- return; |
- AddSearchProvider(); |
- // WARNING: AddSearchProvider deletes us. |
-} |
- |
-void TemplateURLFetcher::RequestDelegate::AddSearchProvider() { |
- DCHECK(template_url_.get()); |
- DCHECK(!keyword_.empty()); |
- TemplateURLService* model = fetcher_->template_url_service_; |
- DCHECK(model); |
- DCHECK(model->loaded()); |
- |
- TemplateURL* existing_url = NULL; |
- if (model->CanReplaceKeyword(keyword_, GURL(template_url_->url()), |
- &existing_url)) { |
- if (existing_url) |
- model->Remove(existing_url); |
- } else if (provider_type_ == AUTODETECTED_PROVIDER) { |
- fetcher_->RequestCompleted(this); // WARNING: Deletes us! |
- return; |
- } |
- |
- // The short name is what is shown to the user. We preserve original names |
- // since it is better when generated keyword in many cases. |
- TemplateURLData data(template_url_->data()); |
- data.SetKeyword(keyword_); |
- data.originating_url = osdd_url_; |
- |
- // The page may have specified a URL to use for favicons, if not, set it. |
- if (!data.favicon_url.is_valid()) |
- data.favicon_url = favicon_url_; |
- |
- switch (provider_type_) { |
- case AUTODETECTED_PROVIDER: |
- // Mark the keyword as replaceable so it can be removed if necessary. |
- data.safe_for_autoreplace = true; |
- model->Add(new TemplateURL(data)); |
- break; |
- |
- case EXPLICIT_PROVIDER: |
- // Confirm addition and allow user to edit default choices. It's ironic |
- // that only *non*-autodetected additions get confirmed, but the user |
- // expects feedback that his action did something. |
- // The source WebContents' delegate takes care of adding the URL to the |
- // model, which takes ownership, or of deleting it if the add is |
- // cancelled. |
- confirm_add_callback_.Run(make_scoped_ptr(new TemplateURL(data))); |
- break; |
- |
- default: |
- NOTREACHED(); |
- break; |
- } |
- |
- fetcher_->RequestCompleted(this); |
- // WARNING: RequestCompleted deletes us. |
-} |
- |
-// TemplateURLFetcher --------------------------------------------------------- |
- |
-TemplateURLFetcher::TemplateURLFetcher( |
- TemplateURLService* template_url_service, |
- net::URLRequestContextGetter* request_context) |
- : template_url_service_(template_url_service), |
- request_context_(request_context) { |
-} |
- |
-TemplateURLFetcher::~TemplateURLFetcher() { |
-} |
- |
-void TemplateURLFetcher::ScheduleDownload( |
- const base::string16& keyword, |
- const GURL& osdd_url, |
- const GURL& favicon_url, |
- const URLFetcherCustomizeCallback& url_fetcher_customize_callback, |
- const ConfirmAddSearchProviderCallback& confirm_add_callback, |
- ProviderType provider_type) { |
- DCHECK(osdd_url.is_valid()); |
- |
- // For a JS-added OSDD, the provided keyword is irrelevant because we will |
- // generate a keyword later from the OSDD content. For the autodetected case, |
- // we need a valid keyword up front. |
- if (provider_type == TemplateURLFetcher::AUTODETECTED_PROVIDER) { |
- DCHECK(!keyword.empty()); |
- |
- if (!template_url_service_->loaded()) { |
- // We could try to set up a callback to this function again once the model |
- // is loaded but since this is an auto-add case anyway, meh. |
- template_url_service_->Load(); |
- return; |
- } |
- |
- const TemplateURL* template_url = |
- template_url_service_->GetTemplateURLForKeyword(keyword); |
- if (template_url && (!template_url->safe_for_autoreplace() || |
- template_url->originating_url() == osdd_url)) |
- return; |
- } |
- |
- // Make sure we aren't already downloading this request. |
- for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) { |
- if (((*i)->url() == osdd_url) || |
- ((provider_type == TemplateURLFetcher::AUTODETECTED_PROVIDER) && |
- ((*i)->keyword() == keyword))) |
- return; |
- } |
- |
- requests_.push_back(new RequestDelegate( |
- this, keyword, osdd_url, favicon_url, url_fetcher_customize_callback, |
- confirm_add_callback, provider_type)); |
-} |
- |
-void TemplateURLFetcher::RequestCompleted(RequestDelegate* request) { |
- Requests::iterator i = |
- std::find(requests_.begin(), requests_.end(), request); |
- DCHECK(i != requests_.end()); |
- requests_.weak_erase(i); |
- delete request; |
-} |