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