chrome_content_browser_client.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/breakpad_mac.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_about_handler.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/browser_shutdown.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/character_encoding.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chrome_net_benchmarking_message_filter.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_quota_permission_context.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_util.h" 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api.h" 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/browser_permissions_policy_delegate.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_info_map.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_web_ui.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_webkit_preferences.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/suggest_permission_util.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/geolocation/chrome_access_token_store.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google/google_util.h" 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/adview/adview_guest.h" 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/guestview_constants.h" 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/guestview/webview/webview_guest.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h" 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.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" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_message_filter.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printing_message_filter.h" 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_render_message_filter.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service_factory.h" 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h" 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/speech/tts_message_filter.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_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" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/sync/sync_promo_ui.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/user_style_sheet_watcher.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/user_style_sheet_watcher_factory.h" 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/validation_message_message_filter.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/child_process_logging.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_process_policy.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_set.h" 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h" 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/shared_module_info.h" 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/extensions/permissions/permissions_data.h" 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/permissions/socket_permission.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h" 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/pepper_permission_util.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/chromeos_constants.h" 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "components/nacl/common/nacl_process_type.h" 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host.h" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_main_parts.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h" 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_url_handler.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/compositor_util.h" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_context.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/site_instance.h" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_host.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_descriptors.h" 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h" 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_resources.h" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/mime_util.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h" 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center_util.h" 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "webkit/browser/fileapi/external_mount_points.h" 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h" 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/plugin_switches.h" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_win.h" 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sandbox/win/src/sandbox_policy.h" 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_mac.h" 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_message_filter_mac.h" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/chrome_browser_main_chromeos.h" 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system_backend_delegate.h" 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/fileapi/file_system_backend.h" 153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h" 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/chromeos/system/statistics_provider.h" 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_linux.h" 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/crash_dump_manager.h" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_android.h" 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/descriptors_android.h" 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_posix.h" 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_OPENBSD) || defined(OS_ANDROID) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/linux_util.h" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/crash_handler_host_linux.h" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/captive_portal/captive_portal_tab_helper.h" 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/crypto_module_password_dialog.h" 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID) 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/media/webrtc_logging_handler_host.h" 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_INPUT_SPEECH) 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate_bubble_ui.h" 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(FILE_MANAGER_EXTENSION) 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/file_manager_util.h" 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(TOOLKIT_GTK) 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/gtk/chrome_browser_main_extra_parts_gtk.h" 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(TOOLKIT_VIEWS) 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h" 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_ASH) 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/views/ash/chrome_browser_main_extra_parts_ash.h" 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_AURA) 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.h" 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_X11) 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_browser_main_extra_parts_x11.h" 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FileDescriptor; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::AccessTokenStore; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserChildProcessHostIterator; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserURLHandler; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessSecurityPolicy; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::FileDescriptorInfo; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::QuotaPermissionContext; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::SiteInstance; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Cached version of the locale so we can return the locale on the I/O 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// thread. 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::LazyInstance<std::string> g_io_thread_application_locale; 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kPredefinedAllowedSocketOrigins[] = { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "okddffdblfhhnmhodogpojmfkjmhinfp", // Test SSH Client 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pnhechapfaindjhompbnflcldabbghjo", // HTerm App (SSH Client) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bglhmjfplikpjnfoegeomebmfnkjomhe", // see crbug.com/122126 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gbchcmhmhahfdphkhkmpfmihenigjmpp", // Chrome Remote Desktop 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "kgngmbheleoaphbjbaiobfdepmghbfah", // Pre-release Chrome Remote Desktop 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "odkaodonbgfohohmklejpjiejmcipmib", // Dogfood Chrome Remote Desktop 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ojoimpklfciegopdfgeenehpalipignm", // Chromoting canary 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cbkkbcmdlboombapidmoeolnmdacpkch", // see crbug.com/129089 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hhnbmknkdabfoieppbbljkhkfjcmcbjh", // see crbug.com/134099 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mablfbjkhmhkmefkjjacnbaikjkipphg", // see crbug.com/134099 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pdeelgamlgannhelgoegilelnnojegoh", // see crbug.com/134099 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cabapfdbkniadpollkckdnedaanlciaj", // see crbug.com/134099 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mapljbgnjledlpdmlchihnmeclmefbba", // see crbug.com/134099 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ghbfeebgmiidnnmeobbbaiamklmpbpii", // see crbug.com/134099 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "jdfhpkjeckflbbleddjlpimecpbjdeep", // see crbug.com/142514 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "iabmpiboiopbgfabjmgeedhcmjenhbla", // see crbug.com/165080 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "B7CF8A292249681AF81771650BA4CEEAF19A4560", // see crbug.com/165080 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see crbug.com/234789 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "7525AF4F66763A70A883C4700529F647B470E4D2", // see crbug.com/238084 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "0B549507088E1564D672F7942EB87CA4DAD73972", // see crbug.com/238084 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "864288364E239573E777D3E0E36864E590E95C74" // see crbug.com/238084 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a copy of the given url with its host set to given host and path set 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to given path. Other parts of the url will be the same. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ReplaceURLHostAndPath(const GURL& url, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_canon::Replacements<char> replacements; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetHost(host.c_str(), 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Component(0, host.length())); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetPath(path.c_str(), 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Component(0, path.length())); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url.ReplaceComponents(replacements); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps "foo://bar/baz/" to "foo://chrome/bar/baz/". 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL AddUberHost(const GURL& url) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string uber_host = chrome::kChromeUIUberHost; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string new_path = url.host() + url.path(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ReplaceURLHostAndPath(url, uber_host, new_path); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If url->host() is "chrome" and url->path() has characters other than the 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first slash, changes the url from "foo://chrome/bar/" to "foo://bar/" and 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns true. Otherwise returns false. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RemoveUberHost(GURL* url) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->host() != chrome::kChromeUIUberHost) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->path().empty() || url->path() == "/") 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string old_path = url->path(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string::size_type separator = old_path.find('/', 1); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_host; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_path; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (separator == std::string::npos) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_host = old_path.substr(1); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_host = old_path.substr(1, separator - 1); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_path = old_path.substr(separator); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Do not allow URLs with paths empty before the first slash since we can't 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // have an empty host. (e.g "foo://chrome//") 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (new_host.empty()) 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = ReplaceURLHostAndPath(*url, new_host, new_path); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(url->is_valid()); 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles rewriting Web UI URLs. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleWebUI(GURL* url, content::BrowserContext* browser_context) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not handle special URLs such as "about:foo" 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->host().empty()) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL chrome_url = AddUberHost(*url); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle valid "chrome://chrome/foo" URLs so the reverse handler will 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL( 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, chrome_url)) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, *url)) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case : in ChromeOS in Guest mode bookmarks and history are 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled for security reasons. New tab page explains the reasons, so 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we redirect user to new tab page. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chromeos::UserManager::Get()->IsLoggedInAsGuest()) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->SchemeIs(chrome::kChromeUIScheme) && 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (url->DomainIs(chrome::kChromeUIBookmarksHost) || 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url->DomainIs(chrome::kChromeUIHistoryHost))) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rewrite with new tab URL 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special case the new tab page. In older versions of Chrome, the new tab 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page was hosted at chrome-internal:<blah>. This might be in people's saved 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sessions or bookmarks, so we say any URL with that scheme triggers the new 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab page. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url->SchemeIs(chrome::kChromeInternalScheme)) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rewrite it with the proper new tab URL. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = GURL(chrome::kChromeUINewTabURL); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reverse URL handler for Web UI. Maps "chrome://chrome/foo/" to 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "chrome://foo/". 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HandleWebUIReverse(GURL* url, content::BrowserContext* browser_context) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url->is_valid() || !url->SchemeIs(chrome::kChromeUIScheme)) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RemoveUberHost(url); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by the GetPrivilegeRequiredByUrl() and GetProcessPrivilege() functions 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// below. Extension, and isolated apps require different privileges to be 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// granted to their RenderProcessHosts. This classification allows us to make 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sure URLs are served by hosts with the right set of privileges. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum RenderProcessHostPrivilege { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_NORMAL, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_HOSTED, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_ISOLATED, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRIV_EXTENSION, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHostPrivilege GetPrivilegeRequiredByUrl( 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service) { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default to a normal renderer cause it is lower privileged. This should only 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // occur if the URL on a site instance is either malformed, or uninitialized. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is malformed, then there is no need for better privileges anyways. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is uninitialized, but eventually settles on being an a scheme other 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than normal webrenderer, the navigation logic will correct us out of band 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anyways. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetByID(url.host()); 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::AppIsolationInfo::HasIsolatedStorage(extension)) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_ISOLATED; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_hosted_app()) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_HOSTED; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_EXTENSION; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessHostPrivilege GetProcessPrivilege( 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process_host, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* service) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> extension_ids = 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_map->GetExtensionsInProcess(process_host->GetID()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_ids.empty()) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_NORMAL; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::iterator iter = extension_ids.begin(); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != extension_ids.end(); ++iter) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->GetExtensionById(*iter, false); 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::AppIsolationInfo::HasIsolatedStorage(extension)) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_ISOLATED; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension && extension->is_hosted_app()) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_HOSTED; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PRIV_EXTENSION; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CertMatchesFilter(const net::X509Certificate& cert, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& filter) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(markusheintz): This is the minimal required filter implementation. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implement a better matcher. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An empty filter matches any client certificate since no requirements are 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified at all. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.empty()) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string common_name; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.GetString("ISSUER.CN", &common_name) && 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cert.issuer().common_name == common_name)) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills |map| with the per-script font prefs under path |map_name|. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillFontFamilyMap(const PrefService* prefs, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* map_name, 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_glue::ScriptFontFamilyMap* map) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pref_name = base::StringPrintf("%s.%s", map_name, script); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string font_family = prefs->GetString(pref_name.c_str()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!font_family.empty()) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*map)[script] = UTF8ToUTF16(font_family); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCrashSignalFD(const CommandLine& command_line) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kExtensionProcess)) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCrashHandlerHostLinux* crash_handler = 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionCrashHandlerHostLinux::GetInstance(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crash_handler->GetDeathSignalSocket(); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string process_type = 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kProcessType); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kRendererProcess) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RendererCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kPluginProcess) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PluginCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kPpapiPluginProcess) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PpapiCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kGpuProcess) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GpuCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetEffectiveURLForSignin(const GURL& url) { 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(SigninManager::IsWebBasedSigninFlowURL(url)); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL effective_url(SigninManager::kChromeSigninEffectiveSite); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy the path because the argument to SetPathStr must outlive 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the Replacements object. 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string path_copy(url.path()); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL::Replacements replacements; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacements.SetPathStr(path_copy); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_url = effective_url.ReplaceComponents(replacements); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return effective_url; 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SetApplicationLocaleOnIOThread(const std::string& locale) { 513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_io_thread_application_locale.Get() = locale; 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::ChromeContentBrowserClient() { 522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kPredefinedAllowedSocketOrigins); ++i) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_socket_origins_.insert(kPredefinedAllowedSocketOrigins[i]); 525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) permissions_policy_delegate_.reset( 52890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new extensions::BrowserPermissionsPolicyDelegate()); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::~ChromeContentBrowserClient() { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeContentBrowserClient::RegisterProfilePrefs( 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kDisable3DAPIs, 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kEnableHyperlinkAuditing, 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true, 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kEnableMemoryInfo, 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeContentBrowserClient::SetApplicationLocale( 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& locale) { 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This object is guaranteed to outlive all threads so we don't have to 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // worry about the lack of refcounting and can just post as Unretained. 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The common case is that this function is called early in Chrome startup 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // before any threads are created (it will also be called later if the user 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // changes the pref). In this case, there will be no threads created and 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // posting will fail. When there are no threads, we can just set the string 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // without worrying about threadsafety. 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&SetApplicationLocaleOnIOThread, locale))) { 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_io_thread_application_locale.Get() = locale; 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::BrowserMainParts* ChromeContentBrowserClient::CreateBrowserMainParts( 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeBrowserMainParts* main_parts; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the Main browser parts based on the OS type. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsWin(parameters); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsMac(parameters); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) main_parts = new chromeos::ChromeBrowserMainPartsChromeos(parameters); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsLinux(parameters); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsAndroid(parameters); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainPartsPosix(parameters); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_parts = new ChromeBrowserMainParts(parameters); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::AddProfilesExtraParts(main_parts); 59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct additional browser parts. Stages are called in the order in 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which they are added. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsGtk()); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 6007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsViews()); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 6047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsAsh()); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 6087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsAura()); 6097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 6107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_X11) 6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch main_parts->AddParts(new ChromeBrowserMainExtraPartsX11()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::AddMetricsExtraParts(main_parts); 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return main_parts; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetStoragePartitionIdForSite( 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_id; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partition ID for webview guest processes is the string value of its 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance URL - "chrome-guest://app_id/persist?partition". 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site.SchemeIs(chrome::kGuestScheme)) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_id = site.spec(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsValidStoragePartitionId(browser_context, partition_id)); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return partition_id; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsValidStoragePartitionId( 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& partition_id) { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default ID is empty and is always valid. 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (partition_id.empty()) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(partition_id).is_valid(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::GetStoragePartitionConfigForSite( 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site, 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_be_default, 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* partition_domain, 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* partition_name, 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* in_memory) { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Default to the browser-wide storage partition and override based on |site| 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // below. 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_domain->clear(); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_name->clear(); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *in_memory = false; 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the webview tag, we create special guest processes, which host the 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag content separately from the main application that embeds the tag. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A webview tag can specify both the partition name and whether the storage 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for that partition should be persisted. Each tag gets a SiteInstance with 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a specially formatted URL, based on the application it is hosted by and 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the partition requested by it. The format for that URL is: 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome-guest://partition_domain/persist?partition_name 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site.SchemeIs(chrome::kGuestScheme)) { 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since guest URLs are only used for packaged apps, there must be an app 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // id in the URL. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(site.has_host()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *partition_domain = site.host(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since persistence is optional, the path must either be empty or the 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // literal string. 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *in_memory = (site.path() != "/persist"); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The partition name is user supplied value, which we have encoded when the 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL was created, so it needs to be decoded. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *partition_name = net::UnescapeURLComponent(site.query(), 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::UnescapeRule::NORMAL); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (site.SchemeIs(extensions::kExtensionScheme)) { 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |can_be_default| is false, the caller is stating that the |site| 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should be parsed as if it had isolated storage. In particular it is 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // important to NOT check ExtensionService for the is_storage_isolated() 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // attribute because this code path is run during Extension uninstall 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to do cleanup after the Extension has already been unloaded from the 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ExtensionService. 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_isolated = !can_be_default; 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (can_be_default) { 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = NULL; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension = extension_service->extensions()-> 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(site)); 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension && 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::AppIsolationInfo::HasIsolatedStorage(extension)) { 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_isolated = true; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_isolated) { 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(site.has_host()); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For extensions with isolated storage, the the host of the |site| is 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the |partition_domain|. The |in_memory| and |partition_name| are only 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // used in guest schemes so they are cleared here. 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *partition_domain = site.host(); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *in_memory = false; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_name->clear(); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Assert that if |can_be_default| is false, the code above must have found a 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-default partition. If this fails, the caller has a serious logic 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error about which StoragePartition they expect to be in and it is not 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // safe to continue. 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(can_be_default || !partition_domain->empty()); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContentsViewDelegate* 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetWebContentsViewDelegate( 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents) { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::CreateWebContentsViewDelegate(web_contents); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check if the extension activity log is enabled for the profile. 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool IsExtensionActivityLogEnabledForProfile(Profile* profile) { 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // crbug.com/247908 - This should be IsLogEnabled except for an issue 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // in chrome_frame_net_tests 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return extensions::ActivityLog::IsLogEnabledOnAnyProfile(); 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ChromeContentBrowserClient::GuestWebContentsCreated( 731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebContents* guest_web_contents, 732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebContents* opener_web_contents, 7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserPluginGuestDelegate** guest_delegate, 734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> extra_params) { 735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (opener_web_contents) { 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GuestView* guest = GuestView::FromWebContents(opener_web_contents); 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!guest) { 738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (guest->GetViewType()) { 743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case GuestView::WEBVIEW: { 7447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *guest_delegate = new WebViewGuest(guest_web_contents); 745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case GuestView::ADVIEW: { 7487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *guest_delegate = new AdViewGuest(guest_web_contents); 749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch default: 752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!extra_params) { 759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string api_type; 763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extra_params->GetString(guestview::kAttributeApi, &api_type); 764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (api_type == "adview") { 7667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *guest_delegate = new AdViewGuest(guest_web_contents); 767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (api_type == "webview") { 7687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *guest_delegate = new WebViewGuest(guest_web_contents); 769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ChromeContentBrowserClient::GuestWebContentsAttached( 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContents* guest_web_contents, 776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContents* embedder_web_contents, 777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int browser_plugin_instance_id, 778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::DictionaryValue& extra_params) { 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder_web_contents->GetBrowserContext()); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!service) { 784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url = embedder_web_contents->GetSiteInstance()->GetSiteURL(); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = service->extensions()-> 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(url)); 790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!extension) { 791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GuestView* guest = GuestView::FromWebContents(guest_web_contents); 796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!guest) { 797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch guest->Attach(embedder_web_contents, 801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extension->id(), 802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_plugin_instance_id, 803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extra_params); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RenderProcessHostCreated( 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* host) { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = host->GetID(); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestContextGetter* context = 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetRequestContextForRenderProcess(id); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new ChromeRenderMessageFilter( 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, profile, context)); 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new PluginInfoMessageFilter(id, profile)); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new PrintingMessageFilter(id, profile)); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter( 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SearchProviderInstallStateMessageFilter(id, profile)); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new SpellCheckMessageFilter(id)); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->GetChannel()->AddFilter(new SpellCheckMessageFilterMac(id)); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->GetChannel()->AddFilter(new ChromeNetBenchmarkingMessageFilter( 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, profile, context)); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter( 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new prerender::PrerenderMessageFilter(id, profile)); 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->GetChannel()->AddFilter(new ValidationMessageMessageFilter(id)); 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->GetChannel()->AddFilter(new TtsMessageFilter(id, profile)); 833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) host->GetChannel()->AddFilter(new WebRtcLoggingHandlerHost()); 835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 8367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(DISABLE_NACL) 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExtensionInfoMap* extension_info_map = 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extensions::ExtensionSystem::Get(profile)->info_map(); 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->GetChannel()->AddFilter(new NaClHostMessageFilter( 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch id, profile->IsOffTheRecord(), 841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile->GetPath(), extension_info_map, 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context)); 8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->Send(new ChromeViewMsg_SetIsIncognitoProcess( 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->IsOffTheRecord())); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->Send(new ChromeViewMsg_SetExtensionActivityLogEnabled( 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IsExtensionActivityLogEnabledForProfile(profile))); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendExtensionWebRequestStatusToHost(host); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererContentSettingRules rules; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRendererContentSettingRules(profile->GetHostContentSettingsMap(), &rules); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->Send(new ChromeViewMsg_SetContentSettingRules(rules)); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)GURL ChromeContentBrowserClient::GetPossiblyPrivilegedURL( 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* browser_context, 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& url, 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_renderer_initiated, 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::SiteInstance* current_instance) { 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!profile) 865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return url; 866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only return the privileged instant URL if we are entering from a browser- 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initiated navigation or if we are already in the instant process. 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_instant_process = false; 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int process_id = current_instance->GetProcess()->GetID(); 871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InstantService* instant_service = 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (instant_service) 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_instant_process = instant_service->IsInstantProcess(process_id); 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(is_instant_process, 877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::IsPrivilegedURLForInstant(current_instance->GetSiteURL())); 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_renderer_initiated || is_instant_process) { 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the input |url| should be assigned to the Instant renderer, make its 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // privileged URL distinct from other URLs on the search provider's domain. 881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::ShouldAssignURLToInstantRenderer(url, profile)) 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return chrome::GetPrivilegedURLForInstant(url, profile); 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return url; 886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ChromeContentBrowserClient::GetEffectiveURL( 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& url) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| should be assigned to the Signin renderer, make its 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effective URL distinct from other URLs on the signin service's domain. 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the signin renderer will be allowed to sign the user in to 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chrome. 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(url)) 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetEffectiveURLForSignin(url); 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the input |url| is part of an installed app, the effective URL is an 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension URL with the ID of that extension as the host. This has the 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // effect of grouping apps together in a common SiteInstance. 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_service) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = extension_service->extensions()-> 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHostedAppByURL(ExtensionURLInfo(url)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bookmark apps do not use the hosted app process model, and should be 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treated as normal URLs. 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->from_bookmark()) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return url; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is part of an extension's web extent, convert it to an 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension URL. 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension->GetResourceURL(url.path()); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldUseProcessPerSite( 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& effective_url) { 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Non-extension, non-Instant URLs should generally use 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process-per-site-instance. Because we expect to use the effective URL, 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // URLs for hosted apps (apart from bookmark apps) should have an extension 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // scheme by now. 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::ShouldAssignURLToInstantRenderer(effective_url, profile)) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(effective_url)) 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!effective_url.SchemeIs(extensions::kExtensionScheme)) 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_service) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = extension_service->extensions()-> 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(effective_url)); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is part of a hosted app that does not have the background 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission, or that does not allow JavaScript access to the background 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page, we want to give each instance its own process to improve 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // responsiveness. 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension->GetType() == Manifest::TYPE_HOSTED_APP) { 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension->HasAPIPermission(APIPermission::kBackground) || 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !extensions::BackgroundInfo::AllowJSAccess(extension)) { 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hosted apps that have script access to their background page must use 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process per site, since all instances can make synchronous calls to the 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background window. Other extensions should use process per site as well. 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are treated as WebUI schemes but do not get WebUI bindings. 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalWebUISchemes( 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>* additional_schemes) { 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_schemes->push_back(chrome::kChromeSearchScheme); 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::CreateRequestContext( 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ProtocolHandlerMap* protocol_handlers) { 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->CreateRequestContext(protocol_handlers); 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestContextGetter* 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChromeContentBrowserClient::CreateRequestContextForStoragePartition( 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& partition_path, 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_memory, 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ProtocolHandlerMap* protocol_handlers) { 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->CreateRequestContextForStoragePartition( 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partition_path, in_memory, protocol_handlers); 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsHandledURL(const GURL& url) { 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProfileIOData::IsHandledURL(url); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1004a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool ChromeContentBrowserClient::CanCommitURL( 1005a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::RenderProcessHost* process_host, 1006a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const GURL& url) { 1007a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We need to let most extension URLs commit in any process, since this can 1008a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // be allowed due to web_accessible_resources. Most hosted app URLs may also 1009a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // load in any process (e.g., in an iframe). However, the Chrome Web Store 1010a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // cannot be loaded in iframes and should never be requested outside its 1011a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // process. 1012a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Profile* profile = 1013a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Profile::FromBrowserContext(process_host->GetBrowserContext()); 1014a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ExtensionService* service = 1015a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 1016a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!service) 1017a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 1018a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const Extension* new_extension = 1019a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo(url)); 1020a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (new_extension && 1021a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new_extension->is_hosted_app() && 1022a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new_extension->id() == extension_misc::kWebStoreAppId && 1023a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) !service->process_map()->Contains(new_extension->id(), 1024a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) process_host->GetID())) { 1025a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 1026a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1027a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1028a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 1029a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 1030a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsSuitableHost( 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process_host, 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site_url) { 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(process_host->GetBrowserContext()); 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This may be NULL during tests. In that case, just assume any site can 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // share any host. 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Instant URLs should only be in the instant process and instant process 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should only have Instant URLs. 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (instant_service) { 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_instant_process = instant_service->IsInstantProcess( 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) process_host->GetID()); 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_be_in_instant_process = 1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::ShouldAssignURLToInstantRenderer(site_url, profile); 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_instant_process || should_be_in_instant_process) 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return is_instant_process && should_be_in_instant_process; 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager && signin_manager->IsSigninProcess(process_host->GetID())) 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SigninManager::IsWebBasedSigninFlowURL(site_url); 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map = service->process_map(); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't allow the Task Manager to share a process with anything else. 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it can affect the renderers it is observing. 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: we could create another RenderProcessHostPrivilege bucket for 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this to allow multiple chrome://tasks instances to share, but that's 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a very unlikely case without serious consequences. 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_url.GetOrigin() == GURL(chrome::kChromeUITaskManagerURL).GetOrigin()) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These may be NULL during tests. In that case, just assume any site can 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // share any host. 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service || !process_map) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, just make sure the process privilege matches the privilege 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // required by the site. 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderProcessHostPrivilege privilege_required = 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrivilegeRequiredByUrl(site_url, service); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetProcessPrivilege(process_host, process_map, service) == 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) privilege_required; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function is trying to limit the amount of processes used by extensions 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with background pages. It uses a globally set percentage of processes to 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run such extensions and if the limit is exceeded, it returns true, to 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicate to the content module to group extensions together. 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldTryToUseExistingProcessHost( 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, const GURL& url) { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It has to be a valid URL for us to check for an extension. 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = !profile ? NULL : 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to have a valid extension with background page to proceed. 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo(url)); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extensions::BackgroundInfo::HasBackgroundPage(extension)) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<int> process_ids; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_process_count = 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::GetMaxRendererProcessCount(); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go through all profiles to ensure we have total count of extension 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processes containing background pages, otherwise one profile can 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starve the other. 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> profiles = g_browser_process->profile_manager()-> 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLoadedProfiles(); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* epm = 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profiles[i])->process_manager(); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionProcessManager::const_iterator iter = 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) epm->background_hosts().begin(); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != epm->background_hosts().end(); ++iter) { 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::ExtensionHost* host = *iter; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_ids.insert(host->render_process_host()->GetID()); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_ids.size() > 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (max_process_count * chrome::kMaxShareOfExtensionProcesses)) { 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SiteInstanceGotProcess( 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(site_instance->HasProcess()); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!profile) 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remember the ID of the Instant process to signal the renderer process 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on startup in |AppendExtraCommandLineSwitches| below. 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::ShouldAssignURLToInstantRenderer( 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->GetSiteURL(), profile)) { 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service) 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->AddInstantProcess(site_instance->GetProcess()->GetID()); 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only expect there to be one signin process as we use process-per-site 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for signin URLs. The signin process will be cleared from SigninManager 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the renderer is destroyed. 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SigninManager::IsWebBasedSigninFlowURL(site_instance->GetSiteURL())) { 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager) 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signin_manager->SetSigninProcess(site_instance->GetProcess()->GetID()); 116590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserThread::PostTask( 116690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&ExtensionInfoMap::SetSigninProcess, 116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) site_instance->GetProcess()->GetID())); 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo( 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetSiteURL())); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->process_map()->Insert(extension->id(), 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId()); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionInfoMap::RegisterExtensionProcess, 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId())); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SiteInstanceDeleting( 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!site_instance->HasProcess()) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetBrowserContext()); 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!service) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->extensions()->GetExtensionOrAppByURL( 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(site_instance->GetSiteURL())); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->process_map()->Remove(extension->id(), 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId()); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ExtensionInfoMap::UnregisterExtensionProcess, 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(), 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension->id(), 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetProcess()->GetID(), 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance->GetId())); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldSwapProcessesForNavigation( 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SiteInstance* site_instance, 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& current_url, 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url) { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_url.is_empty()) { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always choose a new process when navigating to extension URLs. The 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process grouping logic will combine all of a given extension's pages 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the same process. 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_url.SchemeIs(extensions::kExtensionScheme)) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also, we must switch if one is an extension and the other is not the exact 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same extension. 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_url.SchemeIs(extensions::kExtensionScheme) || 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_url.SchemeIs(extensions::kExtensionScheme)) { 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_url.GetOrigin() != new_url.GetOrigin()) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The checks below only matter if we can retrieve which extensions are 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // installed. 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext()); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We must swap if the URL is for an extension and we are not using an 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension process. 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* new_extension = 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo(new_url)); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore all hosted apps except the Chrome Web Store, since they do not 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // require their own BrowsingInstance (e.g., postMessage is ok). 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_extension && 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension->is_hosted_app() && 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension->id() != extension_misc::kWebStoreAppId) 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_extension = NULL; 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_extension && 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->HasProcess() && 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !service->process_map()->Contains(new_extension->id(), 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) site_instance->GetProcess()->GetID())) 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::ShouldSwapProcessesForRedirect( 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* resource_context, const GURL& current_url, 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url) { 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extensions::CrossesExtensionProcessBoundary( 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetExtensionInfoMap()->extensions(), 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(current_url), ExtensionURLInfo(new_url), false); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ChromeContentBrowserClient::ShouldAssignSiteForURL(const GURL& url) { 12867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return !url.SchemeIs(chrome::kChromeNativeScheme); 12877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 12887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetCanonicalEncodingNameByAliasName( 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& alias_name) { 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CharacterEncoding::GetCanonicalEncodingNameByAliasName(alias_name); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line, int child_process_id) { 12967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsCrashReporterEnabled()) { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kEnableCrashReporter, 12997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_process_logging::GetClientId()); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#elif defined(OS_POSIX) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsCrashReporterEnabled()) { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kEnableCrashReporter, 13047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch child_process_logging::GetClientId() + "," + base::GetLinuxDistro()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (logging::DialogsAreSuppressed()) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kNoErrorDialogs); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string process_type = 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->GetSwitchValueASCII(switches::kProcessType); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_command_line.HasSwitch(switches::kChromeFrame)) 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kChromeFrame); 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type == switches::kRendererProcess) { 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir = 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_command_line.GetSwitchValuePath(switches::kUserDataDir); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_data_dir.empty()) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& login_profile = 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_command_line.GetSwitchValueASCII( 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kLoginProfile); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!login_profile.empty()) 1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitchASCII( 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kLoginProfile, login_profile); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::FromID(child_process_id); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process) { 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process->GetBrowserContext()); 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service = 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_service) { 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ProcessMap* process_map = extension_service->process_map(); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_map && process_map->Contains(process->GetID())) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kExtensionProcess); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently this pref is only registered if applied via a policy. 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->HasPrefPath(prefs::kDisable3DAPIs) && 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kDisable3DAPIs)) { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn this policy into a command line switch. 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisable3DAPIs); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable client-side phishing detection in the renderer if it is 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled in the Profile preferences or the browser process. 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kSafeBrowsingEnabled) || 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !g_browser_process->safe_browsing_detection_service()) { 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch( 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableClientSidePhishingDetection); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kPrintPreviewDisabled)) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kRendererPrintPreview); 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantService* instant_service = 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstantServiceFactory::GetForProfile(profile); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (instant_service && 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_service->IsInstantProcess(process->GetID())) 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kInstantProcess); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManager* signin_manager = 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SigninManagerFactory::GetForProfile(profile); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signin_manager && signin_manager->IsSigninProcess(process->GetID())) 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch(switches::kSigninProcess); 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content::IsThreadedCompositingEnabled()) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableThreadedCompositing); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (message_center::IsRichNotificationEnabled()) 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitch(switches::kDisableHTMLNotifications); 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please keep this in alphabetical order. 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 138790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill::switches::kDisableInteractiveAutocomplete, 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) autofill::switches::kEnableExperimentalFormFilling, 138990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill::switches::kEnableInteractiveAutocomplete, 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowHTTPBackgroundPage, 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowLegacyExtensionManifests, 13927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(victorhsieh): remove the following flag once we move PPAPI FileIO 13937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // to browser. 13947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switches::kAllowNaClFileHandleAPI, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowScriptingGallery, 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsCheckoutURL, 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAppsGalleryURL, 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kCloudPrintServiceURL, 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDebugPrint, 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableBundledPpapiFlash, 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableExtensionsResourceWhitelist, 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableScriptedPrintThrottling, 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableAdview, 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableAdviewSrcAttribute, 1405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kEnableAppWindowControls, 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableBenchmarking, 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableExperimentalExtensionApis, 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableIPCFuzzing, 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableNaCl, 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableNetBenchmarking, 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePasswordGeneration, 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnablePnacl, 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableWatchdog, 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kExtensionsOnChromeURLs, 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMemoryProfiling, 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMessageLoopHistogrammer, 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kNoJsRandomness, 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPlaybackMode, 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashArgs, 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashInProcess, 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashPath, 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashVersion, 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingAtStart, 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingFile, 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kProfilingFlush, 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kRecordMode, 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSilentDumpOnDCHECK, 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kSpdyProxyAuthOrigin, 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kWhitelistedExtensionID, 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kUtilityProcess) { 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kAllowHTTPBackgroundPage, 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableExperimentalExtensionApis, 14387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kExtensionsOnChromeURLs, 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kWhitelistedExtensionID, 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kPluginProcess) { 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kLoginProfile, 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kMemoryProfiling, 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kSilentDumpOnDCHECK, 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kUserDataDir, 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kZygoteProcess) { 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* const kSwitchNames[] = { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kUserDataDir, // Make logs go to the right file. 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load (in-process) Pepper plugins in-process in the zygote pre-sandbox. 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kDisableBundledPpapiFlash, 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashInProcess, 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashPath, 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPpapiFlashVersion, 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->CopySwitchesFrom(browser_command_line, kSwitchNames, 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kSwitchNames)); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (process_type == switches::kGpuProcess) { 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir = 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_command_line.GetSwitchValuePath(switches::kUserDataDir); 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!user_data_dir.empty()) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If --ignore-gpu-blacklist is passed in, don't send in crash reports 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because GPU is expected to be unreliable. 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) && 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !command_line->HasSwitch(switches::kDisableBreakpad)) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kDisableBreakpad); 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The command line switch kEnableBenchmarking needs to be specified along 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the kEnableStatsTable switch to ensure that the stats table global 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is initialized correctly. 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line->HasSwitch(switches::kEnableBenchmarking)) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(command_line->HasSwitch(switches::kEnableStatsTable)); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetApplicationLocale() { 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BrowserThread::CurrentlyOn(BrowserThread::IO)) 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_io_thread_application_locale.Get(); 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->GetApplicationLocale(); 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetAcceptLangs( 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* context) { 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(context); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile->GetPrefs()->GetString(prefs::kAcceptLanguages); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* ChromeContentBrowserClient::GetDefaultFavicon() { 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowAppCache( 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& manifest_url, 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context) { 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->GetCookieSettings()-> 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsSettingCookieAllowed(manifest_url, first_party); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowGetCookie( 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list, 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = io_data->GetCookieSettings()-> 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsReadingCookieAllowed(url, first_party); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookiesRead, render_process_id, 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, url, first_party, cookie_list, !allow)); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowSetCookie( 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions* options) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, first_party); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::CookieChanged, render_process_id, 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, url, first_party, cookie_line, *options, 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !allow)); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowSaveLocalState( 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context) { 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSetting setting = cookie_settings->GetDefaultCookieSetting(NULL); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(bauerb): Should we also disallow local state if the default is BLOCK? 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Could we even support per-origin settings? 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return setting != CONTENT_SETTING_SESSION_ONLY; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerDatabase( 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long estimated_size, 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to database for potential display in UI. 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::WebDatabaseAccessed, 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, name, display_name, !allow)); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerFileSystem( 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to file system for potential display in UI. 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::FileSystemAccessed, 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, !allow)); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowWorkerIndexedDB( 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::pair<int, int> >& render_views) { 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieSettings* cookie_settings = io_data->GetCookieSettings(); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow = cookie_settings->IsSettingCookieAllowed(url, url); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record access to IndexedDB for potential display in UI. 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<int, int> >::const_iterator i; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = render_views.begin(); i != render_views.end(); ++i) { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabSpecificContentSettings::IndexedDBAccessed, 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->first, i->second, url, name, !allow)); 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allow; 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContext* 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::OverrideRequestContextForURL( 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, content::ResourceContext* context) { 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_data->extensions_request_context(); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuotaPermissionContext* 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentBrowserClient::CreateQuotaPermissionContext() { 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeQuotaPermissionContext(); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::AllowCertificateError( 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_error, 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::SSLInfo& ssl_info, 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& request_url, 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType::Type resource_type, 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool overridable, 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool strict_enforcement, 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(bool)>& callback, 166090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::CertificateRequestResultType* result) { 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (resource_type != ResourceType::MAIN_FRAME) { 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A sub-resource has a certificate error. The user doesn't really 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have a context for making the right decision, so block the 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request hard, without an info bar to allow showing the insecure 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content. 166690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *result = content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY; 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the tab is being prerendered, cancel the prerender and the request. 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID( 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab) { 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager* prerender_manager = 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManagerFactory::GetForProfile( 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(tab->GetBrowserContext())); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_manager && prerender_manager->IsWebContentsPrerendering(tab, 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)) { 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_manager->prerender_tracker()->TryCancel( 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id, 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::FINAL_STATUS_SSL_ERROR)) { 168590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *result = content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL; 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal::CaptivePortalTabHelper* captive_portal_tab_helper = 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal::CaptivePortalTabHelper::FromWebContents(tab); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (captive_portal_tab_helper) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captive_portal_tab_helper->OnSSLCertError(ssl_info); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, display an SSL blocking page. 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SSLBlockingPage(tab, cert_error, ssl_info, request_url, overridable, 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strict_enforcement, callback); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::SelectClientCertificate( 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpNetworkSession* network_session, 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLCertRequestInfo* cert_request_info, 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void(net::X509Certificate*)>& callback) { 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* tab = tab_util::GetWebContentsByID( 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tab) { 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL requesting_url("https://" + cert_request_info->host_and_port); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(requesting_url.is_valid()) << "Invalid URL string: https://" 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << cert_request_info->host_and_port; 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext()); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> filter( 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetHostContentSettingsMap()->GetWebsiteSetting( 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requesting_url, 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requesting_url, 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(), NULL)); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter.get()) { 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to automatically select a client certificate. 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filter->IsType(Value::TYPE_DICTIONARY)) { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* filter_dict = 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DictionaryValue*>(filter.get()); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<scoped_refptr<net::X509Certificate> >& 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_client_certs = cert_request_info->client_certs; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < all_client_certs.size(); ++i) { 1736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (CertMatchesFilter(*all_client_certs[i].get(), *filter_dict)) { 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the first certificate that is matched by the filter. 1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback.Run(all_client_certs[i].get()); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLTabHelper* ssl_tab_helper = SSLTabHelper::FromWebContents(tab); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ssl_tab_helper) { 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is no SSLTabHelper for the given WebContents then we can't 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // show the user a dialog to select a client certificate. So we simply 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // proceed with no client certificate. 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(NULL); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_tab_helper->ShowClientCertificateRequestDialog( 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_session, cert_request_info, callback); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::AddCertificate( 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::CertificateMimeType cert_type, 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* cert_data, 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t cert_size, 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::SSLAddCertificate(request, cert_type, cert_data, cert_size, 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_process_id, render_view_id); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() { 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MediaCaptureDevicesDispatcher::GetInstance(); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::RequestDesktopNotificationPermission( 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_context, 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id) { 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* contents = 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_util::GetWebContentsByID(render_process_id, render_view_id); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents) { 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip showing the infobar if the request comes from an extension, and that 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension has the 'notify' permission. (If the extension does not have the 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // permission, the user will still be prompted.) 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext()); 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionInfoMap* extension_info_map = 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->info_map(); 1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DesktopNotificationService* notification_service = 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Extension* extension = NULL; 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (extension_info_map) { 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_origin, render_process_id, 1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::APIPermission::kNotification, &extensions); 1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (ExtensionSet::const_iterator iter = extensions.begin(); 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != extensions.end(); ++iter) { 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (notification_service->IsExtensionEnabled((*iter)->id())) { 18057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension = iter->get(); 1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* rvh = 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost::FromID(render_process_id, render_view_id); 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsExtensionWithPermissionOrSuggestInConsole( 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) APIPermission::kNotification, extension, rvh)) { 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->DesktopNotificationPermissionRequestDone(callback_context); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) notification_service->RequestPermission(source_origin, render_process_id, 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id, callback_context, contents); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter::Permission 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::CheckDesktopNotificationPermission( 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id) { 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 18337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sometimes a notification may be invoked during the shutdown. 18347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // See http://crbug.com/256638 18357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (browser_shutdown::IsTryingToQuit()) 18367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return WebKit::WebNotificationPresenter::PermissionNotAllowed; 18377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 1839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DesktopNotificationService* notification_service = 1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) io_data->GetNotificationService(); 1842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (notification_service) { 1843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionInfoMap* extension_info_map = io_data->GetExtensionInfoMap(); 1844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionSet extensions; 1845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_info_map->GetExtensionsWithAPIPermissionForSecurityOrigin( 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin, render_process_id, 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::APIPermission::kNotification, &extensions); 1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (ExtensionSet::const_iterator iter = extensions.begin(); 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != extensions.end(); ++iter) { 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (notification_service->IsExtensionEnabled((*iter)->id())) 1851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 1852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return notification_service->HasPermission(source_origin); 1855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionNotAllowed; 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebKit::WebNotificationPresenter::PermissionAllowed; 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ShowDesktopNotification( 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::ShowDesktopNotificationHostMsgParams& params, 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool worker) { 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::FromID( 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = rvh->GetProcess(); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext()); 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* service = 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->ShowDesktopNotification( 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params, render_process_id, render_view_id, 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker ? DesktopNotificationService::WorkerNotification : 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService::PageNotification); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::CancelDesktopNotification( 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notification_id) { 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::FromID( 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rvh) { 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* process = rvh->GetProcess(); 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(process->GetBrowserContext()); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationService* service = 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopNotificationServiceFactory::GetForProfile(profile); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service->CancelDesktopNotification( 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, render_view_id, notification_id); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::CanCreateWindow( 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& opener_url, 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_origin, 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowContainerType container_type, 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* no_javascript_access) { 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *no_javascript_access = false; 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the opener is trying to create a background window but doesn't have 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the appropriate permission, fail the attempt. 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) { 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionInfoMap* map = io_data->GetExtensionInfoMap(); 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!map->SecurityOriginHasAPIPermission( 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_origin, 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APIPermission::kBackground)) { 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: this use of GetExtensionOrAppByURL is safe but imperfect. It may 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return a recently installed Extension even if this CanCreateWindow call 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // was made by an old copy of the page in a normal web process. That's ok, 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the permission check above would have caused an early return 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already. We must use the full URL to find hosted apps, though, and not 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just the origin. 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = map->extensions().GetExtensionOrAppByURL( 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionURLInfo(opener_url)); 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension && !extensions::BackgroundInfo::AllowJSAccess(extension)) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *no_javascript_access = true; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No new browser window (popup or tab) in app mode. 1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (container_type == WINDOW_CONTAINER_TYPE_NORMAL && 1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::IsRunningInForcedAppMode()) { 1951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetWorkerProcessTitle( 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, content::ResourceContext* context) { 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if it's an extension-created worker, in which case we want to use 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the name of the extension. 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_data->GetExtensionInfoMap()->extensions().GetByID(url.host()); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension ? extension->name() : std::string(); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ResourceDispatcherHostCreated() { 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->ResourceDispatcherHostCreated(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(tommi): Rename from Get to Create. 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::SpeechRecognitionManagerDelegate* 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetSpeechRecognitionManagerDelegate() { 19757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_INPUT_SPEECH) 19767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new speech::ChromeSpeechRecognitionManagerDelegateBubbleUI(); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Platforms who don't implement x-webkit-speech (a.k.a INPUT_SPEECH) just 19797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // need the base delegate without the bubble UI. 19807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new speech::ChromeSpeechRecognitionManagerDelegate(); 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::NetLog* ChromeContentBrowserClient::GetNetLog() { 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_browser_process->net_log(); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccessTokenStore* ChromeContentBrowserClient::CreateAccessTokenStore() { 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ChromeAccessTokenStore(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::IsFastShutdownPossible() { 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::OverrideWebkitPrefs( 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, const GURL& url, WebPreferences* web_prefs) { 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext()); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitStandardFontFamilyMap, 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->standard_font_family_map); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitFixedFontFamilyMap, 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->fixed_font_family_map); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitSerifFontFamilyMap, 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->serif_font_family_map); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitSansSerifFontFamilyMap, 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->sans_serif_font_family_map); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitCursiveFontFamilyMap, 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->cursive_font_family_map); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitFantasyFontFamilyMap, 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->fantasy_font_family_map); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillFontFamilyMap(prefs, prefs::kWebKitPictographFontFamilyMap, 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_prefs->pictograph_font_family_map); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_font_size = 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitDefaultFontSize); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_fixed_font_size = 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitDefaultFixedFontSize); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->minimum_font_size = 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitMinimumFontSize); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->minimum_logical_font_size = 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetInteger(prefs::kWebKitMinimumLogicalFontSize); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->javascript_can_open_windows_automatically = 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitJavascriptCanOpenWindowsAutomatically); 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->dom_paste_enabled = 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitDomPasteEnabled); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->shrinks_standalone_images_to_fit = 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitShrinksStandaloneImagesToFit); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue* inspector_settings = 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetDictionary(prefs::kWebKitInspectorSettings); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inspector_settings) { 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator iter(*inspector_settings); !iter.IsAtEnd(); 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsString(&value)) { 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->inspector_settings.push_back( 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(iter.key(), value)); 20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->tabs_to_links = prefs->GetBoolean(prefs::kWebkitTabsToLinks); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitJavascriptEnabled)) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->javascript_enabled = false; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitWebSecurityEnabled)) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->web_security_enabled = false; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitPluginsEnabled)) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->plugins_enabled = false; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs->GetBoolean(prefs::kWebKitJavaEnabled)) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->java_enabled = false; 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->loads_images_automatically = 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitLoadsImagesAutomatically); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->GetBoolean(prefs::kDisable3DAPIs)) 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->experimental_webgl_enabled = false; 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->memory_info_enabled = 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kEnableMemoryInfo); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_displaying_insecure_content = 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitAllowDisplayingInsecureContent); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_running_insecure_content = 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitAllowRunningInsecureContent); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->font_scale_factor = 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<float>(prefs->GetDouble(prefs::kWebKitFontScaleFactor)); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->force_enable_zoom = 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitForceEnableZoom); 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GOOGLE_TV) 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_prefs->user_gesture_required_for_media_playback = false; 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2077b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_ANDROID) 2079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_prefs->password_echo_enabled = 2080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitPasswordEchoEnabled); 2081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->password_echo_enabled = browser_defaults::kPasswordEchoEnabled; 2083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 2084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2085b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_CHROMEOS) 2086b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Enable password echo during OOBE when keyboard driven flag is set. 2087b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (chromeos::UserManager::IsInitialized() && 2088b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !chromeos::UserManager::Get()->IsUserLoggedIn() && 2089b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !chromeos::StartupUtils::IsOobeCompleted()) { 2090b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool keyboard_driven_oobe = false; 2091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) chromeos::system::StatisticsProvider::GetInstance()->GetMachineFlag( 2092eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chromeos::system::kOemKeyboardDrivenOobeKey, &keyboard_driven_oobe); 2093b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (keyboard_driven_oobe) 2094b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) web_prefs->password_echo_enabled = true; 2095b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 2096b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_prefs->user_style_sheet_enabled = false; 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user stylesheet watcher may not exist in a testing profile. 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserStyleSheetWatcher* user_style_sheet_watcher = 21037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UserStyleSheetWatcherFactory::GetForProfile(profile).get(); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_style_sheet_watcher) { 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_enabled = true; 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_location = 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_style_sheet_watcher->user_style_sheet(); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->user_style_sheet_enabled = false; 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_prefs->asynchronous_spell_checking_enabled = true; 2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_prefs->unified_textchecker_enabled = true; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->uses_universal_detector = 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitUsesUniversalDetector); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->text_areas_are_resizable = 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kWebKitTextAreasAreResizable); 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->hyperlink_auditing_enabled = 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->GetBoolean(prefs::kEnableHyperlinkAuditing); 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we will set the default_encoding with canonical encoding name. 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterEncoding::GetCanonicalEncodingNameByAliasName( 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_prefs->default_encoding.empty()) { 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs->ClearPref(prefs::kDefaultCharset); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!web_prefs->default_encoding.empty()); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (content::IsForceCompositingModeEnabled()) 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_prefs->force_compositing_mode = true; 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = WebContents::FromRenderViewHost(rvh); 2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ViewType view_type = extensions::GetViewType(web_contents); 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service) { 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = rvh->GetSiteInstance()->GetSiteURL(); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = service->extensions()->GetByID(url.host()); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that we are only granting extension preferences to URLs with 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct scheme. Without this check, chrome-guest:// schemes used by 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // webview tags as well as hosts that happen to match the id of an 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installed extension would get the wrong preferences. 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme)) { 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_webkit_preferences::SetPreferences( 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, view_type, web_prefs); 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_type == extensions::VIEW_TYPE_NOTIFICATION) { 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->allow_scripts_to_close_windows = true; 2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (view_type == extensions::VIEW_TYPE_BACKGROUND_CONTENTS) { 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable all kinds of acceleration for background pages. 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/96005 and http://crbug.com/96006 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->force_compositing_mode = false; 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_compositing_enabled = false; 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FILE_MANAGER_EXTENSION) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the default of suppressing HW compositing for WebUI pages for the 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file manager, which is implemented using WebUI but wants HW acceleration 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for video decode & render. 21667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (url.SchemeIs(extensions::kExtensionScheme) && 21677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) url.host() == kFileBrowserDomain) { 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_compositing_enabled = true; 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_prefs->accelerated_2d_canvas_enabled = true; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::UpdateInspectorSetting( 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh, const std::string& key, const std::string& value) { 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context = 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetProcess()->GetBrowserContext(); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update( 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(browser_context)->GetPrefs(), 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kWebKitInspectorSettings); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* inspector_settings = update.Get(); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inspector_settings->SetWithoutPathExpansion(key, 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value::CreateStringValue(value)); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::BrowserURLHandlerCreated( 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler* handler) { 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the default URL handlers. 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&ExtensionWebUI::HandleChromeURLOverride, 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler::null_handler()); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(BrowserURLHandler::null_handler(), 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ExtensionWebUI::HandleChromeURLOverrideReverse); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // about: handler. Must come before chrome: handler, since it will 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rewrite about: urls to chrome: URLs and then expect chrome: to 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // actually handle them. 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&WillHandleBrowserAboutURL, 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserURLHandler::null_handler()); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome: & friends. 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->AddHandlerPair(&HandleWebUI, &HandleWebUIReverse); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearCache(RenderViewHost* rvh) { 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance()->GetProcess()->GetBrowserContext()); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(profile); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(BrowsingDataRemover::REMOVE_CACHE, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataHelper::UNPROTECTED_WEB); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover takes care of deleting itself when done. 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::ClearCookies(RenderViewHost* rvh) { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->GetSiteInstance()->GetProcess()->GetBrowserContext()); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(profile); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int remove_mask = BrowsingDataRemover::REMOVE_SITE_DATA; 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover takes care of deleting itself when done. 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() { 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return download_util::GetDefaultDownloadDirectory(); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ChromeContentBrowserClient::GetDefaultDownloadName() { 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF8(IDS_DEFAULT_DOWNLOAD_FILENAME); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::DidCreatePpapiPlugin( 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserPpapiHost* browser_host) { 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_host->GetPpapiHost()->AddHostFactoryFilter( 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ppapi::host::HostFactory>( 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeBrowserPepperHostFactory(browser_host))); 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::BrowserPpapiHost* 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetExternalBrowserPpapiHost( 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_process_id) { 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserChildProcessHostIterator iter(PROCESS_TYPE_NACL_LOADER); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!iter.Done()) { 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClProcessHost* host = static_cast<NaClProcessHost*>(iter.GetDelegate()); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host->process() && 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->process()->GetData().id == plugin_process_id) { 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Found the plugin. 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host->browser_ppapi_host(); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter; 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeContentBrowserClient::SupportsBrowserPlugin( 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserContext* browser_context, const GURL& site_url) { 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableBrowserPluginForAllViewTypes)) 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(profile)->extension_service(); 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!service) 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = service->extensions()-> 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExtensionOrAppByURL(ExtensionURLInfo(site_url)); 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension) 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return extension->HasAPIPermission(APIPermission::kWebView) || 2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension->HasAPIPermission(APIPermission::kAdView); 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentBrowserClient::AllowPepperSocketAPI( 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserContext* browser_context, 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 22807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool private_api, 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::SocketPermissionRequest& params) { 2282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 22837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 22847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const ExtensionSet* extension_set = NULL; 22857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (profile) { 22867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_set = extensions::ExtensionSystem::Get(profile)-> 22877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_service()->extensions(); 22887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 22897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 22907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (private_api) { 22917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Access to private socket APIs is controlled by the whitelist. 22927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsExtensionOrSharedModuleWhitelisted(url, extension_set, 22937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) allowed_socket_origins_)) { 22947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 22957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 22967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else { 22977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Access to public socket APIs is controlled by extension permissions. 22987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (url.is_valid() && url.SchemeIs(extensions::kExtensionScheme) && 22997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_set) { 23007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const Extension* extension = extension_set->GetByID(url.host()); 23017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (extension) { 23027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extensions::SocketPermission::CheckParam check_params( 23037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.type, params.host, params.port); 23047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (extensions::PermissionsData::CheckAPIPermissionWithParam( 23057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension, extensions::APIPermission::kSocket, &check_params)) { 23067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 23077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 23087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 23097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 23107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 23117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 23127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Allow both public and private APIs if the command line says so. 23137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return IsHostAllowedByCommandLine(url, extension_set, 23147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switches::kAllowNaClSocketAPI); 2315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeContentBrowserClient::GetHyphenDictionaryDirectory() { 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath directory; 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP_DICTIONARIES, &directory); 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return directory.Append(FILE_PATH_LITERAL("Hyphen")); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::SelectFilePolicy* ChromeContentBrowserClient::CreateSelectFilePolicy( 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents) { 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ChromeSelectFilePolicy(web_contents); 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem( 2332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string>* additional_allowed_schemes) { 2333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem( 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_allowed_schemes); 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_allowed_schemes->push_back(kChromeUIScheme); 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) additional_allowed_schemes->push_back(extensions::kExtensionScheme); 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeContentBrowserClient::GetAdditionalFileSystemBackends( 23407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext* browser_context, 2341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& storage_partition_path, 23427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ScopedVector<fileapi::FileSystemBackend>* additional_backends) { 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID) 2344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 23457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch additional_backends->push_back(new MediaFileSystemBackend( 2346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) storage_partition_path, 2347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pool->GetSequencedTaskRunner(pool->GetNamedSequenceToken( 23487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaFileSystemBackend::kMediaTaskRunnerName)).get())); 2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 2350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 23517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fileapi::ExternalMountPoints* external_mount_points = 23527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext::GetMountPoints(browser_context); 2353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(external_mount_points); 23547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch chromeos::FileSystemBackend* backend = 23557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new chromeos::FileSystemBackend( 23567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new drive::FileSystemBackendDelegate(browser_context), 23577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser_context->GetSpecialStoragePolicy(), 2358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch external_mount_points, 2359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileapi::ExternalMountPoints::GetSystemInstance()); 23607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch backend->AddSystemMountPoints(); 23617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(backend->CanHandleType(fileapi::kFileSystemTypeExternal)); 23627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch additional_backends->push_back(backend); 2363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess( 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line, 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_process_id, 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FileDescriptorInfo>* mappings) { 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_path; 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &data_path); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!data_path.empty()); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ; 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath chrome_pak = data_path.AppendASCII("chrome.pak"); 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile f = 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CreatePlatformFile(chrome_pak, flags, NULL, NULL); 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidChromePakDescriptor, 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath chrome_resources_pak = 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("chrome_100_percent.pak"); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = base::CreatePlatformFile(chrome_resources_pak, flags, NULL, NULL); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidChrome100PercentPakDescriptor, 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string locale = GetApplicationLocale(); 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale_pak = ResourceBundle::GetSharedInstance(). 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocaleFilePath(locale, false); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = base::CreatePlatformFile(locale_pak, flags, NULL, NULL); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidLocalePakDescriptor, 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(f, true))); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath resources_pack_path; 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f = base::CreatePlatformFile(resources_pack_path, flags, NULL, NULL); 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(f != base::kInvalidPlatformFileValue); 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidUIResourcesPakDescriptor, 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileDescriptor(f, true))); 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsCrashReporterEnabled()) { 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f = CrashDumpManager::GetInstance()->CreateMinidumpFile(child_process_id); 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (f == base::kInvalidPlatformFileValue) { 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to create file for minidump, crash reporting will " 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "be disabled for this process."; 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mappings->push_back(FileDescriptorInfo(kAndroidMinidumpDescriptor, 24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileDescriptor(f, true))); 24142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int crash_signal_fd = GetCrashSignalFD(command_line); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crash_signal_fd >= 0) { 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings->push_back(FileDescriptorInfo(kCrashDumpSignal, 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptor(crash_signal_fd, 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false))); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_ANDROID) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) && !defined(OS_MACOSX) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t* ChromeContentBrowserClient::GetResourceDllName() { 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::kBrowserResourcesDll; 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentBrowserClient::PreSpawnRenderer( 24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy* policy, 24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* success) { 24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This code is duplicated in nacl_exe_win_64.cc. 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow the server side of a pipe restricted to the "chrome.nacl." 24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // namespace so that it cannot impersonate other system or other chrome 24392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // service pipes. 24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::ResultCode result = policy->AddRule( 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::SUBSYS_NAMED_PIPES, 24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY, 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"\\\\.\\pipe\\chrome.nacl.*"); 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != sandbox::SBOX_ALL_OK) { 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *success = false; 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Renderers need to send named pipe handles and shared memory 24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // segment handles to NaCl loader processes. 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_HANDLES, 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy::HANDLES_DUP_ANY, 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) L"File"); 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != sandbox::SBOX_ALL_OK) { 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *success = false; 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crypto::CryptoModuleBlockingPasswordDelegate* 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeContentBrowserClient::GetCryptoPasswordDelegate( 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::NewCryptoModuleBlockingDialogDelegate( 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kCryptoModulePasswordKeygen, url.host()); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 2471