12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/history/top_sites.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_io_context.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/search/instant_service_observer.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search/local_ntp_source.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search/most_visited_iframe_source.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/search/search.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/search/suggestions/suggestions_source.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_properties.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_service.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_service_factory.h"
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/thumbnails/thumbnail_list_source.h"
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/search/instant_search_prerenderer.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/favicon_source.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/ntp/thumbnail_source.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/theme_source.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/render_messages.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/theme_resources.h"
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/color_utils.h"
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/image/image_skia.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/sys_color_change_listener.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace {
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kSectionBorderAlphaTransparency = 80;
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Converts SkColor to RGBAColor
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochRGBAColor SkColorToRGBAColor(const SkColor& sKColor) {
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RGBAColor color;
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color.r = SkColorGetR(sKColor);
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color.g = SkColorGetG(sKColor);
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color.b = SkColorGetB(sKColor);
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  color.a = SkColorGetA(sKColor);
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return color;
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstantService::InstantService(Profile* profile)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : profile_(profile),
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      template_url_service_(TemplateURLServiceFactory::GetForProfile(profile_)),
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      omnibox_start_margin_(chrome::kDisableStartMargin),
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      weak_ptr_factory_(this) {
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The initialization below depends on a typical set of browser threads. Skip
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // it if we are running in a unit test without the full suite.
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI))
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // This depends on the existence of the typical browser threads. Therefore it
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // is only instantiated here (after the check for a UI thread above).
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  instant_io_context_ = new InstantIOContext();
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  previous_google_base_url_ =
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GURL(UIThreadSearchTermsData(profile).GoogleBaseURLValue());
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TemplateURLService is NULL by default in tests.
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (template_url_service_) {
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    template_url_service_->AddObserver(this);
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const TemplateURL* default_search_provider =
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        template_url_service_->GetDefaultSearchProvider();
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (default_search_provider) {
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      previous_default_search_provider_.reset(
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          new TemplateURLData(default_search_provider->data()));
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ResetInstantSearchPrerenderer();
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 content::NOTIFICATION_RENDERER_PROCESS_CREATED,
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 content::NotificationService::AllSources());
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  registrar_.Add(this,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  history::TopSites* top_sites = profile_->GetTopSites();
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (top_sites) {
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    registrar_.Add(this,
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   chrome::NOTIFICATION_TOP_SITES_CHANGED,
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   content::Source<history::TopSites>(top_sites));
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile_ && profile_->GetResourceContext()) {
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    content::BrowserThread::PostTask(
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        content::BrowserThread::IO, FROM_HERE,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&InstantIOContext::SetUserDataOnIO,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   profile->GetResourceContext(), instant_io_context_));
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up the data sources that Instant uses on the NTP.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_THEMES)
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Listen for theme installation.
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 content::Source<ThemeService>(
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     ThemeServiceFactory::GetForProfile(profile_)));
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::URLDataSource::Add(profile_, new ThemeSource(profile_));
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // defined(ENABLE_THEMES)
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(aurimas) remove this #if once instant_service.cc is no longer compiled
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // on Android.
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if !defined(OS_ANDROID)
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::URLDataSource::Add(profile_, new ThumbnailSource(profile_, false));
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::URLDataSource::Add(profile_, new ThumbnailSource(profile_, true));
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_));
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // !defined(OS_ANDROID)
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::URLDataSource::Add(
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      profile_, new FaviconSource(profile_, FaviconSource::FAVICON));
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::URLDataSource::Add(profile_, new LocalNtpSource(profile_));
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::URLDataSource::Add(profile_, new MostVisitedIframeSource());
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  content::URLDataSource::Add(
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      profile_, new suggestions::SuggestionsSource(profile_));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstantService::~InstantService() {
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (template_url_service_)
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    template_url_service_->RemoveObserver(this);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantService::AddInstantProcess(int process_id) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_ids_.insert(process_id);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (instant_io_context_.get()) {
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    content::BrowserThread::PostTask(
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        content::BrowserThread::IO, FROM_HERE,
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        base::Bind(&InstantIOContext::AddInstantProcessOnIO,
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   instant_io_context_, process_id));
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantService::IsInstantProcess(int process_id) const {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return process_ids_.find(process_id) != process_ids_.end();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::AddObserver(InstantServiceObserver* observer) {
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  observers_.AddObserver(observer);
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::RemoveObserver(InstantServiceObserver* observer) {
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  observers_.RemoveObserver(observer);
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::DeleteMostVisitedItem(const GURL& url) {
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  history::TopSites* top_sites = profile_->GetTopSites();
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!top_sites)
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  top_sites->AddBlacklistedURL(url);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::UndoMostVisitedDeletion(const GURL& url) {
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  history::TopSites* top_sites = profile_->GetTopSites();
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!top_sites)
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  top_sites->RemoveBlacklistedURL(url);
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::UndoAllMostVisitedDeletions() {
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  history::TopSites* top_sites = profile_->GetTopSites();
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!top_sites)
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  top_sites->ClearBlacklistedURLs();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::UpdateThemeInfo() {
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Update theme background info.
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Initialize |theme_info| if necessary.
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!theme_info_)
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    OnThemeChanged(ThemeServiceFactory::GetForProfile(profile_));
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    OnThemeChanged(NULL);
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::UpdateMostVisitedItemsInfo() {
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NotifyAboutMostVisitedItems();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantService::Shutdown() {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_ids_.clear();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (instant_io_context_.get()) {
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    content::BrowserThread::PostTask(
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        content::BrowserThread::IO, FROM_HERE,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&InstantIOContext::ClearInstantProcessesOnIO,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   instant_io_context_));
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instant_io_context_ = NULL;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantService::Observe(int type,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const content::NotificationSource& source,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const content::NotificationDetails& details) {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case content::NOTIFICATION_RENDERER_PROCESS_CREATED:
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      SendSearchURLsToRenderer(
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          content::Source<content::RenderProcessHost>(source).ptr());
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      break;
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED:
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      OnRendererProcessTerminated(
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          content::Source<content::RenderProcessHost>(source)->GetID());
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case chrome::NOTIFICATION_TOP_SITES_CHANGED: {
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      history::TopSites* top_sites = profile_->GetTopSites();
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (top_sites) {
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        top_sites->GetMostVisitedURLs(
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            base::Bind(&InstantService::OnMostVisitedItemsReceived,
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       weak_ptr_factory_.GetWeakPtr()), false);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_THEMES)
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: {
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      OnThemeChanged(content::Source<ThemeService>(source).ptr());
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // defined(ENABLE_THEMES)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unexpected notification type in InstantService.";
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InstantService::SendSearchURLsToRenderer(content::RenderProcessHost* rph) {
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  rph->Send(new ChromeViewMsg_SetSearchURLs(
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      chrome::GetSearchURLs(profile_), chrome::GetNewTabPageURL(profile_)));
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InstantService::OnOmniboxStartMarginChanged(int start_margin) {
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox_start_margin_ = start_margin;
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(InstantServiceObserver, observers_,
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    OmniboxStartMarginChanged(omnibox_start_margin_));
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InstantService::OnRendererProcessTerminated(int process_id) {
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  process_ids_.erase(process_id);
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (instant_io_context_.get()) {
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    content::BrowserThread::PostTask(
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        content::BrowserThread::IO, FROM_HERE,
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::Bind(&InstantIOContext::RemoveInstantProcessOnIO,
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   instant_io_context_, process_id));
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::OnMostVisitedItemsReceived(
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const history::MostVisitedURLList& data) {
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  history::MostVisitedURLList reordered_data(data);
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<InstantMostVisitedItem> new_most_visited_items;
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < reordered_data.size(); i++) {
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const history::MostVisitedURL& url = reordered_data[i];
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    InstantMostVisitedItem item;
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    item.url = url.url;
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    item.title = url.title;
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    new_most_visited_items.push_back(item);
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  most_visited_items_ = new_most_visited_items;
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NotifyAboutMostVisitedItems();
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::NotifyAboutMostVisitedItems() {
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FOR_EACH_OBSERVER(InstantServiceObserver, observers_,
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    MostVisitedItemsChanged(most_visited_items_));
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::OnThemeChanged(ThemeService* theme_service) {
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!theme_service) {
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(theme_info_.get());
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FOR_EACH_OBSERVER(InstantServiceObserver, observers_,
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ThemeInfoChanged(*theme_info_));
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Get theme information from theme service.
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  theme_info_.reset(new ThemeBackgroundInfo());
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Get if the current theme is the default theme.
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->using_default_theme = theme_service->UsingDefaultTheme();
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Get theme colors.
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SkColor background_color =
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_service->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND);
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SkColor text_color =
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      theme_service->GetColor(ThemeProperties::COLOR_NTP_TEXT);
3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SkColor link_color =
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      theme_service->GetColor(ThemeProperties::COLOR_NTP_LINK);
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SkColor text_color_light =
3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      theme_service->GetColor(ThemeProperties::COLOR_NTP_TEXT_LIGHT);
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SkColor header_color =
3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      theme_service->GetColor(ThemeProperties::COLOR_NTP_HEADER);
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Generate section border color from the header color.
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SkColor section_border_color =
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SkColorSetARGB(kSectionBorderAlphaTransparency,
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     SkColorGetR(header_color),
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     SkColorGetG(header_color),
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     SkColorGetB(header_color));
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Invert colors if needed.
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (gfx::IsInvertedColorScheme()) {
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    background_color = color_utils::InvertColor(background_color);
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    text_color = color_utils::InvertColor(text_color);
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    link_color = color_utils::InvertColor(link_color);
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    text_color_light = color_utils::InvertColor(text_color_light);
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    header_color = color_utils::InvertColor(header_color);
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    section_border_color = color_utils::InvertColor(section_border_color);
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Set colors.
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->background_color = SkColorToRGBAColor(background_color);
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->text_color = SkColorToRGBAColor(text_color);
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->link_color = SkColorToRGBAColor(link_color);
3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->text_color_light = SkColorToRGBAColor(text_color_light);
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->header_color = SkColorToRGBAColor(header_color);
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  theme_info_->section_border_color = SkColorToRGBAColor(section_border_color);
3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int logo_alternate = theme_service->GetDisplayProperty(
336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ThemeProperties::NTP_LOGO_ALTERNATE);
337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  theme_info_->logo_alternate = logo_alternate == 1;
338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (theme_service->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Set theme id for theme background image url.
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    theme_info_->theme_id = theme_service->GetThemeID();
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Set theme background image horizontal alignment.
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    int alignment = theme_service->GetDisplayProperty(
345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ThemeProperties::NTP_BACKGROUND_ALIGNMENT);
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (alignment & ThemeProperties::ALIGN_LEFT)
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_info_->image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_LEFT;
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else if (alignment & ThemeProperties::ALIGN_RIGHT)
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_info_->image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_RIGHT;
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_info_->image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER;
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Set theme background image vertical alignment.
354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (alignment & ThemeProperties::ALIGN_TOP)
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_info_->image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_TOP;
356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else if (alignment & ThemeProperties::ALIGN_BOTTOM)
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_info_->image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_BOTTOM;
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      theme_info_->image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER;
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Set theme backgorund image tiling.
362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    int tiling = theme_service->GetDisplayProperty(
363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        ThemeProperties::NTP_BACKGROUND_TILING);
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    switch (tiling) {
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case ThemeProperties::NO_REPEAT:
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        theme_info_->image_tiling = THEME_BKGRND_IMAGE_NO_REPEAT;
367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case ThemeProperties::REPEAT_X:
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        theme_info_->image_tiling = THEME_BKGRND_IMAGE_REPEAT_X;
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case ThemeProperties::REPEAT_Y:
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        theme_info_->image_tiling = THEME_BKGRND_IMAGE_REPEAT_Y;
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case ThemeProperties::REPEAT:
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        theme_info_->image_tiling = THEME_BKGRND_IMAGE_REPEAT;
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Set theme background image height.
380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    gfx::ImageSkia* image = theme_service->GetImageSkiaNamed(
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        IDR_THEME_NTP_BACKGROUND);
382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(image);
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    theme_info_->image_height = image->height();
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    theme_info_->has_attribution =
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       theme_service->HasCustomImage(IDR_THEME_NTP_ATTRIBUTION);
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FOR_EACH_OBSERVER(InstantServiceObserver, observers_,
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    ThemeInfoChanged(*theme_info_));
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InstantService::OnTemplateURLServiceChanged() {
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check whether the default search provider was changed.
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const TemplateURL* template_url =
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      template_url_service_->GetDefaultSearchProvider();
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool default_search_provider_changed = !TemplateURL::MatchesData(
398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      template_url, previous_default_search_provider_.get(),
399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      UIThreadSearchTermsData(profile_));
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (default_search_provider_changed) {
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    previous_default_search_provider_.reset(
402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        template_url ? new TemplateURLData(template_url->data()) : NULL);
40368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Note that, even if the TemplateURL for the Default Search Provider has not
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // changed, the effective URLs might change if they reference the Google base
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // URL. The TemplateURLService will notify us when the effective URL changes
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // in this way but it's up to us to do the work to check both.
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GURL google_base_url(UIThreadSearchTermsData(profile_).GoogleBaseURLValue());
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (google_base_url != previous_google_base_url_) {
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    previous_google_base_url_ = google_base_url;
412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (template_url && template_url->HasGoogleBaseURLs(
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            UIThreadSearchTermsData(profile_)))
414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      default_search_provider_changed = true;
415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (default_search_provider_changed) {
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ResetInstantSearchPrerenderer();
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    FOR_EACH_OBSERVER(InstantServiceObserver, observers_,
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      DefaultSearchProviderChanged());
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
42368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void InstantService::ResetInstantSearchPrerenderer() {
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!chrome::ShouldPrefetchSearchResults())
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GURL url(chrome::GetSearchResultPrefetchBaseURL(profile_));
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  instant_prerenderer_.reset(
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      url.is_valid() ? new InstantSearchPrerenderer(profile_, url) : NULL);
431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
432