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