| Index: chrome/browser/search/instant_service.cc
|
| diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc
|
| index 8eb856bee7b8a752b5c72961587f789c294caa42..4deb2cb9a67ce9590710d06b65366c3ed9bb83bb 100644
|
| --- a/chrome/browser/search/instant_service.cc
|
| +++ b/chrome/browser/search/instant_service.cc
|
| @@ -4,51 +4,39 @@
|
|
|
| #include "chrome/browser/search/instant_service.h"
|
|
|
| -#include <vector>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/prefs/pref_service.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| #include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/history/history_notifications.h"
|
| #include "chrome/browser/history/most_visited_tiles_experiment.h"
|
| #include "chrome/browser/history/top_sites.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/search/instant_io_context.h"
|
| -#include "chrome/browser/search/instant_service_factory.h"
|
| #include "chrome/browser/search/instant_service_observer.h"
|
| #include "chrome/browser/search/local_ntp_source.h"
|
| #include "chrome/browser/search/most_visited_iframe_source.h"
|
| #include "chrome/browser/search/search.h"
|
| #include "chrome/browser/search/suggestions/suggestions_source.h"
|
| -#include "chrome/browser/search_engines/template_url.h"
|
| +#include "chrome/browser/search_engines/search_terms_data.h"
|
| #include "chrome/browser/search_engines/template_url_service.h"
|
| #include "chrome/browser/search_engines/template_url_service_factory.h"
|
| #include "chrome/browser/themes/theme_properties.h"
|
| #include "chrome/browser/themes/theme_service.h"
|
| #include "chrome/browser/themes/theme_service_factory.h"
|
| #include "chrome/browser/thumbnails/thumbnail_list_source.h"
|
| +#include "chrome/browser/ui/search/instant_search_prerenderer.h"
|
| #include "chrome/browser/ui/webui/favicon_source.h"
|
| #include "chrome/browser/ui/webui/ntp/thumbnail_source.h"
|
| #include "chrome/browser/ui/webui/theme_source.h"
|
| -#include "chrome/common/pref_names.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/notification_details.h"
|
| #include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_source.h"
|
| #include "content/public/browser/notification_types.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/url_data_source.h"
|
| #include "grit/theme_resources.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/url_request/url_request.h"
|
| +#include "third_party/skia/include/core/SkColor.h"
|
| #include "ui/gfx/color_utils.h"
|
| #include "ui/gfx/image/image_skia.h"
|
| #include "ui/gfx/sys_color_change_listener.h"
|
| -#include "url/gurl.h"
|
|
|
| -using content::BrowserThread;
|
|
|
| namespace {
|
|
|
| @@ -68,12 +56,32 @@ RGBAColor SkColorToRGBAColor(const SkColor& sKColor) {
|
|
|
| InstantService::InstantService(Profile* profile)
|
| : profile_(profile),
|
| + template_url_service_(TemplateURLServiceFactory::GetForProfile(profile_)),
|
| omnibox_start_margin_(chrome::kDisableStartMargin),
|
| weak_ptr_factory_(this) {
|
| - // Stub for unit tests.
|
| - if (!BrowserThread::CurrentlyOn(BrowserThread::UI))
|
| + // The initialization below depends on a typical set of browser threads. Skip
|
| + // it if we are running in a unit test without the full suite.
|
| + if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI))
|
| return;
|
|
|
| + // This depends on the existence of the typical browser threads. Therefore it
|
| + // is only instantiated here (after the check for a UI thread above).
|
| + instant_io_context_ = new InstantIOContext();
|
| +
|
| + previous_google_base_url_ =
|
| + GURL(UIThreadSearchTermsData(profile).GoogleBaseURLValue());
|
| +
|
| + // TemplateURLService is NULL by default in tests.
|
| + if (template_url_service_) {
|
| + template_url_service_->AddObserver(this);
|
| + const TemplateURL* default_search_provider =
|
| + template_url_service_->GetDefaultSearchProvider();
|
| + if (default_search_provider) {
|
| + previous_default_search_provider_.reset(
|
| + new TemplateURLData(default_search_provider->data()));
|
| + }
|
| + }
|
| +
|
| ResetInstantSearchPrerenderer();
|
|
|
| registrar_.Add(this,
|
| @@ -89,11 +97,10 @@ InstantService::InstantService(Profile* profile)
|
| chrome::NOTIFICATION_TOP_SITES_CHANGED,
|
| content::Source<history::TopSites>(top_sites));
|
| }
|
| - instant_io_context_ = new InstantIOContext();
|
|
|
| if (profile_ && profile_->GetResourceContext()) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| base::Bind(&InstantIOContext::SetUserDataOnIO,
|
| profile->GetResourceContext(), instant_io_context_));
|
| }
|
| @@ -122,29 +129,21 @@ InstantService::InstantService(Profile* profile)
|
| content::URLDataSource::Add(profile_, new MostVisitedIframeSource());
|
| content::URLDataSource::Add(
|
| profile_, new suggestions::SuggestionsSource(profile_));
|
| -
|
| - profile_pref_registrar_.Init(profile_->GetPrefs());
|
| - profile_pref_registrar_.Add(
|
| - prefs::kDefaultSearchProviderID,
|
| - base::Bind(&InstantService::OnDefaultSearchProviderChanged,
|
| - base::Unretained(this)));
|
| -
|
| - registrar_.Add(this, chrome::NOTIFICATION_GOOGLE_URL_UPDATED,
|
| - content::Source<Profile>(profile_->GetOriginalProfile()));
|
| }
|
|
|
| InstantService::~InstantService() {
|
| + if (template_url_service_)
|
| + template_url_service_->RemoveObserver(this);
|
| }
|
|
|
| void InstantService::AddInstantProcess(int process_id) {
|
| process_ids_.insert(process_id);
|
|
|
| if (instant_io_context_.get()) {
|
| - BrowserThread::PostTask(BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&InstantIOContext::AddInstantProcessOnIO,
|
| - instant_io_context_,
|
| - process_id));
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&InstantIOContext::AddInstantProcessOnIO,
|
| + instant_io_context_, process_id));
|
| }
|
| }
|
|
|
| @@ -201,9 +200,8 @@ void InstantService::Shutdown() {
|
| process_ids_.clear();
|
|
|
| if (instant_io_context_.get()) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO,
|
| - FROM_HERE,
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| base::Bind(&InstantIOContext::ClearInstantProcessesOnIO,
|
| instant_io_context_));
|
| }
|
| @@ -237,12 +235,6 @@ void InstantService::Observe(int type,
|
| break;
|
| }
|
| #endif // defined(ENABLE_THEMES)
|
| - case chrome::NOTIFICATION_GOOGLE_URL_UPDATED: {
|
| - OnGoogleURLUpdated(
|
| - content::Source<Profile>(source).ptr(),
|
| - content::Details<GoogleURLTracker::UpdatedDetails>(details).ptr());
|
| - break;
|
| - }
|
| default:
|
| NOTREACHED() << "Unexpected notification type in InstantService.";
|
| }
|
| @@ -263,12 +255,10 @@ void InstantService::OnRendererProcessTerminated(int process_id) {
|
| process_ids_.erase(process_id);
|
|
|
| if (instant_io_context_.get()) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO,
|
| - FROM_HERE,
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO, FROM_HERE,
|
| base::Bind(&InstantIOContext::RemoveInstantProcessOnIO,
|
| - instant_io_context_,
|
| - process_id));
|
| + instant_io_context_, process_id));
|
| }
|
| }
|
|
|
| @@ -403,47 +393,33 @@ void InstantService::OnThemeChanged(ThemeService* theme_service) {
|
| ThemeInfoChanged(*theme_info_));
|
| }
|
|
|
| -void InstantService::OnGoogleURLUpdated(
|
| - Profile* profile,
|
| - GoogleURLTracker::UpdatedDetails* details) {
|
| - GURL last_prompted_url(
|
| - profile->GetPrefs()->GetString(prefs::kLastPromptedGoogleURL));
|
| -
|
| - // See GoogleURLTracker::OnURLFetchComplete().
|
| - // last_prompted_url.is_empty() indicates very first run of Chrome. So there
|
| - // is no need to notify, as there won't be any old state.
|
| - if (last_prompted_url.is_empty())
|
| - return;
|
| -
|
| - ResetInstantSearchPrerenderer();
|
| -
|
| - // Only the scheme changed. Ignore it since we do not prompt the user in this
|
| - // case.
|
| - if (net::StripWWWFromHost(details->first) ==
|
| - net::StripWWWFromHost(details->second))
|
| - return;
|
| -
|
| - FOR_EACH_OBSERVER(InstantServiceObserver, observers_, GoogleURLUpdated());
|
| -}
|
| -
|
| -void InstantService::OnDefaultSearchProviderChanged(
|
| - const std::string& pref_name) {
|
| - DCHECK_EQ(pref_name, std::string(prefs::kDefaultSearchProviderID));
|
| - const TemplateURL* template_url = TemplateURLServiceFactory::GetForProfile(
|
| - profile_)->GetDefaultSearchProvider();
|
| - if (!template_url) {
|
| - // A NULL |template_url| could mean either this notification is sent during
|
| - // the browser start up operation or the user now has no default search
|
| - // provider. There is no way for the user to reach this state using the
|
| - // Chrome settings. Only explicitly poking at the DB or bugs in the Sync
|
| - // could cause that, neither of which we support.
|
| - return;
|
| +void InstantService::OnTemplateURLServiceChanged() {
|
| + // Check whether the default search provider was changed.
|
| + const TemplateURL* template_url =
|
| + template_url_service_->GetDefaultSearchProvider();
|
| + bool default_search_provider_changed = !TemplateURL::MatchesData(
|
| + template_url, previous_default_search_provider_.get());
|
| + if (default_search_provider_changed) {
|
| + previous_default_search_provider_.reset(
|
| + template_url ? new TemplateURLData(template_url->data()) : NULL);
|
| }
|
|
|
| - ResetInstantSearchPrerenderer();
|
| + // Note that, even if the TemplateURL for the Default Search Provider has not
|
| + // changed, the effective URLs might change if they reference the Google base
|
| + // URL. The TemplateURLService will notify us when the effective URL changes
|
| + // in this way but it's up to us to do the work to check both.
|
| + GURL google_base_url(UIThreadSearchTermsData(profile_).GoogleBaseURLValue());
|
| + if (google_base_url != previous_google_base_url_) {
|
| + previous_google_base_url_ = google_base_url;
|
| + if (template_url && template_url->HasGoogleBaseURLs())
|
| + default_search_provider_changed = true;
|
| + }
|
|
|
| - FOR_EACH_OBSERVER(
|
| - InstantServiceObserver, observers_, DefaultSearchProviderChanged());
|
| + if (default_search_provider_changed) {
|
| + ResetInstantSearchPrerenderer();
|
| + FOR_EACH_OBSERVER(InstantServiceObserver, observers_,
|
| + DefaultSearchProviderChanged());
|
| + }
|
| }
|
|
|
| void InstantService::ResetInstantSearchPrerenderer() {
|
| @@ -451,8 +427,6 @@ void InstantService::ResetInstantSearchPrerenderer() {
|
| return;
|
|
|
| GURL url(chrome::GetSearchResultPrefetchBaseURL(profile_));
|
| - if (url.is_valid())
|
| - instant_prerenderer_.reset(new InstantSearchPrerenderer(profile_, url));
|
| - else
|
| - instant_prerenderer_.reset();
|
| + instant_prerenderer_.reset(
|
| + url.is_valid() ? new InstantSearchPrerenderer(profile_, url) : NULL);
|
| }
|
|
|