13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/base_switches.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/strings/utf_string_conversions.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/storage_partition.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h"
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/common/url_constants.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/web_preferences.h"
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/shell/browser/ipc_echo_message_filter.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h"
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_context.h"
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_main_parts.h"
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_devtools_delegate.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_message_filter.h"
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_net_log.h"
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/browser/shell_notification_manager.h"
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_quota_permission_context.h"
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_resource_dispatcher_host_delegate.h"
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_web_contents_view_delegate_creator.h"
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/webkit_test_controller.h"
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_messages.h"
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h"
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/webkit_test_helpers.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/shell/geolocation/shell_access_token_store.h"
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/url_request/url_request_context_getter.h"
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/path_utils.h"
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/crash/browser/crash_dump_manager_android.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/shell/android/shell_descriptors.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX)
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/debug/leak_annotations.h"
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/crash/app/breakpad_linux.h"
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/crash/browser/crash_handler_host_linux.h"
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/common/content_descriptors.h"
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN)
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/common/sandbox_win.h"
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "sandbox/win/src/sandbox.h"
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ShellContentBrowserClient* g_browser_client;
61c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool g_swap_processes_for_redirect = false;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)breakpad::CrashHandlerHostLinux* CreateCrashHandlerHost(
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string& process_type) {
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::FilePath dumps_path =
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      CommandLine::ForCurrentProcess()->GetSwitchValuePath(
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          switches::kCrashDumpsDir);
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ANNOTATE_SCOPED_MEMORY_LEAK;
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    breakpad::CrashHandlerHostLinux* crash_handler =
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new breakpad::CrashHandlerHostLinux(
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            process_type, dumps_path, false);
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    crash_handler->StartUploaderThread();
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return crash_handler;
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int GetCrashSignalFD(const CommandLine& command_line) {
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!breakpad::IsCrashReporterEnabled())
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return -1;
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string process_type =
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line.GetSwitchValueASCII(switches::kProcessType);
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (process_type == switches::kRendererProcess) {
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    static breakpad::CrashHandlerHostLinux* crash_handler = NULL;
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!crash_handler)
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      crash_handler = CreateCrashHandlerHost(process_type);
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return crash_handler->GetDeathSignalSocket();
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (process_type == switches::kPluginProcess) {
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    static breakpad::CrashHandlerHostLinux* crash_handler = NULL;
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!crash_handler)
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      crash_handler = CreateCrashHandlerHost(process_type);
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return crash_handler->GetDeathSignalSocket();
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (process_type == switches::kPpapiPluginProcess) {
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    static breakpad::CrashHandlerHostLinux* crash_handler = NULL;
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!crash_handler)
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      crash_handler = CreateCrashHandlerHost(process_type);
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return crash_handler->GetDeathSignalSocket();
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (process_type == switches::kGpuProcess) {
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    static breakpad::CrashHandlerHostLinux* crash_handler = NULL;
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!crash_handler)
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      crash_handler = CreateCrashHandlerHost(process_type);
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return crash_handler->GetDeathSignalSocket();
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return -1;
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void RequestDesktopNotificationPermissionOnIO(
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& source_origin,
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RenderFrameHost* render_frame_host,
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Callback<void(blink::WebNotificationPermission)>& callback) {
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ShellNotificationManager* manager =
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ShellContentBrowserClient::Get()->GetShellNotificationManager();
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (manager)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    manager->RequestPermission(source_origin, callback);
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  else
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(blink::WebNotificationPermissionAllowed);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ShellContentBrowserClient* ShellContentBrowserClient::Get() {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return g_browser_client;
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid ShellContentBrowserClient::SetSwapProcessesForRedirect(bool swap) {
137c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  g_swap_processes_for_redirect = swap;
138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
139c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellContentBrowserClient::ShellContentBrowserClient()
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : shell_browser_main_parts_(NULL) {
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!g_browser_client);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  g_browser_client = this;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webkit_source_dir_ = GetWebKitRootDirFilePath();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellContentBrowserClient::~ShellContentBrowserClient() {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  g_browser_client = NULL;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ShellNotificationManager*
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ShellContentBrowserClient::GetShellNotificationManager() {
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return NULL;
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!shell_notification_manager_)
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    shell_notification_manager_.reset(new ShellNotificationManager());
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return shell_notification_manager_.get();
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserMainParts* ShellContentBrowserClient::CreateBrowserMainParts(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MainFunctionParams& parameters) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shell_browser_main_parts_ = new ShellBrowserMainParts(parameters);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shell_browser_main_parts_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellContentBrowserClient::RenderProcessWillLaunch(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderProcessHost* host) {
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kExposeIpcEcho))
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    host->AddFilter(new IPCEchoMessageFilter());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  host->AddFilter(new ShellMessageFilter(
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host->GetID(),
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserContext::GetDefaultStoragePartition(browser_context())
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ->GetDatabaseTracker(),
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserContext::GetDefaultStoragePartition(browser_context())
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          ->GetQuotaManager(),
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      BrowserContext::GetDefaultStoragePartition(browser_context())
1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          ->GetURLRequestContext()));
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host->Send(new ShellViewMsg_SetWebKitSourceDir(webkit_source_dir_));
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* ShellContentBrowserClient::CreateRequestContext(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserContext* content_browser_context,
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProtocolHandlerMap* protocol_handlers,
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    URLRequestInterceptorScopedVector request_interceptors) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellBrowserContext* shell_browser_context =
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShellBrowserContextForBrowserContext(content_browser_context);
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return shell_browser_context->CreateRequestContext(
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      protocol_handlers, request_interceptors.Pass());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter*
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellContentBrowserClient::CreateRequestContextForStoragePartition(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserContext* content_browser_context,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& partition_path,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool in_memory,
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProtocolHandlerMap* protocol_handlers,
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    URLRequestInterceptorScopedVector request_interceptors) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellBrowserContext* shell_browser_context =
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShellBrowserContextForBrowserContext(content_browser_context);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return shell_browser_context->CreateRequestContextForStoragePartition(
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      partition_path,
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      in_memory,
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      protocol_handlers,
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      request_interceptors.Pass());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool ShellContentBrowserClient::IsHandledURL(const GURL& url) {
215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!url.is_valid())
216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return false;
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_EQ(url.scheme(), base::StringToLowerASCII(url.scheme()));
218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Keep in sync with ProtocolHandlers added by
219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // ShellURLRequestContextGetter::GetURLRequestContext().
220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  static const char* const kProtocolList[] = {
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      url::kBlobScheme,
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      url::kFileSystemScheme,
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kChromeUIScheme,
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kChromeDevToolsScheme,
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      url::kDataScheme,
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      url::kFileScheme,
227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  };
228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kProtocolList); ++i) {
229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (url.scheme() == kProtocolList[i])
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      return true;
231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return false;
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellContentBrowserClient::AppendExtraCommandLineSwitches(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine* command_line, int child_process_id) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDumpRenderTree);
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      switches::kEnableFontAntialiasing))
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    command_line->AppendSwitch(switches::kEnableFontAntialiasing);
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      switches::kExposeInternalsForTesting))
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    command_line->AppendSwitch(switches::kExposeInternalsForTesting);
24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      switches::kExposeIpcEcho))
24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    command_line->AppendSwitch(switches::kExposeIpcEcho);
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kStableReleaseMode))
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    command_line->AppendSwitch(switches::kStableReleaseMode);
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          switches::kEnableCrashReporter)) {
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    command_line->AppendSwitch(switches::kEnableCrashReporter);
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kCrashDumpsDir)) {
2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    command_line->AppendSwitchPath(
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        switches::kCrashDumpsDir,
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        CommandLine::ForCurrentProcess()->GetSwitchValuePath(
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            switches::kCrashDumpsDir));
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          switches::kEnableLeakDetection)) {
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    command_line->AppendSwitchASCII(
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        switches::kEnableLeakDetection,
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            switches::kEnableLeakDetection));
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(
268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        switches::kRegisterFontFiles)) {
269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    command_line->AppendSwitchASCII(
270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        switches::kRegisterFontFiles,
271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            switches::kRegisterFontFiles));
273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellContentBrowserClient::OverrideWebkitPrefs(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebPreferences* prefs) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKitTestController::Get()->OverrideWebkitPrefs(prefs);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellContentBrowserClient::ResourceDispatcherHostCreated() {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_dispatcher_host_delegate_.reset(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ShellResourceDispatcherHostDelegate());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHost::Get()->SetDelegate(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_dispatcher_host_delegate_.get());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ShellContentBrowserClient::GetDefaultDownloadName() {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "download";
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewDelegate* ShellContentBrowserClient::GetWebContentsViewDelegate(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents) {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(USE_AURA)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateShellWebContentsViewDelegate(web_contents);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuotaPermissionContext*
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellContentBrowserClient::CreateQuotaPermissionContext() {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new ShellQuotaPermissionContext();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ShellContentBrowserClient::RequestDesktopNotificationPermission(
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& source_origin,
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RenderFrameHost* render_frame_host,
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Callback<void(blink::WebNotificationPermission)>& callback) {
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          FROM_HERE,
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          base::Bind(&RequestDesktopNotificationPermissionOnIO,
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              source_origin,
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              render_frame_host,
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              callback));
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)blink::WebNotificationPermission
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ShellContentBrowserClient::CheckDesktopNotificationPermission(
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& source_url,
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResourceContext* context,
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int render_process_id) {
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ShellNotificationManager* manager = GetShellNotificationManager();
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (manager)
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return manager->CheckPermission(source_url);
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return blink::WebNotificationPermissionAllowed;
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SpeechRecognitionManagerDelegate*
336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ShellContentBrowserClient::GetSpeechRecognitionManagerDelegate() {
337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return new ShellSpeechRecognitionManagerDelegate();
338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
339424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnet::NetLog* ShellContentBrowserClient::GetNetLog() {
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return shell_browser_main_parts_->net_log();
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
344c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool ShellContentBrowserClient::ShouldSwapProcessesForRedirect(
345c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    ResourceContext* resource_context,
346c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const GURL& current_url,
347c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const GURL& new_url) {
348c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return g_swap_processes_for_redirect;
349c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
350c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDevToolsManagerDelegate*
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciShellContentBrowserClient::GetDevToolsManagerDelegate() {
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new ShellDevToolsManagerDelegate(browser_context());
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CommandLine& command_line,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int child_process_id,
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<FileDescriptorInfo>* mappings) {
3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_ANDROID)
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath pak_file;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool r = PathService::Get(base::DIR_ANDROID_APP_DATA, &pak_file);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(r);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pak_file = pak_file.Append(FILE_PATH_LITERAL("paks"));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pak_file = pak_file.Append(FILE_PATH_LITERAL("content_shell.pak"));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::File f(pak_file, flags);
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!f.IsValid()) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Failed to open file when creating renderer process: "
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "content_shell.pak";
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mappings->push_back(
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FileDescriptorInfo(kShellPakDescriptor, base::FileDescriptor(f.Pass())));
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (breakpad::IsCrashReporterEnabled()) {
3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    f = breakpad::CrashDumpManager::GetInstance()->CreateMinidumpFile(
3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        child_process_id);
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!f.IsValid()) {
3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      LOG(ERROR) << "Failed to create file for minidump, crash reporting will "
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 << "be disabled for this process.";
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    } else {
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      mappings->push_back(
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          FileDescriptorInfo(kAndroidMinidumpDescriptor,
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             base::FileDescriptor(f.Pass())));
3871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else  // !defined(OS_ANDROID)
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int crash_signal_fd = GetCrashSignalFD(command_line);
3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (crash_signal_fd >= 0) {
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    mappings->push_back(FileDescriptorInfo(
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kCrashDumpSignal, base::FileDescriptor(crash_signal_fd, false)));
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // defined(OS_ANDROID)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN)
400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid ShellContentBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy,
401a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                 bool* success) {
402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Add sideloaded font files for testing. See also DIR_WINDOWS_FONTS
403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // addition in |StartSandboxedProcess|.
404a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::vector<std::string> font_files = GetSideloadFontFiles();
405a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (std::vector<std::string>::const_iterator i(font_files.begin());
406a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      i != font_files.end();
407a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ++i) {
408a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        sandbox::TargetPolicy::FILES_ALLOW_READONLY,
410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        base::UTF8ToWide(*i).c_str());
411a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // OS_WIN
414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellBrowserContext* ShellContentBrowserClient::browser_context() {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shell_browser_main_parts_->browser_context();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellBrowserContext*
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellContentBrowserClient::off_the_record_browser_context() {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shell_browser_main_parts_->off_the_record_browser_context();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessTokenStore* ShellContentBrowserClient::CreateAccessTokenStore() {
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new ShellAccessTokenStore(browser_context());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellBrowserContext*
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellContentBrowserClient::ShellBrowserContextForBrowserContext(
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserContext* content_browser_context) {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (content_browser_context == browser_context())
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return browser_context();
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(content_browser_context, off_the_record_browser_context());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return off_the_record_browser_context();
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
438