navigation_correction_tab_observer.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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