search_provider_install_state_message_filter.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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/search_engines/search_provider_install_state_message_filter.h"
6
7#include "base/bind.h"
8#include "base/logging.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/common/render_messages.h"
11#include "content/public/browser/render_process_host.h"
12#include "url/gurl.h"
13
14using content::BrowserThread;
15
16SearchProviderInstallStateMessageFilter::
17SearchProviderInstallStateMessageFilter(
18    int render_process_id,
19    Profile* profile)
20    : BrowserMessageFilter(ChromeMsgStart),
21      provider_data_(profile,
22                     content::RenderProcessHost::FromID(render_process_id)),
23      is_off_the_record_(profile->IsOffTheRecord()),
24      weak_factory_(this) {
25  // This is initialized by RenderProcessHostImpl. Do not add any non-trivial
26  // initialization here. Instead do it lazily when required.
27  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
28}
29
30bool SearchProviderInstallStateMessageFilter::OnMessageReceived(
31    const IPC::Message& message) {
32  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
33  bool handled = true;
34  IPC_BEGIN_MESSAGE_MAP(SearchProviderInstallStateMessageFilter, message)
35    IPC_MESSAGE_HANDLER_DELAY_REPLY(
36        ChromeViewHostMsg_GetSearchProviderInstallState,
37        OnGetSearchProviderInstallState)
38    IPC_MESSAGE_UNHANDLED(handled = false)
39  IPC_END_MESSAGE_MAP()
40  return handled;
41}
42
43SearchProviderInstallStateMessageFilter::
44~SearchProviderInstallStateMessageFilter() {
45  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
46}
47
48search_provider::InstallState
49SearchProviderInstallStateMessageFilter::GetSearchProviderInstallState(
50    const GURL& page_location,
51    const GURL& requested_host) {
52  GURL requested_origin = requested_host.GetOrigin();
53
54  // Do the security check before any others to avoid information leaks.
55  if (page_location.GetOrigin() != requested_origin)
56    return search_provider::DENIED;
57
58  // In incognito mode, no search information is exposed. (This check must be
59  // done after the security check or else a web site can detect that the
60  // user is in incognito mode just by doing a cross origin request.)
61  if (is_off_the_record_)
62      return search_provider::NOT_INSTALLED;
63
64  switch (provider_data_.GetInstallState(requested_origin)) {
65    case SearchProviderInstallData::NOT_INSTALLED:
66      return search_provider::NOT_INSTALLED;
67
68    case SearchProviderInstallData::INSTALLED_BUT_NOT_DEFAULT:
69      return search_provider::INSTALLED_BUT_NOT_DEFAULT;
70
71    case SearchProviderInstallData::INSTALLED_AS_DEFAULT:
72      return search_provider::INSTALLED_AS_DEFAULT;
73  }
74
75  NOTREACHED();
76  return search_provider::NOT_INSTALLED;
77}
78
79void
80SearchProviderInstallStateMessageFilter::OnGetSearchProviderInstallState(
81    const GURL& page_location,
82    const GURL& requested_host,
83    IPC::Message* reply_msg) {
84  provider_data_.CallWhenLoaded(
85      base::Bind(
86          &SearchProviderInstallStateMessageFilter::
87          ReplyWithProviderInstallState,
88          weak_factory_.GetWeakPtr(),
89          page_location,
90          requested_host,
91          reply_msg));
92}
93
94void SearchProviderInstallStateMessageFilter::ReplyWithProviderInstallState(
95    const GURL& page_location,
96    const GURL& requested_host,
97    IPC::Message* reply_msg) {
98  DCHECK(reply_msg);
99  search_provider::InstallState install_state =
100      GetSearchProviderInstallState(page_location, requested_host);
101
102  ChromeViewHostMsg_GetSearchProviderInstallState::WriteReplyParams(
103      reply_msg,
104      install_state);
105  Send(reply_msg);
106}
107