chrome_render_message_filter.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Use of this source code is governed by a BSD-style license that can be
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// found in the LICENSE file.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string>
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/bind.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/bind_helpers.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/metrics/histogram.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/strings/utf_string_conversions.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/browser_process.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/chrome_notification_types.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/content_settings/cookie_settings.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/content_settings/tab_specific_content_settings.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/extensions/activity_log/activity_action_constants.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/extensions/activity_log/activity_actions.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/extensions/activity_log/activity_log.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/extensions/api/activity_log_private/activity_log_private_api.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/extensions/api/messaging/message_service.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/metrics/metrics_service.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/net/chrome_url_request_context.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/net/predictor.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/profiles/profile_manager.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/task_manager/task_manager.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/common/extensions/api/i18n/default_locale_handler.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/common/render_messages.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "content/public/browser/notification_service.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "content/public/browser/render_process_host.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "extensions/browser/extension_system.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "extensions/common/constants.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "extensions/common/extension_messages.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "extensions/common/file_util.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "extensions/common/message_bundle.h"
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(USE_TCMALLOC)
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/browser_about_handler.h"
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgusing content::BrowserThread;
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgusing extensions::APIPermission;
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgusing blink::WebCache;
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace {
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst uint32 kFilteredMessageClasses[] = {
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ChromeMsgStart,
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ExtensionMsgStart,
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Logs an action to the extension activity log for the specified profile.  Can
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// be called from any thread.
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AddActionToExtensionActivityLog(
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Profile* profile,
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    scoped_refptr<extensions::Action> action) {
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(ENABLE_EXTENSIONS)
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // The ActivityLog can only be accessed from the main (UI) thread.  If we're
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // running on the wrong thread, re-dispatch from the main thread.
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BrowserThread::PostTask(
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        BrowserThread::UI, FROM_HERE,
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        base::Bind(&AddActionToExtensionActivityLog, profile, action));
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!g_browser_process->profile_manager()->IsValidProfile(profile))
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // If the action included a URL, check whether it is for an incognito
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // profile.  The check is performed here so that it can safely be done from
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // the UI thread.
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (action->page_url().is_valid() || !action->page_title().empty())
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      action->set_page_incognito(profile->IsOffTheRecord());
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    extensions::ActivityLog* activity_log =
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        extensions::ActivityLog::GetInstance(profile);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    activity_log->LogAction(action);
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} // namespace
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgChromeRenderMessageFilter::ChromeRenderMessageFilter(
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int render_process_id,
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Profile* profile,
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    net::URLRequestContextGetter* request_context)
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    : BrowserMessageFilter(kFilteredMessageClasses,
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           arraysize(kFilteredMessageClasses)),
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      render_process_id_(render_process_id),
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      profile_(profile),
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      off_the_record_(profile_->IsOffTheRecord()),
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      predictor_(profile_->GetNetworkPredictor()),
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      request_context_(request_context),
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extension_info_map_(
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          extensions::ExtensionSystem::Get(profile)->info_map()),
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cookie_settings_(CookieSettings::Factory::GetForProfile(profile)) {}
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgChromeRenderMessageFilter::~ChromeRenderMessageFilter() {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbool ChromeRenderMessageFilter::OnMessageReceived(const IPC::Message& message,
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  bool* message_was_ok) {
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  bool handled = true;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  IPC_BEGIN_MESSAGE_MAP_EX(ChromeRenderMessageFilter, message, *message_was_ok)
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DnsPrefetch, OnDnsPrefetch)
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_Preconnect, OnPreconnect)
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ResourceTypeStats,
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnResourceTypeStats)
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_UpdatedCacheStats,
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnUpdatedCacheStats)
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_FPS, OnFPS)
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_V8HeapStats, OnV8HeapStats)
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToExtension,
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnOpenChannelToExtension)
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToTab, OnOpenChannelToTab)
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToNativeApp,
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnOpenChannelToNativeApp)
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER_DELAY_REPLY(ExtensionHostMsg_GetMessageBundle,
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    OnGetExtensionMessageBundle)
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseChannel, OnExtensionCloseChannel)
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddAPIActionToActivityLog,
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnAddAPIActionToExtensionActivityLog);
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddDOMActionToActivityLog,
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnAddDOMActionToExtensionActivityLog);
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddEventToActivityLog,
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnAddEventToExtensionActivityLog);
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowDatabase, OnAllowDatabase)
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowDOMStorage, OnAllowDOMStorage)
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowFileSystem, OnAllowFileSystem)
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowIndexedDB, OnAllowIndexedDB)
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CanTriggerClipboardRead,
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnCanTriggerClipboardRead)
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CanTriggerClipboardWrite,
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnCanTriggerClipboardWrite)
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_IsCrashReportingEnabled,
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        OnIsCrashReportingEnabled)
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC_MESSAGE_UNHANDLED(handled = false)
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  IPC_END_MESSAGE_MAP()
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return handled;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OverrideThreadForMessage(
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const IPC::Message& message, BrowserThread::ID* thread) {
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  switch (message.type()) {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case ChromeViewHostMsg_ResourceTypeStats::ID:
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case ExtensionHostMsg_CloseChannel::ID:
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case ChromeViewHostMsg_UpdatedCacheStats::ID:
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *thread = BrowserThread::UI;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      break;
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      break;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnet::HostResolver* ChromeRenderMessageFilter::GetHostResolver() {
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return request_context_->GetURLRequestContext()->host_resolver();
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnDnsPrefetch(
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::vector<std::string>& hostnames) {
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (predictor_)
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    predictor_->DnsPrefetchList(hostnames);
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnPreconnect(const GURL& url) {
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (predictor_)
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    predictor_->PreconnectUrl(
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        url, GURL(), chrome_browser_net::UrlInfo::MOUSE_OVER_MOTIVATED, 1);
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnResourceTypeStats(
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const WebCache::ResourceTypeStats& stats) {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HISTOGRAM_COUNTS("WebCoreCache.ImagesSizeKB",
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   static_cast<int>(stats.images.size / 1024));
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HISTOGRAM_COUNTS("WebCoreCache.CSSStylesheetsSizeKB",
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   static_cast<int>(stats.cssStyleSheets.size / 1024));
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HISTOGRAM_COUNTS("WebCoreCache.ScriptsSizeKB",
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   static_cast<int>(stats.scripts.size / 1024));
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HISTOGRAM_COUNTS("WebCoreCache.XSLStylesheetsSizeKB",
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   static_cast<int>(stats.xslStyleSheets.size / 1024));
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  HISTOGRAM_COUNTS("WebCoreCache.FontsSizeKB",
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   static_cast<int>(stats.fonts.size / 1024));
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(ENABLE_TASK_MANAGER)
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TaskManager::GetInstance()->model()->NotifyResourceTypeStats(peer_pid(),
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                               stats);
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  // defined(ENABLE_TASK_MANAGER)
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnUpdatedCacheStats(
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const WebCache::UsageStats& stats) {
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  WebCacheManager::GetInstance()->ObserveStats(render_process_id_, stats);
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnFPS(int routing_id, float fps) {
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BrowserThread::PostTask(
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        BrowserThread::UI, FROM_HERE,
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        base::Bind(
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &ChromeRenderMessageFilter::OnFPS, this,
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            routing_id, fps));
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(ENABLE_TASK_MANAGER)
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TaskManager::GetInstance()->model()->NotifyFPS(
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      peer_pid(), routing_id, fps);
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  // defined(ENABLE_TASK_MANAGER)
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnV8HeapStats(int v8_memory_allocated,
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              int v8_memory_used) {
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BrowserThread::PostTask(
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        BrowserThread::UI, FROM_HERE,
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        base::Bind(&ChromeRenderMessageFilter::OnV8HeapStats, this,
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   v8_memory_allocated, v8_memory_used));
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::ProcessId renderer_id = peer_pid();
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(ENABLE_TASK_MANAGER)
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TaskManager::GetInstance()->model()->NotifyV8HeapStats(
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      renderer_id,
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      static_cast<size_t>(v8_memory_allocated),
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      static_cast<size_t>(v8_memory_used));
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  // defined(ENABLE_TASK_MANAGER)
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  V8HeapStatsDetails details(v8_memory_allocated, v8_memory_used);
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  content::NotificationService::current()->Notify(
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      chrome::NOTIFICATION_RENDERER_V8_HEAP_STATS_COMPUTED,
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::Source<const base::ProcessId>(&renderer_id),
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      content::Details<const V8HeapStatsDetails>(&details));
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnOpenChannelToExtension(
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int routing_id,
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const ExtensionMsg_ExternalConnectionInfo& info,
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& channel_name,
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bool include_tls_channel_id,
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int* port_id) {
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int port2_id;
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&ChromeRenderMessageFilter::OpenChannelToExtensionOnUIThread,
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 this, render_process_id_, routing_id, port2_id, info,
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 channel_name, include_tls_channel_id));
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OpenChannelToExtensionOnUIThread(
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int source_process_id, int source_routing_id,
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int receiver_port_id,
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const ExtensionMsg_ExternalConnectionInfo& info,
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& channel_name,
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bool include_tls_channel_id) {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService::Get(profile_)->OpenChannelToExtension(
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      source_process_id, source_routing_id, receiver_port_id,
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      info.source_id, info.target_id, info.source_url, channel_name,
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      include_tls_channel_id);
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnOpenChannelToNativeApp(
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int routing_id,
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& source_extension_id,
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& native_app_name,
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int* port_id) {
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int port2_id;
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&ChromeRenderMessageFilter::OpenChannelToNativeAppOnUIThread,
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 this, routing_id, port2_id, source_extension_id,
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 native_app_name));
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OpenChannelToNativeAppOnUIThread(
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int source_routing_id,
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int receiver_port_id,
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& source_extension_id,
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& native_app_name) {
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService::Get(profile_)->OpenChannelToNativeApp(
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      render_process_id_, source_routing_id, receiver_port_id,
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      source_extension_id, native_app_name);
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnOpenChannelToTab(
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int routing_id, int tab_id, const std::string& extension_id,
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& channel_name, int* port_id) {
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int port2_id;
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&ChromeRenderMessageFilter::OpenChannelToTabOnUIThread, this,
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 render_process_id_, routing_id, port2_id, tab_id, extension_id,
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 channel_name));
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OpenChannelToTabOnUIThread(
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int source_process_id, int source_routing_id,
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int receiver_port_id,
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int tab_id,
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& extension_id,
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& channel_name) {
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService::Get(profile_)->OpenChannelToTab(
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      source_process_id, source_routing_id, receiver_port_id,
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      tab_id, extension_id, channel_name);
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnGetExtensionMessageBundle(
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& extension_id, IPC::Message* reply_msg) {
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const extensions::Extension* extension =
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extension_info_map_->extensions().GetByID(extension_id);
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::FilePath extension_path;
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  std::string default_locale;
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (extension) {
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    extension_path = extension->path();
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default_locale = extensions::LocaleInfo::GetDefaultLocale(extension);
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::FILE, FROM_HERE,
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          &ChromeRenderMessageFilter::OnGetExtensionMessageBundleOnFileThread,
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          this, extension_path, extension_id, default_locale, reply_msg));
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnGetExtensionMessageBundleOnFileThread(
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const base::FilePath& extension_path,
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& extension_id,
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& default_locale,
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IPC::Message* reply_msg) {
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<extensions::MessageBundle::SubstitutionMap> dictionary_map(
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extensions::file_util::LoadMessageBundleSubstitutionMap(
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          extension_path, extension_id, default_locale));
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ExtensionHostMsg_GetMessageBundle::WriteReplyParams(reply_msg,
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                      *dictionary_map);
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Send(reply_msg);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnExtensionCloseChannel(
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int port_id,
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& error_message) {
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!content::RenderProcessHost::FromID(render_process_id_))
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;  // To guard against crash in browser_tests shutdown.
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extensions::MessageService* message_service =
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extensions::MessageService::Get(profile_);
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (message_service)
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    message_service->CloseChannel(port_id, error_message);
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAddAPIActionToExtensionActivityLog(
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& extension_id,
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const ExtensionHostMsg_APIActionOrEvent_Params& params) {
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_refptr<extensions::Action> action = new extensions::Action(
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extension_id, base::Time::Now(), extensions::Action::ACTION_API_CALL,
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      params.api_call);
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!params.extra.empty()) {
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    action->mutable_other()->SetString(
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        activity_log_constants::kActionExtra, params.extra);
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  AddActionToExtensionActivityLog(profile_, action);
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAddDOMActionToExtensionActivityLog(
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& extension_id,
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const ExtensionHostMsg_DOMAction_Params& params) {
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_refptr<extensions::Action> action = new extensions::Action(
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extension_id, base::Time::Now(), extensions::Action::ACTION_DOM_ACCESS,
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      params.api_call);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  action->set_page_url(params.url);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  action->set_page_title(base::UTF16ToUTF8(params.url_title));
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  action->mutable_other()->SetInteger(activity_log_constants::kActionDomVerb,
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      params.call_type);
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  AddActionToExtensionActivityLog(profile_, action);
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAddEventToExtensionActivityLog(
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const std::string& extension_id,
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const ExtensionHostMsg_APIActionOrEvent_Params& params) {
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_refptr<extensions::Action> action = new extensions::Action(
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extension_id, base::Time::Now(), extensions::Action::ACTION_API_EVENT,
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      params.api_call);
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (!params.extra.empty()) {
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    action->mutable_other()->SetString(activity_log_constants::kActionExtra,
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       params.extra);
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  AddActionToExtensionActivityLog(profile_, action);
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAllowDatabase(
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int render_frame_id,
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const GURL& origin_url,
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const GURL& top_origin_url,
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const base::string16& name,
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const base::string16& display_name,
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bool* allowed) {
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *allowed =
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&TabSpecificContentSettings::WebDatabaseAccessed,
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 render_process_id_, render_frame_id, origin_url, name,
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 display_name, !*allowed));
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAllowDOMStorage(int render_frame_id,
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  const GURL& origin_url,
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  const GURL& top_origin_url,
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  bool local,
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  bool* allowed) {
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *allowed =
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Record access to DOM storage for potential display in UI.
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&TabSpecificContentSettings::DOMStorageAccessed,
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 render_process_id_, render_frame_id, origin_url, local,
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 !*allowed));
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAllowFileSystem(int render_frame_id,
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  const GURL& origin_url,
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  const GURL& top_origin_url,
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  bool* allowed) {
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *allowed =
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Record access to file system for potential display in UI.
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&TabSpecificContentSettings::FileSystemAccessed,
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 render_process_id_, render_frame_id, origin_url, !*allowed));
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnAllowIndexedDB(int render_frame_id,
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                 const GURL& origin_url,
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                 const GURL& top_origin_url,
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                 const base::string16& name,
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                 bool* allowed) {
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *allowed =
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cookie_settings_->IsSettingCookieAllowed(origin_url, top_origin_url);
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  BrowserThread::PostTask(
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      BrowserThread::UI, FROM_HERE,
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      base::Bind(&TabSpecificContentSettings::IndexedDBAccessed,
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 render_process_id_, render_frame_id, origin_url, name,
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 !*allowed));
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnCanTriggerClipboardRead(
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const GURL& origin, bool* allowed) {
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *allowed = extension_info_map_->SecurityOriginHasAPIPermission(
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      origin, render_process_id_, APIPermission::kClipboardRead);
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnCanTriggerClipboardWrite(
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const GURL& origin, bool* allowed) {
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Since all extensions could historically write to the clipboard, preserve it
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // for compatibility.
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *allowed = (origin.SchemeIs(extensions::kExtensionScheme) ||
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      extension_info_map_->SecurityOriginHasAPIPermission(
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          origin, render_process_id_, APIPermission::kClipboardWrite));
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ChromeRenderMessageFilter::OnIsCrashReportingEnabled(bool* enabled) {
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *enabled = MetricsServiceHelper::IsCrashReportingEnabled();
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org