navigation_correction_tab_observer.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/navigation_correction_tab_observer.h" 6 7#include "base/prefs/pref_service.h" 8#include "chrome/browser/chrome_notification_types.h" 9#include "chrome/browser/google/google_util.h" 10#include "chrome/browser/profiles/profile.h" 11#include "chrome/common/pref_names.h" 12#include "chrome/common/render_messages.h" 13#include "components/user_prefs/pref_registry_syncable.h" 14#include "content/public/browser/notification_service.h" 15#include "content/public/browser/render_frame_host.h" 16#include "content/public/browser/render_view_host.h" 17#include "content/public/browser/web_contents.h" 18#include "google_apis/google_api_keys.h" 19 20using content::RenderFrameHost; 21using content::RenderViewHost; 22using content::WebContents; 23 24DEFINE_WEB_CONTENTS_USER_DATA_KEY(NavigationCorrectionTabObserver); 25 26NavigationCorrectionTabObserver::NavigationCorrectionTabObserver( 27 WebContents* web_contents) 28 : content::WebContentsObserver(web_contents), 29 profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())) { 30 PrefService* prefs = profile_->GetPrefs(); 31 if (prefs) { 32 pref_change_registrar_.Init(prefs); 33 pref_change_registrar_.Add( 34 prefs::kAlternateErrorPagesEnabled, 35 base::Bind(&NavigationCorrectionTabObserver::OnEnabledChanged, 36 base::Unretained(this))); 37 } 38 39 registrar_.Add(this, chrome::NOTIFICATION_GOOGLE_URL_UPDATED, 40 content::Source<Profile>(profile_->GetOriginalProfile())); 41} 42 43NavigationCorrectionTabObserver::~NavigationCorrectionTabObserver() { 44} 45 46// static 47void NavigationCorrectionTabObserver::RegisterProfilePrefs( 48 user_prefs::PrefRegistrySyncable* prefs) { 49 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, 50 true, 51 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 52} 53 54//////////////////////////////////////////////////////////////////////////////// 55// WebContentsObserver overrides 56 57void NavigationCorrectionTabObserver::RenderViewCreated( 58 RenderViewHost* render_view_host) { 59 UpdateNavigationCorrectionInfo(render_view_host); 60} 61 62//////////////////////////////////////////////////////////////////////////////// 63// content::NotificationObserver overrides 64 65void NavigationCorrectionTabObserver::Observe( 66 int type, 67 const content::NotificationSource& source, 68 const content::NotificationDetails& details) { 69 DCHECK_EQ(chrome::NOTIFICATION_GOOGLE_URL_UPDATED, type); 70 UpdateNavigationCorrectionInfo(web_contents()->GetRenderViewHost()); 71} 72 73//////////////////////////////////////////////////////////////////////////////// 74// Internal helpers 75 76GURL NavigationCorrectionTabObserver::GetNavigationCorrectionURL() const { 77 // Disable navigation corrections when the preference is disabled or when in 78 // Incognito mode. 79 if (!profile_->GetPrefs()->GetBoolean(prefs::kAlternateErrorPagesEnabled) || 80 profile_->IsOffTheRecord()) { 81 return GURL(); 82 } 83 84 return google_util::LinkDoctorBaseURL(); 85} 86 87void NavigationCorrectionTabObserver::OnEnabledChanged() { 88 UpdateNavigationCorrectionInfo(web_contents()->GetRenderViewHost()); 89} 90 91void NavigationCorrectionTabObserver::UpdateNavigationCorrectionInfo( 92 RenderViewHost* rvh) { 93 RenderFrameHost* rfh = rvh->GetMainFrame(); 94 rfh->Send(new ChromeViewMsg_SetNavigationCorrectionInfo( 95 rfh->GetRoutingID(), GetNavigationCorrectionURL(), 96 google_util::GetGoogleLocale(), 97 google_util::GetGoogleCountryCode(profile_), google_apis::GetAPIKey(), 98 google_util::GetGoogleSearchURL(profile_))); 99} 100