1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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/render_messages.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter(
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int render_process_id,
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    Profile* profile)
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : ALLOW_THIS_IN_INITIALIZER_LIST(
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        reply_with_provider_install_state_factory_(this)),
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      provider_data_(profile->GetWebDataService(Profile::EXPLICIT_ACCESS),
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     NotificationType::RENDERER_PROCESS_TERMINATED,
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     Source<RenderProcessHost>(
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         RenderProcessHost::FromID(render_process_id))),
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      is_off_the_record_(profile->IsOffTheRecord()) {
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // This is initialized by BrowserRenderProcessHost. Do not add any non-trivial
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // initialization here. Instead do it lazily when required.
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen~SearchProviderInstallStateMessageFilter() {
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool SearchProviderInstallStateMessageFilter::OnMessageReceived(
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const IPC::Message& message,
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    bool* message_was_ok) {
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool handled = true;
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  IPC_BEGIN_MESSAGE_MAP_EX(SearchProviderInstallStateMessageFilter, message,
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           *message_was_ok)
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetSearchProviderInstallState,
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    OnMsgGetSearchProviderInstallState)
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC_MESSAGE_UNHANDLED(handled = false)
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  IPC_END_MESSAGE_MAP()
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return handled;
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsensearch_provider::InstallState
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::GetSearchProviderInstallState(
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& page_location,
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& requested_host) {
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL requested_origin = requested_host.GetOrigin();
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Do the security check before any others to avoid information leaks.
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (page_location.GetOrigin() != requested_origin)
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return search_provider::DENIED;
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // In incognito mode, no search information is exposed. (This check must be
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // done after the security check or else a web site can detect that the
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // user is in incognito mode just by doing a cross origin request.)
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (is_off_the_record_)
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return search_provider::NOT_INSTALLED;
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  switch (provider_data_.GetInstallState(requested_origin)) {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case SearchProviderInstallData::NOT_INSTALLED:
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return search_provider::NOT_INSTALLED;
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case SearchProviderInstallData::INSTALLED_BUT_NOT_DEFAULT:
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return search_provider::INSTALLED_BUT_NOT_DEFAULT;
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    case SearchProviderInstallData::INSTALLED_AS_DEFAULT:
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return search_provider::INSTALLED_AS_DEFAULT;
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  NOTREACHED();
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return search_provider::NOT_INSTALLED;
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenSearchProviderInstallStateMessageFilter::OnMsgGetSearchProviderInstallState(
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& page_location,
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& requested_host,
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_msg) {
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  provider_data_.CallWhenLoaded(
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_with_provider_install_state_factory_.NewRunnableMethod(
8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          &SearchProviderInstallStateMessageFilter::
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          ReplyWithProviderInstallState,
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          page_location,
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          requested_host,
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          reply_msg));
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid SearchProviderInstallStateMessageFilter::ReplyWithProviderInstallState(
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& page_location,
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const GURL& requested_host,
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IPC::Message* reply_msg) {
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(reply_msg);
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  search_provider::InstallState install_state =
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      GetSearchProviderInstallState(page_location, requested_host);
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ViewHostMsg_GetSearchProviderInstallState::WriteReplyParams(
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      reply_msg,
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      install_state);
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Send(reply_msg);
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
109