chrome_render_message_filter.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file.
48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/bind.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind_helpers.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/metrics/histogram.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/browser_process.h"
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/chrome_notification_types.h"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/content_settings/tab_specific_content_settings.h"
178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_action_constants.h"
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_actions.h"
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/api/activity_log_private/activity_log_private_api.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/api/messaging/message_service.h"
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/metrics/metrics_service.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/net/chrome_url_request_context.h"
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/net/predictor.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile_manager.h"
26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/task_manager/task_manager.h"
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/common/extensions/api/i18n/default_locale_handler.h"
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/message_bundle.h"
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/render_messages.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/notification_service.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/browser/extension_system.h"
348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/constants.h"
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/extension_messages.h"
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_TCMALLOC)
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/browser_about_handler.h"
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserThread;
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochusing extensions::APIPermission;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebCache;
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kFilteredMessageClasses[] = {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ChromeMsgStart,
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ExtensionMsgStart,
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Logs an action to the extension activity log for the specified profile.  Can
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// be called from any thread.
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddActionToExtensionActivityLog(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* profile,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<extensions::Action> action) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // The ActivityLog can only be accessed from the main (UI) thread.  If we're
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // running on the wrong thread, re-dispatch from the main thread.
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    BrowserThread::PostTask(
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        BrowserThread::UI, FROM_HERE,
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::Bind(&AddActionToExtensionActivityLog, profile, action));
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!g_browser_process->profile_manager()->IsValidProfile(profile))
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If the action included a URL, check whether it is for an incognito
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // profile.  The check is performed here so that it can safely be done from
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // the UI thread.
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (action->page_url().is_valid() || !action->page_title().empty())
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      action->set_page_incognito(profile->IsOffTheRecord());
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    extensions::ActivityLog* activity_log =
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        extensions::ActivityLog::GetInstance(profile);
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    activity_log->LogAction(action);
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} // namespace
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)ChromeRenderMessageFilter::ChromeRenderMessageFilter(
828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    int render_process_id,
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Profile* profile,
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    net::URLRequestContextGetter* request_context)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : BrowserMessageFilter(
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          kFilteredMessageClasses, arraysize(kFilteredMessageClasses)),
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      render_process_id_(render_process_id),
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile_(profile),
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      off_the_record_(profile_->IsOffTheRecord()),
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      predictor_(profile_->GetNetworkPredictor()),
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      request_context_(request_context),
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extension_info_map_(
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          extensions::ExtensionSystem::Get(profile)->info_map()),
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cookie_settings_(CookieSettings::Factory::GetForProfile(profile)),
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_ptr_factory_(this) {
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ChromeRenderMessageFilter::~ChromeRenderMessageFilter() {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeRenderMessageFilter::OnMessageReceived(const IPC::Message& message,
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  bool* message_was_ok) {
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool handled = true;
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP_EX(ChromeRenderMessageFilter, message, *message_was_ok)
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DnsPrefetch, OnDnsPrefetch)
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_Preconnect, OnPreconnect)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ResourceTypeStats,
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnResourceTypeStats)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdatedCacheStats,
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        OnUpdatedCacheStats)
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_FPS, OnFPS)
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_V8HeapStats, OnV8HeapStats)
1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToExtension,
1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        OnOpenChannelToExtension)
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToTab, OnOpenChannelToTab)
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToNativeApp,
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnOpenChannelToNativeApp)
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(ExtensionHostMsg_GetMessageBundle,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    OnGetExtensionMessageBundle)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseChannel, OnExtensionCloseChannel)
1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_RequestForIOThread,
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        OnExtensionRequestForIOThread)
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddAPIActionToActivityLog,
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        OnAddAPIActionToExtensionActivityLog);
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddDOMActionToActivityLog,
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        OnAddDOMActionToExtensionActivityLog);
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddEventToActivityLog,
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnAddEventToExtensionActivityLog);
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowDatabase, OnAllowDatabase)
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowDOMStorage, OnAllowDOMStorage)
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowFileSystem, OnAllowFileSystem)
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowIndexedDB, OnAllowIndexedDB)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CanTriggerClipboardRead,
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnCanTriggerClipboardRead)
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CanTriggerClipboardWrite,
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnCanTriggerClipboardWrite)
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_IsCrashReportingEnabled,
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnIsCrashReportingEnabled)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return handled;
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeRenderMessageFilter::OverrideThreadForMessage(
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const IPC::Message& message, BrowserThread::ID* thread) {
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (message.type()) {
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case ChromeViewHostMsg_ResourceTypeStats::ID:
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case ExtensionHostMsg_CloseChannel::ID:
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case ChromeViewHostMsg_UpdatedCacheStats::ID:
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      *thread = BrowserThread::UI;
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    default:
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)net::HostResolver* ChromeRenderMessageFilter::GetHostResolver() {
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return request_context_->GetURLRequestContext()->host_resolver();
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnDnsPrefetch(
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<std::string>& hostnames) {
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (predictor_)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    predictor_->DnsPrefetchList(hostnames);
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnPreconnect(const GURL& url) {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (predictor_)
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    predictor_->PreconnectUrl(
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        url, GURL(), chrome_browser_net::UrlInfo::MOUSE_OVER_MOTIVATED, 1);
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnResourceTypeStats(
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const WebCache::ResourceTypeStats& stats) {
1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  HISTOGRAM_COUNTS("WebCoreCache.ImagesSizeKB",
1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                   static_cast<int>(stats.images.size / 1024));
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  HISTOGRAM_COUNTS("WebCoreCache.CSSStylesheetsSizeKB",
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   static_cast<int>(stats.cssStyleSheets.size / 1024));
1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  HISTOGRAM_COUNTS("WebCoreCache.ScriptsSizeKB",
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   static_cast<int>(stats.scripts.size / 1024));
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  HISTOGRAM_COUNTS("WebCoreCache.XSLStylesheetsSizeKB",
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   static_cast<int>(stats.xslStyleSheets.size / 1024));
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HISTOGRAM_COUNTS("WebCoreCache.FontsSizeKB",
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   static_cast<int>(stats.fonts.size / 1024));
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(ENABLE_TASK_MANAGER)
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TaskManager::GetInstance()->model()->NotifyResourceTypeStats(peer_pid(),
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                               stats);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_TASK_MANAGER)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeRenderMessageFilter::OnUpdatedCacheStats(
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const WebCache::UsageStats& stats) {
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebCacheManager::GetInstance()->ObserveStats(render_process_id_, stats);
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ChromeRenderMessageFilter::OnFPS(int routing_id, float fps) {
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    BrowserThread::PostTask(
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            &ChromeRenderMessageFilter::OnFPS, this,
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            routing_id, fps));
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ProcessId renderer_id = peer_pid();
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_TASK_MANAGER)
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TaskManager::GetInstance()->model()->NotifyFPS(
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      renderer_id, routing_id, fps);
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_TASK_MANAGER)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FPSDetails details(routing_id, fps);
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::NotificationService::current()->Notify(
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome::NOTIFICATION_RENDERER_FPS_COMPUTED,
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::Source<const base::ProcessId>(&renderer_id),
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::Details<const FPSDetails>(&details));
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ChromeRenderMessageFilter::OnV8HeapStats(int v8_memory_allocated,
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                              int v8_memory_used) {
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BrowserThread::PostTask(
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        BrowserThread::UI, FROM_HERE,
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&ChromeRenderMessageFilter::OnV8HeapStats, this,
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   v8_memory_allocated, v8_memory_used));
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ProcessId renderer_id = peer_pid();
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_TASK_MANAGER)
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TaskManager::GetInstance()->model()->NotifyV8HeapStats(
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      renderer_id,
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<size_t>(v8_memory_allocated),
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<size_t>(v8_memory_used));
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(ENABLE_TASK_MANAGER)
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  V8HeapStatsDetails details(v8_memory_allocated, v8_memory_used);
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::NotificationService::current()->Notify(
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome::NOTIFICATION_RENDERER_V8_HEAP_STATS_COMPUTED,
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::Source<const base::ProcessId>(&renderer_id),
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::Details<const V8HeapStatsDetails>(&details));
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnOpenChannelToExtension(
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int routing_id,
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ExtensionMsg_ExternalConnectionInfo& info,
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& channel_name,
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool include_tls_channel_id,
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int* port_id) {
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int port2_id;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::PostTask(
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&ChromeRenderMessageFilter::OpenChannelToExtensionOnUIThread,
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 this, render_process_id_, routing_id, port2_id, info,
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 channel_name, include_tls_channel_id));
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OpenChannelToExtensionOnUIThread(
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int source_process_id, int source_routing_id,
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int receiver_port_id,
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ExtensionMsg_ExternalConnectionInfo& info,
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& channel_name,
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool include_tls_channel_id) {
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MessageService::Get(profile_)->OpenChannelToExtension(
2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      source_process_id, source_routing_id, receiver_port_id,
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      info.source_id, info.target_id, info.source_url, channel_name,
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      include_tls_channel_id);
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnOpenChannelToNativeApp(
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int routing_id,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& source_extension_id,
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& native_app_name,
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int* port_id) {
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int port2_id;
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&ChromeRenderMessageFilter::OpenChannelToNativeAppOnUIThread,
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 this, routing_id, port2_id, source_extension_id,
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 native_app_name));
2916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeRenderMessageFilter::OpenChannelToNativeAppOnUIThread(
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int source_routing_id,
2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    int receiver_port_id,
2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const std::string& source_extension_id,
2976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const std::string& native_app_name) {
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MessageService::Get(profile_)->OpenChannelToNativeApp(
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      render_process_id_, source_routing_id, receiver_port_id,
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      source_extension_id, native_app_name);
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeRenderMessageFilter::OnOpenChannelToTab(
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int routing_id, int tab_id, const std::string& extension_id,
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& channel_name, int* port_id) {
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int port2_id;
3086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  BrowserThread::PostTask(
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(&ChromeRenderMessageFilter::OpenChannelToTabOnUIThread, this,
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 render_process_id_, routing_id, port2_id, tab_id, extension_id,
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 channel_name));
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeRenderMessageFilter::OpenChannelToTabOnUIThread(
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int source_process_id, int source_routing_id,
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int receiver_port_id,
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int tab_id,
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& extension_id,
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& channel_name) {
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  extensions::MessageService::Get(profile_)->OpenChannelToTab(
3256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      source_process_id, source_routing_id, receiver_port_id,
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      tab_id, extension_id, channel_name);
3276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeRenderMessageFilter::OnGetExtensionMessageBundle(
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& extension_id, IPC::Message* reply_msg) {
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const extensions::Extension* extension =
3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      extension_info_map_->extensions().GetByID(extension_id);
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath extension_path;
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string default_locale;
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (extension) {
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extension_path = extension->path();
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default_locale = extensions::LocaleInfo::GetDefaultLocale(extension);
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BrowserThread::PostTask(
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          &ChromeRenderMessageFilter::OnGetExtensionMessageBundleOnFileThread,
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          this, extension_path, extension_id, default_locale, reply_msg));
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnGetExtensionMessageBundleOnFileThread(
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& extension_path,
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& extension_id,
3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const std::string& default_locale,
35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    IPC::Message* reply_msg) {
3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<extensions::MessageBundle::SubstitutionMap> dictionary_map(
3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      extension_file_util::LoadMessageBundleSubstitutionMap(
3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          extension_path, extension_id, default_locale));
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExtensionHostMsg_GetMessageBundle::WriteReplyParams(reply_msg,
3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                      *dictionary_map);
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Send(reply_msg);
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnExtensionCloseChannel(
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int port_id,
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& error_message) {
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!content::RenderProcessHost::FromID(render_process_id_))
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;  // To guard against crash in browser_tests shutdown.
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::MessageService* message_service =
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::MessageService::Get(profile_);
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (message_service)
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    message_service->CloseChannel(port_id, error_message);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnExtensionRequestForIOThread(
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int routing_id,
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ExtensionHostMsg_Request_Params& params) {
3786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ExtensionFunctionDispatcher::DispatchOnIOThread(
3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      extension_info_map_.get(), profile_, render_process_id_,
3826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      weak_ptr_factory_.GetWeakPtr(), routing_id, params);
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ChromeRenderMessageFilter::OnAddAPIActionToExtensionActivityLog(
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& extension_id,
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ExtensionHostMsg_APIActionOrEvent_Params& params) {
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<extensions::Action> action = new extensions::Action(
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension_id, base::Time::Now(), extensions::Action::ACTION_API_CALL,
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      params.api_call);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!params.extra.empty()) {
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    action->mutable_other()->SetString(
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        activity_log_constants::kActionExtra, params.extra);
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddActionToExtensionActivityLog(profile_, action);
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeRenderMessageFilter::OnAddDOMActionToExtensionActivityLog(
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& extension_id,
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ExtensionHostMsg_DOMAction_Params& params) {
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<extensions::Action> action = new extensions::Action(
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension_id, base::Time::Now(), extensions::Action::ACTION_DOM_ACCESS,
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      params.api_call);
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  action->set_page_url(params.url);
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  action->set_page_title(base::UTF16ToUTF8(params.url_title));
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  action->mutable_other()->SetInteger(activity_log_constants::kActionDomVerb,
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      params.call_type);
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddActionToExtensionActivityLog(profile_, action);
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeRenderMessageFilter::OnAddEventToExtensionActivityLog(
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& extension_id,
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ExtensionHostMsg_APIActionOrEvent_Params& params) {
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<extensions::Action> action = new extensions::Action(
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension_id, base::Time::Now(), extensions::Action::ACTION_API_EVENT,
4186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      params.api_call);
4196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
4206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!params.extra.empty()) {
4216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    action->mutable_other()->SetString(activity_log_constants::kActionExtra,
4226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       params.extra);
4236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
4246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AddActionToExtensionActivityLog(profile_, action);
4256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeRenderMessageFilter::OnAllowDatabase(
4286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    int render_frame_id,
4296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& origin_url,
4306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const GURL& top_origin_url,
4316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const base::string16& name,
4326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const base::string16& display_name,
4336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    bool* allowed) {
4346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  *allowed =
4356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTask(
4376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
4386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&TabSpecificContentSettings::WebDatabaseAccessed,
4396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 render_process_id_, render_frame_id, origin_url, name,
4406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 display_name, !*allowed));
4416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
44303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ChromeRenderMessageFilter::OnAllowDOMStorage(int render_frame_id,
4446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  const GURL& origin_url,
4456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  const GURL& top_origin_url,
4466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  bool local,
44703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                  bool* allowed) {
4486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  *allowed =
44903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Record access to DOM storage for potential display in UI.
4516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTask(
4526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
4536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&TabSpecificContentSettings::DOMStorageAccessed,
4546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 render_process_id_, render_frame_id, origin_url, local,
4556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 !*allowed));
4566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeRenderMessageFilter::OnAllowFileSystem(int render_frame_id,
4596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  const GURL& origin_url,
4606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  const GURL& top_origin_url,
4616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  bool* allowed) {
4626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  *allowed =
4636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Record access to file system for potential display in UI.
4656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserThread::PostTask(
4666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
4676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&TabSpecificContentSettings::FileSystemAccessed,
4686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 render_process_id_, render_frame_id, origin_url, !*allowed));
4696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
47003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void ChromeRenderMessageFilter::OnAllowIndexedDB(int render_frame_id,
4726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                 const GURL& origin_url,
4736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                 const GURL& top_origin_url,
47403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                 const base::string16& name,
4756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                 bool* allowed) {
47603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  *allowed =
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  BrowserThread::PostTask(
4796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
4806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      base::Bind(&TabSpecificContentSettings::IndexedDBAccessed,
4816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                 render_process_id_, render_frame_id, origin_url, name,
48203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                 !*allowed));
4836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
48403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ChromeRenderMessageFilter::OnCanTriggerClipboardRead(
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& origin, bool* allowed) {
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *allowed = extension_info_map_->SecurityOriginHasAPIPermission(
4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      origin, render_process_id_, APIPermission::kClipboardRead);
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnCanTriggerClipboardWrite(
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& origin, bool* allowed) {
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Since all extensions could historically write to the clipboard, preserve it
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // for compatibility.
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *allowed = (origin.SchemeIs(extensions::kExtensionScheme) ||
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extension_info_map_->SecurityOriginHasAPIPermission(
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          origin, render_process_id_, APIPermission::kClipboardWrite));
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeRenderMessageFilter::OnIsCrashReportingEnabled(bool* enabled) {
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *enabled = MetricsServiceHelper::IsCrashReportingEnabled();
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)