chrome_content_browser_client.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/lazy_instance.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_about_handler.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/browser_shutdown.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/character_encoding.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chrome_net_benchmarking_message_filter.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_quota_permission_context.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h" 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api.h" 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/browser_permissions_policy_delegate.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_web_ui.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_webkit_preferences.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/suggest_permission_util.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/geolocation/chrome_access_token_store.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h" 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/adview/adview_guest.h" 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/guestview_constants.h" 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/webview/webview_guest.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h" 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.h" 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/nacl_host/nacl_browser.h" 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/nacl_host/nacl_browser_delegate_impl.h" 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/nacl_host/nacl_host_message_filter.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/nacl_host/nacl_process_host.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service_factory.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/plugin_info_message_filter.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h" 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/prerender/prerender_final_status.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_message_filter.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printing_message_filter.h" 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_render_message_filter.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service.h" 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service_factory.h" 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h" 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/speech/tts_message_filter.h" 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ssl/ssl_add_certificate.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_blocking_page.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_tab_helper.h" 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/blocked_content/blocked_window_params.h" 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/sync/sync_promo_ui.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/user_style_sheet_watcher.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/user_style_sheet_watcher_factory.h" 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/validation_message_message_filter.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/common/env_vars.h" 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_process_policy.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_set.h" 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h" 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/shared_module_info.h" 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/socket_permission.h" 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/web_accessible_resources_handler.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h" 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/pepper_permission_util.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/installer/util/google_update_settings.h" 112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/chromeos_constants.h" 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "components/nacl/common/nacl_process_type.h" 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/translate/common/translate_switches.h" 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_main_parts.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h" 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_url_handler.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/site_instance.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_host.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_descriptors.h" 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/common/url_utils.h" 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h" 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_resources.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/mime_util.h" 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h" 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center_util.h" 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "webkit/browser/fileapi/external_mount_points.h" 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_win.h" 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sandbox/win/src/sandbox_policy.h" 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_mac.h" 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_message_filter_mac.h" 1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/breakpad/app/breakpad_mac.h" 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/chrome_browser_main_chromeos.h" 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system_backend_delegate.h" 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/fileapi/file_system_backend.h" 160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/chromeos/system/input_device_settings.h" 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_linux.h" 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/android/webapps/single_tab_mode_tab_helper.h" 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_android.h" 169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/media/encrypted_media_message_filter_android.h" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/descriptors_android.h" 1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/breakpad/browser/crash_dump_manager_android.h" 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_posix.h" 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/debug/leak_annotations.h" 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/linux_util.h" 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/breakpad/app/breakpad_linux.h" 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/breakpad/browser/crash_handler_host_linux.h" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/captive_portal/captive_portal_tab_helper.h" 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ui/gfx/android/device_display_info.h" 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/crypto_module_password_dialog.h" 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID) 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/media/webrtc_logging_handler_host.h" 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_INPUT_SPEECH) 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate_bubble_ui.h" 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(FILE_MANAGER_EXTENSION) 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_id.h" 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(TOOLKIT_GTK) 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/gtk/chrome_browser_main_extra_parts_gtk.h" 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(TOOLKIT_VIEWS) 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h" 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_ASH) 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/views/ash/chrome_browser_main_extra_parts_ash.h" 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_AURA) 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.h" 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_X11) 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_browser_main_extra_parts_x11.h" 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(ENABLE_SPELLCHECK) 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_message_filter.h" 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing WebKit::WebWindowFeatures; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FileDescriptor; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::AccessTokenStore; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserChildProcessHostIterator; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserURLHandler; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessSecurityPolicy; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::FileDescriptorInfo; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::QuotaPermissionContext; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SiteInstance; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest; 256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochusing message_center::NotifierId; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Cached version of the locale so we can return the locale on the I/O 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// thread. 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::LazyInstance<std::string> g_io_thread_application_locale; 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kPredefinedAllowedSocketOrigins[] = { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "okddffdblfhhnmhodogpojmfkjmhinfp", // Test SSH Client 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pnhechapfaindjhompbnflcldabbghjo", // HTerm App (SSH Client) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bglhmjfplikpjnfoegeomebmfnkjomhe", // see crbug.com/122126 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gbchcmhmhahfdphkhkmpfmihenigjmpp", // Chrome Remote Desktop 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kgngmbheleoaphbjbaiobfdepmghbfah", // Pre-release Chrome Remote Desktop 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "odkaodonbgfohohmklejpjiejmcipmib", // Dogfood Chrome Remote Desktop 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ojoimpklfciegopdfgeenehpalipignm", // Chromoting canary 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cbkkbcmdlboombapidmoeolnmdacpkch", // see crbug.com/129089 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hhnbmknkdabfoieppbbljkhkfjcmcbjh", // see crbug.com/134099 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mablfbjkhmhkmefkjjacnbaikjkipphg", // see crbug.com/134099 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pdeelgamlgannhelgoegilelnnojegoh", // see crbug.com/134099 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cabapfdbkniadpollkckdnedaanlciaj", // see crbug.com/134099 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mapljbgnjledlpdmlchihnmeclmefbba", // see crbug.com/134099 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ghbfeebgmiidnnmeobbbaiamklmpbpii", // see crbug.com/134099 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jdfhpkjeckflbbleddjlpimecpbjdeep", // see crbug.com/142514 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "iabmpiboiopbgfabjmgeedhcmjenhbla", // see crbug.com/165080 282c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "B7CF8A292249681AF81771650BA4CEEAF19A4560", // see crbug.com/165080 283c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see crbug.com/234789 284c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "4EB74897CB187C7633357C2FE832E0AD6A44883A", // see crbug.com/234789 285c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "7525AF4F66763A70A883C4700529F647B470E4D2", // see crbug.com/238084 286c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "0B549507088E1564D672F7942EB87CA4DAD73972", // see crbug.com/238084 287c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "864288364E239573E777D3E0E36864E590E95C74" // see crbug.com/238084 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a copy of the given url with its host set to given host and path set 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to given path. Other parts of the url will be the same. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ReplaceURLHostAndPath(const GURL& url, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_canon::Replacements<char> replacements; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetHost(host.c_str(), 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Component(0, host.length())); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetPath(path.c_str(), 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Component(0, path.length())); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url.ReplaceComponents(replacements); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps "foo://bar/baz/" to "foo://chrome/bar/baz/". 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL AddUberHost(const GURL& url) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string uber_host = chrome::kChromeUIUberHost; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string new_path = url.host() + url.path(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ReplaceURLHostAndPath(url, uber_host, new_path); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If url->host() is "chrome" and url->path() has characters other than the 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first slash, changes the url from "foo://chrome/bar/" to "foo://bar/" and 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns true. Otherwise returns false. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RemoveUberHost(GURL* url) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->host() != chrome::kChromeUIUberHost) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->path().empty() || url->path() == "/") 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string old_path = url->path(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string::size_type separator = old_path.find('/', 1); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_host; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_path; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (separator == std::string::npos) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_host = old_path.substr(1); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_host = old_path.substr(1, separator - 1); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_path = old_path.substr(separator); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Do not allow URLs with paths empty before the first slash since we can't 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // have an empty host. (e.g "foo://chrome//") 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (new_host.empty()) 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = ReplaceURLHostAndPath(*url, new_host, new_path); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(url->is_valid()); 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles rewriting Web UI URLs. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleWebUI(GURL* url, content::BrowserContext* browser_context) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not handle special URLs such as "about:foo" 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->host().empty()) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL chrome_url = AddUberHost(*url); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle valid "chrome://chrome/foo" URLs so the reverse handler will 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL( 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, chrome_url)) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, *url)) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case : in ChromeOS in Guest mode bookmarks and history are 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled for security reasons. New tab page explains the reasons, so 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we redirect user to new tab page. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chromeos::UserManager::Get()->IsLoggedInAsGuest()) { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->SchemeIs(chrome::kChromeUIScheme) && 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url->DomainIs(chrome::kChromeUIBookmarksHost) || 3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_ENHANCED_BOOKMARKS) 3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) url->DomainIs(chrome::kChromeUIEnhancedBookmarksHost) || 3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url->DomainIs(chrome::kChromeUIHistoryHost))) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rewrite with new tab URL 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case the new tab page. In older versions of Chrome, the new tab 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page was hosted at chrome-internal:<blah>. This might be in people's saved 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sessions or bookmarks, so we say any URL with that scheme triggers the new 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab page. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->SchemeIs(chrome::kChromeInternalScheme)) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rewrite it with the proper new tab URL. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reverse URL handler for Web UI. Maps "chrome://chrome/foo/" to 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "chrome://foo/". 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleWebUIReverse(GURL* url, content::BrowserContext* browser_context) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->is_valid() || !url->SchemeIs(chrome::kChromeUIScheme)) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RemoveUberHost(url); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// below. Extension, and isolated apps require different privileges to be 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// granted to their RenderProcessHosts. This classification allows us to make 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sure URLs are served by hosts with the right set of privileges. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum RenderProcessHostPrivilege { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_NORMAL, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_HOSTED, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_ISOLATED, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_EXTENSION, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default to a normal renderer cause it is lower privileged. This should only 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // occur if the URL on a site instance is either malformed, or uninitialized. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is malformed, then there is no need for better privileges anyways. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is uninitialized, but eventually settles on being an a scheme other 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than normal webrenderer, the navigation logic will correct us out of band 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anyways. 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetByID(url.host()); 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::AppIsolationInfo::HasIsolatedStorage(extension)) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_ISOLATED; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_hosted_app()) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_HOSTED; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_EXTENSION; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHostPrivilege GetProcessPrivilege( 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process_host, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> extension_ids = 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map->GetExtensionsInProcess(process_host->GetID()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_ids.empty()) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::iterator iter = extension_ids.begin(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != extension_ids.end(); ++iter) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->GetExtensionById(*iter, false); 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::AppIsolationInfo::HasIsolatedStorage(extension)) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_ISOLATED; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_hosted_app()) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_HOSTED; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_EXTENSION; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CertMatchesFilter(const net::X509Certificate& cert, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& filter) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(markusheintz): This is the minimal required filter implementation. 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implement a better matcher. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An empty filter matches any client certificate since no requirements are 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified at all. 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.empty()) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string common_name; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.GetString("ISSUER.CN", &common_name) && 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cert.issuer().common_name == common_name)) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills |map| with the per-script font prefs under path |map_name|. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillFontFamilyMap(const PrefService* prefs, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* map_name, 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_glue::ScriptFontFamilyMap* map) { 4838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // TODO: Get rid of the brute-force scan over possible (font family / script) 4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // combinations - see http://crbug.com/308095. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pref_name = base::StringPrintf("%s.%s", map_name, script); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string font_family = prefs->GetString(pref_name.c_str()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!font_family.empty()) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*map)[script] = UTF8ToUTF16(font_family); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 4958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)breakpad::CrashHandlerHostLinux* CreateCrashHandlerHost( 4968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& process_type) { 4978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath dumps_path; 4988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path); 4998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 5008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ANNOTATE_SCOPED_MEMORY_LEAK; 5018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) breakpad::CrashHandlerHostLinux* crash_handler = 5028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new breakpad::CrashHandlerHostLinux( 5038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) process_type, dumps_path, getenv(env_vars::kHeadless) == NULL); 5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) crash_handler->StartUploaderThread(); 5058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return crash_handler; 5068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCrashSignalFD(const CommandLine& command_line) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kExtensionProcess)) { 5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static breakpad::CrashHandlerHostLinux* crash_handler = NULL; 5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!crash_handler) 5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) crash_handler = CreateCrashHandlerHost("extension"); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string process_type = 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kProcessType); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (process_type == switches::kRendererProcess) { 5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static breakpad::CrashHandlerHostLinux* crash_handler = NULL; 5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!crash_handler) 5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) crash_handler = CreateCrashHandlerHost(process_type); 5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 5258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (process_type == switches::kPluginProcess) { 5288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static breakpad::CrashHandlerHostLinux* crash_handler = NULL; 5298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!crash_handler) 5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) crash_handler = CreateCrashHandlerHost(process_type); 5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 5328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (process_type == switches::kPpapiPluginProcess) { 5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static breakpad::CrashHandlerHostLinux* crash_handler = NULL; 5368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!crash_handler) 5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) crash_handler = CreateCrashHandlerHost(process_type); 5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (process_type == switches::kGpuProcess) { 5428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static breakpad::CrashHandlerHostLinux* crash_handler = NULL; 5438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!crash_handler) 5448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) crash_handler = CreateCrashHandlerHost(process_type); 5458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 5468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetEffectiveURLForSignin(const GURL& url) { 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(SigninManager::IsWebBasedSigninFlowURL(url)); 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL effective_url(SigninManager::kChromeSigninEffectiveSite); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy the path because the argument to SetPathStr must outlive 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the Replacements object. 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string path_copy(url.path()); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL::Replacements replacements; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacements.SetPathStr(path_copy); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_url = effective_url.ReplaceComponents(replacements); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return effective_url; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetApplicationLocaleOnIOThread(const std::string& locale) { 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_io_thread_application_locale.Get() = locale; 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void HandleBlockedPopupOnUIThread(const BlockedWindowParams& params) { 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID(params.render_process_id(), 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) params.opener_id()); 575558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!tab) 576558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 577558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 578558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PopupBlockerTabHelper* popup_helper = 579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PopupBlockerTabHelper::FromWebContents(tab); 580558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!popup_helper) 581558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) popup_helper->AddBlockedPopup(params); 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID) 5868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void HandleSingleTabModeBlockOnUIThread(const BlockedWindowParams& params) { 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebContents* web_contents = 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) tab_util::GetWebContentsByID(params.render_process_id(), 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) params.opener_id()); 59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!web_contents) 59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SingleTabModeTabHelper::FromWebContents(web_contents)->HandleOpenUrl(params); 595558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 5968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)float GetFontScaleMultiplier(const PrefService* prefs) { 5988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (prefs->GetBoolean(prefs::kWebKitFontScaleFactorQuirk)) { 5998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // The value of kWebKitFontScaleFactor passed by Chrome for Android already 6008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // includes the multiplier. 6018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return 1.0f; 6028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 6038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static const float kMinFSM = 1.05f; 6058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static const int kWidthForMinFSM = 320; 6068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static const float kMaxFSM = 1.3f; 6078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static const int kWidthForMaxFSM = 800; 6088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::DeviceDisplayInfo info; 6108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int minWidth = info.GetSmallestDIPWidth(); 6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (minWidth <= kWidthForMinFSM) 6138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return kMinFSM; 6148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (minWidth >= kWidthForMaxFSM) 6158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return kMaxFSM; 6168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // The font scale multiplier varies linearly between kMinFSM and kMaxFSM. 6188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) float ratio = static_cast<float>(minWidth - kWidthForMinFSM) / 6198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) (kWidthForMaxFSM - kWidthForMinFSM); 6208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return ratio * (kMaxFSM - kMinFSM) + kMinFSM; 6218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif // defined(OS_ANDROID) 624558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::ChromeContentBrowserClient() { 630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kPredefinedAllowedSocketOrigins); ++i) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_socket_origins_.insert(kPredefinedAllowedSocketOrigins[i]); 633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) permissions_policy_delegate_.reset( 63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new extensions::BrowserPermissionsPolicyDelegate()); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::~ChromeContentBrowserClient() { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeContentBrowserClient::RegisterProfilePrefs( 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kDisable3DAPIs, 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kEnableHyperlinkAuditing, 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true, 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kEnableMemoryInfo, 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeContentBrowserClient::SetApplicationLocale( 661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& locale) { 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This object is guaranteed to outlive all threads so we don't have to 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // worry about the lack of refcounting and can just post as Unretained. 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The common case is that this function is called early in Chrome startup 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // before any threads are created (it will also be called later if the user 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // changes the pref). In this case, there will be no threads created and 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // posting will fail. When there are no threads, we can just set the string 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // without worrying about threadsafety. 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&SetApplicationLocaleOnIOThread, locale))) { 674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_io_thread_application_locale.Get() = locale; 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::BrowserMainParts* ChromeContentBrowserClient::CreateBrowserMainParts( 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters) { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeBrowserMainParts* main_parts; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the Main browser parts based on the OS type. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsWin(parameters); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsMac(parameters); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_parts = new chromeos::ChromeBrowserMainPartsChromeos(parameters); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsLinux(parameters); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsAndroid(parameters); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsPosix(parameters); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainParts(parameters); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::AddProfilesExtraParts(main_parts); 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct additional browser parts. Stages are called in the order in 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which they are added. 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsGtk()); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsViews()); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 7127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsAsh()); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsAura()); 7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 7187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_X11) 7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsX11()); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::AddMetricsExtraParts(main_parts); 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return main_parts; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetStoragePartitionIdForSite( 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_id; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partition ID for webview guest processes is the string value of its 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance URL - "chrome-guest://app_id/persist?partition". 7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (site.SchemeIs(content::kGuestScheme)) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_id = site.spec(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsValidStoragePartitionId(browser_context, partition_id)); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return partition_id; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsValidStoragePartitionId( 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& partition_id) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default ID is empty and is always valid. 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partition_id.empty()) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(partition_id).is_valid(); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::GetStoragePartitionConfigForSite( 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site, 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_be_default, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* partition_domain, 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* partition_name, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* in_memory) { 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Default to the browser-wide storage partition and override based on |site| 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // below. 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_domain->clear(); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_name->clear(); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *in_memory = false; 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the webview tag, we create special guest processes, which host the 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag content separately from the main application that embeds the tag. 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A webview tag can specify both the partition name and whether the storage 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for that partition should be persisted. Each tag gets a SiteInstance with 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a specially formatted URL, based on the application it is hosted by and 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the partition requested by it. The format for that URL is: 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome-guest://partition_domain/persist?partition_name 7724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (site.SchemeIs(content::kGuestScheme)) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since guest URLs are only used for packaged apps, there must be an app 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // id in the URL. 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(site.has_host()); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *partition_domain = site.host(); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since persistence is optional, the path must either be empty or the 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // literal string. 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *in_memory = (site.path() != "/persist"); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partition name is user supplied value, which we have encoded when the 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL was created, so it needs to be decoded. 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *partition_name = net::UnescapeURLComponent(site.query(), 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::UnescapeRule::NORMAL); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (site.SchemeIs(extensions::kExtensionScheme)) { 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |can_be_default| is false, the caller is stating that the |site| 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be parsed as if it had isolated storage. In particular it is 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // important to NOT check ExtensionService for the is_storage_isolated() 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // attribute because this code path is run during Extension uninstall 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to do cleanup after the Extension has already been unloaded from the 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ExtensionService. 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_isolated = !can_be_default; 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (can_be_default) { 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = NULL; 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 798ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extension = 799ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extension_service->extensions()->GetExtensionOrAppByURL(site); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::AppIsolationInfo::HasIsolatedStorage(extension)) { 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_isolated = true; 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_isolated) { 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(site.has_host()); 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For extensions with isolated storage, the the host of the |site| is 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the |partition_domain|. The |in_memory| and |partition_name| are only 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // used in guest schemes so they are cleared here. 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *partition_domain = site.host(); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *in_memory = false; 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_name->clear(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Assert that if |can_be_default| is false, the code above must have found a 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-default partition. If this fails, the caller has a serious logic 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error about which StoragePartition they expect to be in and it is not 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // safe to continue. 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(can_be_default || !partition_domain->empty()); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContentsViewDelegate* 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetWebContentsViewDelegate( 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CreateWebContentsViewDelegate(web_contents); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ChromeContentBrowserClient::GuestWebContentsCreated( 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebContents* guest_web_contents, 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebContents* opener_web_contents, 8347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserPluginGuestDelegate** guest_delegate, 835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> extra_params) { 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (opener_web_contents) { 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GuestView* guest = GuestView::FromWebContents(opener_web_contents); 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!guest) { 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 843d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Create a new GuestView of the same type as the opener. 844d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *guest_delegate = 845d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GuestView::Create(guest_web_contents, guest->GetViewType()); 846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!extra_params) { 850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string api_type; 8542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch extra_params->GetString(guestview::kParameterApi, &api_type); 855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 856d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *guest_delegate = 857d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GuestView::Create(guest_web_contents, 858d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GuestView::GetViewTypeFromString(api_type)); 859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ChromeContentBrowserClient::GuestWebContentsAttached( 862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContents* guest_web_contents, 863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContents* embedder_web_contents, 86468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& embedder_frame_url, 865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::DictionaryValue& extra_params) { 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder_web_contents->GetBrowserContext()); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!service) { 871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 87468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 87568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // We usually require BrowserPlugins to be hosted by a storage isolated 87668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // extension. We treat WebUI pages as a special case if they host the 87768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // BrowserPlugin in a component extension iframe. In that case, we use the 87868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // iframe's URL to determine the extension. 87968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& embedder_site_url = 88068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) embedder_web_contents->GetSiteInstance()->GetSiteURL(); 88168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const Extension* extension = service->extensions()->GetExtensionOrAppByURL( 88268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::HasWebUIScheme(embedder_site_url) ? 88368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) embedder_frame_url : embedder_site_url); 884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!extension) { 885a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // It's ok to return here, since we could be running a browser plugin 886a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // outside an extension, and don't need to attach a 887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // BrowserPluginGuestDelegate in that case; 888a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // e.g. running with flag --enable-browser-plugin-for-all-view-types. 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 891eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GuestView* guest = GuestView::FromWebContents(guest_web_contents); 893eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!guest) { 894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 8973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) guest->Attach(embedder_web_contents, extension->id(), extra_params); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RenderProcessHostCreated( 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* host) { 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = host->GetID(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestContextGetter* context = 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetRequestContextForRenderProcess(id); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new ChromeRenderMessageFilter(id, profile, context)); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 9094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new PluginInfoMessageFilter(id, profile)); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 9124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new PrintingMessageFilter(id, profile)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new SearchProviderInstallStateMessageFilter(id, profile)); 915a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(ENABLE_SPELLCHECK) 9164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new SpellCheckMessageFilter(id)); 917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new SpellCheckMessageFilterMac(id)); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new ChromeNetBenchmarkingMessageFilter( 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, profile, context)); 9234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new prerender::PrerenderMessageFilter(id, profile)); 9244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new ValidationMessageMessageFilter(id)); 9254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new TtsMessageFilter(id, profile)); 926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebRtcLoggingHandlerHost* webrtc_logging_handler_host = 9288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new WebRtcLoggingHandlerHost(profile); 9294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(webrtc_logging_handler_host); 9304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->SetUserData(host, new base::UserDataAdapter<WebRtcLoggingHandlerHost>( 9314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webrtc_logging_handler_host)); 932868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 9337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(DISABLE_NACL) 9344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new NaClHostMessageFilter( 935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch id, profile->IsOffTheRecord(), 9368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) profile->GetPath(), 937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context)); 9387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 939d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_ANDROID) 9404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new EncryptedMediaMessageFilterAndroid()); 941d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->Send(new ChromeViewMsg_SetIsIncognitoProcess( 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->IsOffTheRecord())); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendExtensionWebRequestStatusToHost(host); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererContentSettingRules rules; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRendererContentSettingRules(profile->GetHostContentSettingsMap(), &rules); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->Send(new ChromeViewMsg_SetContentSettingRules(rules)); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ChromeContentBrowserClient::GetEffectiveURL( 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& url) { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url; 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If the input |url| should be assigned to the Instant renderer, make its 960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // effective URL distinct from other URLs on the search provider's domain. 961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (chrome::ShouldAssignURLToInstantRenderer(url, profile)) 962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return chrome::GetEffectiveURLForInstant(url, profile); 963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| should be assigned to the Signin renderer, make its 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effective URL distinct from other URLs on the signin service's domain. 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the signin renderer will be allowed to sign the user in to 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chrome. 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(url)) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetEffectiveURLForSignin(url); 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| is part of an installed app, the effective URL is an 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension URL with the ID of that extension as the host. This has the 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effect of grouping apps together in a common SiteInstance. 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_service) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = extension_service->extensions()-> 982ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetHostedAppByURL(url); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bookmark apps do not use the hosted app process model, and should be 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treated as normal URLs. 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->from_bookmark()) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is part of an extension's web extent, convert it to an 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension URL. 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension->GetResourceURL(url.path()); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldUseProcessPerSite( 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& effective_url) { 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Non-extension, non-Instant URLs should generally use 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process-per-site-instance. Because we expect to use the effective URL, 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // URLs for hosted apps (apart from bookmark apps) should have an extension 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scheme by now. 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1007a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (chrome::ShouldUseProcessPerSiteForInstantURL(effective_url, profile)) 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(effective_url)) 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!effective_url.SchemeIs(extensions::kExtensionScheme)) 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_service) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1023ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Extension* extension = 1024ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extension_service->extensions()->GetExtensionOrAppByURL(effective_url); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is part of a hosted app that does not have the background 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission, or that does not allow JavaScript access to the background 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page, we want to give each instance its own process to improve 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // responsiveness. 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension->GetType() == Manifest::TYPE_HOSTED_APP) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension->HasAPIPermission(APIPermission::kBackground) || 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !extensions::BackgroundInfo::AllowJSAccess(extension)) { 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hosted apps that have script access to their background page must use 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process per site, since all instances can make synchronous calls to the 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background window. Other extensions should use process per site as well. 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are treated as WebUI schemes but do not get WebUI bindings. 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalWebUISchemes( 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>* additional_schemes) { 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_schemes->push_back(chrome::kChromeSearchScheme); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::CreateRequestContext( 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ProtocolHandlerMap* protocol_handlers) { 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->CreateRequestContext(protocol_handlers); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::CreateRequestContextForStoragePartition( 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& partition_path, 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_memory, 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ProtocolHandlerMap* protocol_handlers) { 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->CreateRequestContextForStoragePartition( 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_path, in_memory, protocol_handlers); 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsHandledURL(const GURL& url) { 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProfileIOData::IsHandledURL(url); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1074a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool ChromeContentBrowserClient::CanCommitURL( 1075a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::RenderProcessHost* process_host, 1076a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const GURL& url) { 1077a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We need to let most extension URLs commit in any process, since this can 1078a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // be allowed due to web_accessible_resources. Most hosted app URLs may also 1079a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // load in any process (e.g., in an iframe). However, the Chrome Web Store 1080a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // cannot be loaded in iframes and should never be requested outside its 1081a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // process. 1082a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Profile* profile = 1083a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Profile::FromBrowserContext(process_host->GetBrowserContext()); 1084a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ExtensionService* service = 1085a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 1086a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!service) 1087a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 1088a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const Extension* new_extension = 1089ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch service->extensions()->GetExtensionOrAppByURL(url); 1090a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (new_extension && 1091a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new_extension->is_hosted_app() && 1092a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new_extension->id() == extension_misc::kWebStoreAppId && 1093a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) !service->process_map()->Contains(new_extension->id(), 1094a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) process_host->GetID())) { 1095a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 1096a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1097a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1098a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 1099a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 1100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 110158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ChromeContentBrowserClient::ShouldAllowOpenURL( 110258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::SiteInstance* site_instance, const GURL& url) { 110358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL from_url = site_instance->GetSiteURL(); 110458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Do not allow pages from the web or other extensions navigate to 110558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // non-web-accessible extension resources. 110658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme) && 110758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) (from_url.SchemeIsHTTPOrHTTPS() || 110858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) from_url.SchemeIs(extensions::kExtensionScheme))) { 110958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 111058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) site_instance->GetProcess()->GetBrowserContext()); 111158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExtensionService* service = 111258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 111358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!service) 111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 111558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const Extension* extension = 111658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(url); 111758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!extension) 111858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 111958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const Extension* from_extension = 112058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->extensions()->GetExtensionOrAppByURL( 112158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) site_instance->GetSiteURL()); 112258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (from_extension && from_extension->id() == extension->id()) 112358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 112458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 112558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!extensions::WebAccessibleResourcesInfo::IsResourceWebAccessible( 112658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) extension, url.path())) 112758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 112858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 112958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 113058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 113158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsSuitableHost( 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process_host, 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site_url) { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(process_host->GetBrowserContext()); 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This may be NULL during tests. In that case, just assume any site can 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // share any host. 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Instant URLs should only be in the instant process and instant process 1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should only have Instant URLs. 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (instant_service) { 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_instant_process = instant_service->IsInstantProcess( 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) process_host->GetID()); 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_be_in_instant_process = 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::ShouldAssignURLToInstantRenderer(site_url, profile); 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_instant_process || should_be_in_instant_process) 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return is_instant_process && should_be_in_instant_process; 1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager && signin_manager->IsSigninProcess(process_host->GetID())) 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SigninManager::IsWebBasedSigninFlowURL(site_url); 1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map = service->process_map(); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't allow the Task Manager to share a process with anything else. 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it can affect the renderers it is observing. 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we could create another RenderProcessHostPrivilege bucket for 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this to allow multiple chrome://tasks instances to share, but that's 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a very unlikely case without serious consequences. 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_url.GetOrigin() == GURL(chrome::kChromeUITaskManagerURL).GetOrigin()) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These may be NULL during tests. In that case, just assume any site can 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // share any host. 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service || !process_map) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, just make sure the process privilege matches the privilege 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // required by the site. 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHostPrivilege privilege_required = 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrivilegeRequiredByUrl(site_url, service); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetProcessPrivilege(process_host, process_map, service) == 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privilege_required; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function is trying to limit the amount of processes used by extensions 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with background pages. It uses a globally set percentage of processes to 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run such extensions and if the limit is exceeded, it returns true, to 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicate to the content module to group extensions together. 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldTryToUseExistingProcessHost( 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& url) { 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It has to be a valid URL for us to check for an extension. 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = !profile ? NULL : 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to have a valid extension with background page to proceed. 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 1204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch service->extensions()->GetExtensionOrAppByURL(url); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extensions::BackgroundInfo::HasBackgroundPage(extension)) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<int> process_ids; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_process_count = 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::GetMaxRendererProcessCount(); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go through all profiles to ensure we have total count of extension 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processes containing background pages, otherwise one profile can 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starve the other. 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> profiles = g_browser_process->profile_manager()-> 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLoadedProfiles(); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* epm = 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profiles[i])->process_manager(); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionProcessManager::const_iterator iter = 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) epm->background_hosts().begin(); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != epm->background_hosts().end(); ++iter) { 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::ExtensionHost* host = *iter; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_ids.insert(host->render_process_host()->GetID()); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_ids.size() > 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (max_process_count * chrome::kMaxShareOfExtensionProcesses)) { 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SiteInstanceGotProcess( 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(site_instance->HasProcess()); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remember the ID of the Instant process to signal the renderer process 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on startup in |AppendExtraCommandLineSwitches| below. 1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::ShouldAssignURLToInstantRenderer( 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->GetSiteURL(), profile)) { 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->AddInstantProcess(site_instance->GetProcess()->GetID()); 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only expect there to be one signin process as we use process-per-site 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for signin URLs. The signin process will be cleared from SigninManager 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the renderer is destroyed. 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(site_instance->GetSiteURL())) { 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager) 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_manager->SetSigninProcess(site_instance->GetProcess()->GetID()); 126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserThread::PostTask( 126790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 126890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&ExtensionInfoMap::SetSigninProcess, 126990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 127090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) site_instance->GetProcess()->GetID())); 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1279ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Extension* extension = service->extensions()->GetExtensionOrAppByURL( 1280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->process_map()->Insert(extension->id(), 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId()); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionInfoMap::RegisterExtensionProcess, 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId())); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SiteInstanceDeleting( 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!site_instance->HasProcess()) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1308ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Extension* extension = service->extensions()->GetExtensionOrAppByURL( 1309ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch site_instance->GetSiteURL()); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->process_map()->Remove(extension->id(), 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId()); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionInfoMap::UnregisterExtensionProcess, 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId())); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldSwapProcessesForNavigation( 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SiteInstance* site_instance, 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& current_url, 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url) { 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_url.is_empty()) { 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always choose a new process when navigating to extension URLs. The 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process grouping logic will combine all of a given extension's pages 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the same process. 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_url.SchemeIs(extensions::kExtensionScheme)) 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also, we must switch if one is an extension and the other is not the exact 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same extension. 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_url.SchemeIs(extensions::kExtensionScheme) || 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_url.SchemeIs(extensions::kExtensionScheme)) { 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_url.GetOrigin() != new_url.GetOrigin()) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The checks below only matter if we can retrieve which extensions are 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // installed. 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext()); 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We must swap if the URL is for an extension and we are not using an 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension process. 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* new_extension = 1359ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch service->extensions()->GetExtensionOrAppByURL(new_url); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore all hosted apps except the Chrome Web Store, since they do not 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // require their own BrowsingInstance (e.g., postMessage is ok). 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_extension && 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension->is_hosted_app() && 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension->id() != extension_misc::kWebStoreAppId) 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension = NULL; 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_extension && 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->HasProcess() && 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !service->process_map()->Contains(new_extension->id(), 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->GetProcess()->GetID())) 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldSwapProcessesForRedirect( 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* resource_context, const GURL& current_url, 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url) { 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extensions::CrossesExtensionProcessBoundary( 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetExtensionInfoMap()->extensions(), 1381ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch current_url, new_url, false); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ChromeContentBrowserClient::ShouldAssignSiteForURL(const GURL& url) { 13857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return !url.SchemeIs(chrome::kChromeNativeScheme); 13867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 13877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetCanonicalEncodingNameByAliasName( 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& alias_name) { 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CharacterEncoding::GetCanonicalEncodingNameByAliasName(alias_name); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line, int child_process_id) { 13954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_POSIX) 13968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (breakpad::IsCrashReporterEnabled()) { 13974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string enable_crash_reporter; 13984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GoogleUpdateSettings::GetMetricsId(&enable_crash_reporter); 13994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_MACOSX) 14004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) enable_crash_reporter += "," + base::GetLinuxDistro(); 14014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kEnableCrashReporter, 14034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) enable_crash_reporter); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // OS_POSIX 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (logging::DialogsAreSuppressed()) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kNoErrorDialogs); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string process_type = 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->GetSwitchValueASCII(switches::kProcessType); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const char* const kCommonSwitchNames[] = { 141558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switches::kChromeFrame, 141658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switches::kUserDataDir, // Make logs go to the right file. 141758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 141858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kCommonSwitchNames, 141958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) arraysize(kCommonSwitchNames)); 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kRendererProcess) { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& login_profile = 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_command_line.GetSwitchValueASCII( 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kLoginProfile); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!login_profile.empty()) 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitchASCII( 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kLoginProfile, login_profile); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::FromID(child_process_id); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process) { 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process->GetBrowserContext()); 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ProcessMap* process_map = extension_service->process_map(); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_map && process_map->Contains(process->GetID())) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kExtensionProcess); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently this pref is only registered if applied via a policy. 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->HasPrefPath(prefs::kDisable3DAPIs) && 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kDisable3DAPIs)) { 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn this policy into a command line switch. 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisable3DAPIs); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable client-side phishing detection in the renderer if it is 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled in the Profile preferences or the browser process. 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kSafeBrowsingEnabled) || 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !g_browser_process->safe_browsing_detection_service()) { 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch( 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableClientSidePhishingDetection); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kPrintPreviewDisabled)) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kRendererPrintPreview); 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service && 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->IsInstantProcess(process->GetID())) 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kInstantProcess); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager && signin_manager->IsSigninProcess(process->GetID())) 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kSigninProcess); 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (message_center::IsRichNotificationEnabled()) 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitch(switches::kDisableHTMLNotifications); 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please keep this in alphabetical order. 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 148290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill::switches::kDisableInteractiveAutocomplete, 14834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill::switches::kDisablePasswordGeneration, 1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) autofill::switches::kEnableExperimentalFormFilling, 148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill::switches::kEnableInteractiveAutocomplete, 14864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autofill::switches::kEnablePasswordGeneration, 14878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) autofill::switches::kNoAutofillNecessaryForPasswordGeneration, 1488ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kAllowLegacyExtensionManifests, 1489ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kAllowScriptingGallery, 1490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extensions::switches::kEnableExperimentalExtensionApis, 1491ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kExtensionsOnChromeURLs, 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowHTTPBackgroundPage, 14937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(victorhsieh): remove the following flag once we move PPAPI FileIO 14947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // to browser. 14957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switches::kAllowNaClFileHandleAPI, 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsCheckoutURL, 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsGalleryURL, 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kCloudPrintServiceURL, 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDebugPrint, 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableBundledPpapiFlash, 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableExtensionsResourceWhitelist, 15023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switches::kDisablePnacl, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableScriptedPrintThrottling, 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableAdview, 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableAdviewSrcAttribute, 1506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kEnableAppWindowControls, 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableBenchmarking, 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableNaCl, 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableNetBenchmarking, 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableWatchdog, 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMemoryProfiling, 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMessageLoopHistogrammer, 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kNoJsRandomness, 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPlaybackMode, 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashArgs, 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashInProcess, 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashPath, 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashVersion, 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingAtStart, 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingFile, 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingFlush, 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kRecordMode, 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSilentDumpOnDCHECK, 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kSpdyProxyAuthOrigin, 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kWhitelistedExtensionID, 15264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) translate::switches::kTranslateSecurityOrigin, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kUtilityProcess) { 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 1533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extensions::switches::kEnableExperimentalExtensionApis, 1534ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kExtensionsOnChromeURLs, 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowHTTPBackgroundPage, 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kWhitelistedExtensionID, 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kPluginProcess) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kLoginProfile, 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMemoryProfiling, 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSilentDumpOnDCHECK, 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kZygoteProcess) { 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load (in-process) Pepper plugins in-process in the zygote pre-sandbox. 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableBundledPpapiFlash, 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashInProcess, 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashPath, 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashVersion, 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kGpuProcess) { 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If --ignore-gpu-blacklist is passed in, don't send in crash reports 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because GPU is expected to be unreliable. 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) && 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line->HasSwitch(switches::kDisableBreakpad)) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisableBreakpad); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The command line switch kEnableBenchmarking needs to be specified along 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the kEnableStatsTable switch to ensure that the stats table global 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is initialized correctly. 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line->HasSwitch(switches::kEnableBenchmarking)) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(command_line->HasSwitch(switches::kEnableStatsTable)); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetApplicationLocale() { 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BrowserThread::CurrentlyOn(BrowserThread::IO)) 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_io_thread_application_locale.Get(); 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->GetApplicationLocale(); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetAcceptLangs( 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* context) { 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(context); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile->GetPrefs()->GetString(prefs::kAcceptLanguages); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* ChromeContentBrowserClient::GetDefaultFavicon() { 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowAppCache( 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& manifest_url, 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context) { 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->GetCookieSettings()-> 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsSettingCookieAllowed(manifest_url, first_party); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowGetCookie( 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list, 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = io_data->GetCookieSettings()-> 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsReadingCookieAllowed(url, first_party); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookiesRead, render_process_id, 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, url, first_party, cookie_list, !allow)); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowSetCookie( 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions* options) { 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, first_party); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookieChanged, render_process_id, 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, url, first_party, cookie_line, *options, 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !allow)); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowSaveLocalState( 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context) { 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting setting = cookie_settings->GetDefaultCookieSetting(NULL); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(bauerb): Should we also disallow local state if the default is BLOCK? 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Could we even support per-origin settings? 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return setting != CONTENT_SETTING_SESSION_ONLY; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerDatabase( 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long estimated_size, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to database for potential display in UI. 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::WebDatabaseAccessed, 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, name, display_name, !allow)); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerFileSystem( 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to file system for potential display in UI. 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::FileSystemAccessed, 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, !allow)); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerIndexedDB( 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to IndexedDB for potential display in UI. 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::IndexedDBAccessed, 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, name, !allow)); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContext* 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::OverrideRequestContextForURL( 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, content::ResourceContext* context) { 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->extensions_request_context(); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaPermissionContext* 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::CreateQuotaPermissionContext() { 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeQuotaPermissionContext(); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::AllowCertificateError( 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_error, 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::SSLInfo& ssl_info, 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& request_url, 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType::Type resource_type, 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool overridable, 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool strict_enforcement, 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(bool)>& callback, 175190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::CertificateRequestResultType* result) { 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (resource_type != ResourceType::MAIN_FRAME) { 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A sub-resource has a certificate error. The user doesn't really 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have a context for making the right decision, so block the 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request hard, without an info bar to allow showing the insecure 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content. 175790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *result = content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY; 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab is being prerendered, cancel the prerender and the request. 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID( 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab) { 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager* prerender_manager = 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManagerFactory::GetForProfile( 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(tab->GetBrowserContext())); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_manager && prerender_manager->IsWebContentsPrerendering(tab, 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)) { 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_manager->prerender_tracker()->TryCancel( 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id, 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::FINAL_STATUS_SSL_ERROR)) { 177690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *result = content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal::CaptivePortalTabHelper* captive_portal_tab_helper = 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal::CaptivePortalTabHelper::FromWebContents(tab); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (captive_portal_tab_helper) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal_tab_helper->OnSSLCertError(ssl_info); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, display an SSL blocking page. 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SSLBlockingPage(tab, cert_error, ssl_info, request_url, overridable, 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strict_enforcement, callback); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SelectClientCertificate( 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpNetworkSession* network_session, 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLCertRequestInfo* cert_request_info, 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(net::X509Certificate*)>& callback) { 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID( 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab) { 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_url("https://" + cert_request_info->host_and_port); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(requesting_url.is_valid()) << "Invalid URL string: https://" 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << cert_request_info->host_and_port; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext()); 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> filter( 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetHostContentSettingsMap()->GetWebsiteSetting( 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requesting_url, 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requesting_url, 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(), NULL)); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.get()) { 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to automatically select a client certificate. 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter->IsType(Value::TYPE_DICTIONARY)) { 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* filter_dict = 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DictionaryValue*>(filter.get()); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<scoped_refptr<net::X509Certificate> >& 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_client_certs = cert_request_info->client_certs; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_client_certs.size(); ++i) { 1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (CertMatchesFilter(*all_client_certs[i].get(), *filter_dict)) { 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the first certificate that is matched by the filter. 1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback.Run(all_client_certs[i].get()); 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLTabHelper* ssl_tab_helper = SSLTabHelper::FromWebContents(tab); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ssl_tab_helper) { 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is no SSLTabHelper for the given WebContents then we can't 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // show the user a dialog to select a client certificate. So we simply 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // proceed with no client certificate. 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(NULL); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_tab_helper->ShowClientCertificateRequestDialog( 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session, cert_request_info, callback); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::AddCertificate( 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::CertificateMimeType cert_type, 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* cert_data, 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t cert_size, 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::SSLAddCertificate(request, cert_type, cert_data, cert_size, 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_process_id, render_view_id); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() { 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaCaptureDevicesDispatcher::GetInstance(); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RequestDesktopNotificationPermission( 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_context, 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents = 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_util::GetWebContentsByID(render_process_id, render_view_id); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents) { 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip showing the infobar if the request comes from an extension, and that 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension has the 'notify' permission. (If the extension does not have the 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission, the user will still be prompted.) 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); 1883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionInfoMap* extension_info_map = 1884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(); 1885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DesktopNotificationService* notification_service = 1886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 1887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Extension* extension = NULL; 1888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension_info_map) { 1889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_origin, render_process_id, 1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::APIPermission::kNotification, &extensions); 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (ExtensionSet::const_iterator iter = extensions.begin(); 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != extensions.end(); ++iter) { 1895558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (notification_service->IsNotifierEnabled(NotifierId( 1896558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NotifierId::APPLICATION, (*iter)->id()))) { 18977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension = iter->get(); 1898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* rvh = 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FromID(render_process_id, render_view_id); 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsExtensionWithPermissionOrSuggestInConsole( 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APIPermission::kNotification, extension, rvh)) { 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->DesktopNotificationPermissionRequestDone(callback_context); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) notification_service->RequestPermission(source_origin, render_process_id, 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, callback_context, contents); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter::Permission 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::CheckDesktopNotificationPermission( 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id) { 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 19257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sometimes a notification may be invoked during the shutdown. 19267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // See http://crbug.com/256638 19277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (browser_shutdown::IsTryingToQuit()) 19287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return WebKit::WebNotificationPresenter::PermissionNotAllowed; 19297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 1931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DesktopNotificationService* notification_service = 1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_data->GetNotificationService(); 1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (notification_service) { 1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionInfoMap* extension_info_map = io_data->GetExtensionInfoMap(); 1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 1937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin, render_process_id, 1939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::APIPermission::kNotification, &extensions); 1940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (ExtensionSet::const_iterator iter = extensions.begin(); 1941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != extensions.end(); ++iter) { 1942558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch NotifierId notifier_id(NotifierId::APPLICATION, (*iter)->id()); 1943558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (notification_service->IsNotifierEnabled(notifier_id)) 1944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 1945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return notification_service->HasPermission(source_origin); 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionNotAllowed; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ShowDesktopNotification( 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ShowDesktopNotificationHostMsgParams& params, 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool worker) { 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::FromID( 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = rvh->GetProcess(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext()); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* service = 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->ShowDesktopNotification( 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params, render_process_id, render_view_id, 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker ? DesktopNotificationService::WorkerNotification : 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService::PageNotification); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::CancelDesktopNotification( 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notification_id) { 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::FromID( 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = rvh->GetProcess(); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext()); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* service = 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->CancelDesktopNotification( 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id, notification_id); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::CanCreateWindow( 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& opener_url, 200758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& opener_top_level_frame_url, 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowContainerType container_type, 2010558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const GURL& target_url, 2011558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const content::Referrer& referrer, 2012558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WindowOpenDisposition disposition, 2013558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const WebWindowFeatures& features, 2014558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool user_gesture, 2015558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool opener_suppressed, 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 2018558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool is_guest, 2019558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int opener_id, 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* no_javascript_access) { 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *no_javascript_access = false; 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 202658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExtensionInfoMap* map = io_data->GetExtensionInfoMap(); 202758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the opener is trying to create a background window but doesn't have 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the appropriate permission, fail the attempt. 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) { 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!map->SecurityOriginHasAPIPermission( 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin, 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kBackground)) { 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: this use of GetExtensionOrAppByURL is safe but imperfect. It may 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return a recently installed Extension even if this CanCreateWindow call 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // was made by an old copy of the page in a normal web process. That's ok, 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the permission check above would have caused an early return 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already. We must use the full URL to find hosted apps, though, and not 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just the origin. 2044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Extension* extension = 2045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch map->extensions().GetExtensionOrAppByURL(opener_url); 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension && !extensions::BackgroundInfo::AllowJSAccess(extension)) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *no_javascript_access = true; 2048558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2049558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No new browser window (popup or tab) in app mode. 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (container_type == WINDOW_CONTAINER_TYPE_NORMAL && 2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::IsRunningInForcedAppMode()) { 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (g_browser_process->prerender_tracker() && 20593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) g_browser_process->prerender_tracker()->TryCancelOnIOThread( 20603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) render_process_id, 20613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) opener_id, 20623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) prerender::FINAL_STATUS_CREATE_NEW_WINDOW)) { 20633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 2064558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2065558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2066558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (is_guest) 2067558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 2068558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2069558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch HostContentSettingsMap* content_settings = 2070558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ProfileIOData::FromResourceContext(context)->GetHostContentSettingsMap(); 207158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BlockedWindowParams blocked_params(target_url, 207258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) referrer, 207358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) disposition, 207458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) features, 207558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) user_gesture, 207658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) opener_suppressed, 207758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) render_process_id, 207858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) opener_id); 2079558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 20802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!user_gesture && !CommandLine::ForCurrentProcess()->HasSwitch( 20812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch switches::kDisablePopupBlocking)) { 208258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (content_settings->GetContentSetting(opener_top_level_frame_url, 208358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) opener_top_level_frame_url, 2084558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CONTENT_SETTINGS_TYPE_POPUPS, 208558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string()) != 2086558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CONTENT_SETTING_ALLOW) { 208758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 208858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 208958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&HandleBlockedPopupOnUIThread, 209058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) blocked_params)); 209158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 2092558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 209358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2094558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 209558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_ANDROID) 209658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (SingleTabModeTabHelper::IsRegistered(render_process_id, opener_id)) { 2097558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch BrowserThread::PostTask(BrowserThread::UI, 2098558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch FROM_HERE, 209958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&HandleSingleTabModeBlockOnUIThread, 210058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) blocked_params)); 2101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return false; 2102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 210358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 2104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetWorkerProcessTitle( 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, content::ResourceContext* context) { 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if it's an extension-created worker, in which case we want to use 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the name of the extension. 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetExtensionInfoMap()->extensions().GetByID(url.host()); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension ? extension->name() : std::string(); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ResourceDispatcherHostCreated() { 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->ResourceDispatcherHostCreated(); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(tommi): Rename from Get to Create. 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::SpeechRecognitionManagerDelegate* 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetSpeechRecognitionManagerDelegate() { 21267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_INPUT_SPEECH) 21277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new speech::ChromeSpeechRecognitionManagerDelegateBubbleUI(); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 21297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Platforms who don't implement x-webkit-speech (a.k.a INPUT_SPEECH) just 21307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // need the base delegate without the bubble UI. 21317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new speech::ChromeSpeechRecognitionManagerDelegate(); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::NetLog* ChromeContentBrowserClient::GetNetLog() { 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->net_log(); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessTokenStore* ChromeContentBrowserClient::CreateAccessTokenStore() { 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeAccessTokenStore(); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsFastShutdownPossible() { 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::OverrideWebkitPrefs( 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, const GURL& url, WebPreferences* web_prefs) { 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext()); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Fill per-script font preferences. These are not registered on Android 21548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // - http://crbug.com/308033. 21558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if !defined(OS_ANDROID) 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitStandardFontFamilyMap, 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->standard_font_family_map); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitFixedFontFamilyMap, 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->fixed_font_family_map); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitSerifFontFamilyMap, 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->serif_font_family_map); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitSansSerifFontFamilyMap, 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->sans_serif_font_family_map); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitCursiveFontFamilyMap, 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->cursive_font_family_map); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitFantasyFontFamilyMap, 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->fantasy_font_family_map); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitPictographFontFamilyMap, 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->pictograph_font_family_map); 21708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_font_size = 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitDefaultFontSize); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_fixed_font_size = 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitDefaultFixedFontSize); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->minimum_font_size = 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitMinimumFontSize); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->minimum_logical_font_size = 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitMinimumLogicalFontSize); 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->javascript_can_open_windows_automatically = 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitJavascriptCanOpenWindowsAutomatically); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->dom_paste_enabled = 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitDomPasteEnabled); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->shrinks_standalone_images_to_fit = 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitShrinksStandaloneImagesToFit); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* inspector_settings = 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetDictionary(prefs::kWebKitInspectorSettings); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inspector_settings) { 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator iter(*inspector_settings); !iter.IsAtEnd(); 21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsString(&value)) { 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->inspector_settings.push_back( 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(iter.key(), value)); 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->tabs_to_links = prefs->GetBoolean(prefs::kWebkitTabsToLinks); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitJavascriptEnabled)) 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->javascript_enabled = false; 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitWebSecurityEnabled)) 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->web_security_enabled = false; 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitPluginsEnabled)) 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->plugins_enabled = false; 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitJavaEnabled)) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->java_enabled = false; 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->loads_images_automatically = 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitLoadsImagesAutomatically); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->GetBoolean(prefs::kDisable3DAPIs)) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->experimental_webgl_enabled = false; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->memory_info_enabled = 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kEnableMemoryInfo); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_displaying_insecure_content = 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitAllowDisplayingInsecureContent); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_running_insecure_content = 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitAllowRunningInsecureContent); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 22248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_prefs->text_autosizing_font_scale_factor = 22258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static_cast<float>(prefs->GetDouble(prefs::kWebKitFontScaleFactor)) * 22268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetFontScaleMultiplier(prefs); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->force_enable_zoom = 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitForceEnableZoom); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_ANDROID) 2232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_prefs->password_echo_enabled = 2233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitPasswordEchoEnabled); 2234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->password_echo_enabled = browser_defaults::kPasswordEchoEnabled; 2236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 2237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_CHROMEOS) 2239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Enable password echo during OOBE when keyboard driven flag is set. 2240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (chromeos::UserManager::IsInitialized() && 2241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !chromeos::UserManager::Get()->IsUserLoggedIn() && 2242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch !chromeos::StartupUtils::IsOobeCompleted() && 2243558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch chromeos::system::keyboard_settings::ForceKeyboardDrivenUINavigation()) { 2244558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch web_prefs->password_echo_enabled = true; 2245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_prefs->user_style_sheet_enabled = false; 2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user stylesheet watcher may not exist in a testing profile. 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserStyleSheetWatcher* user_style_sheet_watcher = 22537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UserStyleSheetWatcherFactory::GetForProfile(profile).get(); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_style_sheet_watcher) { 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_enabled = true; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_location = 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_style_sheet_watcher->user_style_sheet(); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_enabled = false; 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_prefs->asynchronous_spell_checking_enabled = true; 2264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_prefs->unified_textchecker_enabled = true; 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->uses_universal_detector = 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitUsesUniversalDetector); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->text_areas_are_resizable = 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitTextAreasAreResizable); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->hyperlink_auditing_enabled = 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kEnableHyperlinkAuditing); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we will set the default_encoding with canonical encoding name. 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterEncoding::GetCanonicalEncodingNameByAliasName( 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding); 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_prefs->default_encoding.empty()) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->ClearPref(prefs::kDefaultCharset); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!web_prefs->default_encoding.empty()); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = WebContents::FromRenderViewHost(rvh); 2284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ViewType view_type = extensions::GetViewType(web_contents); 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service) { 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = rvh->GetSiteInstance()->GetSiteURL(); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->extensions()->GetByID(url.host()); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we are only granting extension preferences to URLs with 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct scheme. Without this check, chrome-guest:// schemes used by 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // webview tags as well as hosts that happen to match the id of an 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installed extension would get the wrong preferences. 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_webkit_preferences::SetPreferences( 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, view_type, web_prefs); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_type == extensions::VIEW_TYPE_NOTIFICATION) { 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_scripts_to_close_windows = true; 2302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (view_type == extensions::VIEW_TYPE_BACKGROUND_CONTENTS) { 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable all kinds of acceleration for background pages. 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/96005 and http://crbug.com/96006 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->force_compositing_mode = false; 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_compositing_enabled = false; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FILE_MANAGER_EXTENSION) 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the default of suppressing HW compositing for WebUI pages for the 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file manager, which is implemented using WebUI but wants HW acceleration 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for video decode & render. 23137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme) && 23143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) url.host() == file_manager::kFileManagerAppId) { 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_compositing_enabled = true; 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_2d_canvas_enabled = true; 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::UpdateInspectorSetting( 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, const std::string& key, const std::string& value) { 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context = 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext(); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update( 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(browser_context)->GetPrefs(), 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kWebKitInspectorSettings); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* inspector_settings = update.Get(); 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inspector_settings->SetWithoutPathExpansion(key, 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value::CreateStringValue(value)); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::BrowserURLHandlerCreated( 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler* handler) { 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the default URL handlers. 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&ExtensionWebUI::HandleChromeURLOverride, 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler::null_handler()); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(BrowserURLHandler::null_handler(), 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ExtensionWebUI::HandleChromeURLOverrideReverse); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about: handler. Must come before chrome: handler, since it will 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rewrite about: urls to chrome: URLs and then expect chrome: to 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actually handle them. 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&WillHandleBrowserAboutURL, 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler::null_handler()); 234658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 234758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Handler to rewrite chrome://newtab for InstantExtended. 234858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch handler->AddHandlerPair(&chrome::HandleNewTabURLRewrite, 234958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch &chrome::HandleNewTabURLReverseRewrite); 235058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome: & friends. 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&HandleWebUI, &HandleWebUIReverse); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearCache(RenderViewHost* rvh) { 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance()->GetProcess()->GetBrowserContext()); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(profile); 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(BrowsingDataRemover::REMOVE_CACHE, 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataHelper::UNPROTECTED_WEB); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover takes care of deleting itself when done. 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearCookies(RenderViewHost* rvh) { 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance()->GetProcess()->GetBrowserContext()); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(profile); 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int remove_mask = BrowsingDataRemover::REMOVE_SITE_DATA; 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover takes care of deleting itself when done. 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() { 23763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return DownloadPrefs::GetDefaultDownloadDirectory(); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetDefaultDownloadName() { 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF8(IDS_DEFAULT_DOWNLOAD_FILENAME); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::DidCreatePpapiPlugin( 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserPpapiHost* browser_host) { 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_host->GetPpapiHost()->AddHostFactoryFilter( 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::host::HostFactory>( 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeBrowserPepperHostFactory(browser_host))); 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::BrowserPpapiHost* 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetExternalBrowserPpapiHost( 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_process_id) { 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserChildProcessHostIterator iter(PROCESS_TYPE_NACL_LOADER); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!iter.Done()) { 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClProcessHost* host = static_cast<NaClProcessHost*>(iter.GetDelegate()); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->process() && 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->process()->GetData().id == plugin_process_id) { 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Found the plugin. 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host->browser_ppapi_host(); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeContentBrowserClient::SupportsBrowserPlugin( 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, const GURL& site_url) { 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableBrowserPluginForAllViewTypes)) 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 241468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (content::HasWebUIScheme(site_url)) 241568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 241668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2423ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Extension* extension = 2424ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch service->extensions()->GetExtensionOrAppByURL(site_url); 24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension) 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return extension->HasAPIPermission(APIPermission::kWebView) || 2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension->HasAPIPermission(APIPermission::kAdView); 24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowPepperSocketAPI( 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 24357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool private_api, 243668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const content::SocketPermissionRequest* params) { 2437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 24387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 24397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ExtensionSet* extension_set = NULL; 24407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (profile) { 24417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_set = extensions::ExtensionSystem::Get(profile)-> 24427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_service()->extensions(); 24437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 24447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 24457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (private_api) { 24467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Access to private socket APIs is controlled by the whitelist. 24477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsExtensionOrSharedModuleWhitelisted(url, extension_set, 24487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) allowed_socket_origins_)) { 24497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 24507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 24517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 24527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Access to public socket APIs is controlled by extension permissions. 24537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (url.is_valid() && url.SchemeIs(extensions::kExtensionScheme) && 24547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_set) { 24557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const Extension* extension = extension_set->GetByID(url.host()); 24567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (extension) { 245768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (params) { 245868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) extensions::SocketPermission::CheckParam check_params( 245968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) params->type, params->host, params->port); 246068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (extensions::PermissionsData::CheckAPIPermissionWithParam( 246168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) extension, extensions::APIPermission::kSocket, 246268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &check_params)) { 246368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 246468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 246568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 246668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (extensions::PermissionsData::HasAPIPermission( 246768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) extension, extensions::APIPermission::kSocket)) { 246868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 246968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 24707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 24717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 24727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 24737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 24747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 24757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Allow both public and private APIs if the command line says so. 24767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return IsHostAllowedByCommandLine(url, extension_set, 24777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switches::kAllowNaClSocketAPI); 2478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::SelectFilePolicy* ChromeContentBrowserClient::CreateSelectFilePolicy( 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents) { 24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ChromeSelectFilePolicy(web_contents); 24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem( 2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>* additional_allowed_schemes) { 2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem( 2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_allowed_schemes); 2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_allowed_schemes->push_back(kChromeUIScheme); 2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_allowed_schemes->push_back(extensions::kExtensionScheme); 2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeContentBrowserClient::GetAdditionalFileSystemBackends( 24977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext* browser_context, 2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& storage_partition_path, 24997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ScopedVector<fileapi::FileSystemBackend>* additional_backends) { 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID) 2501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 25027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch additional_backends->push_back(new MediaFileSystemBackend( 2503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) storage_partition_path, 2504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pool->GetSequencedTaskRunner(pool->GetNamedSequenceToken( 25057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaFileSystemBackend::kMediaTaskRunnerName)).get())); 2506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 2507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 25087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fileapi::ExternalMountPoints* external_mount_points = 25097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext::GetMountPoints(browser_context); 2510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(external_mount_points); 25117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch chromeos::FileSystemBackend* backend = 25127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new chromeos::FileSystemBackend( 25137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new drive::FileSystemBackendDelegate(browser_context), 25147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser_context->GetSpecialStoragePolicy(), 2515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch external_mount_points, 2516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileapi::ExternalMountPoints::GetSystemInstance()); 25177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch backend->AddSystemMountPoints(); 25187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(backend->CanHandleType(fileapi::kFileSystemTypeExternal)); 25197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch additional_backends->push_back(backend); 2520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 2521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 252258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) additional_backends->push_back( 252358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new sync_file_system::SyncFileSystemBackend( 252458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile::FromBrowserContext(browser_context))); 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess( 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line, 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_process_id, 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FileDescriptorInfo>* mappings) { 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_path; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &data_path); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!data_path.empty()); 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ; 25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath chrome_resources_pak = 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("chrome_100_percent.pak"); 25403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::PlatformFile f = 25413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::CreatePlatformFile(chrome_resources_pak, flags, NULL, NULL); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidChrome100PercentPakDescriptor, 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string locale = GetApplicationLocale(); 25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale_pak = ResourceBundle::GetSharedInstance(). 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocaleFilePath(locale, false); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = base::CreatePlatformFile(locale_pak, flags, NULL, NULL); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidLocalePakDescriptor, 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath resources_pack_path; 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f = base::CreatePlatformFile(resources_pack_path, flags, NULL, NULL); 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidUIResourcesPakDescriptor, 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileDescriptor(f, true))); 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (breakpad::IsCrashReporterEnabled()) { 25628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) f = breakpad::CrashDumpManager::GetInstance()->CreateMinidumpFile( 25638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_process_id); 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (f == base::kInvalidPlatformFileValue) { 25652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to create file for minidump, crash reporting will " 25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "be disabled for this process."; 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidMinidumpDescriptor, 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileDescriptor(f, true))); 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int crash_signal_fd = GetCrashSignalFD(command_line); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crash_signal_fd >= 0) { 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kCrashDumpSignal, 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(crash_signal_fd, 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false))); 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_ANDROID) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* ChromeContentBrowserClient::GetResourceDllName() { 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::kBrowserResourcesDll; 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::PreSpawnRenderer( 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy* policy, 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* success) { 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This code is duplicated in nacl_exe_win_64.cc. 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow the server side of a pipe restricted to the "chrome.nacl." 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // namespace so that it cannot impersonate other system or other chrome 25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // service pipes. 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::ResultCode result = policy->AddRule( 25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::SUBSYS_NAMED_PIPES, 25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY, 25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\\\\.\\pipe\\chrome.nacl.*"); 26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != sandbox::SBOX_ALL_OK) { 26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *success = false; 26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Renderers need to send named pipe handles and shared memory 26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // segment handles to NaCl loader processes. 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_HANDLES, 26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::HANDLES_DUP_ANY, 26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"File"); 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != sandbox::SBOX_ALL_OK) { 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *success = false; 26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 26132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crypto::CryptoModuleBlockingPasswordDelegate* 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetCryptoPasswordDelegate( 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::NewCryptoModuleBlockingDialogDelegate( 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kCryptoModulePasswordKeygen, url.host()); 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool ChromeContentBrowserClient::IsPluginAllowedToCallRequestOSFileHandle( 26274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::BrowserContext* browser_context, 26284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& url) { 26294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 26304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 26314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ExtensionSet* extension_set = NULL; 26324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (profile) { 26334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_set = extensions::ExtensionSystem::Get(profile)-> 26344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extension_service()->extensions(); 26354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 26364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(teravest): Populate allowed_file_handle_origins_ when FileIO is moved 26374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // from the renderer to the browser. 26384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return IsExtensionOrSharedModuleWhitelisted(url, extension_set, 26394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) allowed_file_handle_origins_) || 26404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IsHostAllowedByCommandLine(url, extension_set, 26414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switches::kAllowNaClFileHandleAPI); 26424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 26434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 26444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 26454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 26464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 2648