Index: chrome/browser/protector/default_search_provider_change.cc |
diff --git a/chrome/browser/protector/default_search_provider_change.cc b/chrome/browser/protector/default_search_provider_change.cc |
deleted file mode 100644 |
index d27e666a62df295f0e21f257eca9ba50089eb1fa..0000000000000000000000000000000000000000 |
--- a/chrome/browser/protector/default_search_provider_change.cc |
+++ /dev/null |
@@ -1,433 +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 <algorithm> |
- |
-#include "base/basictypes.h" |
-#include "base/compiler_specific.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/metrics/histogram.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/protector/base_setting_change.h" |
-#include "chrome/browser/protector/histograms.h" |
-#include "chrome/browser/protector/protector_service.h" |
-#include "chrome/browser/protector/protector_service_factory.h" |
-#include "chrome/browser/search_engines/template_url.h" |
-#include "chrome/browser/search_engines/template_url_prepopulate_data.h" |
-#include "chrome/browser/search_engines/template_url_service.h" |
-#include "chrome/browser/search_engines/template_url_service_factory.h" |
-#include "chrome/browser/search_engines/template_url_service_observer.h" |
-#include "chrome/browser/webdata/keyword_table.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "chrome/common/url_constants.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "content/public/browser/notification_service.h" |
-#include "googleurl/src/gurl.h" |
-#include "grit/chromium_strings.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
- |
-namespace protector { |
- |
-namespace { |
- |
-// Maximum length of the search engine name to be displayed. |
-const size_t kMaxDisplayedNameLength = 16; |
- |
-// Matches TemplateURL with all fields set from the prepopulated data equal |
-// to fields in another TemplateURL. |
-class TemplateURLIsSame { |
- public: |
- // Creates a matcher based on |other|. |
- explicit TemplateURLIsSame(const TemplateURL* other) : other_(other) { |
- } |
- |
- // Returns true if both |other| and |url| are NULL or have same field values. |
- bool operator()(const TemplateURL* url) { |
- if (url == other_ ) |
- return true; |
- if (!url || !other_) |
- return false; |
- return url->short_name() == other_->short_name() && |
- url->HasSameKeywordAs(*other_) && |
- url->url() == other_->url() && |
- url->suggestions_url() == other_->suggestions_url() && |
- url->instant_url() == other_->instant_url() && |
- url->safe_for_autoreplace() == other_->safe_for_autoreplace() && |
- url->favicon_url() == other_->favicon_url() && |
- url->show_in_default_list() == other_->show_in_default_list() && |
- url->input_encodings() == other_->input_encodings() && |
- url->prepopulate_id() == other_->prepopulate_id(); |
- } |
- |
- private: |
- const TemplateURL* other_; |
-}; |
- |
-} // namespace |
- |
-// Default search engine change tracked by Protector. |
-class DefaultSearchProviderChange : public BaseSettingChange, |
- public TemplateURLServiceObserver, |
- public content::NotificationObserver { |
- public: |
- DefaultSearchProviderChange(TemplateURL* new_search_provider, |
- TemplateURL* backup_search_provider); |
- |
- // BaseSettingChange overrides: |
- virtual bool Init(Profile* profile) OVERRIDE; |
- virtual void InitWhenDisabled(Profile* profile) OVERRIDE; |
- virtual void Apply(Browser* browser) OVERRIDE; |
- virtual void Discard(Browser* browser) OVERRIDE; |
- virtual void Timeout() OVERRIDE; |
- virtual int GetBadgeIconID() const OVERRIDE; |
- virtual int GetMenuItemIconID() const OVERRIDE; |
- virtual int GetBubbleIconID() const OVERRIDE; |
- virtual string16 GetBubbleTitle() const OVERRIDE; |
- virtual string16 GetBubbleMessage() const OVERRIDE; |
- virtual string16 GetApplyButtonText() const OVERRIDE; |
- virtual string16 GetDiscardButtonText() const OVERRIDE; |
- virtual DisplayName GetApplyDisplayName() const OVERRIDE; |
- virtual GURL GetNewSettingURL() const OVERRIDE; |
- |
- private: |
- virtual ~DefaultSearchProviderChange(); |
- |
- // TemplateURLServiceObserver overrides: |
- virtual void OnTemplateURLServiceChanged() OVERRIDE; |
- |
- // content::NotificationObserver overrides: |
- virtual void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) OVERRIDE; |
- |
- // Sets the default search provider to |*search_provider|. If a matching |
- // TemplateURL already exists, it is reused and |*search_provider| is reset. |
- // Otherwise, adds |*search_provider| to keywords and releases it. |
- // In both cases, |*search_provider| is NULL after this call. |
- // Returns the new default search provider (either |*search_provider| or the |
- // reused TemplateURL). |
- const TemplateURL* SetDefaultSearchProvider( |
- scoped_ptr<TemplateURL>* search_provider); |
- |
- // Returns true if |new_search_provider_| can be used as the default search |
- // provider. |
- bool NewSearchProviderValid() const; |
- |
- // Opens the Search engine settings page in a new tab. |
- void OpenSearchEngineSettings(Browser* browser); |
- |
- // Returns the TemplateURLService instance for the Profile this change is |
- // related to. |
- TemplateURLService* GetTemplateURLService(); |
- |
- // Histogram ID of the new search provider. |
- int new_histogram_id_; |
- // Indicates that the default search was restored to the prepopulated default |
- // search engines. |
- bool is_fallback_; |
- // Indicates that the the prepopulated default search is the same as |
- // |new_search_provider_|. |
- bool fallback_is_new_; |
- // ID of |new_search_provider_|. |
- TemplateURLID new_id_; |
- // The default search at the moment the change was detected. Will be used to |
- // restore the new default search back if Apply is called. Will be set to |
- // |NULL| if removed from the TemplateURLService. |
- TemplateURL* new_search_provider_; |
- // Default search provider set by Init for the period until user makes a |
- // choice and either Apply or Discard is performed. Never is |NULL| during |
- // that period since the change will dismiss itself if this provider gets |
- // deleted or stops being the default. |
- const TemplateURL* default_search_provider_; |
- // Stores backup of the default search until it becomes owned by the |
- // TemplateURLService or deleted. |
- scoped_ptr<TemplateURL> backup_search_provider_; |
- content::NotificationRegistrar registrar_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DefaultSearchProviderChange); |
-}; |
- |
-DefaultSearchProviderChange::DefaultSearchProviderChange( |
- TemplateURL* new_search_provider, |
- TemplateURL* backup_search_provider) |
- : new_histogram_id_(GetSearchProviderHistogramID(new_search_provider)), |
- is_fallback_(false), |
- fallback_is_new_(false), |
- new_search_provider_(new_search_provider), |
- default_search_provider_(NULL), |
- backup_search_provider_(backup_search_provider) { |
- if (backup_search_provider) { |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderHijacked, |
- new_histogram_id_, |
- kProtectorMaxSearchProviderID); |
- } else { |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderCorrupt, |
- new_histogram_id_, |
- kProtectorMaxSearchProviderID); |
- } |
-} |
- |
-DefaultSearchProviderChange::~DefaultSearchProviderChange() { |
- if (profile()) |
- GetTemplateURLService()->RemoveObserver(this); |
-} |
- |
-bool DefaultSearchProviderChange::Init(Profile* profile) { |
- if (!BaseSettingChange::Init(profile)) |
- return false; |
- |
- if (!backup_search_provider_.get() || |
- !backup_search_provider_->SupportsReplacement()) { |
- // Fallback to a prepopulated default search provider, ignoring any |
- // overrides in Prefs. |
- backup_search_provider_.reset( |
- TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(NULL)); |
- is_fallback_ = true; |
- VLOG(1) << "Fallback search provider: " |
- << backup_search_provider_->short_name(); |
- } |
- |
- default_search_provider_ = SetDefaultSearchProvider(&backup_search_provider_); |
- DCHECK(default_search_provider_); |
- // |backup_search_provider_| should be |NULL| since now. |
- DCHECK(!backup_search_provider_.get()); |
- if (is_fallback_ && default_search_provider_ == new_search_provider_) |
- fallback_is_new_ = true; |
- |
- int restored_histogram_id = |
- GetSearchProviderHistogramID(default_search_provider_); |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderRestored, |
- restored_histogram_id, |
- kProtectorMaxSearchProviderID); |
- |
- if (is_fallback_) { |
- VLOG(1) << "Fallback to search provider: " |
- << default_search_provider_->short_name(); |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderFallback, |
- restored_histogram_id, |
- kProtectorMaxSearchProviderID); |
- } |
- |
- // Listen for the default search provider changes. |
- GetTemplateURLService()->AddObserver(this); |
- |
- if (new_search_provider_) { |
- // Listen for removal of |new_search_provider_|. |
- new_id_ = new_search_provider_->id(); |
- registrar_.Add( |
- this, chrome::NOTIFICATION_TEMPLATE_URL_REMOVED, |
- content::Source<Profile>(profile->GetOriginalProfile())); |
- } |
- |
- return true; |
-} |
- |
-void DefaultSearchProviderChange::InitWhenDisabled(Profile* profile) { |
- // The --no-protector case is handled in TemplateURLService internals. |
- // TODO(ivankr): move it here. |
- NOTREACHED(); |
-} |
- |
-void DefaultSearchProviderChange::Apply(Browser* browser) { |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderApplied, |
- new_histogram_id_, |
- kProtectorMaxSearchProviderID); |
- |
- GetTemplateURLService()->RemoveObserver(this); |
- if (NewSearchProviderValid()) { |
- GetTemplateURLService()->SetDefaultSearchProvider(new_search_provider_); |
- } else { |
- // Open settings page in case the new setting is invalid. |
- OpenSearchEngineSettings(browser); |
- } |
-} |
- |
-void DefaultSearchProviderChange::Discard(Browser* browser) { |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderDiscarded, |
- new_histogram_id_, |
- kProtectorMaxSearchProviderID); |
- |
- GetTemplateURLService()->RemoveObserver(this); |
- if (is_fallback_) { |
- // Open settings page in case the old setting is invalid. |
- OpenSearchEngineSettings(browser); |
- } |
- // Nothing to do otherwise since we have already set the search engine |
- // to |old_id_| in |Init|. |
-} |
- |
-void DefaultSearchProviderChange::Timeout() { |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderTimeout, |
- new_histogram_id_, |
- kProtectorMaxSearchProviderID); |
-} |
- |
-int DefaultSearchProviderChange::GetBadgeIconID() const { |
- return IDR_SEARCH_ENGINE_CHANGE_BADGE; |
-} |
- |
-int DefaultSearchProviderChange::GetMenuItemIconID() const { |
- return IDR_SEARCH_ENGINE_CHANGE_MENU; |
-} |
- |
-int DefaultSearchProviderChange::GetBubbleIconID() const { |
- return IDR_SEARCH_ENGINE_CHANGE_ALERT; |
-} |
- |
-string16 DefaultSearchProviderChange::GetBubbleTitle() const { |
- return l10n_util::GetStringUTF16(IDS_SEARCH_ENGINE_CHANGE_TITLE); |
-} |
- |
-string16 DefaultSearchProviderChange::GetBubbleMessage() const { |
- if (is_fallback_) { |
- return l10n_util::GetStringFUTF16( |
- IDS_SEARCH_ENGINE_CHANGE_NO_BACKUP_MESSAGE, |
- default_search_provider_->short_name()); |
- } |
- return l10n_util::GetStringUTF16(IDS_SEARCH_ENGINE_CHANGE_MESSAGE); |
-} |
- |
-string16 DefaultSearchProviderChange::GetApplyButtonText() const { |
- if (NewSearchProviderValid()) { |
- // If backup search engine is lost and fallback was made to the current |
- // search provider then there is no need to show this button. |
- if (fallback_is_new_) |
- return string16(); |
- string16 name = new_search_provider_->short_name(); |
- return (name.length() > kMaxDisplayedNameLength) ? |
- l10n_util::GetStringUTF16(IDS_CHANGE_SEARCH_ENGINE_NO_NAME) : |
- l10n_util::GetStringFUTF16(IDS_CHANGE_SEARCH_ENGINE, name); |
- } |
- if (is_fallback_) { |
- // Both settings are lost: don't show this button. |
- return string16(); |
- } |
- // New setting is lost, offer to go to settings. |
- return l10n_util::GetStringUTF16(IDS_SELECT_SEARCH_ENGINE); |
-} |
- |
-string16 DefaultSearchProviderChange::GetDiscardButtonText() const { |
- if (!is_fallback_) { |
- string16 name = default_search_provider_->short_name(); |
- return (name.length() > kMaxDisplayedNameLength) ? |
- l10n_util::GetStringUTF16(IDS_KEEP_SETTING) : |
- l10n_util::GetStringFUTF16(IDS_KEEP_SEARCH_ENGINE, name); |
- } |
- // Old setting is lost, offer to go to settings. |
- return l10n_util::GetStringUTF16(IDS_SELECT_SEARCH_ENGINE); |
-} |
- |
-BaseSettingChange::DisplayName |
-DefaultSearchProviderChange::GetApplyDisplayName() const { |
- if (NewSearchProviderValid() && |
- new_search_provider_->short_name().length() <= kMaxDisplayedNameLength) { |
- return DisplayName(kDefaultSearchProviderChangeNamePriority, |
- new_search_provider_->short_name()); |
- } |
- // Return the default empty name. |
- return BaseSettingChange::GetApplyDisplayName(); |
-} |
- |
-GURL DefaultSearchProviderChange::GetNewSettingURL() const { |
- if (is_fallback_) { |
- // Do not collide this change when fallback was made, since the message |
- // and Discard behaviour is pretty different. |
- return GURL(); |
- } |
- if (!NewSearchProviderValid()) |
- return GURL(); |
- return TemplateURLService::GenerateSearchURL(new_search_provider_); |
-} |
- |
-void DefaultSearchProviderChange::OnTemplateURLServiceChanged() { |
- TemplateURLService* url_service = GetTemplateURLService(); |
- if (url_service->GetDefaultSearchProvider() != default_search_provider_) { |
- VLOG(1) << "Default search provider has been changed by user"; |
- default_search_provider_ = NULL; |
- url_service->RemoveObserver(this); |
- // Will delete this DefaultSearchProviderChange instance. |
- ProtectorServiceFactory::GetForProfile(profile())->DismissChange(this); |
- } |
-} |
- |
-void DefaultSearchProviderChange::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- DCHECK(type == chrome::NOTIFICATION_TEMPLATE_URL_REMOVED); |
- TemplateURLID id = *content::Details<TemplateURLID>(details).ptr(); |
- if (id == new_id_) |
- new_search_provider_ = NULL; |
- registrar_.Remove(this, type, source); |
- // TODO(ivankr): should the change be dismissed as well? Probably not, |
- // since this may happend due to Sync or whatever. In that case, if user |
- // clicks on 'Change to...', the Search engine settings page will be opened. |
-} |
- |
-const TemplateURL* DefaultSearchProviderChange::SetDefaultSearchProvider( |
- scoped_ptr<TemplateURL>* search_provider) { |
- TemplateURLService* url_service = GetTemplateURLService(); |
- TemplateURLService::TemplateURLVector urls = url_service->GetTemplateURLs(); |
- TemplateURL* new_default_provider = NULL; |
- |
- // Check if this provider already exists and add it otherwise. |
- TemplateURLService::TemplateURLVector::const_iterator i = |
- std::find_if(urls.begin(), urls.end(), |
- TemplateURLIsSame(search_provider->get())); |
- if (i != urls.end()) { |
- VLOG(1) << "Provider already exists"; |
- new_default_provider = *i; |
- search_provider->reset(); |
- } else { |
- VLOG(1) << "No match, adding new provider"; |
- new_default_provider = search_provider->get(); |
- url_service->Add(search_provider->release()); |
- UMA_HISTOGRAM_ENUMERATION( |
- kProtectorHistogramSearchProviderMissing, |
- GetSearchProviderHistogramID(new_default_provider), |
- kProtectorMaxSearchProviderID); |
- } |
- |
- // TODO(ivankr): handle keyword conflicts with existing providers. |
- DCHECK(new_default_provider); |
- VLOG(1) << "Default search provider set to: " |
- << new_default_provider->short_name(); |
- url_service->SetDefaultSearchProvider(new_default_provider); |
- return new_default_provider; |
-} |
- |
-bool DefaultSearchProviderChange::NewSearchProviderValid() const { |
- return new_search_provider_ && new_search_provider_->SupportsReplacement(); |
-} |
- |
-void DefaultSearchProviderChange::OpenSearchEngineSettings(Browser* browser) { |
- ProtectorServiceFactory::GetForProfile(profile())->OpenTab( |
- GURL(std::string(chrome::kChromeUISettingsURL) + |
- chrome::kSearchEnginesSubPage), browser); |
-} |
- |
-TemplateURLService* DefaultSearchProviderChange::GetTemplateURLService() { |
- TemplateURLService* url_service = |
- TemplateURLServiceFactory::GetForProfile(profile()); |
- DCHECK(url_service); |
- return url_service; |
-} |
- |
-BaseSettingChange* CreateDefaultSearchProviderChange(TemplateURL* actual, |
- TemplateURL* backup) { |
- return new DefaultSearchProviderChange(actual, backup); |
-} |
- |
-} // namespace protector |