1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/renderer_host/chrome_render_message_filter.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/file_path.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/metrics/histogram.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/browser_process.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_message_service.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/metrics/histogram_synchronizer.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/nacl_host/nacl_process_host.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/net/chrome_url_request_context.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/net/predictor_api.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/prefs/pref_member.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/task_manager/task_manager.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_file_util.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_message_bundle.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_messages.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/pref_names.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/render_messages.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(USE_TCMALLOC) 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/browser_about_handler.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing WebKit::WebCache; 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenChromeRenderMessageFilter::ChromeRenderMessageFilter( 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int render_process_id, 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Profile* profile, 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::URLRequestContextGetter* request_context) 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : render_process_id_(render_process_id), 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_(profile), 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request_context_(request_context) { 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen allow_outdated_plugins_.Init(prefs::kPluginsAllowOutdated, 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_->GetPrefs(), NULL); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen allow_outdated_plugins_.MoveToThread(BrowserThread::IO); 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenChromeRenderMessageFilter::~ChromeRenderMessageFilter() { 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ChromeRenderMessageFilter::OnMessageReceived(const IPC::Message& message, 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool* message_was_ok) { 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool handled = true; 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_BEGIN_MESSAGE_MAP_EX(ChromeRenderMessageFilter, message, *message_was_ok) 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_LaunchNaCl, OnLaunchNaCl) 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_DnsPrefetch, OnDnsPrefetch) 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_RendererHistograms, OnRendererHistograms) 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_ResourceTypeStats, OnResourceTypeStats) 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_V8HeapStats, OnV8HeapStats) 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToExtension, 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OnOpenChannelToExtension) 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToTab, OnOpenChannelToTab) 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER_DELAY_REPLY(ExtensionHostMsg_GetMessageBundle, 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OnGetExtensionMessageBundle) 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(USE_TCMALLOC) 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_RendererTcmalloc, OnRendererTcmalloc) 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_GetOutdatedPluginsPolicy, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OnGetOutdatedPluginsPolicy) 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_UNHANDLED(handled = false) 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_END_MESSAGE_MAP() 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return handled; 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnDestruct() const { 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Destroy on the UI thread because we contain a PrefMember. 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::DeleteOnUIThread::Destruct(this); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OverrideThreadForMessage( 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const IPC::Message& message, BrowserThread::ID* thread) { 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (message.type() == ViewHostMsg_ResourceTypeStats::ID || 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(USE_TCMALLOC) 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message.type() == ViewHostMsg_RendererTcmalloc::ID || 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message.type() == ViewHostMsg_ResourceTypeStats::ID) { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *thread = BrowserThread::UI; 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnLaunchNaCl( 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::wstring& url, int channel_descriptor, IPC::Message* reply_msg) { 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NaClProcessHost* host = new NaClProcessHost(url); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host->Launch(this, channel_descriptor, reply_msg); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnDnsPrefetch( 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<std::string>& hostnames) { 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chrome_browser_net::DnsPrefetchList(hostnames); 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnRendererHistograms( 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int sequence_number, 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<std::string>& histograms) { 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HistogramSynchronizer::DeserializeHistogramList(sequence_number, histograms); 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnResourceTypeStats( 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const WebCache::ResourceTypeStats& stats) { 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HISTOGRAM_COUNTS("WebCoreCache.ImagesSizeKB", 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(stats.images.size / 1024)); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HISTOGRAM_COUNTS("WebCoreCache.CSSStylesheetsSizeKB", 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(stats.cssStyleSheets.size / 1024)); 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HISTOGRAM_COUNTS("WebCoreCache.ScriptsSizeKB", 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(stats.scripts.size / 1024)); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HISTOGRAM_COUNTS("WebCoreCache.XSLStylesheetsSizeKB", 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(stats.xslStyleSheets.size / 1024)); 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HISTOGRAM_COUNTS("WebCoreCache.FontsSizeKB", 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(stats.fonts.size / 1024)); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TaskManager::GetInstance()->model()->NotifyResourceTypeStats( 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::GetProcId(peer_handle()), stats); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnV8HeapStats(int v8_memory_allocated, 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int v8_memory_used) { 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TaskManager::GetInstance()->model()->NotifyV8HeapStats( 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::GetProcId(peer_handle()), 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<size_t>(v8_memory_allocated), 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<size_t>(v8_memory_used)); 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnOpenChannelToExtension( 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int routing_id, const std::string& source_extension_id, 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& target_extension_id, 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& channel_name, int* port_id) { 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int port2_id; 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionMessageService::AllocatePortIdPair(port_id, &port2_id); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask( 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::UI, FROM_HERE, 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod( 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, &ChromeRenderMessageFilter::OpenChannelToExtensionOnUIThread, 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_process_id_, routing_id, port2_id, source_extension_id, 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen target_extension_id, channel_name)); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OpenChannelToExtensionOnUIThread( 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int source_process_id, int source_routing_id, 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int receiver_port_id, 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& source_extension_id, 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& target_extension_id, 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& channel_name) { 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_->GetExtensionMessageService()->OpenChannelToExtension( 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_process_id, source_routing_id, receiver_port_id, 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_extension_id, target_extension_id, channel_name); 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnOpenChannelToTab( 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int routing_id, int tab_id, const std::string& extension_id, 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& channel_name, int* port_id) { 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int port2_id; 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionMessageService::AllocatePortIdPair(port_id, &port2_id); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask( 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::UI, FROM_HERE, 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod( 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, &ChromeRenderMessageFilter::OpenChannelToTabOnUIThread, 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_process_id_, routing_id, port2_id, tab_id, extension_id, 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen channel_name)); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OpenChannelToTabOnUIThread( 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int source_process_id, int source_routing_id, 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int receiver_port_id, 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int tab_id, 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& extension_id, 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& channel_name) { 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_->GetExtensionMessageService()->OpenChannelToTab( 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_process_id, source_routing_id, receiver_port_id, 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_id, extension_id, channel_name); 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnGetExtensionMessageBundle( 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& extension_id, IPC::Message* reply_msg) { 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>( 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request_context_->GetURLRequestContext()); 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath extension_path = 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen context->extension_info_map()->GetPathForExtension(extension_id); 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string default_locale = 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen context->extension_info_map()->GetDefaultLocaleForExtension(extension_id); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask( 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::FILE, FROM_HERE, 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableMethod( 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &ChromeRenderMessageFilter::OnGetExtensionMessageBundleOnFileThread, 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extension_path, extension_id, default_locale, reply_msg)); 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnGetExtensionMessageBundleOnFileThread( 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const FilePath& extension_path, 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& extension_id, 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& default_locale, 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC::Message* reply_msg) { 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::map<std::string, std::string> dictionary_map; 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!default_locale.empty()) { 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Touch disk only if extension is localized. 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string error; 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<ExtensionMessageBundle> bundle( 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extension_file_util::LoadExtensionMessageBundle( 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen extension_path, default_locale, &error)); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (bundle.get()) 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dictionary_map = *bundle->dictionary(); 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add @@extension_id reserved message here, so it's available to 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // non-localized extensions too. 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dictionary_map.insert( 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::make_pair(ExtensionMessageBundle::kExtensionIdKey, extension_id)); 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionHostMsg_GetMessageBundle::WriteReplyParams( 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reply_msg, dictionary_map); 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Send(reply_msg); 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(USE_TCMALLOC) 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnRendererTcmalloc(base::ProcessId pid, 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& output) { 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AboutTcmallocRendererCallback(pid, output); 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeRenderMessageFilter::OnGetOutdatedPluginsPolicy( 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ContentSetting* policy) { 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *policy = CONTENT_SETTING_ALLOW; 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!allow_outdated_plugins_.GetValue()) { 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If this is false by policy, the plugin is blocked; otherwise, it is 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // blocked initially but the user can load it manually. 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *policy = allow_outdated_plugins_.IsManaged() ? 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CONTENT_SETTING_BLOCK : CONTENT_SETTING_ASK; 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 247