search_provider_install_state_message_filter.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/notification_source.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/notification_type.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/render_messages.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/render_messages_params.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter(
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int render_process_id,
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    Profile* profile)
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : ALLOW_THIS_IN_INITIALIZER_LIST(
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_with_provider_install_state_factory_(this)),
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      provider_data_(profile->GetWebDataService(Profile::EXPLICIT_ACCESS),
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     NotificationType::RENDERER_PROCESS_TERMINATED,
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     Source<RenderProcessHost>(
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         RenderProcessHost::FromID(render_process_id))),
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      is_off_the_record_(profile->IsOffTheRecord()) {
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // This is initialized by BrowserRenderProcessHost. Do not add any non-trivial
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // initialization here. Instead do it lazily when required.
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen~SearchProviderInstallStateMessageFilter() {
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool SearchProviderInstallStateMessageFilter::OnMessageReceived(
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const IPC::Message& message,
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* message_was_ok) {
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool handled = true;
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  IPC_BEGIN_MESSAGE_MAP_EX(SearchProviderInstallStateMessageFilter, message,
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           *message_was_ok)
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetSearchProviderInstallState,
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    OnMsgGetSearchProviderInstallState)
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_UNHANDLED(handled = false)
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  IPC_END_MESSAGE_MAP()
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return handled;
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenViewHostMsg_GetSearchProviderInstallState_Params
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::GetSearchProviderInstallState(
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& page_location,
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& requested_host) {
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL requested_origin = requested_host.GetOrigin();
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Do the security check before any others to avoid information leaks.
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (page_location.GetOrigin() != requested_origin)
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return ViewHostMsg_GetSearchProviderInstallState_Params::Denied();
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // In incognito mode, no search information is exposed. (This check must be
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // done after the security check or else a web site can detect that the
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // user is in incognito mode just by doing a cross origin request.)
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (is_off_the_record_)
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return ViewHostMsg_GetSearchProviderInstallState_Params::NotInstalled();
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  switch (provider_data_.GetInstallState(requested_origin)) {
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case SearchProviderInstallData::NOT_INSTALLED:
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return ViewHostMsg_GetSearchProviderInstallState_Params::
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          NotInstalled();
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case SearchProviderInstallData::INSTALLED_BUT_NOT_DEFAULT:
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return ViewHostMsg_GetSearchProviderInstallState_Params::
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          InstallButNotDefault();
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case SearchProviderInstallData::INSTALLED_AS_DEFAULT:
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return ViewHostMsg_GetSearchProviderInstallState_Params::
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          InstalledAsDefault();
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NOTREACHED();
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return ViewHostMsg_GetSearchProviderInstallState_Params::
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NotInstalled();
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::OnMsgGetSearchProviderInstallState(
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& page_location,
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& requested_host,
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_msg) {
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  provider_data_.CallWhenLoaded(
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_with_provider_install_state_factory_.NewRunnableMethod(
9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          &SearchProviderInstallStateMessageFilter::
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          ReplyWithProviderInstallState,
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          page_location,
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          requested_host,
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          reply_msg));
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid SearchProviderInstallStateMessageFilter::ReplyWithProviderInstallState(
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& page_location,
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& requested_host,
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_msg) {
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(reply_msg);
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ViewHostMsg_GetSearchProviderInstallState_Params install_state =
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetSearchProviderInstallState(page_location, requested_host);
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ViewHostMsg_GetSearchProviderInstallState::WriteReplyParams(
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_msg,
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      install_state);
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_msg);
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
114