summaryrefslogtreecommitdiffstats
path: root/chrome/browser/template_url_fetcher.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/template_url_fetcher.cc')
-rw-r--r--chrome/browser/template_url_fetcher.cc116
1 files changed, 116 insertions, 0 deletions
diff --git a/chrome/browser/template_url_fetcher.cc b/chrome/browser/template_url_fetcher.cc
new file mode 100644
index 0000000..57bb259
--- /dev/null
+++ b/chrome/browser/template_url_fetcher.cc
@@ -0,0 +1,116 @@
+// Copyright (c) 2006-2008 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/template_url_fetcher.h"
+
+#include "chrome/browser/profile.h"
+#include "chrome/browser/template_url.h"
+#include "chrome/browser/template_url_model.h"
+#include "chrome/browser/template_url_parser.h"
+#include "chrome/browser/views/edit_keyword_controller.h"
+
+// RequestDelegate ------------------------------------------------------------
+
+void TemplateURLFetcher::RequestDelegate::OnURLFetchComplete(
+ const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data) {
+ // Make sure we can still replace the keyword.
+ if (response_code != 200) {
+ fetcher_->RequestCompleted(this);
+ // WARNING: RequestCompleted deletes us.
+ return;
+ }
+
+ scoped_ptr<TemplateURL> template_url(new TemplateURL());
+ if (TemplateURLParser::Parse(
+ reinterpret_cast<const unsigned char*>(data.c_str()),
+ data.length(),
+ NULL,
+ template_url.get()) &&
+ template_url->url() && template_url->url()->SupportsReplacement()) {
+ TemplateURLModel* model = fetcher_->profile()->GetTemplateURLModel();
+ const TemplateURL* existing_url;
+ if (!model || !model->loaded() ||
+ !model->CanReplaceKeyword(keyword_, template_url->url()->url(),
+ &existing_url)) {
+ // TODO(pamg): If we're coming from JS (not autodetected) and this URL
+ // already exists in the model, consider bringing up the
+ // EditKeywordController to edit it. This would be helpful feedback in
+ // the case of clicking a button twice, and annoying in the case of a
+ // page that calls AddSearchProvider() in JS without a user action.
+ fetcher_->RequestCompleted(this);
+ // WARNING: RequestCompleted deletes us.
+ return;
+ }
+
+ if (existing_url)
+ model->Remove(existing_url);
+
+ // The short name is what is shown to the user. We reset it to make sure
+ // we don't display random text from the web.
+ template_url->set_short_name(keyword_);
+ template_url->set_keyword(keyword_);
+ template_url->set_originating_url(osdd_url_);
+
+ // The page may have specified a URL to use for favicons, if not, set it.
+ if (!template_url->GetFavIconURL().is_valid())
+ template_url->SetFavIconURL(favicon_url_);
+
+ if (autodetected_) {
+ // Mark the keyword as replaceable so it can be removed if necessary.
+ template_url->set_safe_for_autoreplace(true);
+ model->Add(template_url.release());
+ } else {
+ // 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 edit controller will take care of adding the URL to the model,
+ // which takes ownership, or of deleting it if the add is cancelled.
+ EditKeywordController* controller =
+ new EditKeywordController(parent_window_,
+ template_url.release(),
+ NULL, // no KeywordEditorView
+ fetcher_->profile());
+ controller->Show();
+ }
+ }
+ fetcher_->RequestCompleted(this);
+ // WARNING: RequestCompleted deletes us.
+}
+
+// TemplateURLFetcher ---------------------------------------------------------
+
+TemplateURLFetcher::TemplateURLFetcher(Profile* profile) : profile_(profile) {
+ DCHECK(profile_);
+}
+
+void TemplateURLFetcher::ScheduleDownload(const std::wstring& keyword,
+ const GURL& osdd_url,
+ const GURL& favicon_url,
+ const HWND parent_window,
+ bool autodetected) {
+ DCHECK(!keyword.empty() && osdd_url.is_valid());
+ // Make sure we aren't already downloading this request.
+ for (std::vector<RequestDelegate*>::iterator i = requests_->begin();
+ i != requests_->end(); ++i) {
+ if ((*i)->url() == osdd_url || (*i)->keyword() == keyword)
+ return;
+ }
+
+ requests_->push_back(
+ new RequestDelegate(this, keyword, osdd_url, favicon_url, parent_window,
+ autodetected));
+}
+
+void TemplateURLFetcher::RequestCompleted(RequestDelegate* request) {
+ DCHECK(find(requests_->begin(), requests_->end(), request) !=
+ requests_->end());
+ requests_->erase(find(requests_->begin(), requests_->end(), request));
+ delete request;
+}
+