blob: 45bc6aa82d4a5ca9fa9479b60ec7732e02b3bd8b [file] [log] [blame]
[email protected]f3986f82012-01-03 20:00:061// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]d977f9c2011-03-14 16:10:262// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chrome_content_browser_client.h"
6
bmcquade5d2d9cf32015-06-19 17:42:287#include <map>
[email protected]7c3228a2011-11-11 21:35:228#include <set>
[email protected]1033acd2012-02-08 08:46:279#include <utility>
[email protected]7c3228a2011-11-11 21:35:2210#include <vector>
11
brettwf1958912015-10-07 19:43:1212#include "base/base_switches.h"
[email protected]317c58f02011-11-09 02:15:0313#include "base/bind.h"
estark3ba11132015-04-10 01:38:3314#include "base/bind_helpers.h"
[email protected]b80f68432011-05-02 17:22:3015#include "base/command_line.h"
Ken Rockot91c40da82019-08-12 20:07:1116#include "base/compiler_specific.h"
Will Harrisc196ed942019-08-03 03:45:3017#include "base/files/file_util.h"
morritad95714f2014-10-01 02:37:2418#include "base/files/scoped_file.h"
Marc Treibad33cf942017-08-24 11:19:0019#include "base/i18n/base_i18n_switches.h"
jinsukkim79df88a2017-01-04 06:26:1520#include "base/i18n/character_encoding.h"
Ken Rockot341089f2019-01-11 23:11:5821#include "base/macros.h"
Tarun Bansal73d67f02018-01-17 05:56:2522#include "base/metrics/field_trial_params.h"
lazyboy5d5fede02016-03-10 04:10:1423#include "base/metrics/histogram_macros.h"
Lei Zhang2cfceac2018-11-14 19:36:3324#include "base/no_destructor.h"
[email protected]29699c22012-10-03 23:57:3925#include "base/path_service.h"
Avi Drissmand251e912018-12-26 15:46:3726#include "base/stl_util.h"
[email protected]e7463412013-06-10 22:53:4627#include "base/strings/string_number_conversions.h"
markdittmer67b71ea2016-03-03 22:40:0328#include "base/strings/string_split.h"
bmcquade5d2d9cf32015-06-19 17:42:2829#include "base/strings/string_util.h"
30#include "base/strings/stringprintf.h"
[email protected]135cb802013-06-09 16:44:2031#include "base/strings/utf_string_conversions.h"
Sebastien Marchand75a7cdf2018-11-13 23:47:0332#include "base/system/sys_info.h"
Eric Seckler8652dcd52018-09-20 10:42:2833#include "base/task/post_task.h"
Wojciech Dzierżanowski45380802019-04-29 14:50:3234#include "base/threading/sequenced_task_runner_handle.h"
gabb15e19072016-05-11 20:45:4135#include "base/threading/thread_task_runner_handle.h"
avie4d7b6f2015-12-26 00:59:1836#include "build/build_config.h"
Ken Rockot06fd2832019-05-24 17:24:4437#include "chrome/app/builtin_service_manifests.h"
Ken Rockot341089f2019-01-11 23:11:5838#include "chrome/app/chrome_content_browser_overlay_manifest.h"
39#include "chrome/app/chrome_content_gpu_overlay_manifest.h"
40#include "chrome/app/chrome_content_renderer_overlay_manifest.h"
Dominic Mazzoni21fb0282019-02-13 18:32:4741#include "chrome/browser/accessibility/accessibility_labels_service.h"
42#include "chrome/browser/accessibility/accessibility_labels_service_factory.h"
michaeln96f887e22015-04-13 23:58:3143#include "chrome/browser/after_startup_task_utils.h"
[email protected]b8148ac2011-07-13 22:03:2544#include "chrome/browser/browser_about_handler.h"
[email protected]b80f68432011-05-02 17:22:3045#include "chrome/browser/browser_process.h"
[email protected]b0cb5e82012-07-19 19:22:4746#include "chrome/browser/browsing_data/browsing_data_helper.h"
msramek1c2b3ca2017-03-14 17:57:5647#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
[email protected]d5a74be2014-08-08 01:01:2748#include "chrome/browser/chrome_content_browser_client_parts.h"
[email protected]317f96c92011-05-31 06:53:4149#include "chrome/browser/chrome_quota_permission_context.h"
drogerb1716972015-06-30 09:04:0950#include "chrome/browser/content_settings/cookie_settings_factory.h"
peconn5100d432015-09-16 12:03:0851#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
[email protected]8093a542011-05-13 07:29:3252#include "chrome/browser/content_settings/tab_specific_content_settings.h"
Robbie McElrath1294d242019-05-31 20:46:2253#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
54#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
Zhuoyu Qiancb1976382018-12-13 02:18:3055#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
56#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
rajendrantfeea8592018-10-19 18:26:0657#include "chrome/browser/data_use_measurement/chrome_data_use_measurement.h"
[email protected]9d06d88d2012-02-23 22:37:0858#include "chrome/browser/defaults.h"
[email protected]b1d97272013-08-17 13:38:4959#include "chrome/browser/download/download_prefs.h"
Maks Orlovich710d5e32019-07-09 20:16:4560#include "chrome/browser/extensions/chrome_extension_cookies.h"
John Abd-El-Maleka67add82018-03-09 18:22:0161#include "chrome/browser/external_protocol/external_protocol_handler.h"
[email protected]354de9e2014-08-07 03:27:1962#include "chrome/browser/font_family_cache.h"
Matt Reynolds93616f9b2019-06-07 01:28:5263#include "chrome/browser/hid/chrome_hid_delegate.h"
Anthony Vallee-Duboise2432137a2019-01-17 20:06:0164#include "chrome/browser/language/translate_frame_binder.h"
Avi Drissmand30927342018-05-22 15:04:2765#include "chrome/browser/lifetime/browser_shutdown.h"
Joe DeBlasio6e8409a2019-02-20 23:08:2766#include "chrome/browser/lookalikes/lookalike_url_navigation_throttle.h"
thakis678822e2017-04-20 17:20:3467#include "chrome/browser/media/router/media_router_feature.h"
Derek Chengeb64b19a2018-01-02 20:20:4268#include "chrome/browser/media/router/presentation/presentation_service_delegate_impl.h"
69#include "chrome/browser/media/router/presentation/receiver_presentation_service_delegate_impl.h"
Patrik Höglundb564859b2018-05-17 11:17:1670#include "chrome/browser/media/webrtc/audio_debug_recordings_handler.h"
mcasasa2023ab2016-09-08 01:06:3671#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
Darin Fisher09aa7222019-08-29 09:27:3672#include "chrome/browser/media/webrtc/webrtc_logging_controller.h"
Sebastien Marchand8c0088102019-10-11 16:47:5673#include "chrome/browser/memory/chrome_browser_main_extra_parts_memory.h"
[email protected]95132f52013-04-12 02:19:0474#include "chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.h"
Xi Han85079c22019-04-18 21:43:0575#include "chrome/browser/metrics/chrome_feature_list_creator.h"
[email protected]a2b4c5c2013-10-18 02:06:0776#include "chrome/browser/nacl_host/nacl_browser_delegate_impl.h"
John Abd-El-Malek7577f262019-06-10 21:23:2377#include "chrome/browser/net/chrome_network_delegate.h"
Matt Menkeae4fdb12018-06-02 06:32:5478#include "chrome/browser/net/system_network_context_manager.h"
Richard Knolld0eae962019-04-04 12:34:0279#include "chrome/browser/notifications/platform_notification_service_factory.h"
peterc26c6c62014-12-10 14:13:5980#include "chrome/browser/notifications/platform_notification_service_impl.h"
leon.han952ea3252016-04-13 02:44:5681#include "chrome/browser/password_manager/chrome_password_manager_client.h"
Anthony Vallee-Dubois8f5e7e12018-01-12 16:14:0682#include "chrome/browser/payments/payment_request_display_manager_factory.h"
Sigurdur Asgeirsson54b72702019-04-12 14:18:5483#include "chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.h"
Sigurdur Asgeirsson70696672019-02-08 16:14:5184#include "chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.h"
Adam Langley85339f62018-02-12 22:03:5685#include "chrome/browser/permissions/attestation_permission_request.h"
jyasskinc993ce8d2016-03-31 00:38:3486#include "chrome/browser/permissions/permission_context_base.h"
Adam Langley85339f62018-02-12 22:03:5687#include "chrome/browser/permissions/permission_request_manager.h"
[email protected]0609b17f2011-05-31 20:13:4288#include "chrome/browser/platform_util.h"
Amber Won94afd8112017-08-23 17:30:1189#include "chrome/browser/plugins/pdf_iframe_navigation_throttle.h"
Ehsan Karamad91413d72019-03-22 16:37:4890#include "chrome/browser/plugins/plugin_utils.h"
[email protected]190e5e22013-07-27 05:59:2391#include "chrome/browser/prerender/prerender_final_status.h"
[email protected]f9034cf2011-07-21 12:43:4192#include "chrome/browser/prerender/prerender_manager.h"
[email protected]3085c502011-10-05 17:50:5093#include "chrome/browser/prerender/prerender_manager_factory.h"
[email protected]2736c032012-05-11 18:06:0794#include "chrome/browser/prerender/prerender_message_filter.h"
John Abd-El-Maleka67add82018-03-09 18:22:0195#include "chrome/browser/prerender/prerender_util.h"
Ryan Sturmcc5071be2019-02-16 02:15:1996#include "chrome/browser/previews/previews_content_util.h"
Robert Ogden0f4d88682019-09-24 22:27:5297#include "chrome/browser/previews/previews_lite_page_redirect_decider.h"
98#include "chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.h"
Ryan Sturmaa05092f2018-10-21 03:56:5499#include "chrome/browser/previews/previews_service.h"
100#include "chrome/browser/previews/previews_service_factory.h"
101#include "chrome/browser/previews/previews_ui_tab_helper.h"
[email protected]7e75e4a2013-05-17 17:20:03102#include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
[email protected]05fcf982011-04-19 00:44:14103#include "chrome/browser/profiles/profile.h"
[email protected]8093a542011-05-13 07:29:32104#include "chrome/browser/profiles/profile_io_data.h"
John Abd-El-Malek1f7fc912018-07-26 02:48:06105#include "chrome/browser/profiles/renderer_updater.h"
106#include "chrome/browser/profiles/renderer_updater_factory.h"
Erik Chen49bbfa22017-08-18 08:49:56107#include "chrome/browser/profiling_host/chrome_browser_main_extra_parts_profiling.h"
108#include "chrome/browser/profiling_host/profiling_process_host.h"
clamy1e5574e2016-09-29 16:48:44109#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
[email protected]05fcf982011-04-19 00:44:14110#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
[email protected]b7631cc2012-09-15 05:08:38111#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
Kenichi Ishibashi46329872018-07-17 09:43:40112#include "chrome/browser/renderer_preferences_util.h"
zhenw6edd49c2017-07-12 05:49:45113#include "chrome/browser/resource_coordinator/background_tab_navigation_throttle.h"
meacerf43117a2016-12-27 21:02:31114#include "chrome/browser/safe_browsing/certificate_reporting_service.h"
115#include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h"
Carlos IL4ee307e2018-12-22 03:19:00116#include "chrome/browser/safe_browsing/safe_browsing_navigation_throttle.h"
yzshen2d8fb422017-06-01 20:29:40117#include "chrome/browser/safe_browsing/safe_browsing_service.h"
Yuzhu Shen44094e22017-07-18 22:52:35118#include "chrome/browser/safe_browsing/ui_manager.h"
119#include "chrome/browser/safe_browsing/url_checker_delegate_impl.h"
[email protected]a7b8e43d2013-03-18 18:52:43120#include "chrome/browser/search/search.h"
Jay Civelli2578ebe2018-06-05 18:44:31121#include "chrome/browser/sessions/session_tab_helper.h"
Sam Goto5cf068e82019-11-04 23:08:44122#include "chrome/browser/sharing/sms/sms_remote_fetcher.h"
Reilly Grantcc22e602018-09-07 15:25:20123#include "chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h"
Reilly Grant37877802018-08-18 00:58:35124#include "chrome/browser/signin/chrome_signin_url_loader_throttle.h"
Robbie McElrath38f47af2019-09-19 21:51:40125#include "chrome/browser/signin/header_modification_delegate_impl.h"
David Rogere8e83f3c2019-09-12 10:56:23126#include "chrome/browser/signin/identity_manager_factory.h"
Lukasz Anforowiczfd30af32019-03-28 17:33:28127#include "chrome/browser/site_isolation/site_isolation_policy.h"
[email protected]c52b2892012-03-07 11:01:02128#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h"
Katie D840d9532018-11-27 06:20:48129#include "chrome/browser/speech/tts_controller_delegate_impl.h"
[email protected]848dd042011-06-04 18:24:03130#include "chrome/browser/ssl/ssl_blocking_page.h"
Joe DeBlasio9b996292019-01-31 05:09:32131#include "chrome/browser/ssl/ssl_client_auth_metrics.h"
[email protected]25af6ec2014-06-06 19:35:07132#include "chrome/browser/ssl/ssl_client_certificate_selector.h"
meacer4ef065e2015-01-09 03:21:35133#include "chrome/browser/ssl/ssl_error_handler.h"
Christopher Thompson4137cec2017-12-19 05:34:23134#include "chrome/browser/ssl/typed_navigation_timing_throttle.h"
csharrison77bf8342017-05-04 18:23:10135#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
meacer4ef065e2015-01-09 03:21:35136#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
[email protected]8ec26472011-06-06 16:52:45137#include "chrome/browser/tab_contents/tab_util.h"
oysteinec563c582015-02-13 19:19:52138#include "chrome/browser/tracing/chrome_tracing_delegate.h"
Dave Tapuskac6627e12018-08-30 15:07:19139#include "chrome/browser/translate/translate_service.h"
[email protected]916615b2013-09-11 18:19:44140#include "chrome/browser/ui/blocked_content/blocked_window_params.h"
Charlie Harrison804659a2018-10-16 16:43:38141#include "chrome/browser/ui/blocked_content/popup_blocker.h"
Charles Harrison6dd11d282017-10-03 06:14:51142#include "chrome/browser/ui/blocked_content/tab_under_navigation_throttle.h"
thestige80821242015-09-30 23:46:08143#include "chrome/browser/ui/browser_navigator.h"
144#include "chrome/browser/ui/browser_navigator_params.h"
[email protected]a28e3302013-02-03 03:50:43145#include "chrome/browser/ui/chrome_select_file_policy.h"
Jun Caibc561f412018-02-28 18:41:39146#include "chrome/browser/ui/login/login_handler.h"
Emily Starkd6896cd32019-08-21 04:55:54147#include "chrome/browser/ui/login/login_navigation_throttle.h"
Makoto Shimazuc7502932018-08-15 02:12:56148#include "chrome/browser/ui/prefs/pref_watcher.h"
[email protected]329ac972013-06-21 15:24:25149#include "chrome/browser/ui/sync/sync_promo_ui.h"
[email protected]b5d73422012-06-02 23:46:44150#include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h"
Dan Beamf0a7e112019-06-07 18:40:58151#include "chrome/browser/ui/ui_features.h"
[email protected]863f70a2012-01-27 02:05:50152#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
dbeambaee5bd2015-09-26 03:07:01153#include "chrome/browser/ui/webui/log_web_ui_url.h"
reillyg3ff45322015-10-23 21:16:25154#include "chrome/browser/usb/usb_tab_helper.h"
Ian Vollick6243dfe02018-03-08 01:08:53155#include "chrome/browser/vr/vr_tab_helper.h"
Giovanni Ortuño Urquididcd38852019-03-07 08:08:25156#include "chrome/browser/web_applications/components/app_registrar.h"
157#include "chrome/browser/web_applications/web_app_provider.h"
Scott Violet6200d332018-02-23 21:29:23158#include "chrome/common/buildflags.h"
sdefresne9fb67692015-08-03 18:48:22159#include "chrome/common/channel_info.h"
[email protected]4a65826d2011-08-25 16:04:01160#include "chrome/common/chrome_constants.h"
chrisha927d8fe2017-01-18 23:09:51161#include "chrome/common/chrome_features.h"
[email protected]a7944aa2012-10-15 10:12:14162#include "chrome/common/chrome_paths.h"
Mythri Alle0b8de0d2018-10-22 11:06:22163#include "chrome/common/chrome_paths_internal.h"
[email protected]b80f68432011-05-02 17:22:30164#include "chrome/common/chrome_switches.h"
[email protected]779dd282013-10-19 15:57:02165#include "chrome/common/env_vars.h"
John Abd-El-Malek9fb60492018-08-02 04:28:50166#include "chrome/common/google_url_loader_throttle.h"
[email protected]f1933792011-06-14 00:49:34167#include "chrome/common/logging_chrome.h"
[email protected]9d450492013-06-13 23:08:37168#include "chrome/common/pepper_permission_util.h"
[email protected]763ec4ca2011-04-29 15:48:12169#include "chrome/common/pref_names.h"
evliubc2aa0472019-08-09 20:19:19170#include "chrome/common/pref_names_util.h"
John Abd-El-Malekd2377982018-01-08 22:23:12171#include "chrome/common/prerender_url_loader_throttle.h"
Egor Paskod52474c32018-06-19 12:03:22172#include "chrome/common/prerender_util.h"
[email protected]3e69bc82011-05-26 23:22:38173#include "chrome/common/render_messages.h"
nigeltao7cd8d5582016-12-12 06:05:28174#include "chrome/common/renderer_configuration.mojom.h"
falkenad185092016-06-16 06:10:02175#include "chrome/common/secure_origin_whitelist.h"
wittman832321f52016-10-10 18:18:38176#include "chrome/common/stack_sampling_configuration.h"
[email protected]c5dbef02011-05-13 05:06:09177#include "chrome/common/url_constants.h"
Peter Boström8e9b1632019-08-22 23:12:47178#include "chrome/common/webui_url_constants.h"
benc70c0e32016-09-22 03:50:37179#include "chrome/grit/browser_resources.h"
[email protected]af39f002014-08-22 10:18:18180#include "chrome/grit/generated_resources.h"
[email protected]264c0acac2013-10-01 13:33:30181#include "chrome/installer/util/google_update_settings.h"
brettwf1958912015-10-07 19:43:12182#include "components/autofill/core/common/autofill_switches.h"
msramek1c8e19d2017-01-04 20:04:53183#include "components/browsing_data/core/browsing_data_utils.h"
[email protected]649b57272014-05-09 14:54:44184#include "components/cdm/browser/cdm_message_filter_android.h"
Pavol Markob211ab22019-01-23 20:03:04185#include "components/certificate_matching/certificate_principal_pattern.h"
[email protected]09cff78782014-04-20 22:04:48186#include "components/cloud_devices/common/cloud_devices_switches.h"
mukai8eaec822014-10-25 17:53:16187#include "components/content_settings/core/browser/content_settings_utils.h"
drogerb1716972015-06-30 09:04:09188#include "components/content_settings/core/browser/cookie_settings.h"
mukai8eaec822014-10-25 17:53:16189#include "components/content_settings/core/browser/host_content_settings_map.h"
mukai077089f2014-09-11 18:41:52190#include "components/content_settings/core/common/content_settings.h"
jyasskin98bdd3992016-02-26 20:25:45191#include "components/content_settings/core/common/content_settings_types.h"
tbansal08a0e3e2017-06-30 21:30:08192#include "components/content_settings/core/common/content_settings_utils.h"
Daniel Vogelheim976f1c22017-11-22 16:26:03193#include "components/content_settings/core/common/pref_names.h"
Clark DuVall92335842018-10-10 16:49:09194#include "components/data_reduction_proxy/content/common/data_reduction_proxy_url_loader_throttle.h"
Clark DuVall0e901722019-08-14 23:31:37195#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config.h"
Ryan Sturmaa05092f2018-10-21 03:56:54196#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
Clark DuVall68eb997f2019-06-28 05:42:28197#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h"
rajendrant43194072019-04-15 22:13:43198#include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
Clark DuVall92335842018-10-10 16:49:09199#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
Wojciech Dzierżanowski45380802019-04-29 14:50:32200#include "components/data_reduction_proxy/core/common/data_reduction_proxy_throttle_manager.h"
wychene55687342015-11-13 20:17:03201#include "components/dom_distiller/core/dom_distiller_switches.h"
[email protected]474a5a32014-07-28 18:23:24202#include "components/dom_distiller/core/url_constants.h"
blundella5e3240a2016-01-05 11:30:43203#include "components/error_page/common/error_page_switches.h"
khushalsagarc5447db22017-08-22 17:53:01204#include "components/feature_engagement/public/feature_constants.h"
205#include "components/feature_engagement/public/feature_list.h"
John Abd-El-Malek9cf3d7f02018-07-27 02:40:39206#include "components/google/core/common/google_util.h"
Alexandre Frechette572755b2019-02-13 22:30:20207#include "components/language/core/browser/pref_names.h"
[email protected]8e885de2014-07-22 23:36:53208#include "components/metrics/client_info.h"
Scott Violet9ae82892018-03-01 18:38:12209#include "components/nacl/common/buildflags.h"
sammc2b0375b2016-12-22 01:26:17210#include "components/nacl/common/nacl_constants.h"
drogerc690e8802015-09-21 14:29:16211#include "components/net_log/chrome_net_log.h"
Tao Baib827b202019-09-19 21:22:12212#include "components/page_load_metrics/browser/metrics_navigation_throttle.h"
213#include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
214#include "components/page_load_metrics/browser/page_load_metrics_util.h"
Anthony Vallee-Dubois8f5e7e12018-01-12 16:14:06215#include "components/payments/content/payment_request_display_manager.h"
Doug Turner9dcaf5962017-12-21 04:38:53216#include "components/policy/content/policy_blacklist_navigation_throttle.h"
Michael Giuffrida01d7b5d2018-08-21 07:55:54217#include "components/policy/content/policy_blacklist_service.h"
John Abd-El-Malek27b3ebd22019-02-12 18:59:18218#include "components/policy/core/common/policy_service.h"
219#include "components/policy/policy_constants.h"
[email protected]f0c8c4992014-05-15 17:37:26220#include "components/pref_registry/pref_registry_syncable.h"
Chris Palmerac7d75642017-11-22 20:12:54221#include "components/prefs/pref_registry_simple.h"
brettwb1fc1b82016-02-02 00:19:08222#include "components/prefs/pref_service.h"
223#include "components/prefs/scoped_user_pref_update.h"
Sophie Changff1fc382019-08-21 16:30:21224#include "components/previews/content/previews_decider.h"
Ryan Sturmaa05092f2018-10-21 03:56:54225#include "components/previews/content/previews_decider_impl.h"
226#include "components/previews/content/previews_ui_service.h"
227#include "components/previews/content/previews_user_data.h"
Ryan Sturmaa05092f2018-10-21 03:56:54228#include "components/previews/core/previews_experiments.h"
Ryan Sturmaf523742019-01-16 00:15:45229#include "components/previews/core/previews_features.h"
Robert Ogden01770b362019-05-22 17:36:43230#include "components/previews/core/previews_switches.h"
nzolghadrd87a308d2016-12-07 15:45:56231#include "components/rappor/public/rappor_utils.h"
nzolghadrd87a308d2016-12-07 15:45:56232#include "components/rappor/rappor_service_impl.h"
Yuzhu Shen44094e22017-07-18 22:52:35233#include "components/safe_browsing/browser/browser_url_loader_throttle.h"
Yuzhu Shen44094e22017-07-18 22:52:35234#include "components/safe_browsing/browser/url_checker_delegate.h"
Nico Weberbc5b06f2019-07-26 14:00:13235#include "components/safe_browsing/buildflags.h"
timvolodine89cf11712017-05-15 18:05:07236#include "components/safe_browsing/common/safe_browsing_prefs.h"
Tim Volodinee45938472017-09-21 10:08:22237#include "components/safe_browsing/db/database_manager.h"
Yuzhu Shencb3011f62018-02-08 02:51:50238#include "components/safe_browsing/features.h"
Jialiu Linbdbb81d2017-10-11 21:29:09239#include "components/safe_browsing/password_protection/password_protection_navigation_throttle.h"
Daniel Vogelheim6008f572018-09-24 14:35:14240#include "components/security_interstitials/content/origin_policy_ui.h"
Evan Stade1e71d6dd2019-10-29 03:04:49241#include "components/security_interstitials/content/ssl_cert_reporter.h"
242#include "components/security_interstitials/content/ssl_error_navigation_throttle.h"
David Rogere8e83f3c2019-09-12 10:56:23243#include "components/signin/public/identity_manager/identity_manager.h"
csharrisone985ebc2017-04-04 17:05:03244#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h"
[email protected]eba93c92014-01-07 17:34:17245#include "components/translate/core/common/translate_switches.h"
rsleevi24f64dc22015-08-07 21:39:21246#include "components/url_formatter/url_fixer.h"
bmcquade5d2d9cf32015-06-19 17:42:28247#include "components/variations/variations_associated_data.h"
Jun Cai0e568632018-08-09 02:05:33248#include "components/variations/variations_http_header_provider.h"
Kyle Milkab5c048e2017-07-07 02:38:46249#include "components/variations/variations_switches.h"
sdefresne9fb67692015-08-03 18:48:22250#include "components/version_info/version_info.h"
[email protected]e0ada9c2012-03-20 03:54:43251#include "content/public/browser/browser_child_process_host.h"
[email protected]b48c9182011-10-26 18:03:30252#include "content/public/browser/browser_main_parts.h"
[email protected]b7631cc2012-09-15 05:08:38253#include "content/public/browser/browser_ppapi_host.h"
Eric Seckler8652dcd52018-09-20 10:42:28254#include "content/public/browser/browser_task_traits.h"
[email protected]30a306f42013-06-10 03:09:03255#include "content/public/browser/browser_thread.h"
[email protected]825b1662012-03-12 19:07:31256#include "content/public/browser/browser_url_handler.h"
msrameke169ccb2017-04-26 05:21:41257#include "content/public/browser/browsing_data_remover.h"
Lucas Garronb9539b732017-10-31 00:22:09258#include "content/public/browser/certificate_request_result_type.h"
[email protected]0c7193742012-11-07 19:05:03259#include "content/public/browser/child_process_data.h"
[email protected]b9535422012-02-09 01:47:59260#include "content/public/browser/child_process_security_policy.h"
davidben3b8455ae72015-03-11 19:42:19261#include "content/public/browser/client_certificate_delegate.h"
Jay Civelli2578ebe2018-06-05 18:44:31262#include "content/public/browser/file_url_loader.h"
Mohsen Izadi6a6476b72018-12-07 04:34:35263#include "content/public/browser/gpu_data_manager.h"
clamy40c9e142015-09-29 11:18:47264#include "content/public/browser/navigation_handle.h"
265#include "content/public/browser/navigation_throttle.h"
Jennifer Apacible4f854a82018-04-06 22:22:11266#include "content/public/browser/overlay_window.h"
[email protected]094c8772013-12-21 17:54:50267#include "content/public/browser/render_frame_host.h"
[email protected]f3b1a082011-11-18 00:34:30268#include "content/public/browser/render_process_host.h"
[email protected]9c1662b2012-03-06 15:44:33269#include "content/public/browser/render_view_host.h"
[email protected]ce967862012-02-09 22:47:05270#include "content/public/browser/resource_context.h"
jam608f2992016-03-31 16:35:34271#include "content/public/browser/storage_partition.h"
Katie D840d9532018-11-27 06:20:48272#include "content/public/browser/tts_controller.h"
Katie D4713ee42018-11-30 01:48:27273#include "content/public/browser/tts_platform.h"
Jian Lide7b43792018-06-01 23:22:13274#include "content/public/browser/url_loader_request_interceptor.h"
adrian.belgun5b341c72016-06-22 22:24:08275#include "content/public/browser/vpn_service_proxy.h"
[email protected]91ee3682012-01-19 15:02:19276#include "content/public/browser/web_contents.h"
Ryan Sturmda2a0e02018-10-25 01:52:21277#include "content/public/browser/web_contents_delegate.h"
Chris Mumfordbae8a742018-03-01 23:02:23278#include "content/public/browser/web_ui_url_loader_factory.h"
[email protected]e0ada9c2012-03-20 03:54:43279#include "content/public/common/child_process_host.h"
[email protected]a1733df2012-06-22 11:24:18280#include "content/public/common/content_descriptors.h"
juncai1bf9f7c2016-03-22 20:46:56281#include "content/public/common/content_features.h"
brettw90e92602015-10-10 00:12:40282#include "content/public/common/content_switches.h"
Hans Wennborg5ffd1392019-10-16 11:00:02283#include "content/public/common/navigation_policy.h"
John Abd-El-Malek27b3ebd22019-02-12 18:59:18284#include "content/public/common/network_service_util.h"
bend32292b2016-10-07 00:21:58285#include "content/public/common/service_manager_connection.h"
ben51bb6c62016-11-17 20:15:57286#include "content/public/common/service_names.mojom.h"
Chris Mumfordbae8a742018-03-01 23:02:23287#include "content/public/common/url_constants.h"
[email protected]22aa4f82013-09-24 17:01:44288#include "content/public/common/url_utils.h"
Yutaka Hirano968d6252018-12-04 05:09:31289#include "content/public/common/user_agent.h"
[email protected]b3a97b52014-07-09 06:25:05290#include "content/public/common/web_preferences.h"
Takuto Ikutaaa3b796c2019-02-06 02:54:56291#include "content/public/common/window_container_type.mojom-shared.h"
Bill Orreb429222018-08-08 21:14:43292#include "device/vr/buildflags/buildflags.h"
Scott Violetc8240b02018-03-08 22:03:59293#include "extensions/buildflags/buildflags.h"
Alex Moshchukd252c192017-07-17 22:03:48294#include "google_apis/gaia/gaia_urls.h"
Andrew Moylan17329fc2017-09-25 07:43:30295#include "google_apis/google_api_keys.h"
ericrk41a1579e2017-02-10 20:56:28296#include "gpu/config/gpu_switches.h"
grunell086a4112017-03-02 09:23:04297#include "media/audio/audio_manager.h"
François Beaufort8c08979fc2018-03-05 13:06:31298#include "media/base/media_switches.h"
Scott Violeta35f9a42018-03-22 22:00:44299#include "media/media_buildflags.h"
300#include "media/mojo/buildflags.h"
Guido Urdanetad06ae842019-10-10 20:04:12301#include "media/webrtc/webrtc_switches.h"
Shimi Zhang6b72d292019-07-12 20:52:42302#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:52303#include "mojo/public/cpp/bindings/receiver_set.h"
Ken Rockot0adc1e42019-05-24 08:20:08304#include "mojo/public/cpp/bindings/remote.h"
engedyafef0482017-07-06 15:40:53305#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
Bence Béky6b44abf2018-04-11 10:32:51306#include "net/base/load_flags.h"
[email protected]3b455502012-12-11 18:22:58307#include "net/base/mime_util.h"
John Abd-El-Malek7577f262019-06-10 21:23:23308#include "net/http/http_util.h"
Jun Cai9409ded2018-01-30 00:19:46309#include "net/ssl/client_cert_store.h"
[email protected]536fd0b2013-03-14 17:41:57310#include "net/ssl/ssl_cert_request_info.h"
Scott Violet02e38b92018-03-27 23:42:14311#include "ppapi/buildflags/buildflags.h"
[email protected]b7631cc2012-09-15 05:08:38312#include "ppapi/host/ppapi_host.h"
Scott Violet318a55f2018-03-30 19:08:19313#include "printing/buildflags/buildflags.h"
Takashi Toyoshima128441462019-10-16 04:19:17314#include "services/network/public/cpp/features.h"
Lukasz Anforowicz60d1253d2019-05-08 16:31:37315#include "services/network/public/cpp/is_potentially_trustworthy.h"
Lukasz Anforowicz9527fd42019-03-13 19:08:50316#include "services/network/public/cpp/network_switches.h"
Yuzhu Shencb3011f62018-02-08 02:51:50317#include "services/network/public/cpp/resource_request.h"
Jay Civelli668c097f2018-05-16 20:44:13318#include "services/service_manager/embedder/switches.h"
Tom Sepez15d4e5202017-09-27 23:59:05319#include "services/service_manager/sandbox/sandbox_type.h"
Andrew Comminos66057672019-05-01 00:03:34320#include "services/service_manager/sandbox/switches.h"
Ken Rockotcebdf9c82019-05-28 20:33:03321#include "services/strings/grit/services_strings.h"
DongJun Kimfebb3c22019-10-21 02:08:06322#include "storage/browser/file_system/external_mount_points.h"
Hans Wennborg5ffd1392019-10-16 11:00:02323#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
John Delaneyac24e572019-04-30 19:47:02324#include "third_party/blink/public/common/features.h"
Minggang Wangf6840ecf2019-07-29 05:15:02325#include "third_party/blink/public/common/loader/url_loader_throttle.h"
Leon Hanc819dc62019-01-28 04:30:19326#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
Mike West6e4cbb32019-02-13 09:40:17327#include "third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom.h"
Evan Liu7cdbf8872019-06-19 16:47:21328#include "third_party/skia/include/core/SkColor.h"
Xiaohan Wangf170c732018-09-27 05:45:26329#include "third_party/widevine/cdm/buildflags.h"
Scott Violetb72577d2019-01-09 22:18:18330#include "ui/base/buildflags.h"
[email protected]c9b6eb62011-10-18 20:49:39331#include "ui/base/l10n/l10n_util.h"
[email protected]ac55e292011-06-24 05:16:08332#include "ui/base/resource/resource_bundle.h"
Scott Violet8ff9c302018-02-22 22:28:35333#include "ui/base/ui_base_features.h"
Evan Liu7cdbf8872019-06-19 16:47:21334#include "ui/base/ui_base_switches.h"
Khushal1fc0da52019-10-09 00:38:56335#include "ui/display/display.h"
Evan Liu7cdbf8872019-06-19 16:47:21336#include "ui/gfx/color_utils.h"
Elly Fong-Jonesf92897392019-01-24 16:05:49337#include "ui/native_theme/caption_style.h"
338#include "ui/native_theme/native_theme.h"
[email protected]b47dc492014-08-17 07:05:57339#include "ui/resources/grit/ui_resources.h"
jyasskin98bdd3992016-02-26 20:25:45340#include "url/gurl.h"
341#include "url/origin.h"
[email protected]d977f9c2011-03-14 16:10:26342
Ken Rockot69aade02019-01-23 21:19:51343#if BUILDFLAG(ENABLE_NACL)
344#include "components/nacl/loader/nacl_loader_manifest.h"
345#if defined(OS_WIN) && defined(ARCH_CPU_X86)
346#include "components/nacl/broker/nacl_broker_manifest.h"
347#endif
348#endif
349
[email protected]b48c9182011-10-26 18:03:30350#if defined(OS_WIN)
wfhc91e9672016-01-27 00:14:20351#include "base/strings/string_tokenizer.h"
[email protected]199fc7a2011-09-28 22:45:38352#include "chrome/browser/chrome_browser_main_win.h"
Jerry Lina0de7ce2018-06-22 15:18:36353#include "chrome/install_static/install_util.h"
[email protected]34f48682013-03-20 00:30:18354#include "sandbox/win/src/sandbox_policy.h"
[email protected]199fc7a2011-09-28 22:45:38355#elif defined(OS_MACOSX)
Avi Drissmana2969a552019-10-30 15:32:25356#include "chrome/browser/apps/intent_helper/mac_apps_navigation_throttle.h"
[email protected]199fc7a2011-09-28 22:45:38357#include "chrome/browser/chrome_browser_main_mac.h"
Guido Urdaneta1a2917432018-05-10 18:32:32358#include "services/audio/public/mojom/constants.mojom.h"
[email protected]b48c9182011-10-26 18:03:30359#elif defined(OS_CHROMEOS)
Xiyuan Xiafc9f38132019-08-02 00:51:42360#include "ash/public/cpp/tablet_mode.h"
Miyoung Shin7e1b1b12019-08-02 12:23:50361#include "ash/public/mojom/constants.mojom.h"
Joshua Peraza30d8fc72019-08-19 17:24:30362#include "chrome/app/chrome_crash_reporter_client.h"
hashimotoa53e7e82016-10-26 06:30:47363#include "chrome/browser/chromeos/arc/fileapi/arc_content_file_system_backend_delegate.h"
nyaf5df1e32016-12-14 04:36:17364#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.h"
[email protected]b48c9182011-10-26 18:03:30365#include "chrome/browser/chromeos/chrome_browser_main_chromeos.h"
Ahmed Fakhryd70bf37b2018-04-04 17:07:24366#include "chrome/browser/chromeos/chrome_content_browser_client_chromeos_part.h"
Sam McNallyd8b7d822018-08-21 03:18:18367#include "chrome/browser/chromeos/drive/fileapi/drivefs_file_system_backend_delegate.h"
[email protected]5bc61cad2014-07-08 05:05:08368#include "chrome/browser/chromeos/file_manager/app_id.h"
[email protected]43420a12014-04-21 03:20:48369#include "chrome/browser/chromeos/file_system_provider/fileapi/backend_delegate.h"
Robbie McElrath6a45ea62018-12-05 06:53:41370#include "chrome/browser/chromeos/fileapi/external_file_url_loader_factory.h"
[email protected]f19bbf62013-07-09 01:22:32371#include "chrome/browser/chromeos/fileapi/file_system_backend.h"
[email protected]bee0df312014-04-28 06:59:58372#include "chrome/browser/chromeos/fileapi/mtp_file_system_backend_delegate.h"
clamy49678312015-10-22 21:59:00373#include "chrome/browser/chromeos/login/signin/merge_session_navigation_throttle.h"
374#include "chrome/browser/chromeos/login/signin/merge_session_throttling_utils.h"
Pavol Marko230ea2c92017-12-03 22:35:44375#include "chrome/browser/chromeos/login/signin_partition_manager.h"
[email protected]5c915252013-05-07 13:15:39376#include "chrome/browser/chromeos/login/startup_utils.h"
edwardjung7db1c9e2015-03-25 15:44:31377#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
John Abd-El-Malek21bca7c2018-10-26 22:13:33378#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
Pavol Marko230ea2c92017-12-03 22:35:44379#include "chrome/browser/chromeos/profiles/profile_helper.h"
[email protected]c94ac692013-07-27 00:50:10380#include "chrome/browser/chromeos/system/input_device_settings.h"
Katie Db2d07092018-12-04 18:59:36381#include "chrome/browser/speech/tts_chromeos.h"
Steven Bennetts81d07be2018-01-08 20:45:27382#include "chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h"
djacobo21e56e02016-07-02 01:14:31383#include "chrome/browser/ui/browser_dialogs.h"
Steven Bennetts38e9bde22019-01-03 17:31:10384#include "chromeos/constants/chromeos_constants.h"
Kyle Horimoto1d6a679f2019-04-16 23:24:21385#include "chromeos/constants/chromeos_features.h"
Steven Bennetts38e9bde22019-01-03 17:31:10386#include "chromeos/constants/chromeos_switches.h"
Ian Barkley-Yeung550aae052019-07-11 00:11:11387#include "components/crash/content/app/breakpad_linux.h"
John Abd-El-Malek35bfaa52019-08-20 16:22:07388#include "components/user_manager/user.h"
[email protected]4d390782014-08-15 09:22:58389#include "components/user_manager/user_manager.h"
Ken Rockot543f5e32018-02-04 02:13:50390#include "services/service_manager/public/mojom/interface_provider_spec.mojom.h"
[email protected]81ce2c42012-03-24 01:43:26391#elif defined(OS_LINUX)
[email protected]b48c9182011-10-26 18:03:30392#include "chrome/browser/chrome_browser_main_linux.h"
[email protected]81054f812012-08-30 00:47:09393#elif defined(OS_ANDROID)
Bo Liu4ade6b1b22017-11-28 02:26:35394#include "base/android/application_status_listener.h"
Samuel Huange63048d2019-09-03 20:35:45395#include "chrome/android/features/dev_ui/buildflags.h"
Tibor Goldschwendtbf1b96e2019-10-07 22:03:47396#include "chrome/android/modules/extra_icu/provider/module_provider.h"
zqzhang93e959d12017-03-16 13:10:20397#include "chrome/browser/android/app_hooks.h"
Scott Violetef765b92017-06-09 21:26:36398#include "chrome/browser/android/chrome_context_util.h"
399#include "chrome/browser/android/devtools_manager_delegate_android.h"
400#include "chrome/browser/android/ntp/new_tab_page_url_handler.h"
401#include "chrome/browser/android/service_tab_launcher.h"
402#include "chrome/browser/android/tab_android.h"
Jinsuk Kima3d393ce2019-05-27 00:57:42403#include "chrome/browser/android/tab_web_contents_delegate_android.h"
[email protected]81054f812012-08-30 00:47:09404#include "chrome/browser/chrome_browser_main_android.h"
Min Qin869874062019-10-15 19:27:56405#include "chrome/browser/download/android/available_offline_content_provider.h"
406#include "chrome/browser/download/android/intercept_oma_download_navigation_throttle.h"
Dan Harrington954c8822019-01-09 18:40:48407#include "chrome/browser/offline_pages/android/offline_page_auto_fetcher.h"
Jinsuk Kim6f9253c2019-03-11 02:45:07408#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
James Cook01e3e5ef2019-04-09 14:44:38409#include "chrome/common/chrome_descriptors.h"
Joshua Peraza934e5592018-07-18 23:43:11410#include "components/crash/content/browser/child_exit_observer_android.h"
Yuzu Saijo2d12ef92018-08-21 04:52:07411#include "components/crash/content/browser/crash_memory_metrics_collector_android.h"
clamy40c9e142015-09-29 11:18:47412#include "components/navigation_interception/intercept_navigation_delegate.h"
Scott Violetef765b92017-06-09 21:26:36413#include "content/public/browser/android/java_interfaces.h"
mfomitchev220b8562017-07-13 23:08:54414#include "services/service_manager/public/cpp/interface_provider.h"
agrieve05398f52015-06-24 18:59:00415#include "ui/base/resource/resource_bundle_android.h"
Scott Violetef765b92017-06-09 21:26:36416#include "ui/base/ui_base_paths.h"
Samuel Huange63048d2019-09-03 20:35:45417#if BUILDFLAG(DFMIFY_DEV_UI)
Samuel Huang3a1ce1c32019-10-16 17:34:04418#include "chrome/browser/dev_ui/android/dev_ui_loader_throttle.h"
Samuel Huange63048d2019-09-03 20:35:45419#endif // BUILDFLAG(DFMIFY_DEV_UI)
[email protected]b48c9182011-10-26 18:03:30420#elif defined(OS_POSIX)
421#include "chrome/browser/chrome_browser_main_posix.h"
422#endif
423
tmartinofb341882017-02-10 19:36:53424#if !defined(OS_ANDROID)
Jay Harris1ddcffa2019-07-09 03:07:40425#include "chrome/browser/badging/badge_manager.h"
Scott Violetef765b92017-06-09 21:26:36426#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
Dmitry Gozman57b92ce2017-12-28 22:24:54427#include "chrome/browser/devtools/devtools_window.h"
Becca Hughes7d2bbb82018-08-07 22:56:59428#include "chrome/browser/media/unified_autoplay_config.h"
Marc Treib7895941d2017-11-28 12:37:02429#include "chrome/browser/search/instant_service.h"
430#include "chrome/browser/search/instant_service_factory.h"
Reilly Grant2814fb72019-03-19 17:04:46431#include "chrome/browser/serial/chrome_serial_delegate.h"
Collin Baker8a217552019-05-29 19:47:51432#include "chrome/browser/ui/browser.h"
433#include "chrome/browser/ui/browser_finder.h"
434#include "chrome/browser/ui/browser_list.h"
435#include "chrome/browser/ui/browser_window.h"
jdoerrie4f9376f2018-12-12 18:26:20436#include "chrome/browser/ui/passwords/google_password_manager_navigation_throttle.h"
Conley Owensaafcf122018-02-26 18:53:51437#include "chrome/browser/ui/search/new_tab_page_navigation_throttle.h"
Nina Satragno8c832df2019-07-29 15:59:39438#include "chrome/browser/webauthn/authenticator_request_scheduler.h"
439#include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h"
Jay Civelli4d53be9b2017-08-31 22:01:43440#include "chrome/common/importer/profile_import.mojom.h"
Austin Orione250d012019-05-29 02:56:27441#include "chrome/grit/chrome_unscaled_resources.h"
Maggie Caia2f03f52019-04-02 02:13:28442#endif // !defined(OS_ANDROID)
mathpf709499d2017-01-09 20:48:36443
Nicolas Ouellet-Payeurbdcab0092018-10-22 14:50:33444#if defined(OS_WIN) || defined(OS_MACOSX) || \
445 (defined(OS_LINUX) && !defined(OS_CHROMEOS))
Nicolas Ouellet-Payeur4b840a92018-09-18 14:46:52446#include "chrome/browser/browser_switcher/browser_switcher_navigation_throttle.h"
Guido Urdanetad06ae842019-10-10 20:04:12447#include "services/service_manager/sandbox/features.h"
Nicolas Ouellet-Payeur4b840a92018-09-18 14:46:52448#endif
449
Joshua Perazace68e2f2019-09-23 18:44:24450#if defined(OS_LINUX)
451#include "components/crash/content/app/crash_switches.h"
452#include "components/crash/content/app/crashpad.h"
453#endif
454
[email protected]a220b5932013-09-21 03:47:44455#if defined(OS_POSIX) && !defined(OS_MACOSX)
Joshua Perazaf890e4b2019-01-03 19:19:02456#if !defined(OS_ANDROID)
[email protected]779dd282013-10-19 15:57:02457#include "base/debug/leak_annotations.h"
sdefresne8ba0b88c2015-09-18 10:33:13458#include "components/crash/content/app/breakpad_linux.h"
Joshua Perazaf890e4b2019-01-03 19:19:02459#endif // !defined(OS_ANDROID)
sdefresne8ba0b88c2015-09-18 10:33:13460#include "components/crash/content/browser/crash_handler_host_linux.h"
[email protected]1fd5302c2011-05-28 04:06:43461#endif
[email protected]b80f68432011-05-02 17:22:30462
Maggie Caia2f03f52019-04-02 02:13:28463// TODO(crbug.com/939205): Once the upcoming App Service is available, use a
464// single navigation throttle to display the intent picker on all platforms.
465#if !defined(OS_ANDROID)
466#if defined(OS_CHROMEOS)
467#include "chrome/browser/chromeos/apps/intent_helper/chromeos_apps_navigation_throttle.h"
Maggie Cai00e2a21e2019-10-16 00:47:51468#include "chrome/browser/chromeos/apps/intent_helper/common_apps_navigation_throttle.h"
Maggie Caia2f03f52019-04-02 02:13:28469#else
470#include "chrome/browser/apps/intent_helper/apps_navigation_throttle.h"
471#endif
472#endif
473
[email protected]e8b6ca02013-07-10 18:00:51474#if defined(TOOLKIT_VIEWS)
475#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h"
476#endif
477
estaded3aa0e82016-02-17 22:55:21478#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
Maksim Sisov1f2f2e62019-05-08 07:56:22479#if defined(USE_X11)
480#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h"
481#else
estaded3aa0e82016-02-17 22:55:21482#include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h"
Maksim Sisov1f2f2e62019-05-08 07:56:22483#endif // USE_X11
[email protected]e8b6ca02013-07-10 18:00:51484#endif
485
Mohsen Izadif1958f22019-01-18 20:29:31486#if defined(USE_OZONE)
487#include "ui/ozone/public/ozone_platform.h"
488#endif
489
[email protected]e8b6ca02013-07-10 18:00:51490#if defined(USE_X11)
491#include "chrome/browser/chrome_browser_main_extra_parts_x11.h"
492#endif
493
brettwab78fef2016-10-12 02:56:05494#if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION)
[email protected]7a2a6d802014-06-06 13:39:19495#include "chrome/browser/captive_portal/captive_portal_tab_helper.h"
496#endif
497
Nico Weberaf3b00b2017-09-11 17:58:17498#if BUILDFLAG(ENABLE_NACL)
[email protected]a56f8322014-07-16 21:13:55499#include "components/nacl/browser/nacl_browser.h"
500#include "components/nacl/browser/nacl_host_message_filter.h"
501#include "components/nacl/browser/nacl_process_host.h"
502#include "components/nacl/common/nacl_process_type.h"
503#include "components/nacl/common/nacl_switches.h"
504#endif
505
brettw00899e62016-11-12 02:10:17506#if BUILDFLAG(ENABLE_EXTENSIONS)
je_julie.kim7fbb5a1a2015-02-09 17:26:05507#include "chrome/browser/accessibility/animation_policy_prefs.h"
Dominick Ng6ff51052018-07-06 05:30:20508#include "chrome/browser/apps/platform_apps/platform_app_navigation_redirector.h"
[email protected]d5a74be2014-08-08 01:01:27509#include "chrome/browser/extensions/chrome_content_browser_client_extensions_part.h"
Chris Mumfordbae8a742018-03-01 23:02:23510#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
Pavol Marko41c37b12019-08-07 10:56:32511#include "chrome/browser/extensions/extension_util.h"
Clark DuVall2cf99249e2018-09-19 19:11:51512#include "chrome/browser/extensions/user_script_listener.h"
513#include "chrome/browser/media/cast_transport_host_filter.h"
thestig2dbee717e2014-09-05 14:54:28514#include "chrome/browser/speech/extension_api/tts_engine_extension_api.h"
Evan Stade1e71d6dd2019-10-29 03:04:49515#include "chrome/browser/ui/browser_commands.h"
Eric Willigers007ef302019-08-29 09:58:46516#include "chrome/browser/ui/web_applications/app_browser_controller.h"
fsamuel8dfa19a2015-05-05 01:00:39517#include "components/guest_view/browser/guest_view_base.h"
518#include "components/guest_view/browser/guest_view_manager.h"
Ken Rockota0dfaca12018-02-15 07:26:25519#include "extensions/browser/api/web_request/web_request_api.h"
Jay Civelli2578ebe2018-06-05 18:44:31520#include "extensions/browser/extension_host.h"
naskob9164c42016-06-07 01:21:35521#include "extensions/browser/extension_navigation_throttle.h"
Ken Rockot6414c4d92017-11-08 19:58:32522#include "extensions/browser/extension_protocols.h"
reillyga3acbc12014-11-11 23:17:12523#include "extensions/browser/extension_registry.h"
Chris Mumford8f812662018-02-22 00:27:57524#include "extensions/browser/extension_system.h"
hanxi0d0a1e92014-08-26 18:39:48525#include "extensions/browser/guest_view/web_view/web_view_guest.h"
526#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
527#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
Jay Civelli2578ebe2018-06-05 18:44:31528#include "extensions/browser/process_manager.h"
Dan Beam836c02a2019-06-15 01:58:27529#include "extensions/common/constants.h"
thestig2dbee717e2014-09-05 14:54:28530#include "extensions/common/extension.h"
531#include "extensions/common/extension_set.h"
[email protected]f7daaa32014-08-02 07:58:13532#include "extensions/common/manifest_handlers/background_info.h"
thestig2dbee717e2014-09-05 14:54:28533#include "extensions/common/manifest_handlers/shared_module_info.h"
Clark DuVallbf7722f2018-08-03 18:03:33534#include "extensions/common/manifest_handlers/web_accessible_resources_info.h"
thestig2dbee717e2014-09-05 14:54:28535#include "extensions/common/permissions/permissions_data.h"
536#include "extensions/common/permissions/socket_permission.h"
537#include "extensions/common/switches.h"
thakis678822e2017-04-20 17:20:34538#endif // BUILDFLAG(ENABLE_EXTENSIONS)
merkindb10455e2017-02-28 13:16:25539
brettw4b461082016-11-19 18:55:16540#if BUILDFLAG(ENABLE_PLUGINS)
jitendra.ks42e889a2014-12-05 09:05:55541#include "chrome/browser/plugins/chrome_content_browser_client_plugins_part.h"
trizzofo8ddaeb72016-09-01 23:18:27542#include "chrome/browser/plugins/flash_download_interception.h"
John Abd-El-Malekecc6f5f2018-03-02 18:47:39543#include "chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h"
jitendra.ks42e889a2014-12-05 09:05:55544#endif
545
bauerb8f9c37742017-03-30 15:04:12546#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
547#include "chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.h"
548#endif
549
thakis678822e2017-04-20 17:20:34550#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
miu54dca6c2016-11-17 10:59:38551#include "chrome/browser/media/cast_remoting_connector.h"
haibinlu9e605a92015-06-06 03:45:09552#endif
553
weilifabbf7572017-05-22 19:05:16554#if BUILDFLAG(ENABLE_PRINTING)
Lei Zhanga2fa14c2018-05-15 00:05:21555#include "chrome/browser/printing/printing_message_filter.h"
weilifabbf7572017-05-22 19:05:16556#endif
Lei Zhanga2fa14c2018-05-15 00:05:21557
Xiaohan Wanga4e41842018-06-26 18:45:10558#if BUILDFLAG(ENABLE_LIBRARY_CDMS)
xhwangc86d76e42016-03-14 23:38:49559#include "chrome/browser/media/output_protection_impl.h"
Xiaohan Wangf170c732018-09-27 05:45:26560#if defined(OS_WIN) && BUILDFLAG(ENABLE_WIDEVINE)
Xiaohan Wanga4e41842018-06-26 18:45:10561#include "chrome/browser/media/widevine_hardware_caps_win.h"
562#include "third_party/widevine/cdm/widevine_cdm_common.h"
563#endif
564#endif
565
xhwangdb24d602017-05-20 06:32:24566#if BUILDFLAG(ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS)
Aran Gilmanf010bdd2019-08-28 19:55:44567#include "media/mojo/mojom/constants.mojom.h" // nogncheck
xhwangb1d65fd2016-10-19 20:55:52568#include "media/mojo/services/media_service_factory.h" // nogncheck
alokp6ecb2382016-01-27 00:40:00569#endif
570
mmenkedb2637ff2017-03-30 23:59:42571#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
572#include "chrome/browser/supervised_user/supervised_user_navigation_throttle.h"
573#endif
574
Nico Weberbc5b06f2019-07-26 14:00:13575#if BUILDFLAG(FULL_SAFE_BROWSING)
Daniel Ruberya1611e32019-04-24 21:38:35576#include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
577#endif
578
Jian Lide7b43792018-06-01 23:22:13579#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
Ryan Sturmaa05092f2018-10-21 03:56:54580#include "chrome/browser/offline_pages/offline_page_tab_helper.h"
Jian Lide7b43792018-06-01 23:22:13581#include "chrome/browser/offline_pages/offline_page_url_loader_request_interceptor.h"
582#endif
583
Will Cassella40837ba2019-07-01 21:32:00584#if BUILDFLAG(ENABLE_VR) && !defined(OS_ANDROID)
Bill Orreb429222018-08-08 21:14:43585#include "device/vr/public/mojom/isolated_xr_service.mojom.h"
586#endif
587
[email protected]c7abd422012-09-25 00:20:08588using base::FileDescriptor;
[email protected]631bb742011-11-02 11:29:39589using content::BrowserThread;
[email protected]825b1662012-03-12 19:07:31590using content::BrowserURLHandler;
msrameka3c7cfd2017-02-03 13:34:13591using content::BrowsingDataFilterBuilder;
[email protected]b9535422012-02-09 01:47:59592using content::ChildProcessSecurityPolicy;
[email protected]9f9749a2012-03-02 19:37:00593using content::QuotaPermissionContext;
[email protected]2626d142014-04-22 17:24:02594using content::RenderFrameHost;
[email protected]eaabba22012-03-07 15:02:11595using content::RenderViewHost;
[email protected]7491ad02014-07-05 19:10:07596using content::ResourceType;
[email protected]b6583592012-01-25 19:52:33597using content::SiteInstance;
[email protected]83ff91c2012-01-05 20:54:13598using content::WebContents;
[email protected]b3a97b52014-07-09 06:25:05599using content::WebPreferences;
[email protected]593d2a72013-07-26 08:48:38600using message_center::NotifierId;
[email protected]631bb742011-11-02 11:29:39601
[email protected]0daaebfe2014-03-15 00:09:05602#if defined(OS_POSIX)
brettw3c98c7d32017-07-25 01:44:20603using content::PosixFileDescriptorInfo;
[email protected]0daaebfe2014-03-15 00:09:05604#endif
605
brettw00899e62016-11-12 02:10:17606#if BUILDFLAG(ENABLE_EXTENSIONS)
thestig2dbee717e2014-09-05 14:54:28607using extensions::APIPermission;
[email protected]d5a74be2014-08-08 01:01:27608using extensions::ChromeContentBrowserClientExtensionsPart;
thestig2dbee717e2014-09-05 14:54:28609using extensions::Extension;
thestig2dbee717e2014-09-05 14:54:28610using extensions::Manifest;
[email protected]d5a74be2014-08-08 01:01:27611#endif
612
brettw4b461082016-11-19 18:55:16613#if BUILDFLAG(ENABLE_PLUGINS)
jitendra.ks42e889a2014-12-05 09:05:55614using plugins::ChromeContentBrowserClientPluginsPart;
615#endif
616
[email protected]c5dbef02011-05-13 05:06:09617namespace {
618
michaeln10e5fc352017-02-07 02:07:58619const storage::QuotaSettings* g_default_quota_settings;
620
brettw4b461082016-11-19 18:55:16621#if BUILDFLAG(ENABLE_PLUGINS)
[email protected]aec5ed52014-06-20 07:51:42622// TODO(teravest): Add renderer-side API-specific checking for these APIs so
623// that blanket permission isn't granted to all dev channel APIs for these.
624// http://crbug.com/386743
625const char* const kPredefinedAllowedDevChannelOrigins[] = {
Aran Gilmanf010bdd2019-08-28 19:55:44626 "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see crbug.com/383937
627 "4EB74897CB187C7633357C2FE832E0AD6A44883A" // see crbug.com/383937
[email protected]aec5ed52014-06-20 07:51:42628};
629
[email protected]9de4da52014-05-24 12:26:50630const char* const kPredefinedAllowedFileHandleOrigins[] = {
Aran Gilmanf010bdd2019-08-28 19:55:44631 "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see crbug.com/234789
632 "4EB74897CB187C7633357C2FE832E0AD6A44883A" // see crbug.com/234789
[email protected]10c39222013-11-13 20:09:25633};
634
[email protected]9de4da52014-05-24 12:26:50635const char* const kPredefinedAllowedSocketOrigins[] = {
Aran Gilmanf010bdd2019-08-28 19:55:44636 "okddffdblfhhnmhodogpojmfkjmhinfp", // Secure Shell App (dev)
637 "pnhechapfaindjhompbnflcldabbghjo", // Secure Shell App (stable)
638 "algkcnfjnajfhgimadimbjhmpaeohhln", // Secure Shell Extension (dev)
639 "iodihamcpbpeioajjeobimgagajmlibd", // Secure Shell Extension (stable)
640 "bglhmjfplikpjnfoegeomebmfnkjomhe", // see crbug.com/122126
641 "gbchcmhmhahfdphkhkmpfmihenigjmpp", // Chrome Remote Desktop
642 "kgngmbheleoaphbjbaiobfdepmghbfah", // Pre-release Chrome Remote Desktop
643 "odkaodonbgfohohmklejpjiejmcipmib", // Dogfood Chrome Remote Desktop
644 "ojoimpklfciegopdfgeenehpalipignm", // Chromoting canary
645 "cbkkbcmdlboombapidmoeolnmdacpkch", // see crbug.com/129089
646 "hhnbmknkdabfoieppbbljkhkfjcmcbjh", // see crbug.com/134099
647 "mablfbjkhmhkmefkjjacnbaikjkipphg", // see crbug.com/134099
648 "pdeelgamlgannhelgoegilelnnojegoh", // see crbug.com/134099
649 "cabapfdbkniadpollkckdnedaanlciaj", // see crbug.com/134099
650 "mapljbgnjledlpdmlchihnmeclmefbba", // see crbug.com/134099
651 "ghbfeebgmiidnnmeobbbaiamklmpbpii", // see crbug.com/134099
652 "jdfhpkjeckflbbleddjlpimecpbjdeep", // see crbug.com/142514
653 "iabmpiboiopbgfabjmgeedhcmjenhbla", // see crbug.com/165080
654 "B7CF8A292249681AF81771650BA4CEEAF19A4560", // see crbug.com/165080
655 "7525AF4F66763A70A883C4700529F647B470E4D2", // see crbug.com/238084
656 "0B549507088E1564D672F7942EB87CA4DAD73972", // see crbug.com/238084
657 "864288364E239573E777D3E0E36864E590E95C74" // see crbug.com/238084
[email protected]e461da2f2012-02-16 19:06:40658};
[email protected]93f72062013-05-29 20:29:40659#endif
[email protected]e461da2f2012-02-16 19:06:40660
Will Harris1b9b4152019-08-21 22:33:50661#if defined(OS_WIN) && !defined(COMPONENT_BUILD) && !defined(ADDRESS_SANITIZER)
Will Harrisc196ed942019-08-03 03:45:30662// Enables pre-launch Code Integrity Guard (CIG) for Chrome renderers, when
663// running on Windows 10 1511 and above. See
664// https://blogs.windows.com/blog/tag/code-integrity-guard/.
665const base::Feature kRendererCodeIntegrity{"RendererCodeIntegrity",
Will Harrisa9eaa282019-11-01 17:51:35666 base::FEATURE_ENABLED_BY_DEFAULT};
Will Harris1b9b4152019-08-21 22:33:50667#endif // defined(OS_WIN) && !defined(COMPONENT_BUILD) &&
668 // !defined(ADDRESS_SANITIZER)
Will Harrisc196ed942019-08-03 03:45:30669
lazyboy5d5fede02016-03-10 04:10:14670enum AppLoadedInTabSource {
nickb6ae0bd32017-04-18 20:53:53671 // A platform app page tried to load one of its own URLs in a tab.
lazyboy5d5fede02016-03-10 04:10:14672 APP_LOADED_IN_TAB_SOURCE_APP = 0,
nickb6ae0bd32017-04-18 20:53:53673
674 // A platform app background page tried to load one of its own URLs in a tab.
lazyboy5d5fede02016-03-10 04:10:14675 APP_LOADED_IN_TAB_SOURCE_BACKGROUND_PAGE,
nickb6ae0bd32017-04-18 20:53:53676
677 // An extension or app tried to load a resource of a different platform app in
678 // a tab.
679 APP_LOADED_IN_TAB_SOURCE_OTHER_EXTENSION,
680
681 // A non-app and non-extension page tried to load a platform app in a tab.
682 APP_LOADED_IN_TAB_SOURCE_OTHER,
683
lazyboy5d5fede02016-03-10 04:10:14684 APP_LOADED_IN_TAB_SOURCE_MAX
685};
686
Lei Zhang2cfceac2018-11-14 19:36:33687// Cached version of the locale so we can return the locale on the I/O
688// thread.
689std::string& GetIOThreadApplicationLocale() {
690 static base::NoDestructor<std::string> s;
691 return *s;
692}
693
[email protected]f8f93eb2012-09-25 03:06:24694// Returns a copy of the given url with its host set to given host and path set
695// to given path. Other parts of the url will be the same.
696GURL ReplaceURLHostAndPath(const GURL& url,
697 const std::string& host,
698 const std::string& path) {
[email protected]b45334502014-04-30 19:44:05699 url::Replacements<char> replacements;
700 replacements.SetHost(host.c_str(), url::Component(0, host.length()));
701 replacements.SetPath(path.c_str(), url::Component(0, path.length()));
[email protected]f8f93eb2012-09-25 03:06:24702 return url.ReplaceComponents(replacements);
703}
704
madfbd10852017-01-20 03:15:33705// Handles the rewriting of the new tab page URL based on group policy.
706bool HandleNewTabPageLocationOverride(
707 GURL* url,
708 content::BrowserContext* browser_context) {
709 if (!url->SchemeIs(content::kChromeUIScheme) ||
710 url->host() != chrome::kChromeUINewTabHost)
711 return false;
712
713 Profile* profile = Profile::FromBrowserContext(browser_context);
714 std::string ntp_location =
715 profile->GetPrefs()->GetString(prefs::kNewTabPageLocationOverride);
716 if (ntp_location.empty())
717 return false;
718
719 *url = GURL(ntp_location);
720 return true;
721}
722
Becca Hughesfe8c32c2018-03-21 13:36:56723#if !defined(OS_ANDROID)
724// Check if the current url is whitelisted based on a list of whitelisted urls.
725bool IsURLWhitelisted(const GURL& current_url,
Jan Wilken Dörrie53e009b2019-09-09 14:17:41726 base::span<const base::Value> whitelisted_urls) {
Becca Hughesfe8c32c2018-03-21 13:36:56727 // Only check on HTTP and HTTPS pages.
728 if (!current_url.SchemeIsHTTPOrHTTPS())
729 return false;
730
731 for (auto const& value : whitelisted_urls) {
732 ContentSettingsPattern pattern =
733 ContentSettingsPattern::FromString(value.GetString());
734 if (pattern == ContentSettingsPattern::Wildcard() || !pattern.IsValid())
735 continue;
736 if (pattern.Matches(current_url))
737 return true;
738 }
739
740 return false;
741}
742
743// Check if autoplay is allowed by policy configuration.
744bool IsAutoplayAllowedByPolicy(content::WebContents* contents,
745 PrefService* prefs) {
746 DCHECK(prefs);
747
748 // Check if we have globally allowed autoplay by policy.
749 if (prefs->GetBoolean(prefs::kAutoplayAllowed) &&
750 prefs->IsManagedPreference(prefs::kAutoplayAllowed)) {
751 return true;
752 }
753
754 if (!contents)
755 return false;
756
757 // Check if the current URL matches a URL pattern on the whitelist.
758 const base::ListValue* autoplay_whitelist =
759 prefs->GetList(prefs::kAutoplayWhitelist);
760 return autoplay_whitelist &&
761 prefs->IsManagedPreference(prefs::kAutoplayWhitelist) &&
762 IsURLWhitelisted(contents->GetURL(), autoplay_whitelist->GetList());
763}
764#endif
765
Joshua Perazaf890e4b2019-01-03 19:19:02766#if defined(OS_ANDROID)
767int GetCrashSignalFD(const base::CommandLine& command_line) {
768 return crashpad::CrashHandlerHost::Get()->GetDeathSignalSocket();
769}
770#elif defined(OS_POSIX) && !defined(OS_MACOSX)
[email protected]0b818f72013-10-22 00:11:03771breakpad::CrashHandlerHostLinux* CreateCrashHandlerHost(
772 const std::string& process_type) {
[email protected]779dd282013-10-19 15:57:02773 base::FilePath dumps_path;
Avi Drissman9098f9002018-05-04 00:11:52774 base::PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path);
[email protected]779dd282013-10-19 15:57:02775 {
776 ANNOTATE_SCOPED_MEMORY_LEAK;
Lei Zhang74f3dd3f2019-04-10 00:16:31777 bool upload = !getenv(env_vars::kHeadless);
[email protected]0b818f72013-10-22 00:11:03778 breakpad::CrashHandlerHostLinux* crash_handler =
[email protected]9de4da52014-05-24 12:26:50779 new breakpad::CrashHandlerHostLinux(process_type, dumps_path, upload);
[email protected]779dd282013-10-19 15:57:02780 crash_handler->StartUploaderThread();
781 return crash_handler;
782 }
783}
784
avi3ef9ec9e2014-12-22 22:50:17785int GetCrashSignalFD(const base::CommandLine& command_line) {
Joshua Perazace68e2f2019-09-23 18:44:24786 if (crash_reporter::IsCrashpadEnabled()) {
787 int fd;
788 pid_t pid;
789 return crash_reporter::GetHandlerSocket(&fd, &pid) ? fd : -1;
790 }
791
[email protected]9de4da52014-05-24 12:26:50792 // Extensions have the same process type as renderers.
[email protected]cd0f7af2014-01-16 23:50:39793 if (command_line.HasSwitch(extensions::switches::kExtensionProcess)) {
Lei Zhang74f3dd3f2019-04-10 00:16:31794 static breakpad::CrashHandlerHostLinux* crash_handler = nullptr;
[email protected]779dd282013-10-19 15:57:02795 if (!crash_handler)
796 crash_handler = CreateCrashHandlerHost("extension");
[email protected]a1733df2012-06-22 11:24:18797 return crash_handler->GetDeathSignalSocket();
798 }
799
800 std::string process_type =
801 command_line.GetSwitchValueASCII(switches::kProcessType);
802
[email protected]779dd282013-10-19 15:57:02803 if (process_type == switches::kRendererProcess) {
Lei Zhang74f3dd3f2019-04-10 00:16:31804 static breakpad::CrashHandlerHostLinux* crash_handler = nullptr;
[email protected]779dd282013-10-19 15:57:02805 if (!crash_handler)
806 crash_handler = CreateCrashHandlerHost(process_type);
807 return crash_handler->GetDeathSignalSocket();
808 }
[email protected]a1733df2012-06-22 11:24:18809
[email protected]779dd282013-10-19 15:57:02810 if (process_type == switches::kPpapiPluginProcess) {
Lei Zhang74f3dd3f2019-04-10 00:16:31811 static breakpad::CrashHandlerHostLinux* crash_handler = nullptr;
[email protected]779dd282013-10-19 15:57:02812 if (!crash_handler)
813 crash_handler = CreateCrashHandlerHost(process_type);
814 return crash_handler->GetDeathSignalSocket();
815 }
[email protected]a1733df2012-06-22 11:24:18816
[email protected]779dd282013-10-19 15:57:02817 if (process_type == switches::kGpuProcess) {
Lei Zhang74f3dd3f2019-04-10 00:16:31818 static breakpad::CrashHandlerHostLinux* crash_handler = nullptr;
[email protected]779dd282013-10-19 15:57:02819 if (!crash_handler)
820 crash_handler = CreateCrashHandlerHost(process_type);
821 return crash_handler->GetDeathSignalSocket();
822 }
[email protected]a1733df2012-06-22 11:24:18823
James Cook9207cc12017-10-19 17:08:39824 if (process_type == switches::kUtilityProcess) {
825 static breakpad::CrashHandlerHostLinux* crash_handler = nullptr;
826 if (!crash_handler)
827 crash_handler = CreateCrashHandlerHost(process_type);
828 return crash_handler->GetDeathSignalSocket();
829 }
830
[email protected]a1733df2012-06-22 11:24:18831 return -1;
832}
Joshua Perazaf890e4b2019-01-03 19:19:02833#endif // defined(OS_ANDROID)
[email protected]a1733df2012-06-22 11:24:18834
[email protected]eabbfb12013-04-05 23:28:35835void SetApplicationLocaleOnIOThread(const std::string& locale) {
thestig00844cea2015-09-08 21:44:52836 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Lei Zhang2cfceac2018-11-14 19:36:33837 GetIOThreadApplicationLocale() = locale;
[email protected]eabbfb12013-04-05 23:28:35838}
839
estark3ba11132015-04-10 01:38:33840// An implementation of the SSLCertReporter interface used by
meacerf43117a2016-12-27 21:02:31841// SSLErrorHandler. Uses CertificateReportingService to send reports. The
842// service handles queueing and re-sending of failed reports. Each certificate
843// error creates a new instance of this class.
844class CertificateReportingServiceCertReporter : public SSLCertReporter {
estark3ba11132015-04-10 01:38:33845 public:
meacerf43117a2016-12-27 21:02:31846 explicit CertificateReportingServiceCertReporter(
Lucas Garron94b16052017-11-11 01:58:12847 content::WebContents* web_contents)
848 : service_(CertificateReportingServiceFactory::GetForBrowserContext(
849 web_contents->GetBrowserContext())) {}
meacerf43117a2016-12-27 21:02:31850 ~CertificateReportingServiceCertReporter() override {}
estark3ba11132015-04-10 01:38:33851
852 // SSLCertReporter implementation
estark4282f1172015-05-13 22:01:55853 void ReportInvalidCertificateChain(
854 const std::string& serialized_report) override {
meacerf43117a2016-12-27 21:02:31855 service_->Send(serialized_report);
estark3ba11132015-04-10 01:38:33856 }
857
858 private:
meacerf43117a2016-12-27 21:02:31859 CertificateReportingService* service_;
860
861 DISALLOW_COPY_AND_ASSIGN(CertificateReportingServiceCertReporter);
estark3ba11132015-04-10 01:38:33862};
863
bshe4f53ce42015-11-30 16:56:31864#if defined(OS_ANDROID)
[email protected]ded00dc2013-11-01 00:37:05865float GetDeviceScaleAdjustment() {
[email protected]b255a8e0e82013-10-22 04:03:59866 static const float kMinFSM = 1.05f;
867 static const int kWidthForMinFSM = 320;
868 static const float kMaxFSM = 1.3f;
869 static const int kWidthForMaxFSM = 800;
870
boliu21c5afa2017-01-11 19:34:23871 int minWidth = chrome::android::ChromeContextUtil::GetSmallestDIPWidth();
[email protected]b255a8e0e82013-10-22 04:03:59872
873 if (minWidth <= kWidthForMinFSM)
874 return kMinFSM;
875 if (minWidth >= kWidthForMaxFSM)
876 return kMaxFSM;
877
878 // The font scale multiplier varies linearly between kMinFSM and kMaxFSM.
879 float ratio = static_cast<float>(minWidth - kWidthForMinFSM) /
Aran Gilmanf010bdd2019-08-28 19:55:44880 (kWidthForMaxFSM - kWidthForMinFSM);
[email protected]b255a8e0e82013-10-22 04:03:59881 return ratio * (kMaxFSM - kMinFSM) + kMinFSM;
882}
zpengdb4a58e2017-01-10 17:40:32883
[email protected]916615b2013-09-11 18:19:44884#endif // defined(OS_ANDROID)
885
brettw00899e62016-11-12 02:10:17886#if BUILDFLAG(ENABLE_EXTENSIONS)
nickb6ae0bd32017-04-18 20:53:53887
888AppLoadedInTabSource ClassifyAppLoadedInTabSource(
889 const GURL& opener_url,
890 const extensions::Extension* target_platform_app) {
Lei Zhang7d0b0f42019-10-12 03:47:58891 if (!opener_url.SchemeIs(extensions::kExtensionScheme)) {
892 // The forbidden app URL was being opened by a non-extension page (e.g.
893 // http).
894 return APP_LOADED_IN_TAB_SOURCE_OTHER;
895 }
896
897 if (opener_url.host_piece() != target_platform_app->id()) {
nickb6ae0bd32017-04-18 20:53:53898 // The forbidden app URL was being opened by a different app or extension.
899 return APP_LOADED_IN_TAB_SOURCE_OTHER_EXTENSION;
900 }
Lei Zhang7d0b0f42019-10-12 03:47:58901
902 // This platform app was trying to window.open() one of its own URLs.
903 if (opener_url ==
904 extensions::BackgroundInfo::GetBackgroundURL(target_platform_app)) {
905 // Source was the background page.
906 return APP_LOADED_IN_TAB_SOURCE_BACKGROUND_PAGE;
907 }
908
909 // Source was a different page inside the app.
910 return APP_LOADED_IN_TAB_SOURCE_APP;
nickb6ae0bd32017-04-18 20:53:53911}
[email protected]9c7656382014-08-08 21:02:30912
Charles Harrison34f67862017-08-22 01:04:17913// Returns true if there is is an extension matching |url| in
914// |opener_render_process_id| with APIPermission::kBackground.
915//
916// Note that GetExtensionOrAppByURL requires a full URL in order to match with a
917// hosted app, even though normal extensions just use the host.
918bool URLHasExtensionBackgroundPermission(
csharrison95f01e922017-04-24 18:52:35919 extensions::ProcessMap* process_map,
920 extensions::ExtensionRegistry* registry,
Charles Harrison34f67862017-08-22 01:04:17921 const GURL& url,
csharrison95f01e922017-04-24 18:52:35922 int opener_render_process_id) {
923 // Note: includes web URLs that are part of an extension's web extent.
924 const Extension* extension =
Charles Harrison34f67862017-08-22 01:04:17925 registry->enabled_extensions().GetExtensionOrAppByURL(url);
csharrison95f01e922017-04-24 18:52:35926 return extension &&
927 extension->permissions_data()->HasAPIPermission(
928 APIPermission::kBackground) &&
929 process_map->Contains(extension->id(), opener_render_process_id);
930}
Kevin Marshall32f99d7e2017-07-11 23:17:46931
csharrison95f01e922017-04-24 18:52:35932#endif
933
John Abd-El-Malekd2377982018-01-08 22:23:12934chrome::mojom::PrerenderCanceler* GetPrerenderCanceller(
935 const base::Callback<content::WebContents*()>& wc_getter) {
936 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
937 auto* web_contents = wc_getter.Run();
938 if (!web_contents)
939 return nullptr;
940
941 return prerender::PrerenderContents::FromWebContents(web_contents);
942}
943
John Abd-El-Malek92bf3602019-07-31 02:25:48944void LaunchURL(const GURL& url,
945 const content::WebContents::Getter& web_contents_getter,
946 ui::PageTransition page_transition,
Emily Stark13b66bdf2019-10-04 17:11:45947 bool has_user_gesture,
948 const base::Optional<url::Origin>& initiating_origin) {
John Abd-El-Maleka67add82018-03-09 18:22:01949 // If there is no longer a WebContents, the request may have raced with tab
950 // closing. Don't fire the external request. (It may have been a prerender.)
951 content::WebContents* web_contents = web_contents_getter.Run();
952 if (!web_contents)
953 return;
954
955 // Do not launch external requests attached to unswapped prerenders.
956 prerender::PrerenderContents* prerender_contents =
957 prerender::PrerenderContents::FromWebContents(web_contents);
958 if (prerender_contents) {
959 prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME);
960 prerender::ReportPrerenderExternalURL();
961 return;
962 }
963
Robbie McElrath1294d242019-05-31 20:46:22964 // Do not launch external requests for schemes that have a handler registered.
965 ProtocolHandlerRegistry* protocol_handler_registry =
966 ProtocolHandlerRegistryFactory::GetForBrowserContext(
967 web_contents->GetBrowserContext());
968 if (protocol_handler_registry &&
969 protocol_handler_registry->IsHandledProtocol(url.scheme()))
970 return;
971
John Abd-El-Maleka67add82018-03-09 18:22:01972 bool is_whitelisted = false;
John Abd-El-Maleka67add82018-03-09 18:22:01973 PolicyBlacklistService* service =
Oleg Davydov5cfe7ab2019-02-01 12:27:19974 PolicyBlacklistFactory::GetForBrowserContext(
975 web_contents->GetBrowserContext());
John Abd-El-Maleka67add82018-03-09 18:22:01976 if (service) {
977 const policy::URLBlacklist::URLBlacklistState url_state =
978 service->GetURLBlacklistState(url);
979 is_whitelisted =
980 url_state == policy::URLBlacklist::URLBlacklistState::URL_IN_WHITELIST;
981 }
982
983 // If the URL is in whitelist, we launch it without asking the user and
984 // without any additional security checks. Since the URL is whitelisted,
985 // we assume it can be executed.
986 if (is_whitelisted) {
987 ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url, web_contents);
988 } else {
989 ExternalProtocolHandler::LaunchUrl(
990 url, web_contents->GetRenderViewHost()->GetProcess()->GetID(),
991 web_contents->GetRenderViewHost()->GetRoutingID(), page_transition,
Emily Stark13b66bdf2019-10-04 17:11:45992 has_user_gesture, initiating_origin);
John Abd-El-Maleka67add82018-03-09 18:22:01993 }
994}
995
Yutaka Hirano968d6252018-12-04 05:09:31996std::string GetProduct() {
997 return version_info::GetProductNameAndVersionForUserAgent();
998}
999
Lukasz Anforowicz60d1253d2019-05-08 16:31:371000void MaybeAppendSecureOriginsAllowlistSwitch(base::CommandLine* cmdline) {
1001 // |allowlist| combines pref/policy + cmdline switch in the browser process.
1002 // For renderer and utility (e.g. NetworkService) processes the switch is the
1003 // only available source, so below the combined (pref/policy + cmdline)
1004 // allowlist of secure origins is injected into |cmdline| for these other
1005 // processes.
1006 std::vector<std::string> allowlist =
1007 network::SecureOriginAllowlist::GetInstance().GetCurrentAllowlist();
1008 if (!allowlist.empty()) {
1009 cmdline->AppendSwitchASCII(
1010 network::switches::kUnsafelyTreatInsecureOriginAsSecure,
1011 base::JoinString(allowlist, ","));
1012 }
1013}
1014
Will Harris1b9b4152019-08-21 22:33:501015#if defined(OS_WIN) && !defined(COMPONENT_BUILD) && !defined(ADDRESS_SANITIZER)
Will Harrisc196ed942019-08-03 03:45:301016// Returns the full path to |module_name|. Both dev builds (where |module_name|
1017// is in the current executable's directory) and proper installs (where
1018// |module_name| is in a versioned sub-directory of the current executable's
1019// directory) are supported. The identified file is not guaranteed to exist.
1020base::FilePath GetModulePath(base::StringPiece16 module_name) {
1021 base::FilePath exe_dir;
1022 const bool has_path = base::PathService::Get(base::DIR_EXE, &exe_dir);
1023 DCHECK(has_path);
1024
1025 // Look for the module in a versioned sub-directory of the current
1026 // executable's directory and return the path if it can be read. This is the
1027 // expected location of modules for proper installs.
1028 const base::FilePath module_path =
1029 exe_dir.AppendASCII(chrome::kChromeVersion).Append(module_name);
1030 if (base::PathExists(module_path))
1031 return module_path;
1032
1033 // Otherwise, return the path to the module in the current executable's
1034 // directory. This is the expected location of modules for dev builds.
1035 return exe_dir.Append(module_name);
1036}
Will Harris1b9b4152019-08-21 22:33:501037#endif // defined(OS_WIN) && !defined(COMPONENT_BUILD) &&
1038 // !defined(ADDRESS_SANITIZER)
Will Harrisc196ed942019-08-03 03:45:301039
Lukasz Anforowicz7724d092019-10-03 23:50:211040void MaybeAddThrottle(
1041 std::vector<std::unique_ptr<content::NavigationThrottle>>* throttles,
1042 std::unique_ptr<content::NavigationThrottle> maybe_throttle) {
1043 if (maybe_throttle)
1044 throttles->push_back(std::move(maybe_throttle));
1045}
1046
Evan Stade1e71d6dd2019-10-29 03:04:491047// Returns whether |web_contents| is within a hosted app.
1048bool IsInHostedApp(WebContents* web_contents) {
1049#if BUILDFLAG(ENABLE_EXTENSIONS)
1050 Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
1051 return (browser &&
1052 web_app::AppBrowserController::IsForWebAppBrowser(browser));
1053#else
1054 return false;
1055#endif
1056}
1057
[email protected]9dbfff12011-07-01 19:37:071058} // namespace
[email protected]c5dbef02011-05-13 05:06:091059
Yutaka Hirano968d6252018-12-04 05:09:311060std::string GetUserAgent() {
1061 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1062 if (command_line->HasSwitch(switches::kUserAgent)) {
1063 std::string ua = command_line->GetSwitchValueASCII(switches::kUserAgent);
1064 if (net::HttpUtil::IsValidHeaderValue(ua))
1065 return ua;
1066 LOG(WARNING) << "Ignored invalid value for flag --" << switches::kUserAgent;
1067 }
1068
John Delaneyac24e572019-04-30 19:47:021069 if (base::FeatureList::IsEnabled(blink::features::kFreezeUserAgent)) {
1070 return content::GetFrozenUserAgent(
1071 command_line->HasSwitch(switches::kUseMobileUserAgent))
1072 .as_string();
1073 }
1074
Yutaka Hirano968d6252018-12-04 05:09:311075 std::string product = GetProduct();
1076#if defined(OS_ANDROID)
1077 if (command_line->HasSwitch(switches::kUseMobileUserAgent))
1078 product += " Mobile";
1079#endif
1080 return content::BuildUserAgentFromProduct(product);
1081}
1082
Mike West6e4cbb32019-02-13 09:40:171083blink::UserAgentMetadata GetUserAgentMetadata() {
1084 blink::UserAgentMetadata metadata;
Mike West6e4cbb32019-02-13 09:40:171085 metadata.brand = version_info::GetProductName();
Mike Weste555be862019-02-20 16:17:301086 metadata.full_version = version_info::GetVersionNumber();
1087 metadata.major_version = version_info::GetMajorVersionNumber();
Mike West6e4cbb32019-02-13 09:40:171088 metadata.platform = version_info::GetOSType();
1089
1090 // TODO(mkwst): Poke at BuildUserAgentFromProduct to split out these pieces.
1091 metadata.architecture = "";
1092 metadata.model = "";
1093
1094 return metadata;
1095}
1096
Ran Jia96d43d42018-05-02 17:14:531097ChromeContentBrowserClient::ChromeContentBrowserClient(
Xi Han85079c22019-04-18 21:43:051098 StartupData* startup_data)
Wojciech Dzierżanowskie7c8e3f2019-09-27 20:50:311099 : startup_data_(startup_data) {
brettw4b461082016-11-19 18:55:161100#if BUILDFLAG(ENABLE_PLUGINS)
Avi Drissmand251e912018-12-26 15:46:371101 for (size_t i = 0; i < base::size(kPredefinedAllowedDevChannelOrigins); ++i)
[email protected]aec5ed52014-06-20 07:51:421102 allowed_dev_channel_origins_.insert(kPredefinedAllowedDevChannelOrigins[i]);
Avi Drissmand251e912018-12-26 15:46:371103 for (size_t i = 0; i < base::size(kPredefinedAllowedFileHandleOrigins); ++i)
[email protected]10c39222013-11-13 20:09:251104 allowed_file_handle_origins_.insert(kPredefinedAllowedFileHandleOrigins[i]);
Avi Drissmand251e912018-12-26 15:46:371105 for (size_t i = 0; i < base::size(kPredefinedAllowedSocketOrigins); ++i)
[email protected]e461da2f2012-02-16 19:06:401106 allowed_socket_origins_.insert(kPredefinedAllowedSocketOrigins[i]);
jitendra.ks42e889a2014-12-05 09:05:551107
1108 extra_parts_.push_back(new ChromeContentBrowserClientPluginsPart);
[email protected]93f72062013-05-29 20:29:401109#endif
[email protected]1deace22013-05-22 06:14:461110
Ahmed Fakhryd70bf37b2018-04-04 17:07:241111#if defined(OS_CHROMEOS)
1112 extra_parts_.push_back(new ChromeContentBrowserClientChromeOsPart);
1113#endif // defined(OS_CHROMEOS)
1114
brettw00899e62016-11-12 02:10:171115#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]f7daaa32014-08-02 07:58:131116 extra_parts_.push_back(new ChromeContentBrowserClientExtensionsPart);
[email protected]d5a74be2014-08-08 01:01:271117#endif
bena06f7d62017-04-04 20:48:521118
Sigurdur Asgeirsson70696672019-02-08 16:14:511119 extra_parts_.push_back(new ChromeContentBrowserClientPerformanceManagerPart);
[email protected]e461da2f2012-02-16 19:06:401120}
1121
1122ChromeContentBrowserClient::~ChromeContentBrowserClient() {
[email protected]a48ab7112014-08-01 16:48:031123 for (int i = static_cast<int>(extra_parts_.size()) - 1; i >= 0; --i)
1124 delete extra_parts_[i];
1125 extra_parts_.clear();
[email protected]e461da2f2012-02-16 19:06:401126}
1127
[email protected]bca18382012-06-25 19:15:231128// static
Chris Palmerac7d75642017-11-22 20:12:541129void ChromeContentBrowserClient::RegisterLocalStatePrefs(
1130 PrefRegistrySimple* registry) {
Greg Thompson8c9227562019-08-05 17:47:131131 registry->RegisterFilePathPref(prefs::kDiskCacheDir, base::FilePath());
1132 registry->RegisterIntegerPref(prefs::kDiskCacheSize, 0);
Chris Palmerac7d75642017-11-22 20:12:541133 registry->RegisterStringPref(prefs::kIsolateOrigins, std::string());
1134 registry->RegisterBooleanPref(prefs::kSitePerProcess, false);
Francois Doray424bd992019-10-16 20:59:461135 registry->RegisterBooleanPref(prefs::kTabFreezingEnabled, true);
Chris Palmerac7d75642017-11-22 20:12:541136}
1137
1138// static
[email protected]37ca3fe02013-07-05 15:32:441139void ChromeContentBrowserClient::RegisterProfilePrefs(
[email protected]443e9312013-05-06 06:17:341140 user_prefs::PrefRegistrySyncable* registry) {
raymesaa608722015-04-27 03:00:251141 registry->RegisterBooleanPref(prefs::kDisable3DAPIs, false);
1142 registry->RegisterBooleanPref(prefs::kEnableHyperlinkAuditing, true);
1143 registry->RegisterListPref(prefs::kEnableDeprecatedWebPlatformFeatures);
Pavol Marko6adbea7f2018-02-20 16:35:281144 // Register user prefs for mapping SitePerProcess and IsolateOrigins in
1145 // user policy in addition to the same named ones in Local State (which are
1146 // used for mapping the command-line flags).
1147 registry->RegisterStringPref(prefs::kIsolateOrigins, std::string());
1148 registry->RegisterBooleanPref(prefs::kSitePerProcess, false);
Alex Moshchuke256d562019-04-26 21:43:571149 registry->RegisterListPref(prefs::kUserTriggeredIsolatedOrigins);
Rayan Kanso411e84e2019-02-13 15:27:401150 registry->RegisterDictionaryPref(
1151 prefs::kDevToolsBackgroundServicesExpirationDict);
Kunihiko Sakamotof586da62019-03-28 03:03:041152 registry->RegisterBooleanPref(prefs::kSignedHTTPExchangeEnabled, true);
François Beaufort4f8107d2018-03-05 12:12:101153#if !defined(OS_ANDROID)
1154 registry->RegisterBooleanPref(prefs::kAutoplayAllowed, false);
Becca Hughesfe8c32c2018-03-21 13:36:561155 registry->RegisterListPref(prefs::kAutoplayWhitelist);
François Beaufort4f8107d2018-03-05 12:12:101156#endif
Takashi Toyoshima128441462019-10-16 04:19:171157 registry->RegisterListPref(prefs::kCorsMitigationList);
1158 registry->RegisterBooleanPref(prefs::kCorsLegacyModeEnabled, false);
[email protected]bca18382012-06-25 19:15:231159}
1160
[email protected]eabbfb12013-04-05 23:28:351161// static
1162void ChromeContentBrowserClient::SetApplicationLocale(
1163 const std::string& locale) {
Scott Violet875789e2018-02-02 07:46:481164 // The common case is that this function is called early in Chrome startup
1165 // before any threads are created or registered. When there are no threads,
1166 // we can just set the string without worrying about threadsafety.
Gabriel Charette192b8c92018-03-21 21:16:001167 if (!BrowserThread::IsThreadInitialized(BrowserThread::IO)) {
Lei Zhang2cfceac2018-11-14 19:36:331168 GetIOThreadApplicationLocale() = locale;
Scott Violet875789e2018-02-02 07:46:481169 return;
1170 }
1171
1172 // Otherwise we're being called to change the locale. In this case set it on
1173 // the IO thread.
thestig00844cea2015-09-08 21:44:521174 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]eabbfb12013-04-05 23:28:351175
Sami Kyostila5e1306d2019-08-14 11:01:291176 base::PostTask(FROM_HERE, {BrowserThread::IO},
1177 base::BindOnce(&SetApplicationLocaleOnIOThread, locale));
[email protected]eabbfb12013-04-05 23:28:351178}
1179
Patrick Monette61dfef92019-05-30 23:06:271180std::unique_ptr<content::BrowserMainParts>
1181ChromeContentBrowserClient::CreateBrowserMainParts(
[email protected]50462bf02011-11-21 19:13:311182 const content::MainFunctionParams& parameters) {
Patrick Monette61dfef92019-05-30 23:06:271183 std::unique_ptr<ChromeBrowserMainParts> main_parts;
[email protected]b48c9182011-10-26 18:03:301184 // Construct the Main browser parts based on the OS type.
1185#if defined(OS_WIN)
Xi Han85079c22019-04-18 21:43:051186 main_parts =
Patrick Monette61dfef92019-05-30 23:06:271187 std::make_unique<ChromeBrowserMainPartsWin>(parameters, startup_data_);
1188#elif defined(OS_MACOSX)
1189 main_parts =
1190 std::make_unique<ChromeBrowserMainPartsMac>(parameters, startup_data_);
1191#elif defined(OS_CHROMEOS)
1192 main_parts = std::make_unique<chromeos::ChromeBrowserMainPartsChromeos>(
1193 parameters, startup_data_);
[email protected]81ce2c42012-03-24 01:43:261194#elif defined(OS_LINUX)
Patrick Monette61dfef92019-05-30 23:06:271195 main_parts =
1196 std::make_unique<ChromeBrowserMainPartsLinux>(parameters, startup_data_);
[email protected]6e677a342012-02-11 01:21:141197#elif defined(OS_ANDROID)
Patrick Monette61dfef92019-05-30 23:06:271198 main_parts = std::make_unique<ChromeBrowserMainPartsAndroid>(parameters,
1199 startup_data_);
[email protected]b48c9182011-10-26 18:03:301200#elif defined(OS_POSIX)
Patrick Monette61dfef92019-05-30 23:06:271201 main_parts =
1202 std::make_unique<ChromeBrowserMainPartsPosix>(parameters, startup_data_);
[email protected]f967b722011-09-07 00:58:041203#else
[email protected]b48c9182011-10-26 18:03:301204 NOTREACHED();
Patrick Monette61dfef92019-05-30 23:06:271205 main_parts =
1206 std::make_unique<ChromeBrowserMainParts>(parameters, startup_data_);
[email protected]b48c9182011-10-26 18:03:301207#endif
1208
Xi Han9fd44002019-04-30 17:39:361209 bool add_profiles_extra_parts = true;
1210#if defined(OS_ANDROID)
1211 if (startup_data_->HasBuiltProfilePrefService())
1212 add_profiles_extra_parts = false;
1213#endif
1214 if (add_profiles_extra_parts)
Patrick Monette61dfef92019-05-30 23:06:271215 chrome::AddProfilesExtraParts(main_parts.get());
[email protected]7e75e4a2013-05-17 17:20:031216
Xi Han9fd44002019-04-30 17:39:361217 // Construct additional browser parts. Stages are called in the order in
1218 // which they are added.
[email protected]c7480942011-11-08 19:18:271219#if defined(TOOLKIT_VIEWS)
Maksim Sisov1f2f2e62019-05-08 07:56:221220#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
1221#if defined(USE_X11)
1222 main_parts->AddParts(new ChromeBrowserMainExtraPartsViewsLinuxX11());
1223#else
estaded3aa0e82016-02-17 22:55:211224 main_parts->AddParts(new ChromeBrowserMainExtraPartsViewsLinux());
Maksim Sisov1f2f2e62019-05-08 07:56:221225#endif // USE_X11
estaded3aa0e82016-02-17 22:55:211226#else
riajiang7d6ec5c2017-01-25 16:40:331227 main_parts->AddParts(new ChromeBrowserMainExtraPartsViews());
James Cookf9d34d22017-10-04 16:39:351228#endif
1229#endif
1230
1231#if defined(OS_CHROMEOS)
1232 // TODO(jamescook): Combine with ChromeBrowserMainPartsChromeos.
riajiang7d6ec5c2017-01-25 16:40:331233 main_parts->AddParts(new ChromeBrowserMainExtraPartsAsh());
skycea631e2016-12-16 21:52:221234#endif
[email protected]dc04be7c2012-03-15 23:57:491235
[email protected]e8b6ca02013-07-10 18:00:511236#if defined(USE_X11)
1237 main_parts->AddParts(new ChromeBrowserMainExtraPartsX11());
[email protected]e050ef142012-03-21 01:04:241238#endif
1239
Sigurdur Asgeirsson54b72702019-04-12 14:18:541240 main_parts->AddParts(new ChromeBrowserMainExtraPartsPerformanceManager);
Etienne Bergeron05d62532017-10-13 18:24:001241
Albert J. Wong59d85acb2017-08-10 00:50:571242 main_parts->AddParts(new ChromeBrowserMainExtraPartsProfiling);
Albert J. Wong59d85acb2017-08-10 00:50:571243
Sebastien Marchand8c0088102019-10-11 16:47:561244 main_parts->AddParts(new ChromeBrowserMainExtraPartsMemory);
1245
Patrick Monette61dfef92019-05-30 23:06:271246 chrome::AddMetricsExtraParts(main_parts.get());
[email protected]95132f52013-04-12 02:19:041247
[email protected]50462bf02011-11-21 19:13:311248 return main_parts;
[email protected]f967b722011-09-07 00:58:041249}
1250
michaeln96f887e22015-04-13 23:58:311251void ChromeContentBrowserClient::PostAfterStartupTask(
Brett Wilsone1a70422017-09-12 05:10:091252 const base::Location& from_here,
michaeln96f887e22015-04-13 23:58:311253 const scoped_refptr<base::TaskRunner>& task_runner,
tzik6e427842017-04-05 10:13:211254 base::OnceClosure task) {
tzik070c8ffb2017-03-29 05:28:121255 AfterStartupTaskUtils::PostTask(from_here, task_runner, std::move(task));
John Abd-El-Malek0e82fe7f2019-07-27 00:06:291256
Robert Sesek466e43e2019-08-19 22:02:021257 InitNetworkContextsParentDirectory();
1258
John Abd-El-Malek0e82fe7f2019-07-27 00:06:291259 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1260 safe_browsing_service_ = g_browser_process->safe_browsing_service();
michaeln96f887e22015-04-13 23:58:311261}
1262
falkenb09d443f2016-04-07 12:36:121263bool ChromeContentBrowserClient::IsBrowserStartupComplete() {
1264 return AfterStartupTaskUtils::IsBrowserStartupComplete();
1265}
1266
Gabriel Charettec8cca992017-08-10 18:21:491267void ChromeContentBrowserClient::SetBrowserStartupIsCompleteForTesting() {
1268 AfterStartupTaskUtils::SetBrowserStartupIsCompleteForTesting();
1269}
1270
John Abd-El-Malek9d57f9c2019-02-20 18:50:041271bool ChromeContentBrowserClient::IsShuttingDown() {
1272 return browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID;
1273}
1274
[email protected]e94bbcb2012-09-07 05:33:571275std::string ChromeContentBrowserClient::GetStoragePartitionIdForSite(
[email protected]d1198fd2012-08-13 22:50:191276 content::BrowserContext* browser_context,
[email protected]e94bbcb2012-09-07 05:33:571277 const GURL& site) {
[email protected]1bc28312012-11-08 08:31:531278 std::string partition_id;
1279
1280 // The partition ID for webview guest processes is the string value of its
1281 // SiteInstance URL - "chrome-guest://app_id/persist?partition".
rogerta5f5bb822015-12-17 03:24:451282 if (site.SchemeIs(content::kGuestScheme))
[email protected]1bc28312012-11-08 08:31:531283 partition_id = site.spec();
brettw00899e62016-11-12 02:10:171284#if BUILDFLAG(ENABLE_EXTENSIONS)
blundellf650ea02016-02-08 11:50:501285 // The partition ID for extensions with isolated storage is treated similarly
1286 // to the above.
1287 else if (site.SchemeIs(extensions::kExtensionScheme) &&
1288 extensions::util::SiteHasIsolatedStorage(site, browser_context))
1289 partition_id = site.spec();
1290#endif
[email protected]1bc28312012-11-08 08:31:531291
[email protected]056efdc2013-04-06 00:14:531292 DCHECK(IsValidStoragePartitionId(browser_context, partition_id));
[email protected]1bc28312012-11-08 08:31:531293 return partition_id;
1294}
1295
1296bool ChromeContentBrowserClient::IsValidStoragePartitionId(
1297 content::BrowserContext* browser_context,
1298 const std::string& partition_id) {
1299 // The default ID is empty and is always valid.
1300 if (partition_id.empty())
1301 return true;
1302
1303 return GURL(partition_id).is_valid();
1304}
1305
1306void ChromeContentBrowserClient::GetStoragePartitionConfigForSite(
1307 content::BrowserContext* browser_context,
1308 const GURL& site,
[email protected]14acc642012-11-17 12:20:101309 bool can_be_default,
[email protected]1bc28312012-11-08 08:31:531310 std::string* partition_domain,
1311 std::string* partition_name,
1312 bool* in_memory) {
[email protected]14acc642012-11-17 12:20:101313 // Default to the browser-wide storage partition and override based on |site|
1314 // below.
1315 partition_domain->clear();
1316 partition_name->clear();
1317 *in_memory = false;
1318
brettw00899e62016-11-12 02:10:171319#if BUILDFLAG(ENABLE_EXTENSIONS)
rogerta5f5bb822015-12-17 03:24:451320 bool success = extensions::WebViewGuest::GetGuestPartitionConfigForSite(
[email protected]3f24f97c2013-11-17 21:53:331321 site, partition_domain, partition_name, in_memory);
1322
1323 if (!success && site.SchemeIs(extensions::kExtensionScheme)) {
[email protected]14acc642012-11-17 12:20:101324 // If |can_be_default| is false, the caller is stating that the |site|
1325 // should be parsed as if it had isolated storage. In particular it is
1326 // important to NOT check ExtensionService for the is_storage_isolated()
1327 // attribute because this code path is run during Extension uninstall
1328 // to do cleanup after the Extension has already been unloaded from the
1329 // ExtensionService.
1330 bool is_isolated = !can_be_default;
1331 if (can_be_default) {
[email protected]ca0336342014-03-21 12:58:341332 if (extensions::util::SiteHasIsolatedStorage(site, browser_context))
1333 is_isolated = true;
[email protected]14acc642012-11-17 12:20:101334 }
[email protected]1bc28312012-11-08 08:31:531335
[email protected]14acc642012-11-17 12:20:101336 if (is_isolated) {
1337 CHECK(site.has_host());
1338 // For extensions with isolated storage, the the host of the |site| is
1339 // the |partition_domain|. The |in_memory| and |partition_name| are only
1340 // used in guest schemes so they are cleared here.
1341 *partition_domain = site.host();
[email protected]1bc28312012-11-08 08:31:531342 *in_memory = false;
[email protected]14acc642012-11-17 12:20:101343 partition_name->clear();
[email protected]1bc28312012-11-08 08:31:531344 }
[email protected]1df3d972014-06-11 04:55:181345 success = true;
1346 }
1347#endif
1348
[email protected]14acc642012-11-17 12:20:101349 // Assert that if |can_be_default| is false, the code above must have found a
1350 // non-default partition. If this fails, the caller has a serious logic
1351 // error about which StoragePartition they expect to be in and it is not
1352 // safe to continue.
1353 CHECK(can_be_default || !partition_domain->empty());
[email protected]d7c7c98a2012-07-12 21:27:441354}
1355
[email protected]38b098f2012-03-14 21:11:571356content::WebContentsViewDelegate*
Aran Gilmanf010bdd2019-08-28 19:55:441357ChromeContentBrowserClient::GetWebContentsViewDelegate(
1358 content::WebContents* web_contents) {
cm.sanchi2db24a82017-11-16 07:22:101359 return CreateWebContentsViewDelegate(web_contents);
[email protected]74313b42011-08-24 16:51:321360}
1361
Bo Liu4ade6b1b22017-11-28 02:26:351362bool ChromeContentBrowserClient::AllowGpuLaunchRetryOnIOThread() {
1363#if defined(OS_ANDROID)
1364 const base::android::ApplicationState app_state =
1365 base::android::ApplicationStatusListener::GetState();
1366 return base::android::APPLICATION_STATE_UNKNOWN == app_state ||
1367 base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES == app_state ||
1368 base::android::APPLICATION_STATE_HAS_PAUSED_ACTIVITIES == app_state;
1369#else
1370 return true;
1371#endif
1372}
1373
[email protected]6f2862742013-12-20 07:53:191374void ChromeContentBrowserClient::RenderProcessWillLaunch(
Ken Rockot7c6275b2019-08-02 20:00:231375 content::RenderProcessHost* host) {
[email protected]f3b1a082011-11-18 00:34:301376 int id = host->GetID();
1377 Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext());
Darin Fisher86ec1f42019-10-30 04:26:531378 host->AddFilter(new ChromeRenderMessageFilter());
thakis678822e2017-04-20 17:20:341379#if BUILDFLAG(ENABLE_EXTENSIONS)
John Abd-El-Malekb79dd6ba2018-12-07 01:20:491380 host->AddFilter(new cast::CastTransportHostFilter());
thestig73f4cdc2015-01-15 01:51:061381#endif
Brett Wilson65f951c2016-11-03 22:06:121382#if BUILDFLAG(ENABLE_PRINTING)
[email protected]168b77992014-08-20 11:48:401383 host->AddFilter(new printing::PrintingMessageFilter(id, profile));
[email protected]058e5732012-03-01 22:48:031384#endif
[email protected]ba780c12013-10-01 17:07:061385 host->AddFilter(new prerender::PrerenderMessageFilter(id, profile));
Darin Fisher8c84328c2019-07-23 02:50:001386
Darin Fisher09aa7222019-08-29 09:27:361387 WebRtcLoggingController::AttachToRenderProcessHost(
Darin Fisher8c84328c2019-07-23 02:50:001388 host, g_browser_process->webrtc_log_uploader());
tereliusfa159cc2016-04-13 15:13:021389
grunell086a4112017-03-02 09:23:041390 // The audio manager outlives the host, so it's safe to hand a raw pointer to
1391 // it to the AudioDebugRecordingsHandler, which is owned by the host.
tereliusfa159cc2016-04-13 15:13:021392 AudioDebugRecordingsHandler* audio_debug_recordings_handler =
Marina Ciocea741a4fb12018-01-27 09:55:121393 new AudioDebugRecordingsHandler(profile);
tereliusfa159cc2016-04-13 15:13:021394 host->SetUserData(
1395 AudioDebugRecordingsHandler::kAudioDebugRecordingsHandlerKey,
Jeremy Romanec48d7a2018-03-01 17:35:091396 std::make_unique<base::UserDataAdapter<AudioDebugRecordingsHandler>>(
tereliusfa159cc2016-04-13 15:13:021397 audio_debug_recordings_handler));
1398
Nico Weberaf3b00b2017-09-11 17:58:171399#if BUILDFLAG(ENABLE_NACL)
Helen Li8897b022018-05-03 13:29:031400 host->AddFilter(new nacl::NaClHostMessageFilter(id, profile->IsOffTheRecord(),
1401 profile->GetPath()));
[email protected]01e59752013-06-18 00:17:351402#endif
jeremyim364ac1182015-03-03 18:49:431403
Xiaohan Wang9b34281b2017-09-08 23:48:331404#if defined(OS_ANDROID)
1405 // Data cannot be persisted if the profile is off the record.
1406 host->AddFilter(
John Abd-El-Malek1f7fc912018-07-26 02:48:061407 new cdm::CdmMessageFilterAndroid(!profile->IsOffTheRecord(), false));
Yuzu Saijo2d12ef92018-08-21 04:52:071408
1409 // Register CrashMemoryMetricsCollector to report oom related metrics.
1410 host->SetUserData(
1411 CrashMemoryMetricsCollector::kCrashMemoryMetricsCollectorKey,
1412 std::make_unique<CrashMemoryMetricsCollector>(host));
Xiaohan Wang9b34281b2017-09-08 23:48:331413#endif
1414
Jun Caidb3f93cc2018-07-09 21:54:551415 Profile* original_profile = profile->GetOriginalProfile();
John Abd-El-Malek1f7fc912018-07-26 02:48:061416 RendererUpdaterFactory::GetForProfile(original_profile)
1417 ->InitializeRenderer(host);
[email protected]39a5b532011-10-22 01:47:071418
[email protected]a48ab7112014-08-01 16:48:031419 for (size_t i = 0; i < extra_parts_.size(); ++i)
1420 extra_parts_[i]->RenderProcessWillLaunch(host);
[email protected]05fcf982011-04-19 00:44:141421}
1422
[email protected]3d7474ff2011-07-27 17:47:371423GURL ChromeContentBrowserClient::GetEffectiveURL(
Alex Moshchukbb99a332017-11-22 04:49:571424 content::BrowserContext* browser_context,
Alex Moshchuka31c7882018-01-17 00:57:301425 const GURL& url) {
[email protected]3d7474ff2011-07-27 17:47:371426 Profile* profile = Profile::FromBrowserContext(browser_context);
[email protected]c5dec6292013-01-25 04:54:521427 if (!profile)
1428 return url;
1429
Marc Treib7d467b792017-12-04 13:31:031430#if !defined(OS_ANDROID)
[email protected]b3cb3a32013-07-31 01:32:291431 // If the input |url| should be assigned to the Instant renderer, make its
1432 // effective URL distinct from other URLs on the search provider's domain.
Alex Moshchukca171372017-11-28 16:11:311433 // This needs to happen even if |url| corresponds to an isolated origin; see
1434 // https://crbug.com/755595.
sdefresne51bbec7b2015-08-03 14:18:131435 if (search::ShouldAssignURLToInstantRenderer(url, profile))
1436 return search::GetEffectiveURLForInstant(url, profile);
Marc Treib7d467b792017-12-04 13:31:031437#endif
[email protected]b3cb3a32013-07-31 01:32:291438
brettw00899e62016-11-12 02:10:171439#if BUILDFLAG(ENABLE_EXTENSIONS)
Alex Moshchuka31c7882018-01-17 00:57:301440 return ChromeContentBrowserClientExtensionsPart::GetEffectiveURL(profile,
1441 url);
[email protected]d5a74be2014-08-08 01:01:271442#else
1443 return url;
1444#endif
[email protected]36fb2c7c2011-04-04 15:49:081445}
1446
Alexander Yashkin6aedc6e2018-08-15 08:58:451447bool ChromeContentBrowserClient::
1448 ShouldCompareEffectiveURLsForSiteInstanceSelection(
1449 content::BrowserContext* browser_context,
1450 content::SiteInstance* candidate_site_instance,
1451 bool is_main_frame,
1452 const GURL& candidate_url,
1453 const GURL& destination_url) {
1454 DCHECK(browser_context);
1455 DCHECK(candidate_site_instance);
1456#if BUILDFLAG(ENABLE_EXTENSIONS)
1457 return ChromeContentBrowserClientExtensionsPart::
1458 ShouldCompareEffectiveURLsForSiteInstanceSelection(
1459 browser_context, candidate_site_instance, is_main_frame,
1460 candidate_url, destination_url);
1461#else
1462 return true;
1463#endif
1464}
1465
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:521466bool ChromeContentBrowserClient::ShouldUseMobileFlingCurve() {
Ahmed Fakhrye6a2c642018-06-20 02:58:411467#if defined(OS_ANDROID)
1468 return true;
1469#elif defined(OS_CHROMEOS)
Xiyuan Xiafc9f38132019-08-02 00:51:421470 return ash::TabletMode::Get() && ash::TabletMode::Get()->InTabletMode();
Ahmed Fakhrye6a2c642018-06-20 02:58:411471#else
1472 return false;
1473#endif // defined(OS_ANDROID)
1474}
1475
[email protected]056ad2a2011-07-12 02:13:551476bool ChromeContentBrowserClient::ShouldUseProcessPerSite(
Aran Gilmanf010bdd2019-08-28 19:55:441477 content::BrowserContext* browser_context,
1478 const GURL& effective_url) {
[email protected]c5dec6292013-01-25 04:54:521479 Profile* profile = Profile::FromBrowserContext(browser_context);
1480 if (!profile)
1481 return false;
1482
Lukasz Anforowiczfec6b9a2019-07-16 21:02:301483 // NTP should use process-per-site. This is a performance optimization to
1484 // reduce process count associated with NTP tabs.
1485 if (effective_url == GURL(chrome::kChromeUINewTabURL))
1486 return true;
Peter Boström8e9b1632019-08-22 23:12:471487
1488 // The web footer experiment should share its renderer to not effectively
1489 // instantiate one per window. See https://crbug.com/993502.
1490 if (effective_url == GURL(chrome::kChromeUIWebFooterExperimentURL))
1491 return true;
1492
Marc Treib7d467b792017-12-04 13:31:031493#if !defined(OS_ANDROID)
sdefresne51bbec7b2015-08-03 14:18:131494 if (search::ShouldUseProcessPerSiteForInstantURL(effective_url, profile))
[email protected]c5dec6292013-01-25 04:54:521495 return true;
Marc Treib7d467b792017-12-04 13:31:031496#endif
[email protected]c5dec6292013-01-25 04:54:521497
brettw00899e62016-11-12 02:10:171498#if BUILDFLAG(ENABLE_EXTENSIONS)
Lukasz Anforowiczfec6b9a2019-07-16 21:02:301499 if (ChromeContentBrowserClientExtensionsPart::ShouldUseProcessPerSite(
1500 profile, effective_url))
1501 return true;
[email protected]d5a74be2014-08-08 01:01:271502#endif
Lukasz Anforowiczfec6b9a2019-07-16 21:02:301503
1504 // Non-extension, non-NTP URLs should generally use process-per-site-instance
1505 // (rather than process-per-site).
1506 return false;
[email protected]056ad2a2011-07-12 02:13:551507}
1508
Lukasz Anforowicz32d27122018-04-09 21:48:331509bool ChromeContentBrowserClient::ShouldUseSpareRenderProcessHost(
1510 content::BrowserContext* browser_context,
1511 const GURL& site_url) {
1512 Profile* profile = Profile::FromBrowserContext(browser_context);
1513 if (!profile)
1514 return false;
1515
1516#if !defined(OS_ANDROID)
1517 // Instant renderers should not use a spare process, because they require
1518 // passing switches::kInstantProcess to the renderer process when it
1519 // launches. A spare process is launched earlier, before it is known which
1520 // navigation will use it, so it lacks this flag.
1521 if (search::ShouldAssignURLToInstantRenderer(site_url, profile))
1522 return false;
1523#endif
1524
1525#if BUILDFLAG(ENABLE_EXTENSIONS)
1526 return ChromeContentBrowserClientExtensionsPart::
1527 ShouldUseSpareRenderProcessHost(profile, site_url);
1528#else
1529 return true;
1530#endif
1531}
1532
nickcc0d9142015-10-14 16:27:101533bool ChromeContentBrowserClient::DoesSiteRequireDedicatedProcess(
Clark DuVall4e1f0a72019-08-07 22:41:421534 content::BrowserContext* browser_context,
nickcc0d9142015-10-14 16:27:101535 const GURL& effective_site_url) {
Clark DuVall4e1f0a72019-08-07 22:41:421536 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
brettw00899e62016-11-12 02:10:171537#if BUILDFLAG(ENABLE_EXTENSIONS)
nickcc0d9142015-10-14 16:27:101538 if (ChromeContentBrowserClientExtensionsPart::DoesSiteRequireDedicatedProcess(
Clark DuVall4e1f0a72019-08-07 22:41:421539 browser_context, effective_site_url)) {
nickcc0d9142015-10-14 16:27:101540 return true;
1541 }
1542#endif
1543 return false;
1544}
1545
nick7d0984c2015-08-29 00:13:461546// TODO(creis, nick): https://crbug.com/160576 describes a weakness in our
1547// origin-lock enforcement, where we don't have a way to efficiently know
1548// effective URLs on the IO thread, and wind up killing processes that e.g.
1549// request cookies for their actual URL. This whole function (and its
1550// ExtensionsPart) should be removed once we add that ability to the IO thread.
1551bool ChromeContentBrowserClient::ShouldLockToOrigin(
1552 content::BrowserContext* browser_context,
1553 const GURL& effective_site_url) {
1554 // Origin lock to the search scheme would kill processes upon legitimate
1555 // requests for cookies from the search engine's domain.
1556 if (effective_site_url.SchemeIs(chrome::kChromeSearchScheme))
1557 return false;
1558
brettw00899e62016-11-12 02:10:171559#if BUILDFLAG(ENABLE_EXTENSIONS)
nick7d0984c2015-08-29 00:13:461560 if (!ChromeContentBrowserClientExtensionsPart::ShouldLockToOrigin(
1561 browser_context, effective_site_url)) {
1562 return false;
1563 }
1564#endif
1565 return true;
creise5d6d1732015-08-25 19:47:061566}
1567
Lukasz Anforowicz05f356e2018-03-13 20:26:111568const char*
Lukasz Anforowiczce869f0b2018-08-06 18:33:371569ChromeContentBrowserClient::GetInitiatorSchemeBypassingDocumentBlocking() {
Charles Reis358baf472017-12-06 05:30:431570#if BUILDFLAG(ENABLE_EXTENSIONS)
Lukasz Anforowicz05f356e2018-03-13 20:26:111571 // Don't block responses for extension processes or for content scripts.
1572 // TODO(creis): When every extension fetch (including content scripts) has
1573 // been made to go through an extension-specific URLLoaderFactory, this
1574 // mechanism ought to work by enumerating the host permissions from the
1575 // extension manifest, and forwarding them on to the network service while
1576 // brokering the URLLoaderFactory.
1577 return extensions::kExtensionScheme;
1578#else
1579 return nullptr;
Charles Reis358baf472017-12-06 05:30:431580#endif
Charles Reis358baf472017-12-06 05:30:431581}
1582
Maks Orlovich0e23e312019-07-16 13:13:561583bool ChromeContentBrowserClient::ShouldTreatURLSchemeAsFirstPartyWhenTopLevel(
1584 base::StringPiece scheme) {
1585#if BUILDFLAG(ENABLE_EXTENSIONS)
1586 return scheme == extensions::kExtensionScheme;
1587#else
1588 return false;
1589#endif
1590}
1591
Julie Jeongeun Kimfb6f5302019-10-17 17:24:101592mojo::PendingRemote<network::mojom::URLLoaderFactory>
Lukasz Anforowicz2f810162018-10-03 21:38:071593ChromeContentBrowserClient::CreateURLLoaderFactoryForNetworkRequests(
1594 content::RenderProcessHost* process,
1595 network::mojom::NetworkContext* network_context,
Julie Jeongeun Kim47499a0c2019-08-28 07:23:181596 mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
1597 header_client,
Yao Xiaoc85cf0a2019-09-25 23:35:421598 const url::Origin& request_initiator,
1599 const base::Optional<net::NetworkIsolationKey>& network_isolation_key) {
Lukasz Anforowicz2f810162018-10-03 21:38:071600#if BUILDFLAG(ENABLE_EXTENSIONS)
1601 return ChromeContentBrowserClientExtensionsPart::
Yao Xiaoc85cf0a2019-09-25 23:35:421602 CreateURLLoaderFactoryForNetworkRequests(process, network_context,
1603 header_client, request_initiator,
1604 network_isolation_key);
Lukasz Anforowicz2f810162018-10-03 21:38:071605#else
Julie Jeongeun Kimfb6f5302019-10-17 17:24:101606 return mojo::NullRemote();
Lukasz Anforowicz2f810162018-10-03 21:38:071607#endif
1608}
1609
[email protected]73b718f2014-01-27 02:59:461610// These are treated as WebUI schemes but do not get WebUI bindings. Also,
1611// view-source is allowed for these schemes.
[email protected]8f89dd412013-04-17 02:35:411612void ChromeContentBrowserClient::GetAdditionalWebUISchemes(
1613 std::vector<std::string>* additional_schemes) {
1614 additional_schemes->push_back(chrome::kChromeSearchScheme);
[email protected]474a5a32014-07-28 18:23:241615 additional_schemes->push_back(dom_distiller::kDomDistillerScheme);
Andrey Kosyakov031e9e32017-08-18 21:00:351616 additional_schemes->push_back(content::kChromeDevToolsScheme);
[email protected]672c8c12013-03-07 12:30:061617}
1618
alexmos94875b3b2017-03-16 22:19:011619void ChromeContentBrowserClient::GetAdditionalViewSourceSchemes(
1620 std::vector<std::string>* additional_schemes) {
1621 GetAdditionalWebUISchemes(additional_schemes);
1622
1623#if BUILDFLAG(ENABLE_EXTENSIONS)
1624 additional_schemes->push_back(extensions::kExtensionScheme);
1625#endif
1626}
1627
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:521628bool ChromeContentBrowserClient::LogWebUIUrl(const GURL& web_ui_url) {
dbeambaee5bd2015-09-26 03:07:011629 return webui::LogWebUIUrl(web_ui_url);
1630}
1631
John Abd-El-Malek04bfa8532018-07-12 05:28:221632bool ChromeContentBrowserClient::IsWebUIAllowedToMakeNetworkRequests(
1633 const url::Origin& origin) {
1634 return ChromeWebUIControllerFactory::IsWebUIAllowedToMakeNetworkRequests(
1635 origin);
1636}
1637
[email protected]46fb9442011-12-09 17:57:471638bool ChromeContentBrowserClient::IsHandledURL(const GURL& url) {
1639 return ProfileIOData::IsHandledURL(url);
1640}
1641
[email protected]c4365fa42013-05-14 01:08:241642bool ChromeContentBrowserClient::CanCommitURL(
1643 content::RenderProcessHost* process_host,
1644 const GURL& url) {
brettw00899e62016-11-12 02:10:171645#if BUILDFLAG(ENABLE_EXTENSIONS)
Aran Gilmanf010bdd2019-08-28 19:55:441646 return ChromeContentBrowserClientExtensionsPart::CanCommitURL(process_host,
1647 url);
[email protected]d5a74be2014-08-08 01:01:271648#else
1649 return true;
1650#endif
[email protected]c4365fa42013-05-14 01:08:241651}
1652
rdevlin.cronina32a0902016-11-09 15:50:201653void ChromeContentBrowserClient::OverrideNavigationParams(
1654 SiteInstance* site_instance,
1655 ui::PageTransition* transition,
1656 bool* is_renderer_initiated,
Lukasz Anforowicz63f3b9432019-05-30 05:42:581657 content::Referrer* referrer,
1658 base::Optional<url::Origin>* initiator_origin) {
rdevlin.cronina32a0902016-11-09 15:50:201659 DCHECK(transition);
1660 DCHECK(is_renderer_initiated);
1661 DCHECK(referrer);
Moe Ahmadi26e2f502019-07-16 02:34:471662 // While using SiteInstance::GetSiteURL() is unreliable and the wrong thing to
1663 // use for making security decisions 99.44% of the time, for detecting the NTP
1664 // it is reliable and the correct way. See http://crbug.com/624410.
1665 if (site_instance && search::IsNTPURL(site_instance->GetSiteURL()) &&
rdevlin.cronina32a0902016-11-09 15:50:201666 ui::PageTransitionCoreTypeIs(*transition, ui::PAGE_TRANSITION_LINK)) {
Lukasz Anforowicz63f3b9432019-05-30 05:42:581667 // Clicks on tiles of the new tab page should be treated as if a user
1668 // clicked on a bookmark. This is consistent with native implementations
1669 // like Android's. This also helps ensure that security features (like
1670 // Sec-Fetch-Site and SameSite-cookies) will treat the navigation as
1671 // browser-initiated.
rdevlin.cronina32a0902016-11-09 15:50:201672 *transition = ui::PAGE_TRANSITION_AUTO_BOOKMARK;
1673 *is_renderer_initiated = false;
1674 *referrer = content::Referrer();
Lukasz Anforowicz63f3b9432019-05-30 05:42:581675 *initiator_origin = base::nullopt;
mastiza77db6992016-06-30 09:48:421676 }
1677}
1678
Charles Reis29e9dd12017-09-28 00:59:151679bool ChromeContentBrowserClient::ShouldStayInParentProcessForNTP(
1680 const GURL& url,
1681 SiteInstance* parent_site_instance) {
Moe Ahmadi26e2f502019-07-16 02:34:471682 // While using SiteInstance::GetSiteURL() is unreliable and the wrong thing to
1683 // use for making security decisions 99.44% of the time, for detecting the NTP
1684 // it is reliable and the correct way. See http://crbug.com/624410.
1685 return url.SchemeIs(chrome::kChromeSearchScheme) && parent_site_instance &&
1686 search::IsNTPURL(parent_site_instance->GetSiteURL());
Charles Reis29e9dd12017-09-28 00:59:151687}
1688
[email protected]2a5221b2011-09-27 23:07:311689bool ChromeContentBrowserClient::IsSuitableHost(
[email protected]f3b1a082011-11-18 00:34:301690 content::RenderProcessHost* process_host,
[email protected]2a5221b2011-09-27 23:07:311691 const GURL& site_url) {
1692 Profile* profile =
[email protected]f3b1a082011-11-18 00:34:301693 Profile::FromBrowserContext(process_host->GetBrowserContext());
Aran Gilmanf010bdd2019-08-28 19:55:441694 // This may be nullptr during tests. In that case, just assume any site can
[email protected]c5dec6292013-01-25 04:54:521695 // share any host.
1696 if (!profile)
1697 return true;
1698
Marc Treib7895941d2017-11-28 12:37:021699#if !defined(OS_ANDROID)
[email protected]d43f99fe2013-04-03 00:20:141700 // Instant URLs should only be in the instant process and instant process
1701 // should only have Instant URLs.
[email protected]c5dec6292013-01-25 04:54:521702 InstantService* instant_service =
1703 InstantServiceFactory::GetForProfile(profile);
[email protected]d43f99fe2013-04-03 00:20:141704 if (instant_service) {
Aran Gilmanf010bdd2019-08-28 19:55:441705 bool is_instant_process =
1706 instant_service->IsInstantProcess(process_host->GetID());
[email protected]d43f99fe2013-04-03 00:20:141707 bool should_be_in_instant_process =
sdefresne51bbec7b2015-08-03 14:18:131708 search::ShouldAssignURLToInstantRenderer(site_url, profile);
[email protected]d43f99fe2013-04-03 00:20:141709 if (is_instant_process || should_be_in_instant_process)
1710 return is_instant_process && should_be_in_instant_process;
1711 }
Marc Treib7895941d2017-11-28 12:37:021712#endif
[email protected]c5dec6292013-01-25 04:54:521713
brettw00899e62016-11-12 02:10:171714#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]f7daaa32014-08-02 07:58:131715 return ChromeContentBrowserClientExtensionsPart::IsSuitableHost(
1716 profile, process_host, site_url);
[email protected]d5a74be2014-08-08 01:01:271717#else
1718 return true;
1719#endif
[email protected]2a5221b2011-09-27 23:07:311720}
1721
[email protected]28c5d0b72014-05-13 08:19:591722bool ChromeContentBrowserClient::MayReuseHost(
1723 content::RenderProcessHost* process_host) {
1724 // If there is currently a prerender in progress for the host provided,
1725 // it may not be shared. We require prerenders to be by themselves in a
davidben879199c2015-03-06 00:55:041726 // separate process so that we can monitor their resource usage.
[email protected]28c5d0b72014-05-13 08:19:591727 prerender::PrerenderManager* prerender_manager =
drogerc1543152016-09-20 13:03:371728 prerender::PrerenderManagerFactory::GetForBrowserContext(
1729 process_host->GetBrowserContext());
[email protected]28c5d0b72014-05-13 08:19:591730 if (prerender_manager &&
[email protected]2290af22014-05-26 15:44:491731 !prerender_manager->MayReuseProcessHost(process_host)) {
[email protected]28c5d0b72014-05-13 08:19:591732 return false;
1733 }
1734
1735 return true;
1736}
1737
[email protected]76411f412012-02-22 18:56:061738bool ChromeContentBrowserClient::ShouldTryToUseExistingProcessHost(
Aran Gilmanf010bdd2019-08-28 19:55:441739 content::BrowserContext* browser_context,
1740 const GURL& url) {
[email protected]76411f412012-02-22 18:56:061741 // It has to be a valid URL for us to check for an extension.
1742 if (!url.is_valid())
1743 return false;
1744
brettw00899e62016-11-12 02:10:171745#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]76411f412012-02-22 18:56:061746 Profile* profile = Profile::FromBrowserContext(browser_context);
[email protected]f7daaa32014-08-02 07:58:131747 return ChromeContentBrowserClientExtensionsPart::
Aran Gilmanf010bdd2019-08-28 19:55:441748 ShouldTryToUseExistingProcessHost(profile, url);
[email protected]d5a74be2014-08-08 01:01:271749#else
1750 return false;
1751#endif
[email protected]76411f412012-02-22 18:56:061752}
1753
Alex Moshchuk9c9e3882018-11-02 19:57:031754bool ChromeContentBrowserClient::ShouldSubframesTryToReuseExistingProcess(
1755 content::RenderFrameHost* main_frame) {
1756#if BUILDFLAG(ENABLE_EXTENSIONS)
1757 return ChromeContentBrowserClientExtensionsPart::
1758 ShouldSubframesTryToReuseExistingProcess(main_frame);
1759#else
1760 return true;
1761#endif
1762}
1763
[email protected]6f371442011-11-09 06:45:461764void ChromeContentBrowserClient::SiteInstanceGotProcess(
1765 SiteInstance* site_instance) {
1766 CHECK(site_instance->HasProcess());
1767
Aran Gilmanf010bdd2019-08-28 19:55:441768 Profile* profile =
1769 Profile::FromBrowserContext(site_instance->GetBrowserContext());
[email protected]c5dec6292013-01-25 04:54:521770 if (!profile)
1771 return;
1772
Marc Treib7895941d2017-11-28 12:37:021773#if !defined(OS_ANDROID)
[email protected]c5dec6292013-01-25 04:54:521774 // Remember the ID of the Instant process to signal the renderer process
1775 // on startup in |AppendExtraCommandLineSwitches| below.
sdefresne51bbec7b2015-08-03 14:18:131776 if (search::ShouldAssignURLToInstantRenderer(site_instance->GetSiteURL(),
1777 profile)) {
[email protected]c5dec6292013-01-25 04:54:521778 InstantService* instant_service =
1779 InstantServiceFactory::GetForProfile(profile);
1780 if (instant_service)
1781 instant_service->AddInstantProcess(site_instance->GetProcess()->GetID());
1782 }
Marc Treib7895941d2017-11-28 12:37:021783#endif
[email protected]c5dec6292013-01-25 04:54:521784
[email protected]a48ab7112014-08-01 16:48:031785 for (size_t i = 0; i < extra_parts_.size(); ++i)
1786 extra_parts_[i]->SiteInstanceGotProcess(site_instance);
[email protected]6f371442011-11-09 06:45:461787}
1788
1789void ChromeContentBrowserClient::SiteInstanceDeleting(
1790 SiteInstance* site_instance) {
1791 if (!site_instance->HasProcess())
1792 return;
1793
[email protected]a48ab7112014-08-01 16:48:031794 for (size_t i = 0; i < extra_parts_.size(); ++i)
1795 extra_parts_[i]->SiteInstanceDeleting(site_instance);
[email protected]6f371442011-11-09 06:45:461796}
1797
[email protected]453f5432013-11-26 19:43:001798bool ChromeContentBrowserClient::ShouldSwapBrowsingInstancesForNavigation(
[email protected]e9841fbd2013-02-22 23:12:141799 SiteInstance* site_instance,
[email protected]e3daf3c2011-10-05 21:17:081800 const GURL& current_url,
1801 const GURL& new_url) {
brettw00899e62016-11-12 02:10:171802#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]f7daaa32014-08-02 07:58:131803 return ChromeContentBrowserClientExtensionsPart::
Aran Gilmanf010bdd2019-08-28 19:55:441804 ShouldSwapBrowsingInstancesForNavigation(site_instance, current_url,
1805 new_url);
[email protected]d5a74be2014-08-08 01:01:271806#else
1807 return false;
1808#endif
[email protected]e3daf3c2011-10-05 21:17:081809}
1810
Nasko Oskovd83b5712018-05-04 04:50:571811bool ChromeContentBrowserClient::ShouldIsolateErrorPage(bool in_main_frame) {
1812 // TODO(nasko): Consider supporting error page isolation in subframes if
1813 // Site Isolation is enabled.
Nasko Oskov55d21e152018-06-27 23:59:381814 return in_main_frame;
Nasko Oskovd83b5712018-05-04 04:50:571815}
1816
[email protected]3d831992013-07-04 01:13:291817bool ChromeContentBrowserClient::ShouldAssignSiteForURL(const GURL& url) {
1818 return !url.SchemeIs(chrome::kChromeNativeScheme);
1819}
1820
Alex Moshchukd252c192017-07-17 22:03:481821std::vector<url::Origin>
1822ChromeContentBrowserClient::GetOriginsRequiringDedicatedProcess() {
1823 std::vector<url::Origin> isolated_origin_list;
1824
Alex Moshchuk89352a72017-10-25 20:25:591825// Sign-in process isolation is not needed on Android, see
1826// https://crbug.com/739418.
1827#if !defined(OS_ANDROID)
Alex Moshchuk81d2a29e2019-07-16 01:14:381828 isolated_origin_list.push_back(
Alex Moshchuk36417aa2018-06-13 18:01:121829 url::Origin::Create(GaiaUrls::GetInstance()->gaia_url()));
Alex Moshchuk89352a72017-10-25 20:25:591830#endif
Alex Moshchukd252c192017-07-17 22:03:481831
Alex Moshchuk81d2a29e2019-07-16 01:14:381832#if BUILDFLAG(ENABLE_EXTENSIONS)
1833 auto origins_from_extensions = ChromeContentBrowserClientExtensionsPart::
1834 GetOriginsRequiringDedicatedProcess();
1835 std::move(std::begin(origins_from_extensions),
1836 std::end(origins_from_extensions),
1837 std::back_inserter(isolated_origin_list));
1838#endif
1839
Alex Moshchukd252c192017-07-17 22:03:481840 return isolated_origin_list;
1841}
1842
Lukasz Anforowicz5e201abd2018-03-24 00:41:061843bool ChromeContentBrowserClient::ShouldEnableStrictSiteIsolation() {
Aaron Colwell25617f72018-11-27 20:56:341844 return base::FeatureList::IsEnabled(features::kSitePerProcess);
1845}
1846
1847bool ChromeContentBrowserClient::ShouldDisableSiteIsolation() {
Alex Moshchuk7a737b632019-10-10 05:03:371848 return SiteIsolationPolicy::ShouldDisableSiteIsolationDueToMemoryThreshold();
Lukasz Anforowicz5e201abd2018-03-24 00:41:061849}
1850
Alex Moshchuk082b5f82019-03-14 01:34:161851std::vector<std::string>
1852ChromeContentBrowserClient::GetAdditionalSiteIsolationModes() {
1853 if (SiteIsolationPolicy::IsIsolationForPasswordSitesEnabled())
1854 return {"Isolate Password Sites"};
1855 else
1856 return {};
1857}
1858
Alex Moshchuke256d562019-04-26 21:43:571859void ChromeContentBrowserClient::PersistIsolatedOrigin(
1860 content::BrowserContext* context,
1861 const url::Origin& origin) {
1862 DCHECK(!context->IsOffTheRecord());
1863 Profile* profile = Profile::FromBrowserContext(context);
1864 ListPrefUpdate update(profile->GetPrefs(),
1865 prefs::kUserTriggeredIsolatedOrigins);
1866 base::ListValue* list = update.Get();
1867 base::Value value(origin.Serialize());
Jan Wilken Dörriea8cb56302019-06-06 18:59:361868 if (!base::Contains(list->GetList(), value))
Jan Wilken Dörrie91e4ef02019-09-11 08:22:121869 list->Append(std::move(value));
Alex Moshchuke256d562019-04-26 21:43:571870}
1871
Ken Rockot314714c2017-11-05 23:36:241872bool ChromeContentBrowserClient::IsFileAccessAllowed(
1873 const base::FilePath& path,
1874 const base::FilePath& absolute_path,
1875 const base::FilePath& profile_path) {
1876 return ChromeNetworkDelegate::IsAccessAllowed(path, absolute_path,
1877 profile_path);
1878}
1879
[email protected]d2e1a0a2014-06-16 15:49:371880namespace {
1881
1882bool IsAutoReloadEnabled() {
avi3ef9ec9e2014-12-22 22:50:171883 const base::CommandLine& browser_command_line =
1884 *base::CommandLine::ForCurrentProcess();
Elly Fong-Jones5f13ee12019-05-10 19:20:351885 if (browser_command_line.HasSwitch(switches::kEnableAutoReload))
[email protected]d2e1a0a2014-06-16 15:49:371886 return true;
Elly Fong-Jones5f13ee12019-05-10 19:20:351887 if (browser_command_line.HasSwitch(switches::kDisableAutoReload))
[email protected]d2e1a0a2014-06-16 15:49:371888 return false;
[email protected]9ef49b42014-08-07 16:44:241889 return true;
[email protected]d2e1a0a2014-06-16 15:49:371890}
1891
bmcquade5d2d9cf32015-06-19 17:42:281892void MaybeAppendBlinkSettingsSwitchForFieldTrial(
1893 const base::CommandLine& browser_command_line,
1894 base::CommandLine* command_line) {
bmcquade9dd54cc2015-06-22 16:56:521895 // List of field trials that modify the blink-settings command line flag. No
1896 // two field trials in the list should specify the same keys, otherwise one
1897 // field trial may overwrite another. See Source/core/frame/Settings.in in
1898 // Blink for the list of valid keys.
1899 static const char* const kBlinkSettingsFieldTrials[] = {
jkarlin3bddb7d2016-09-21 18:44:161900 // Keys: disallowFetchForDocWrittenScriptsInMainFrame
1901 // disallowFetchForDocWrittenScriptsInMainFrameOnSlowConnections
1902 // disallowFetchForDocWrittenScriptsInMainFrameIfEffectively2G
1903 "DisallowFetchForDocWrittenScriptsInMainFrame",
bmcquade9dd54cc2015-06-22 16:56:521904 };
1905
1906 std::vector<std::string> blink_settings;
1907 for (const char* field_trial_name : kBlinkSettingsFieldTrials) {
1908 // Each blink-settings field trial should include a forcing_flag group,
1909 // to make sure that clients that specify the blink-settings flag on the
1910 // command line are excluded from the experiment groups. To make
1911 // sure we assign clients that specify this flag to the forcing_flag
1912 // group, we must call GetVariationParams for each field trial first
1913 // (for example, before checking HasSwitch() and returning), since
1914 // GetVariationParams has the side-effect of assigning the client to
1915 // a field trial group.
1916 std::map<std::string, std::string> params;
1917 if (variations::GetVariationParams(field_trial_name, &params)) {
1918 for (const auto& param : params) {
1919 blink_settings.push_back(base::StringPrintf(
1920 "%s=%s", param.first.c_str(), param.second.c_str()));
1921 }
1922 }
1923 }
pmeenan9ac669682015-08-17 14:57:031924
bmcquade9dd54cc2015-06-22 16:56:521925 if (blink_settings.empty()) {
bmcquade5d2d9cf32015-06-19 17:42:281926 return;
1927 }
1928
1929 if (browser_command_line.HasSwitch(switches::kBlinkSettings) ||
1930 command_line->HasSwitch(switches::kBlinkSettings)) {
pmeenan9ac669682015-08-17 14:57:031931 // The field trials should be configured to force users that specify the
bmcquade9dd54cc2015-06-22 16:56:521932 // blink-settings flag into a group with no params, and we return
1933 // above if no params were specified, so it's an error if we reach
1934 // this point.
bmcquade5d2d9cf32015-06-19 17:42:281935 LOG(WARNING) << "Received field trial params, "
1936 "but blink-settings switch already specified.";
1937 return;
1938 }
1939
bmcquade5d2d9cf32015-06-19 17:42:281940 command_line->AppendSwitchASCII(switches::kBlinkSettings,
brettwd94a22142015-07-15 05:19:261941 base::JoinString(blink_settings, ","));
bmcquade5d2d9cf32015-06-19 17:42:281942}
1943
[email protected]d2e1a0a2014-06-16 15:49:371944} // namespace
1945
[email protected]b80f68432011-05-02 17:22:301946void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
avi3ef9ec9e2014-12-22 22:50:171947 base::CommandLine* command_line,
1948 int child_process_id) {
Mark Mentovaic67fa64f2015-03-24 14:00:061949#if defined(OS_MACOSX)
dcheng4af48582016-04-19 00:29:351950 std::unique_ptr<metrics::ClientInfo> client_info =
Mark Mentovaic67fa64f2015-03-24 14:00:061951 GoogleUpdateSettings::LoadMetricsClientInfo();
1952 if (client_info) {
1953 command_line->AppendSwitchASCII(switches::kMetricsClientID,
1954 client_info->client_id);
1955 }
1956#elif defined(OS_POSIX)
Joshua Perazaf890e4b2019-01-03 19:19:021957#if defined(OS_ANDROID)
1958 bool enable_crash_reporter = true;
1959#else
Joshua Perazace68e2f2019-09-23 18:44:241960 bool enable_crash_reporter = false;
1961 if (crash_reporter::IsCrashpadEnabled()) {
1962 command_line->AppendSwitch(crash_reporter::kEnableCrashpad);
1963 enable_crash_reporter = true;
1964
1965 int fd;
1966 pid_t pid;
1967 if (crash_reporter::GetHandlerSocket(&fd, &pid)) {
1968 command_line->AppendSwitchASCII(
1969 crash_reporter::switches::kCrashpadHandlerPid,
1970 base::NumberToString(pid));
1971 }
1972 } else {
1973 enable_crash_reporter = breakpad::IsCrashReporterEnabled();
1974 }
Joshua Perazaf890e4b2019-01-03 19:19:021975#endif
1976 if (enable_crash_reporter) {
thestigcb7a59a2016-01-26 02:43:511977 std::string switch_value;
dcheng4af48582016-04-19 00:29:351978 std::unique_ptr<metrics::ClientInfo> client_info =
[email protected]8e885de2014-07-22 23:36:531979 GoogleUpdateSettings::LoadMetricsClientInfo();
thestigcb7a59a2016-01-26 02:43:511980 if (client_info)
1981 switch_value = client_info->client_id;
1982 switch_value.push_back(',');
Boris Vidolov86578012018-03-21 16:55:251983 switch_value.append(chrome::GetChannelName());
[email protected]b80f68432011-05-02 17:22:301984 command_line->AppendSwitchASCII(switches::kEnableCrashReporter,
thestigcb7a59a2016-01-26 02:43:511985 switch_value);
[email protected]b80f68432011-05-02 17:22:301986 }
Mark Mentovaic67fa64f2015-03-24 14:00:061987#endif
[email protected]b80f68432011-05-02 17:22:301988
[email protected]f1933792011-06-14 00:49:341989 if (logging::DialogsAreSuppressed())
1990 command_line->AppendSwitch(switches::kNoErrorDialogs);
1991
[email protected]b80f68432011-05-02 17:22:301992 std::string process_type =
1993 command_line->GetSwitchValueASCII(switches::kProcessType);
avi3ef9ec9e2014-12-22 22:50:171994 const base::CommandLine& browser_command_line =
1995 *base::CommandLine::ForCurrentProcess();
[email protected]9206f2a02013-03-20 01:10:321996
[email protected]7c9b6f92013-09-10 18:11:351997 static const char* const kCommonSwitchNames[] = {
Aran Gilmanf010bdd2019-08-28 19:55:441998 switches::kUserAgent,
1999 switches::kUserDataDir, // Make logs go to the right file.
[email protected]7c9b6f92013-09-10 18:11:352000 };
2001 command_line->CopySwitchesFrom(browser_command_line, kCommonSwitchNames,
Avi Drissmand251e912018-12-26 15:46:372002 base::size(kCommonSwitchNames));
[email protected]9206f2a02013-03-20 01:10:322003
fqj15ff3f72015-10-09 19:20:022004 static const char* const kDinosaurEasterEggSwitches[] = {
blundella5e3240a2016-01-05 11:30:432005 error_page::switches::kDisableDinosaurEasterEgg,
edwardjung7db1c9e2015-03-25 15:44:312006 };
fqj15ff3f72015-10-09 19:20:022007 command_line->CopySwitchesFrom(browser_command_line,
2008 kDinosaurEasterEggSwitches,
Avi Drissmand251e912018-12-26 15:46:372009 base::size(kDinosaurEasterEggSwitches));
edwardjung7db1c9e2015-03-25 15:44:312010
fqj15ff3f72015-10-09 19:20:022011#if defined(OS_CHROMEOS)
[email protected]6bdc52272014-05-27 00:12:332012 // On Chrome OS need to pass primary user homedir (in multi-profiles session).
2013 base::FilePath homedir;
Avi Drissman9098f9002018-05-04 00:11:522014 base::PathService::Get(base::DIR_HOME, &homedir);
[email protected]6bdc52272014-05-27 00:12:332015 command_line->AppendSwitchASCII(chromeos::switches::kHomedir,
2016 homedir.value().c_str());
2017#endif
2018
[email protected]718eab62011-10-05 21:16:522019 if (process_type == switches::kRendererProcess) {
[email protected]a48ab7112014-08-01 16:48:032020 content::RenderProcessHost* process =
2021 content::RenderProcessHost::FromID(child_process_id);
2022 Profile* profile =
2023 process ? Profile::FromBrowserContext(process->GetBrowserContext())
Aran Gilmanf010bdd2019-08-28 19:55:442024 : nullptr;
[email protected]a48ab7112014-08-01 16:48:032025 for (size_t i = 0; i < extra_parts_.size(); ++i) {
Aran Gilmanf010bdd2019-08-28 19:55:442026 extra_parts_[i]->AppendExtraRendererCommandLineSwitches(command_line,
2027 process, profile);
[email protected]a48ab7112014-08-01 16:48:032028 }
2029
[email protected]b80f68432011-05-02 17:22:302030#if defined(OS_CHROMEOS)
Aran Gilmanf010bdd2019-08-28 19:55:442031 const std::string& login_profile = browser_command_line.GetSwitchValueASCII(
2032 chromeos::switches::kLoginProfile);
[email protected]b80f68432011-05-02 17:22:302033 if (!login_profile.empty())
Aran Gilmanf010bdd2019-08-28 19:55:442034 command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile,
2035 login_profile);
[email protected]b80f68432011-05-02 17:22:302036#endif
2037
Aran Gilmanf010bdd2019-08-28 19:55:442038 MaybeCopyDisableWebRtcEncryptionSwitch(command_line, browser_command_line,
sdefresne9fb67692015-08-03 18:48:222039 chrome::GetChannel());
[email protected]a8d851f82011-12-21 00:32:372040 if (process) {
[email protected]a8d851f82011-12-21 00:32:372041 PrefService* prefs = profile->GetPrefs();
2042 // Currently this pref is only registered if applied via a policy.
2043 if (prefs->HasPrefPath(prefs::kDisable3DAPIs) &&
2044 prefs->GetBoolean(prefs::kDisable3DAPIs)) {
2045 // Turn this policy into a command line switch.
2046 command_line->AppendSwitch(switches::kDisable3DAPIs);
2047 }
[email protected]718eab62011-10-05 21:16:522048
[email protected]1733b782014-06-19 18:51:552049 const base::ListValue* switches =
2050 prefs->GetList(prefs::kEnableDeprecatedWebPlatformFeatures);
2051 if (switches) {
2052 // Enable any deprecated features that have been re-enabled by policy.
jdoerrie601c7152018-10-02 23:43:112053 for (auto it = switches->begin(); it != switches->end(); ++it) {
[email protected]1733b782014-06-19 18:51:552054 std::string switch_to_enable;
jdoerriea5676c62017-04-11 18:09:142055 if (it->GetAsString(&switch_to_enable))
[email protected]1733b782014-06-19 18:51:552056 command_line->AppendSwitch(switch_to_enable);
2057 }
2058 }
2059
[email protected]a8d851f82011-12-21 00:32:372060 // Disable client-side phishing detection in the renderer if it is
2061 // disabled in the Profile preferences or the browser process.
2062 if (!prefs->GetBoolean(prefs::kSafeBrowsingEnabled) ||
2063 !g_browser_process->safe_browsing_detection_service()) {
2064 command_line->AppendSwitch(
2065 switches::kDisableClientSidePhishingDetection);
2066 }
[email protected]0045b0f42012-07-26 11:52:082067
vitalybukaa7ae5052014-09-26 04:11:132068 if (prefs->GetBoolean(prefs::kPrintPreviewDisabled))
2069 command_line->AppendSwitch(switches::kDisablePrintPreview);
2070
Marc Treib7895941d2017-11-28 12:37:022071#if !defined(OS_ANDROID)
[email protected]c5dec6292013-01-25 04:54:522072 InstantService* instant_service =
2073 InstantServiceFactory::GetForProfile(profile);
2074 if (instant_service &&
Chris Palmerac7d75642017-11-22 20:12:542075 instant_service->IsInstantProcess(process->GetID())) {
[email protected]c5dec6292013-01-25 04:54:522076 command_line->AppendSwitch(switches::kInstantProcess);
Chris Palmerac7d75642017-11-22 20:12:542077 }
Marc Treib7895941d2017-11-28 12:37:022078#endif
fqjba8749c2015-10-29 15:33:072079
fqj38306f7b2015-11-02 16:59:062080 if (prefs->HasPrefPath(prefs::kAllowDinosaurEasterEgg) &&
Chris Palmerac7d75642017-11-22 20:12:542081 !prefs->GetBoolean(prefs::kAllowDinosaurEasterEgg)) {
blundella5e3240a2016-01-05 11:30:432082 command_line->AppendSwitch(
2083 error_page::switches::kDisableDinosaurEasterEgg);
Chris Palmerac7d75642017-11-22 20:12:542084 }
Daniel Vogelheim976f1c22017-11-22 16:26:032085
Lukasz Anforowicz60d1253d2019-05-08 16:31:372086 MaybeAppendSecureOriginsAllowlistSwitch(command_line);
2087
Amr Aboelkherb04cbf32019-04-29 15:17:102088 if (prefs->HasPrefPath(prefs::kAllowPopupsDuringPageUnload) &&
2089 prefs->GetBoolean(prefs::kAllowPopupsDuringPageUnload)) {
Avi Drissmanfb961262019-03-05 22:50:292090 command_line->AppendSwitch(switches::kAllowPopupsDuringPageUnload);
Amr Aboelkherb04cbf32019-04-29 15:17:102091 }
Katie Dillonc25ee5c92019-09-12 17:05:422092
2093 if (prefs->HasPrefPath(prefs::kAllowSyncXHRInPageDismissal) &&
2094 prefs->GetBoolean(prefs::kAllowSyncXHRInPageDismissal)) {
2095 command_line->AppendSwitch(switches::kAllowSyncXHRInPageDismissal);
2096 }
Takashi Toyoshima128441462019-10-16 04:19:172097
Takashi Toyoshima0dab73302019-10-18 01:51:362098 if (!profile->ShouldEnableOutOfBlinkCors()) {
2099 command_line->AppendSwitch(
2100 network::switches::kForceToDisableOutOfBlinkCors);
2101 }
[email protected]47c7ec82012-01-18 03:29:212102 }
[email protected]4287a3d2011-06-13 23:56:512103
[email protected]d2e1a0a2014-06-16 15:49:372104 if (IsAutoReloadEnabled())
Elly Fong-Jones5f13ee12019-05-10 19:20:352105 command_line->AppendSwitch(switches::kEnableAutoReload);
[email protected]28ee4e72014-03-28 19:29:042106
Aran Gilmanf010bdd2019-08-28 19:55:442107 MaybeAppendBlinkSettingsSwitchForFieldTrial(browser_command_line,
2108 command_line);
bmcquade5d2d9cf32015-06-19 17:42:282109
mdjonesa6b9e172016-09-23 16:24:302110#if defined(OS_ANDROID)
2111 // If the platform is Android, force the distillability service on.
2112 command_line->AppendSwitch(switches::kEnableDistillabilityService);
2113#endif
2114
[email protected]47c7ec82012-01-18 03:29:212115 // Please keep this in alphabetical order.
[email protected]4287a3d2011-06-13 23:56:512116 static const char* const kSwitchNames[] = {
estade0ee91262014-10-23 19:29:192117 autofill::switches::kIgnoreAutocompleteOffForAutofill,
kolosad369932017-02-23 13:29:412118 autofill::switches::kShowAutofillSignatures,
Chris Mumford6b1696b2019-01-25 02:54:302119#if defined(OS_CHROMEOS)
2120 switches::kShortMergeSessionTimeoutForTest, // For tests only.
2121#endif
brettw00899e62016-11-12 02:10:172122#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]558878cc82013-11-09 01:25:512123 extensions::switches::kAllowHTTPBackgroundPage,
[email protected]49d9b142013-07-19 08:50:272124 extensions::switches::kAllowLegacyExtensionManifests,
Chris Mumford3f0eda92018-07-23 14:51:172125 extensions::switches::kDisableExtensionsHttpThrottling,
[email protected]c8d02992013-07-31 22:16:512126 extensions::switches::kEnableExperimentalExtensionApis,
[email protected]49d9b142013-07-19 08:50:272127 extensions::switches::kExtensionsOnChromeURLs,
Chris Mumford3f0eda92018-07-23 14:51:172128 extensions::switches::kSetExtensionThrottleTestParams, // For tests only.
[email protected]a612eb32014-03-31 22:09:172129 extensions::switches::kWhitelistedExtensionID,
thestig2dbee717e2014-09-05 14:54:282130#endif
estark4b003b332015-02-14 01:07:052131 switches::kAllowInsecureLocalhost,
[email protected]4287a3d2011-06-13 23:56:512132 switches::kAppsGalleryURL,
[email protected]09cff78782014-04-20 22:04:482133 switches::kCloudPrintURL,
[email protected]6f5c141a2014-04-15 21:44:512134 switches::kCloudPrintXmppEndpoint,
[email protected]382fb0d2012-02-25 00:19:502135 switches::kDisableBundledPpapiFlash,
dslomova893e972014-12-05 09:39:572136 switches::kDisableJavaScriptHarmonyShipping,
Kyle Milkab5c048e2017-07-07 02:38:462137 variations::switches::kEnableBenchmarking,
mdjonesa6b9e172016-09-23 16:24:302138 switches::kEnableDistillabilityService,
[email protected]4287a3d2011-06-13 23:56:512139 switches::kEnableNaCl,
Nico Weberaf3b00b2017-09-11 17:58:172140#if BUILDFLAG(ENABLE_NACL)
[email protected]1b4ec382014-03-07 02:32:242141 switches::kEnableNaClDebug,
[email protected]b2c73f42014-03-07 15:44:482142 switches::kEnableNaClNonSfiMode,
[email protected]a56f8322014-07-16 21:13:552143#endif
[email protected]ce304ce2013-02-22 21:54:452144 switches::kEnableNetBenchmarking,
Nico Weberaf3b00b2017-09-11 17:58:172145#if BUILDFLAG(ENABLE_NACL)
stichnot7040ac832016-02-24 23:40:592146 switches::kForcePNaClSubzero,
2147#endif
Marc Treibad33cf942017-08-24 11:19:002148 switches::kForceUIDirection,
erikcorryb251cb92014-09-25 23:48:512149 switches::kJavaScriptHarmony,
Andreas Haasb400d912019-08-28 18:54:102150 switches::kEnableExperimentalWebAssemblyFeatures,
iclelland79237e92016-06-23 12:03:512151 switches::kOriginTrialDisabledFeatures,
chasejdfec22ae2017-03-16 20:58:552152 switches::kOriginTrialDisabledTokens,
iclellandee4f4a72016-04-26 18:59:022153 switches::kOriginTrialPublicKey,
[email protected]4287a3d2011-06-13 23:56:512154 switches::kPpapiFlashArgs,
[email protected]4287a3d2011-06-13 23:56:512155 switches::kPpapiFlashPath,
2156 switches::kPpapiFlashVersion,
wychene55687342015-11-13 20:17:032157 switches::kReaderModeHeuristics,
[email protected]499e7c52013-10-04 16:03:092158 translate::switches::kTranslateSecurityOrigin,
[email protected]4287a3d2011-06-13 23:56:512159 };
2160
2161 command_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
Avi Drissmand251e912018-12-26 15:46:372162 base::size(kSwitchNames));
[email protected]3cb054e62011-06-13 05:21:172163 } else if (process_type == switches::kUtilityProcess) {
brettw00899e62016-11-12 02:10:172164#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]a446534d2012-02-09 00:07:382165 static const char* const kSwitchNames[] = {
Aran Gilmanf010bdd2019-08-28 19:55:442166 extensions::switches::kAllowHTTPBackgroundPage,
2167 extensions::switches::kEnableExperimentalExtensionApis,
2168 extensions::switches::kExtensionsOnChromeURLs,
2169 extensions::switches::kWhitelistedExtensionID,
[email protected]a446534d2012-02-09 00:07:382170 };
2171
2172 command_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
Avi Drissmand251e912018-12-26 15:46:372173 base::size(kSwitchNames));
thestig2dbee717e2014-09-05 14:54:282174#endif
Lukasz Anforowicz60d1253d2019-05-08 16:31:372175 MaybeAppendSecureOriginsAllowlistSwitch(command_line);
Jay Civelli668c097f2018-05-16 20:44:132176 } else if (process_type == service_manager::switches::kZygoteProcess) {
[email protected]4287a3d2011-06-13 23:56:512177 static const char* const kSwitchNames[] = {
[email protected]4287a3d2011-06-13 23:56:512178 // Load (in-process) Pepper plugins in-process in the zygote pre-sandbox.
[email protected]382fb0d2012-02-25 00:19:502179 switches::kDisableBundledPpapiFlash,
Nico Weberaf3b00b2017-09-11 17:58:172180#if BUILDFLAG(ENABLE_NACL)
rickyz3638a212014-10-29 23:50:242181 switches::kEnableNaClDebug,
[email protected]a9a8e2f2014-05-13 23:32:582182 switches::kEnableNaClNonSfiMode,
stichnot7040ac832016-02-24 23:40:592183 switches::kForcePNaClSubzero,
[email protected]0b470342014-04-15 12:59:412184 switches::kNaClDangerousNoSandboxNonSfi,
[email protected]a56f8322014-07-16 21:13:552185#endif
[email protected]4287a3d2011-06-13 23:56:512186 switches::kPpapiFlashPath,
2187 switches::kPpapiFlashVersion,
2188 };
2189
2190 command_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
Avi Drissmand251e912018-12-26 15:46:372191 base::size(kSwitchNames));
[email protected]d56ecf922012-02-15 16:03:112192 } else if (process_type == switches::kGpuProcess) {
2193 // If --ignore-gpu-blacklist is passed in, don't send in crash reports
2194 // because GPU is expected to be unreliable.
2195 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) &&
2196 !command_line->HasSwitch(switches::kDisableBreakpad))
2197 command_line->AppendSwitch(switches::kDisableBreakpad);
[email protected]b80f68432011-05-02 17:22:302198 }
[email protected]6f08af82011-09-15 01:19:032199
Ian Barkley-Yeung550aae052019-07-11 00:11:112200#if defined(OS_CHROMEOS)
Joshua Peraza30d8fc72019-08-19 17:24:302201 if (ChromeCrashReporterClient::ShouldPassCrashLoopBefore(process_type)) {
Ian Barkley-Yeung550aae052019-07-11 00:11:112202 static const char* const kSwitchNames[] = {
Joshua Peraza86b79582019-10-08 15:56:292203 crash_reporter::switches::kCrashLoopBefore,
Ian Barkley-Yeung550aae052019-07-11 00:11:112204 };
2205 command_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
2206 base::size(kSwitchNames));
2207 }
2208#endif
2209
wittman832321f52016-10-10 18:18:382210 StackSamplingConfiguration::Get()->AppendCommandLineSwitchForChildProcess(
Aran Gilmanf010bdd2019-08-28 19:55:442211 process_type, command_line);
Andrew Comminos66057672019-05-01 00:03:342212
2213#if defined(OS_LINUX)
2214 // Processes may only query perf_event_open with the BPF sandbox disabled.
2215 if (browser_command_line.HasSwitch(switches::kEnableThreadInstructionCount) &&
2216 command_line->HasSwitch(service_manager::switches::kNoSandbox)) {
2217 command_line->AppendSwitch(switches::kEnableThreadInstructionCount);
2218 }
2219#endif
[email protected]b80f68432011-05-02 17:22:302220}
2221
Scott Violet776edf82017-09-29 02:03:012222void ChromeContentBrowserClient::AdjustUtilityServiceProcessCommandLine(
2223 const service_manager::Identity& identity,
2224 base::CommandLine* command_line) {
Guido Urdaneta191635e2018-05-09 16:00:532225#if defined(OS_MACOSX)
Ken Rockot2f8c1dd22019-07-23 21:56:022226 // On Mac, the audio service requires a CFRunLoop, provided by a UI message
2227 // loop, to run AVFoundation and CoreAudio code. See https://crbug.com/834581.
2228 if (identity.name() == audio::mojom::kServiceName)
Guido Urdaneta191635e2018-05-09 16:00:532229 command_line->AppendSwitch(switches::kMessageLoopTypeUi);
2230#endif
Scott Violet776edf82017-09-29 02:03:012231}
2232
Olivier Yiptong0daa93f2019-08-22 19:40:082233std::string
2234ChromeContentBrowserClient::GetApplicationClientGUIDForQuarantineCheck() {
2235 return std::string(chrome::kApplicationClientIDStringForAVScanning);
2236}
2237
[email protected]b80f68432011-05-02 17:22:302238std::string ChromeContentBrowserClient::GetApplicationLocale() {
[email protected]e9a32a52012-06-14 23:32:432239 if (BrowserThread::CurrentlyOn(BrowserThread::IO))
Lei Zhang2cfceac2018-11-14 19:36:332240 return GetIOThreadApplicationLocale();
[email protected]b80f68432011-05-02 17:22:302241 return g_browser_process->GetApplicationLocale();
2242}
2243
[email protected]597a867b2011-11-18 18:31:202244std::string ChromeContentBrowserClient::GetAcceptLangs(
2245 content::BrowserContext* context) {
2246 Profile* profile = Profile::FromBrowserContext(context);
Alexandre Frechette572755b2019-02-13 22:30:202247 return profile->GetPrefs()->GetString(language::prefs::kAcceptLanguages);
[email protected]b5cca982011-05-26 04:42:082248}
2249
Dana Fried34d580002019-04-24 20:05:482250gfx::ImageSkia ChromeContentBrowserClient::GetDefaultFavicon() {
Lei Zhang7640d542017-10-03 16:26:492251 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
Dana Fried34d580002019-04-24 20:05:482252 return rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).AsImageSkia();
[email protected]ac55e292011-06-24 05:16:082253}
2254
bengre8a146f2016-03-10 01:20:222255bool ChromeContentBrowserClient::IsDataSaverEnabled(
2256 content::BrowserContext* browser_context) {
rajendrantfb95964d2019-10-17 20:05:382257 if (!browser_context || browser_context->IsOffTheRecord())
2258 return false;
2259
Robert Ogdenc995d4fe2019-03-25 19:18:372260 Profile* profile = Profile::FromBrowserContext(browser_context);
2261 return profile && data_reduction_proxy::DataReductionProxySettings::
2262 IsDataSaverEnabledByUser(profile->GetPrefs());
bengre8a146f2016-03-10 01:20:222263}
2264
Kenichi Ishibashi46329872018-07-17 09:43:402265void ChromeContentBrowserClient::UpdateRendererPreferencesForWorker(
2266 content::BrowserContext* browser_context,
Leon Hanc819dc62019-01-28 04:30:192267 blink::mojom::RendererPreferences* out_prefs) {
Kenichi Ishibashi46329872018-07-17 09:43:402268 DCHECK(browser_context);
2269 DCHECK(out_prefs);
2270 renderer_preferences_util::UpdateFromSystemSettings(
2271 out_prefs, Profile::FromBrowserContext(browser_context));
2272}
2273
Clark DuVall5690e742019-07-17 18:26:172274bool ChromeContentBrowserClient::AllowAppCache(
2275 const GURL& manifest_url,
2276 const GURL& first_party,
2277 content::BrowserContext* context) {
2278 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2279 return CookieSettingsFactory::GetForProfile(
2280 Profile::FromBrowserContext(context))
2281 ->IsCookieAccessAllowed(manifest_url, first_party);
2282}
2283
Matt Falkenhagen7b509e52019-08-15 23:11:412284bool ChromeContentBrowserClient::AllowServiceWorkerOnIO(
falken3dbc36e2014-10-10 16:48:072285 const GURL& scope,
Christian Dullweber2a2f2182019-09-25 15:44:542286 const GURL& site_for_cookies,
2287 const base::Optional<url::Origin>& top_frame_origin,
David Bertoni3b3597d82019-06-22 02:29:362288 const GURL& script_url,
falken4a22dce2015-04-30 08:25:202289 content::ResourceContext* context,
tzikdf81f142018-10-26 00:23:342290 base::RepeatingCallback<content::WebContents*()> wc_getter) {
thestig00844cea2015-09-08 21:44:522291 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Christian Dullweber2a2f2182019-09-25 15:44:542292 GURL first_party_url = top_frame_origin ? top_frame_origin->GetURL() : GURL();
rdevlin.croninf5863da2015-09-10 19:21:452293
brettw00899e62016-11-12 02:10:172294#if BUILDFLAG(ENABLE_EXTENSIONS)
rdevlin.croninf5863da2015-09-10 19:21:452295 // Check if this is an extension-related service worker, and, if so, if it's
2296 // allowed (this can return false if, e.g., the extension is disabled).
2297 // If it's not allowed, return immediately. We deliberately do *not* report
2298 // to the TabSpecificContentSettings, since the service worker is blocked
2299 // because of the extension, rather than because of the user's content
2300 // settings.
Matt Falkenhagena59e1cce2019-08-22 23:45:022301 if (!ChromeContentBrowserClientExtensionsPart::AllowServiceWorkerOnIO(
David Bertoni3b3597d82019-06-22 02:29:362302 scope, first_party_url, script_url, context)) {
rdevlin.croninf5863da2015-09-10 19:21:452303 return false;
2304 }
2305#endif
2306
falken3dbc36e2014-10-10 16:48:072307 ProfileIOData* io_data = ProfileIOData::FromResourceContext(context);
falken4a22dce2015-04-30 08:25:202308
shimazuce8af88122016-10-06 23:49:212309 // Check if JavaScript is allowed.
2310 content_settings::SettingInfo info;
2311 std::unique_ptr<base::Value> value =
2312 io_data->GetHostContentSettingsMap()->GetWebsiteSetting(
Darin Fisher42f5e7d2019-10-30 07:15:452313 first_party_url, first_party_url, ContentSettingsType::JAVASCRIPT,
shimazuce8af88122016-10-06 23:49:212314 std::string(), &info);
2315 ContentSetting setting = content_settings::ValueToContentSetting(value.get());
2316 bool allow_javascript = (setting == CONTENT_SETTING_ALLOW);
2317
2318 // Check if cookies are allowed.
Christian Dullweber2a2f2182019-09-25 15:44:542319 bool allow_cookies = io_data->GetCookieSettings()->IsCookieAccessAllowed(
2320 scope, site_for_cookies, top_frame_origin);
falken4a22dce2015-04-30 08:25:202321 // Record access to database for potential display in UI.
yzshenbc36c972016-12-21 21:39:242322 // Only post the task if this is for a specific tab.
2323 if (!wc_getter.is_null()) {
Sami Kyostila5e1306d2019-08-14 11:01:292324 base::PostTask(
Eric Seckler8652dcd52018-09-20 10:42:282325 FROM_HERE, {BrowserThread::UI},
tzik29ea5c72017-04-20 02:16:512326 base::BindOnce(&TabSpecificContentSettings::ServiceWorkerAccessed,
tzikdf81f142018-10-26 00:23:342327 std::move(wc_getter), scope, !allow_javascript,
Christian Dullweber2a2f2182019-09-25 15:44:542328 !allow_cookies));
rdevlin.croninf5863da2015-09-10 19:21:452329 }
Christian Dullweber2a2f2182019-09-25 15:44:542330 return allow_javascript && allow_cookies;
falken3dbc36e2014-10-10 16:48:072331}
2332
Matt Falkenhagen7b509e52019-08-15 23:11:412333bool ChromeContentBrowserClient::AllowServiceWorkerOnUI(
2334 const GURL& scope,
Christian Dullweber2a2f2182019-09-25 15:44:542335 const GURL& site_for_cookies,
2336 const base::Optional<url::Origin>& top_frame_origin,
Matt Falkenhagen7b509e52019-08-15 23:11:412337 const GURL& script_url,
2338 content::BrowserContext* context,
2339 base::RepeatingCallback<content::WebContents*()> wc_getter) {
2340 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Christian Dullweber2a2f2182019-09-25 15:44:542341 GURL first_party_url = top_frame_origin ? top_frame_origin->GetURL() : GURL();
Matt Falkenhagen7b509e52019-08-15 23:11:412342
2343#if BUILDFLAG(ENABLE_EXTENSIONS)
Matt Falkenhagena59e1cce2019-08-22 23:45:022344 // Check if this is an extension-related service worker, and, if so, if it's
2345 // allowed (this can return false if, e.g., the extension is disabled).
2346 // If it's not allowed, return immediately. We deliberately do *not* report
2347 // to the TabSpecificContentSettings, since the service worker is blocked
2348 // because of the extension, rather than because of the user's content
2349 // settings.
2350 if (!ChromeContentBrowserClientExtensionsPart::AllowServiceWorkerOnUI(
2351 scope, first_party_url, script_url, context)) {
2352 return false;
2353 }
Matt Falkenhagen7b509e52019-08-15 23:11:412354#endif
2355
2356 Profile* profile = Profile::FromBrowserContext(context);
2357
2358 // Check if JavaScript is allowed.
2359 content_settings::SettingInfo info;
2360 std::unique_ptr<base::Value> value =
2361 HostContentSettingsMapFactory::GetForProfile(profile)->GetWebsiteSetting(
Darin Fisher42f5e7d2019-10-30 07:15:452362 first_party_url, first_party_url, ContentSettingsType::JAVASCRIPT,
Matt Falkenhagen7b509e52019-08-15 23:11:412363 std::string(), &info);
2364 ContentSetting setting = content_settings::ValueToContentSetting(value.get());
2365 bool allow_javascript = (setting == CONTENT_SETTING_ALLOW);
2366
2367 // Check if cookies are allowed.
2368 bool allow_cookies =
2369 CookieSettingsFactory::GetForProfile(profile)->IsCookieAccessAllowed(
Christian Dullweber2a2f2182019-09-25 15:44:542370 scope, site_for_cookies, top_frame_origin);
Matt Falkenhagen7b509e52019-08-15 23:11:412371
2372 // Record access to database for potential display in UI.
2373 // Only post the task if this is for a specific tab.
2374 if (!wc_getter.is_null()) {
2375 TabSpecificContentSettings::ServiceWorkerAccessed(
2376 std::move(wc_getter), scope, !allow_javascript, !allow_cookies);
2377 }
2378 return allow_javascript && allow_cookies;
2379}
2380
Jochen Eisinger0ff7645c2017-11-28 08:11:262381bool ChromeContentBrowserClient::AllowSharedWorker(
2382 const GURL& worker_url,
Christian Dullweber2a2f2182019-09-25 15:44:542383 const GURL& site_for_cookies,
2384 const base::Optional<url::Origin>& top_frame_origin,
Jochen Eisinger0ff7645c2017-11-28 08:11:262385 const std::string& name,
Hiroki Nakagawa018bb6d2017-11-30 03:31:372386 const url::Origin& constructor_origin,
Jochen Eisinger0ff7645c2017-11-28 08:11:262387 content::BrowserContext* context,
2388 int render_process_id,
2389 int render_frame_id) {
2390 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2391
2392 // Check if cookies are allowed.
2393 bool allow =
2394 CookieSettingsFactory::GetForProfile(Profile::FromBrowserContext(context))
Christian Dullweber2a2f2182019-09-25 15:44:542395 ->IsCookieAccessAllowed(worker_url, site_for_cookies,
2396 top_frame_origin);
Jochen Eisinger0ff7645c2017-11-28 08:11:262397
2398 TabSpecificContentSettings::SharedWorkerAccessed(
Hiroki Nakagawa018bb6d2017-11-30 03:31:372399 render_process_id, render_frame_id, worker_url, name, constructor_origin,
2400 !allow);
Jochen Eisinger0ff7645c2017-11-28 08:11:262401 return allow;
2402}
2403
Patrick Monette6cb099a2019-09-18 19:31:272404bool ChromeContentBrowserClient::DoesSchemeAllowCrossOriginSharedWorker(
2405 const std::string& scheme) {
2406#if BUILDFLAG(ENABLE_EXTENSIONS)
2407 // Extensions are allowed to start cross-origin shared workers.
2408 if (scheme == extensions::kExtensionScheme)
2409 return true;
2410#endif
2411
2412 return false;
2413}
2414
Clark DuVallab63d142019-07-23 04:24:362415bool ChromeContentBrowserClient::AllowSignedExchange(
2416 content::BrowserContext* browser_context) {
2417 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2418 Profile* profile = Profile::FromBrowserContext(browser_context);
2419 return profile->GetPrefs()->GetBoolean(prefs::kSignedHTTPExchangeEnabled);
2420}
2421
[email protected]f917df22014-07-10 07:45:492422void ChromeContentBrowserClient::AllowWorkerFileSystem(
[email protected]5c5a88e2011-11-12 00:45:352423 const GURL& url,
John Abd-El-Malek2a18d98d2019-08-08 04:31:572424 content::BrowserContext* browser_context,
Lukasz Anforowicz09060bdf72018-08-23 15:53:172425 const std::vector<content::GlobalFrameRoutingId>& render_frames,
John Abd-El-Malek2a18d98d2019-08-08 04:31:572426 base::OnceCallback<void(bool)> callback) {
2427 Profile* profile = Profile::FromBrowserContext(browser_context);
2428 auto cookie_settings = CookieSettingsFactory::GetForProfile(profile);
falken71691402017-01-27 03:38:002429 bool allow = cookie_settings->IsCookieAccessAllowed(url, url);
[email protected]5c5a88e2011-11-12 00:45:352430
brettw00899e62016-11-12 02:10:172431#if BUILDFLAG(ENABLE_EXTENSIONS)
John Abd-El-Malek2a18d98d2019-08-08 04:31:572432 GuestPermissionRequestHelper(url, render_frames, std::move(callback), allow);
[email protected]f917df22014-07-10 07:45:492433#else
John Abd-El-Malek2a18d98d2019-08-08 04:31:572434 FileSystemAccessed(url, render_frames, std::move(callback), allow);
[email protected]f917df22014-07-10 07:45:492435#endif
2436}
2437
brettw00899e62016-11-12 02:10:172438#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]f917df22014-07-10 07:45:492439void ChromeContentBrowserClient::GuestPermissionRequestHelper(
2440 const GURL& url,
Lukasz Anforowicz09060bdf72018-08-23 15:53:172441 const std::vector<content::GlobalFrameRoutingId>& render_frames,
John Abd-El-Malek2a18d98d2019-08-08 04:31:572442 base::OnceCallback<void(bool)> callback,
[email protected]f917df22014-07-10 07:45:492443 bool allow) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572444 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]f917df22014-07-10 07:45:492445 std::map<int, int> process_map;
2446 std::map<int, int>::const_iterator it;
2447 bool has_web_view_guest = false;
2448 // Record access to file system for potential display in UI.
Lukasz Anforowicz09060bdf72018-08-23 15:53:172449 for (const auto& it : render_frames) {
2450 if (process_map.find(it.child_id) != process_map.end())
[email protected]f917df22014-07-10 07:45:492451 continue;
2452
Lukasz Anforowicz09060bdf72018-08-23 15:53:172453 process_map.insert(std::pair<int, int>(it.child_id, it.frame_routing_id));
[email protected]f917df22014-07-10 07:45:492454
Lukasz Anforowicz09060bdf72018-08-23 15:53:172455 if (extensions::WebViewRendererState::GetInstance()->IsGuest(it.child_id))
[email protected]f917df22014-07-10 07:45:492456 has_web_view_guest = true;
2457 }
2458 if (!has_web_view_guest) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572459 FileSystemAccessed(url, render_frames, std::move(callback), allow);
[email protected]f917df22014-07-10 07:45:492460 return;
2461 }
[email protected]dffb9fc2014-07-16 04:14:022462 DCHECK_EQ(1U, process_map.size());
[email protected]f917df22014-07-10 07:45:492463 it = process_map.begin();
[email protected]f917df22014-07-10 07:45:492464
[email protected]140d6cd92014-08-12 18:26:462465 extensions::WebViewPermissionHelper* web_view_permission_helper =
John Abd-El-Malek2a18d98d2019-08-08 04:31:572466 extensions::WebViewPermissionHelper::FromFrameID(it->first, it->second);
2467 web_view_permission_helper->RequestFileSystemPermission(
2468 url, allow,
2469 base::BindOnce(&ChromeContentBrowserClient::FileSystemAccessed,
2470 weak_factory_.GetWeakPtr(), url, render_frames,
2471 std::move(callback)));
[email protected]f917df22014-07-10 07:45:492472}
2473#endif
2474
2475void ChromeContentBrowserClient::FileSystemAccessed(
2476 const GURL& url,
Lukasz Anforowicz09060bdf72018-08-23 15:53:172477 const std::vector<content::GlobalFrameRoutingId>& render_frames,
John Abd-El-Malek2a18d98d2019-08-08 04:31:572478 base::OnceCallback<void(bool)> callback,
[email protected]f917df22014-07-10 07:45:492479 bool allow) {
[email protected]62151052012-02-01 18:40:482480 // Record access to file system for potential display in UI.
Lukasz Anforowicz09060bdf72018-08-23 15:53:172481 for (const auto& it : render_frames) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572482 TabSpecificContentSettings::FileSystemAccessed(
2483 it.child_id, it.frame_routing_id, url, !allow);
[email protected]5c5a88e2011-11-12 00:45:352484 }
John Abd-El-Malek2a18d98d2019-08-08 04:31:572485 std::move(callback).Run(allow);
[email protected]5c5a88e2011-11-12 00:45:352486}
2487
[email protected]7c5ff9a2012-03-02 07:42:492488bool ChromeContentBrowserClient::AllowWorkerIndexedDB(
2489 const GURL& url,
John Abd-El-Malek2a18d98d2019-08-08 04:31:572490 content::BrowserContext* browser_context,
Lukasz Anforowicz09060bdf72018-08-23 15:53:172491 const std::vector<content::GlobalFrameRoutingId>& render_frames) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572492 Profile* profile = Profile::FromBrowserContext(browser_context);
2493 auto cookie_settings = CookieSettingsFactory::GetForProfile(profile);
2494
falken71691402017-01-27 03:38:002495 bool allow = cookie_settings->IsCookieAccessAllowed(url, url);
[email protected]7c5ff9a2012-03-02 07:42:492496
2497 // Record access to IndexedDB for potential display in UI.
Lukasz Anforowicz09060bdf72018-08-23 15:53:172498 for (const auto& it : render_frames) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572499 TabSpecificContentSettings::IndexedDBAccessed(
2500 it.child_id, it.frame_routing_id, url, !allow);
[email protected]7c5ff9a2012-03-02 07:42:492501 }
2502
2503 return allow;
2504}
2505
Ben Kelly6b2e61c2019-03-14 16:06:292506bool ChromeContentBrowserClient::AllowWorkerCacheStorage(
2507 const GURL& url,
John Abd-El-Malek2a18d98d2019-08-08 04:31:572508 content::BrowserContext* browser_context,
Ben Kelly6b2e61c2019-03-14 16:06:292509 const std::vector<content::GlobalFrameRoutingId>& render_frames) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572510 Profile* profile = Profile::FromBrowserContext(browser_context);
2511 auto cookie_settings = CookieSettingsFactory::GetForProfile(profile);
Ben Kelly6b2e61c2019-03-14 16:06:292512 bool allow = cookie_settings->IsCookieAccessAllowed(url, url);
2513
2514 // Record access to CacheStorage for potential display in UI.
2515 for (const auto& it : render_frames) {
John Abd-El-Malek2a18d98d2019-08-08 04:31:572516 TabSpecificContentSettings::CacheStorageAccessed(
2517 it.child_id, it.frame_routing_id, url, !allow);
Ben Kelly6b2e61c2019-03-14 16:06:292518 }
2519
2520 return allow;
2521}
2522
jyasskinc993ce8d2016-03-31 00:38:342523ChromeContentBrowserClient::AllowWebBluetoothResult
2524ChromeContentBrowserClient::AllowWebBluetooth(
jyasskin98bdd3992016-02-26 20:25:452525 content::BrowserContext* browser_context,
2526 const url::Origin& requesting_origin,
2527 const url::Origin& embedding_origin) {
jyasskinc993ce8d2016-03-31 00:38:342528 // TODO(crbug.com/598890): Don't disable if
2529 // base::CommandLine::ForCurrentProcess()->
2530 // HasSwitch(switches::kEnableWebBluetooth) is true.
2531 if (variations::GetVariationParamValue(
2532 PermissionContextBase::kPermissionsKillSwitchFieldStudy,
2533 "Bluetooth") ==
2534 PermissionContextBase::kPermissionsKillSwitchBlockedValue) {
2535 // The kill switch is enabled for this permission. Block requests.
2536 return AllowWebBluetoothResult::BLOCK_GLOBALLY_DISABLED;
2537 }
2538
jyasskin98bdd3992016-02-26 20:25:452539 const HostContentSettingsMap* const content_settings =
2540 HostContentSettingsMapFactory::GetForProfile(
2541 Profile::FromBrowserContext(browser_context));
2542
csharrisonaec2c542016-10-12 19:40:362543 if (content_settings->GetContentSetting(
2544 requesting_origin.GetURL(), embedding_origin.GetURL(),
Darin Fisher42f5e7d2019-10-30 07:15:452545 ContentSettingsType::BLUETOOTH_GUARD,
csharrisonaec2c542016-10-12 19:40:362546 std::string()) == CONTENT_SETTING_BLOCK) {
jyasskinc993ce8d2016-03-31 00:38:342547 return AllowWebBluetoothResult::BLOCK_POLICY;
2548 }
2549 return AllowWebBluetoothResult::ALLOW;
jyasskin98bdd3992016-02-26 20:25:452550}
2551
beaufort.francois01135bf2016-11-23 14:37:362552std::string ChromeContentBrowserClient::GetWebBluetoothBlocklist() {
2553 return variations::GetVariationParamValue("WebBluetoothBlocklist",
2554 "blocklist_additions");
scheib74250322016-04-07 03:32:212555}
2556
John Abd-El-Malek21bca7c2018-10-26 22:13:332557#if defined(OS_CHROMEOS)
John Abd-El-Maleka5b1a5d602018-11-05 19:20:522558void ChromeContentBrowserClient::OnTrustAnchorUsed(
John Abd-El-Malek35bfaa52019-08-20 16:22:072559 content::BrowserContext* browser_context) {
2560 user_manager::UserManager* user_manager = user_manager::UserManager::Get();
2561 if (user_manager) {
2562 const user_manager::User* user =
2563 chromeos::ProfileHelper::Get()->GetUserByProfile(
2564 Profile::FromBrowserContext(browser_context));
2565 if (user && !user->username_hash().empty()) {
2566 policy::PolicyCertServiceFactory::SetUsedPolicyCertificates(
2567 user->username_hash());
2568 }
2569 }
John Abd-El-Malek21bca7c2018-10-26 22:13:332570}
2571#endif
2572
Reilly Grant19aaccd2018-07-16 22:06:372573scoped_refptr<network::SharedURLLoaderFactory>
2574ChromeContentBrowserClient::GetSystemSharedURLLoaderFactory() {
Min Qinda0d55b2018-10-12 18:30:052575 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
2576 !BrowserThread::IsThreadInitialized(BrowserThread::UI));
2577
2578 if (!SystemNetworkContextManager::GetInstance())
Reilly Grant19aaccd2018-07-16 22:06:372579 return nullptr;
2580
Min Qinda0d55b2018-10-12 18:30:052581 return SystemNetworkContextManager::GetInstance()
Reilly Grant19aaccd2018-07-16 22:06:372582 ->GetSharedURLLoaderFactory();
Andrew Moylan8673dba2017-10-10 04:29:042583}
2584
Sean Gilhulyda1ee4b2018-11-13 21:56:092585network::mojom::NetworkContext*
2586ChromeContentBrowserClient::GetSystemNetworkContext() {
2587 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2588 DCHECK(g_browser_process->system_network_context_manager());
2589 return g_browser_process->system_network_context_manager()->GetContext();
2590}
2591
Andrew Moylan17329fc2017-09-25 07:43:302592std::string ChromeContentBrowserClient::GetGeolocationApiKey() {
2593 return google_apis::GetAPIKey();
2594}
2595
Ke He21ee87f2018-05-30 02:35:322596#if defined(OS_ANDROID)
2597bool ChromeContentBrowserClient::ShouldUseGmsCoreGeolocationProvider() {
2598 // Indicate that Chrome uses the GMS core location provider.
2599 return true;
2600}
2601#endif
2602
Yeolf3dc22ca2019-04-18 17:25:322603scoped_refptr<content::QuotaPermissionContext>
[email protected]317f96c92011-05-31 06:53:412604ChromeContentBrowserClient::CreateQuotaPermissionContext() {
2605 return new ChromeQuotaPermissionContext();
2606}
2607
michaeln10e5fc352017-02-07 02:07:582608void ChromeContentBrowserClient::GetQuotaSettings(
2609 content::BrowserContext* context,
2610 content::StoragePartition* partition,
taptede6d878e2017-06-24 01:53:452611 storage::OptionalQuotaSettingsCallback callback) {
michaeln10e5fc352017-02-07 02:07:582612 if (g_default_quota_settings) {
2613 // For debugging tests harness can inject settings.
taptede6d878e2017-06-24 01:53:452614 std::move(callback).Run(*g_default_quota_settings);
michaeln10e5fc352017-02-07 02:07:582615 return;
2616 }
taptede6d878e2017-06-24 01:53:452617 storage::GetNominalDynamicSettings(
Jarryd451ab7b2019-02-12 06:39:062618 partition->GetPath(), context->IsOffTheRecord(),
2619 storage::GetDefaultDiskInfoHelper(), std::move(callback));
calamityc96116b2015-11-03 04:30:512620}
2621
Mythri Alle0b8de0d2018-10-22 11:06:222622content::GeneratedCodeCacheSettings
2623ChromeContentBrowserClient::GetGeneratedCodeCacheSettings(
2624 content::BrowserContext* context) {
2625 base::FilePath cache_path;
2626 chrome::GetUserCacheDirectory(context->GetPath(), &cache_path);
2627 // If we pass 0 for size, disk_cache will pick a default size using the
2628 // heuristics based on available disk size. These are implemented in
2629 // disk_cache::PreferredCacheSize in net/disk_cache/cache_util.cc.
Mythri Ab2486572019-06-13 14:48:162630 int64_t size_in_bytes = 0;
Greg Thompson8c9227562019-08-05 17:47:132631 DCHECK(g_browser_process);
2632 PrefService* local_state = g_browser_process->local_state();
2633 if (local_state) {
2634 size_in_bytes = local_state->GetInteger(prefs::kDiskCacheSize);
2635 base::FilePath disk_cache_dir =
2636 local_state->GetFilePath(prefs::kDiskCacheDir);
2637 if (!disk_cache_dir.empty())
2638 cache_path = disk_cache_dir.Append(cache_path.BaseName());
2639 }
Mythri Ab2486572019-06-13 14:48:162640 return content::GeneratedCodeCacheSettings(true, size_in_bytes, cache_path);
Mythri Alle0b8de0d2018-10-22 11:06:222641}
2642
[email protected]848dd042011-06-04 18:24:032643void ChromeContentBrowserClient::AllowCertificateError(
clamy0d32d6d2015-11-24 11:16:262644 content::WebContents* web_contents,
[email protected]4cf611e32012-02-13 16:06:172645 int cert_error,
2646 const net::SSLInfo& ssl_info,
2647 const GURL& request_url,
John Abd-El-Malekc5b8df912019-05-07 17:02:232648 bool is_main_frame_request,
[email protected]d9be47702012-05-16 03:41:222649 bool strict_enforcement,
estark719dde52016-08-09 03:14:272650 const base::Callback<void(content::CertificateRequestResultType)>&
2651 callback) {
clamy0d32d6d2015-11-24 11:16:262652 DCHECK(web_contents);
John Abd-El-Malekc5b8df912019-05-07 17:02:232653 if (!is_main_frame_request) {
irisu8452ddd62017-03-22 07:46:142654 // A sub-resource has a certificate error. The user doesn't really
[email protected]a2f76882013-02-25 21:36:022655 // have a context for making the right decision, so block the
2656 // request hard, without an info bar to allow showing the insecure
2657 // content.
estark719dde52016-08-09 03:14:272658 if (!callback.is_null())
2659 callback.Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
[email protected]a2f76882013-02-25 21:36:022660 return;
2661 }
2662
[email protected]f9034cf2011-07-21 12:43:412663 // If the tab is being prerendered, cancel the prerender and the request.
[email protected]09667f02014-01-06 15:37:572664 prerender::PrerenderContents* prerender_contents =
clamy0d32d6d2015-11-24 11:16:262665 prerender::PrerenderContents::FromWebContents(web_contents);
[email protected]09667f02014-01-06 15:37:572666 if (prerender_contents) {
2667 prerender_contents->Destroy(prerender::FINAL_STATUS_SSL_ERROR);
estark719dde52016-08-09 03:14:272668 if (!callback.is_null()) {
2669 callback.Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL);
2670 }
[email protected]09667f02014-01-06 15:37:572671 return;
[email protected]f9034cf2011-07-21 12:43:412672 }
2673
Carlos IL5a9e7512019-06-13 22:35:282674 callback.Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
2675 return;
[email protected]848dd042011-06-04 18:24:032676}
2677
Alexander Hendrichbcf2616e2018-05-18 08:21:102678namespace {
2679
Pavol Markob211ab22019-01-23 20:03:042680certificate_matching::CertificatePrincipalPattern
2681ParseCertificatePrincipalPattern(const base::Value* pattern) {
2682 return certificate_matching::CertificatePrincipalPattern::
2683 ParseFromOptionalDict(pattern, "CN", "L", "O", "OU");
2684}
2685
Alexander Hendrichbcf2616e2018-05-18 08:21:102686// Attempts to auto-select a client certificate according to the value of
Darin Fisher42f5e7d2019-10-30 07:15:452687// |ContentSettingsType::AUTO_SELECT_CERTIFICATE| content setting for
Alexander Hendrichbcf2616e2018-05-18 08:21:102688// |requesting_url|. If no certificate was auto-selected, returns nullptr.
2689std::unique_ptr<net::ClientCertIdentity> AutoSelectCertificate(
2690 Profile* profile,
2691 const GURL& requesting_url,
2692 net::ClientCertIdentityList& client_certs) {
2693 HostContentSettingsMap* host_content_settings_map =
2694 HostContentSettingsMapFactory::GetForProfile(profile);
2695 std::unique_ptr<base::Value> setting =
2696 host_content_settings_map->GetWebsiteSetting(
2697 requesting_url, requesting_url,
Darin Fisher42f5e7d2019-10-30 07:15:452698 ContentSettingsType::AUTO_SELECT_CERTIFICATE, std::string(), nullptr);
Alexander Hendrichbcf2616e2018-05-18 08:21:102699
Pavol Markob211ab22019-01-23 20:03:042700 if (!setting || !setting->is_dict())
Alexander Hendrichbcf2616e2018-05-18 08:21:102701 return nullptr;
2702
Alexander Hendrichbcf2616e2018-05-18 08:21:102703 const base::Value* filters =
Pavol Markob211ab22019-01-23 20:03:042704 setting->FindKeyOfType("filters", base::Value::Type::LIST);
2705 if (!filters) {
Alexander Hendrichbcf2616e2018-05-18 08:21:102706 // |setting_dict| has the wrong format (e.g. single filter instead of a
2707 // list of filters). This content setting is only provided by
2708 // the |PolicyProvider|, which should always set it to a valid format.
2709 // Therefore, delete the invalid value.
2710 host_content_settings_map->SetWebsiteSettingDefaultScope(
2711 requesting_url, requesting_url,
Darin Fisher42f5e7d2019-10-30 07:15:452712 ContentSettingsType::AUTO_SELECT_CERTIFICATE, std::string(), nullptr);
Pavol Markob211ab22019-01-23 20:03:042713 return nullptr;
2714 }
2715
2716 for (const base::Value& filter : filters->GetList()) {
2717 DCHECK(filter.is_dict());
2718
2719 auto issuer_pattern = ParseCertificatePrincipalPattern(
2720 filter.FindKeyOfType("ISSUER", base::Value::Type::DICTIONARY));
2721 auto subject_pattern = ParseCertificatePrincipalPattern(
2722 filter.FindKeyOfType("SUBJECT", base::Value::Type::DICTIONARY));
2723 // Use the first certificate that is matched by the filter.
2724 for (auto& client_cert : client_certs) {
2725 if (issuer_pattern.Matches(client_cert->certificate()->issuer()) &&
2726 subject_pattern.Matches(client_cert->certificate()->subject())) {
2727 return std::move(client_cert);
2728 }
2729 }
Alexander Hendrichbcf2616e2018-05-18 08:21:102730 }
2731
2732 return nullptr;
2733}
2734
2735} // namespace
2736
Daniel McArdle85735f52019-06-25 03:27:062737base::OnceClosure ChromeContentBrowserClient::SelectClientCertificate(
davidben3b8455ae72015-03-11 19:42:192738 content::WebContents* web_contents,
[email protected]7a593db2012-02-13 21:19:402739 net::SSLCertRequestInfo* cert_request_info,
mattm436ccfe2017-06-19 20:24:082740 net::ClientCertIdentityList client_certs,
dcheng4af48582016-04-19 00:29:352741 std::unique_ptr<content::ClientCertificateDelegate> delegate) {
[email protected]294084d2014-01-06 22:22:022742 prerender::PrerenderContents* prerender_contents =
davidben3b8455ae72015-03-11 19:42:192743 prerender::PrerenderContents::FromWebContents(web_contents);
[email protected]294084d2014-01-06 22:22:022744 if (prerender_contents) {
2745 prerender_contents->Destroy(
2746 prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED);
Daniel McArdle85735f52019-06-25 03:27:062747 return base::OnceClosure();
[email protected]8ec26472011-06-06 16:52:452748 }
2749
[email protected]791879c2013-12-17 07:22:412750 GURL requesting_url("https://" + cert_request_info->host_and_port.ToString());
2751 DCHECK(requesting_url.is_valid())
2752 << "Invalid URL string: https://"
2753 << cert_request_info->host_and_port.ToString();
[email protected]6786bf402011-12-03 15:19:452754
Pavol Marko230ea2c92017-12-03 22:35:442755 bool may_show_cert_selection = true;
2756
davidben3b8455ae72015-03-11 19:42:192757 Profile* profile =
2758 Profile::FromBrowserContext(web_contents->GetBrowserContext());
Pavol Marko230ea2c92017-12-03 22:35:442759#if defined(OS_CHROMEOS)
2760 if (chromeos::ProfileHelper::IsSigninProfile(profile)) {
2761 // TODO(pmarko): crbug.com/723849: Set |may_show_cert_selection| to false
2762 // and remove the command-line flag after prototype phase when the
2763 // DeviceLoginScreenAutoSelectCertificateForUrls policy is live.
2764 may_show_cert_selection =
2765 chromeos::switches::IsSigninFrameClientCertUserSelectionEnabled();
2766
2767 content::StoragePartition* storage_partition =
2768 content::BrowserContext::GetStoragePartition(
2769 profile, web_contents->GetSiteInstance());
2770 chromeos::login::SigninPartitionManager* signin_partition_manager =
2771 chromeos::login::SigninPartitionManager::Factory::GetForBrowserContext(
2772 profile);
2773
2774 // On the sign-in profile, only allow client certs in the context of the
2775 // sign-in frame.
2776 if (!signin_partition_manager->IsCurrentSigninStoragePartition(
2777 storage_partition)) {
2778 LOG(WARNING)
2779 << "Client cert requested in sign-in profile in wrong context.";
2780 // Continue without client certificate. We do this to mimic the case of no
2781 // client certificate being present in the profile's certificate store.
2782 delegate->ContinueWithCertificate(nullptr, nullptr);
Daniel McArdle85735f52019-06-25 03:27:062783 return base::OnceClosure();
Pavol Marko230ea2c92017-12-03 22:35:442784 }
2785 VLOG(1) << "Client cert requested in sign-in profile.";
2786 }
2787#endif // defined(OS_CHROMEOS)
2788
Alexander Hendrichbcf2616e2018-05-18 08:21:102789 std::unique_ptr<net::ClientCertIdentity> auto_selected_identity =
2790 AutoSelectCertificate(profile, requesting_url, client_certs);
2791 if (auto_selected_identity) {
2792 // The callback will own |auto_selected_identity| and |delegate|, keeping
2793 // them alive until after ContinueWithCertificate is called.
2794 scoped_refptr<net::X509Certificate> cert =
2795 auto_selected_identity->certificate();
2796 net::ClientCertIdentity::SelfOwningAcquirePrivateKey(
2797 std::move(auto_selected_identity),
David Benjamin0cda2042019-04-08 23:00:582798 base::BindOnce(
2799 &content::ClientCertificateDelegate::ContinueWithCertificate,
2800 std::move(delegate), std::move(cert)));
Joe DeBlasio9b996292019-01-31 05:09:322801 LogClientAuthResult(ClientCertSelectionResult::kAutoSelect);
Daniel McArdle85735f52019-06-25 03:27:062802 return base::OnceClosure();
[email protected]6786bf402011-12-03 15:19:452803 }
2804
Pavol Marko230ea2c92017-12-03 22:35:442805 if (!may_show_cert_selection) {
2806 LOG(WARNING) << "No client cert matched by policy and user selection is "
2807 "not allowed.";
Joe DeBlasio9b996292019-01-31 05:09:322808 LogClientAuthResult(ClientCertSelectionResult::kNoSelectionAllowed);
Pavol Marko230ea2c92017-12-03 22:35:442809 // Continue without client certificate. We do this to mimic the case of no
2810 // client certificate being present in the profile's certificate store.
2811 delegate->ContinueWithCertificate(nullptr, nullptr);
Daniel McArdle85735f52019-06-25 03:27:062812 return base::OnceClosure();
Pavol Marko230ea2c92017-12-03 22:35:442813 }
2814
Daniel McArdle85735f52019-06-25 03:27:062815 return chrome::ShowSSLClientCertificateSelector(
2816 web_contents, cert_request_info, std::move(client_certs),
2817 std::move(delegate));
[email protected]8ec26472011-06-06 16:52:452818}
2819
[email protected]dc73a7b2012-03-25 15:27:182820content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() {
[email protected]11158e2d2013-02-01 02:31:562821 return MediaCaptureDevicesDispatcher::GetInstance();
[email protected]dc73a7b2012-03-25 15:27:182822}
2823
Francois Dorayfd823bb12019-10-04 18:03:052824content::LockObserver* ChromeContentBrowserClient::GetLockObserver() {
François Dorayaa3f80102019-10-12 02:29:242825 return ChromeBrowserMainExtraPartsPerformanceManager::GetInstance()
2826 ->GetLockObserver();
Francois Dorayfd823bb12019-10-04 18:03:052827}
2828
peterc26c6c62014-12-10 14:13:592829content::PlatformNotificationService*
Richard Knolld0eae962019-04-04 12:34:022830ChromeContentBrowserClient::GetPlatformNotificationService(
2831 content::BrowserContext* browser_context) {
2832 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2833 Profile* profile = Profile::FromBrowserContext(browser_context);
2834 return PlatformNotificationServiceFactory::GetForProfile(profile);
[email protected]941623e2011-06-07 23:06:042835}
2836
[email protected]9f3fba52011-06-08 20:37:192837bool ChromeContentBrowserClient::CanCreateWindow(
csharrison95f01e922017-04-24 18:52:352838 RenderFrameHost* opener,
[email protected]2b751a12012-03-06 03:00:352839 const GURL& opener_url,
[email protected]931bc922013-09-11 21:42:572840 const GURL& opener_top_level_frame_url,
Nasko Oskove9f19782019-01-04 18:32:352841 const url::Origin& source_origin,
scottmgde42fb92017-02-10 17:56:032842 content::mojom::WindowContainerType container_type,
[email protected]190e5e22013-07-27 05:59:232843 const GURL& target_url,
2844 const content::Referrer& referrer,
jochen67b271b2016-08-03 13:50:212845 const std::string& frame_name,
[email protected]190e5e22013-07-27 05:59:232846 WindowOpenDisposition disposition,
scottmg8e6c6082017-02-13 23:15:482847 const blink::mojom::WindowFeatures& features,
[email protected]190e5e22013-07-27 05:59:232848 bool user_gesture,
2849 bool opener_suppressed,
[email protected]03b6d552012-03-29 04:03:012850 bool* no_javascript_access) {
csharrison95f01e922017-04-24 18:52:352851 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2852 DCHECK(opener);
[email protected]03b6d552012-03-29 04:03:012853
csharrison95f01e922017-04-24 18:52:352854 content::WebContents* web_contents =
2855 content::WebContents::FromRenderFrameHost(opener);
2856 Profile* profile =
2857 Profile::FromBrowserContext(web_contents->GetBrowserContext());
2858 DCHECK(profile);
[email protected]03b6d552012-03-29 04:03:012859 *no_javascript_access = false;
2860
[email protected]9f3fba52011-06-08 20:37:192861 // If the opener is trying to create a background window but doesn't have
2862 // the appropriate permission, fail the attempt.
scottmgde42fb92017-02-10 17:56:032863 if (container_type == content::mojom::WindowContainerType::BACKGROUND) {
brettw00899e62016-11-12 02:10:172864#if BUILDFLAG(ENABLE_EXTENSIONS)
csharrison95f01e922017-04-24 18:52:352865 auto* process_map = extensions::ProcessMap::Get(profile);
2866 auto* registry = extensions::ExtensionRegistry::Get(profile);
Charles Harrison34f67862017-08-22 01:04:172867 if (!URLHasExtensionBackgroundPermission(process_map, registry, opener_url,
2868 opener->GetProcess()->GetID())) {
[email protected]03b6d552012-03-29 04:03:012869 return false;
2870 }
2871
[email protected]7b54ca02012-03-02 18:06:532872 // Note: this use of GetExtensionOrAppByURL is safe but imperfect. It may
2873 // return a recently installed Extension even if this CanCreateWindow call
2874 // was made by an old copy of the page in a normal web process. That's ok,
[email protected]03b6d552012-03-29 04:03:012875 // because the permission check above would have caused an early return
2876 // already. We must use the full URL to find hosted apps, though, and not
2877 // just the origin.
[email protected]be9915fb2013-07-18 09:28:552878 const Extension* extension =
csharrison95f01e922017-04-24 18:52:352879 registry->enabled_extensions().GetExtensionOrAppByURL(opener_url);
[email protected]9367eabc2013-03-01 01:29:292880 if (extension && !extensions::BackgroundInfo::AllowJSAccess(extension))
[email protected]03b6d552012-03-29 04:03:012881 *no_javascript_access = true;
[email protected]dffb9fc2014-07-16 04:14:022882#endif
[email protected]190e5e22013-07-27 05:59:232883
2884 return true;
[email protected]9f3fba52011-06-08 20:37:192885 }
[email protected]056efdc2013-04-06 00:14:532886
brettw00899e62016-11-12 02:10:172887#if BUILDFLAG(ENABLE_EXTENSIONS)
[email protected]140d6cd92014-08-12 18:26:462888 if (extensions::WebViewRendererState::GetInstance()->IsGuest(
csharrison95f01e922017-04-24 18:52:352889 opener->GetProcess()->GetID())) {
[email protected]190e5e22013-07-27 05:59:232890 return true;
lazyboy04b75d32016-02-25 03:12:182891 }
2892
nick0fbc3922016-12-16 20:52:072893 if (target_url.SchemeIs(extensions::kExtensionScheme)) {
csharrison95f01e922017-04-24 18:52:352894 // Intentionally duplicating |registry| code from above because we want to
2895 // reduce calls to retrieve them as this function is a SYNC IPC handler.
2896 auto* registry = extensions::ExtensionRegistry::Get(profile);
lazyboy04b75d32016-02-25 03:12:182897 const Extension* extension =
csharrison95f01e922017-04-24 18:52:352898 registry->enabled_extensions().GetExtensionOrAppByURL(target_url);
lazyboy5d5fede02016-03-10 04:10:142899 if (extension && extension->is_platform_app()) {
nickb6ae0bd32017-04-18 20:53:532900 UMA_HISTOGRAM_ENUMERATION(
2901 "Extensions.AppLoadedInTab",
2902 ClassifyAppLoadedInTabSource(opener_url, extension),
2903 APP_LOADED_IN_TAB_SOURCE_MAX);
2904
2905 // window.open() may not be used to load v2 apps in a regular tab.
lazyboy39585ed2016-12-06 19:30:162906 return false;
lazyboy5d5fede02016-03-10 04:10:142907 }
lazyboy04b75d32016-02-25 03:12:182908 }
[email protected]5940b0d2014-07-01 00:18:262909#endif
[email protected]190e5e22013-07-27 05:59:232910
Charles Harrisonaf2acd02017-08-18 22:46:022911#if BUILDFLAG(ENABLE_PLUGINS)
[email protected]190e5e22013-07-27 05:59:232912 HostContentSettingsMap* content_settings =
csharrison95f01e922017-04-24 18:52:352913 HostContentSettingsMapFactory::GetForProfile(profile);
tommycli61f6f0c2016-09-21 00:26:582914 if (FlashDownloadInterception::ShouldStopFlashDownloadAction(
2915 content_settings, opener_top_level_frame_url, target_url,
2916 user_gesture)) {
csharrison95f01e922017-04-24 18:52:352917 FlashDownloadInterception::InterceptFlashDownloadNavigation(
2918 web_contents, opener_top_level_frame_url);
tommycli61f6f0c2016-09-21 00:26:582919 return false;
2920 }
2921#endif
2922
Charles Harrisonaf2acd02017-08-18 22:46:022923 // Don't let prerenders open popups.
2924 if (auto* prerender_contents =
2925 prerender::PrerenderContents::FromWebContents(web_contents)) {
2926 prerender_contents->Destroy(prerender::FINAL_STATUS_CREATE_NEW_WINDOW);
2927 return false;
2928 }
2929
Nasko Oskove9f19782019-01-04 18:32:352930 BlockedWindowParams blocked_params(target_url, source_origin, referrer,
2931 frame_name, disposition, features,
2932 user_gesture, opener_suppressed);
cm.sanchi2522bc92017-12-04 08:04:132933 NavigateParams nav_params = blocked_params.CreateNavigateParams(web_contents);
Lei Zhang31c778f2019-09-23 20:32:192934 return !MaybeBlockPopup(web_contents, &opener_top_level_frame_url,
2935 &nav_params, nullptr /*=open_url_params*/,
2936 blocked_params.features());
[email protected]9f3fba52011-06-08 20:37:192937}
2938
[email protected]c52b2892012-03-07 11:01:022939content::SpeechRecognitionManagerDelegate*
Aran Gilmanf010bdd2019-08-28 19:55:442940ChromeContentBrowserClient::CreateSpeechRecognitionManagerDelegate() {
[email protected]855e18b2013-07-08 21:02:002941 return new speech::ChromeSpeechRecognitionManagerDelegate();
[email protected]66cfec62012-02-24 17:57:512942}
2943
Katie D840d9532018-11-27 06:20:482944content::TtsControllerDelegate*
2945ChromeContentBrowserClient::GetTtsControllerDelegate() {
2946 TtsControllerDelegateImpl* delegate =
2947 TtsControllerDelegateImpl::GetInstance();
2948#if !defined(OS_ANDROID)
2949 TtsExtensionEngine* tts_extension_engine = TtsExtensionEngine::GetInstance();
2950 delegate->SetTtsEngineDelegate(tts_extension_engine);
2951#endif
2952 return delegate;
2953}
2954
Katie D4713ee42018-11-30 01:48:272955content::TtsPlatform* ChromeContentBrowserClient::GetTtsPlatform() {
2956#ifdef OS_CHROMEOS
2957 return TtsPlatformImplChromeOs::GetInstance();
Katie D4713ee42018-11-30 01:48:272958#else
2959 return nullptr;
2960#endif
2961}
2962
[email protected]64d69de42012-02-06 00:19:542963void ChromeContentBrowserClient::OverrideWebkitPrefs(
Aran Gilmanf010bdd2019-08-28 19:55:442964 RenderViewHost* rvh,
2965 WebPreferences* web_prefs) {
2966 Profile* profile =
2967 Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext());
[email protected]f3986f82012-01-03 20:00:062968 PrefService* prefs = profile->GetPrefs();
[email protected]f3986f82012-01-03 20:00:062969
aelias0df335a2017-03-02 23:43:512970// Fill font preferences. These are not registered on Android
2971// - http://crbug.com/308033, http://crbug.com/696364.
[email protected]33b79542013-10-18 11:18:452972#if !defined(OS_ANDROID)
[email protected]354de9e2014-08-07 03:27:192973 FontFamilyCache::FillFontFamilyMap(profile,
2974 prefs::kWebKitStandardFontFamilyMap,
2975 &web_prefs->standard_font_family_map);
Aran Gilmanf010bdd2019-08-28 19:55:442976 FontFamilyCache::FillFontFamilyMap(profile, prefs::kWebKitFixedFontFamilyMap,
[email protected]354de9e2014-08-07 03:27:192977 &web_prefs->fixed_font_family_map);
Aran Gilmanf010bdd2019-08-28 19:55:442978 FontFamilyCache::FillFontFamilyMap(profile, prefs::kWebKitSerifFontFamilyMap,
[email protected]354de9e2014-08-07 03:27:192979 &web_prefs->serif_font_family_map);
2980 FontFamilyCache::FillFontFamilyMap(profile,
2981 prefs::kWebKitSansSerifFontFamilyMap,
2982 &web_prefs->sans_serif_font_family_map);
2983 FontFamilyCache::FillFontFamilyMap(profile,
2984 prefs::kWebKitCursiveFontFamilyMap,
2985 &web_prefs->cursive_font_family_map);
2986 FontFamilyCache::FillFontFamilyMap(profile,
2987 prefs::kWebKitFantasyFontFamilyMap,
2988 &web_prefs->fantasy_font_family_map);
2989 FontFamilyCache::FillFontFamilyMap(profile,
2990 prefs::kWebKitPictographFontFamilyMap,
2991 &web_prefs->pictograph_font_family_map);
[email protected]f3986f82012-01-03 20:00:062992
[email protected]64d69de42012-02-06 00:19:542993 web_prefs->default_font_size =
[email protected]ddf72142012-05-22 04:52:402994 prefs->GetInteger(prefs::kWebKitDefaultFontSize);
[email protected]64d69de42012-02-06 00:19:542995 web_prefs->default_fixed_font_size =
[email protected]ddf72142012-05-22 04:52:402996 prefs->GetInteger(prefs::kWebKitDefaultFixedFontSize);
[email protected]64d69de42012-02-06 00:19:542997 web_prefs->minimum_font_size =
[email protected]ddf72142012-05-22 04:52:402998 prefs->GetInteger(prefs::kWebKitMinimumFontSize);
[email protected]64d69de42012-02-06 00:19:542999 web_prefs->minimum_logical_font_size =
[email protected]ddf72142012-05-22 04:52:403000 prefs->GetInteger(prefs::kWebKitMinimumLogicalFontSize);
aelias0df335a2017-03-02 23:43:513001#endif
[email protected]f3986f82012-01-03 20:00:063002
[email protected]ddf72142012-05-22 04:52:403003 web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset);
[email protected]f3986f82012-01-03 20:00:063004
[email protected]64d69de42012-02-06 00:19:543005 web_prefs->dom_paste_enabled =
[email protected]f3986f82012-01-03 20:00:063006 prefs->GetBoolean(prefs::kWebKitDomPasteEnabled);
Joel Hockey08a6c84c2018-04-11 10:09:213007 web_prefs->javascript_can_access_clipboard =
3008 prefs->GetBoolean(prefs::kWebKitJavascriptCanAccessClipboard);
[email protected]64d69de42012-02-06 00:19:543009 web_prefs->tabs_to_links = prefs->GetBoolean(prefs::kWebkitTabsToLinks);
[email protected]f3986f82012-01-03 20:00:063010
[email protected]ddf72142012-05-22 04:52:403011 if (!prefs->GetBoolean(prefs::kWebKitJavascriptEnabled))
[email protected]64d69de42012-02-06 00:19:543012 web_prefs->javascript_enabled = false;
mkwsta1f7749b2015-12-28 09:28:573013
Avi Drissman1aa6cb92019-01-23 15:58:383014 if (!prefs->GetBoolean(prefs::kWebKitWebSecurityEnabled))
[email protected]64d69de42012-02-06 00:19:543015 web_prefs->web_security_enabled = false;
mkwsta1f7749b2015-12-28 09:28:573016
[email protected]ddf72142012-05-22 04:52:403017 if (!prefs->GetBoolean(prefs::kWebKitPluginsEnabled))
[email protected]64d69de42012-02-06 00:19:543018 web_prefs->plugins_enabled = false;
[email protected]64d69de42012-02-06 00:19:543019 web_prefs->loads_images_automatically =
[email protected]ddf72142012-05-22 04:52:403020 prefs->GetBoolean(prefs::kWebKitLoadsImagesAutomatically);
[email protected]f3986f82012-01-03 20:00:063021
Zhenyao Moa3fda9972017-09-16 01:34:403022 if (prefs->GetBoolean(prefs::kDisable3DAPIs)) {
3023 web_prefs->webgl1_enabled = false;
3024 web_prefs->webgl2_enabled = false;
3025 }
[email protected]f3986f82012-01-03 20:00:063026
[email protected]64d69de42012-02-06 00:19:543027 web_prefs->allow_running_insecure_content =
3028 prefs->GetBoolean(prefs::kWebKitAllowRunningInsecureContent);
[email protected]d3b935f2012-10-19 23:14:323029#if defined(OS_ANDROID)
[email protected]ded00dc2013-11-01 00:37:053030 web_prefs->font_scale_factor =
3031 static_cast<float>(prefs->GetDouble(prefs::kWebKitFontScaleFactor));
3032 web_prefs->device_scale_adjustment = GetDeviceScaleAdjustment();
[email protected]d3b935f2012-10-19 23:14:323033 web_prefs->force_enable_zoom =
3034 prefs->GetBoolean(prefs::kWebKitForceEnableZoom);
Aran Gilman5e9672bed2019-08-02 19:07:493035#endif
Becky Zhoubbfbde32019-02-20 17:07:593036 web_prefs->force_dark_mode_enabled =
3037 prefs->GetBoolean(prefs::kWebKitForceDarkModeEnabled);
[email protected]5c915252013-05-07 13:15:393038
[email protected]af4256d52013-06-04 20:39:073039#if defined(OS_ANDROID)
3040 web_prefs->password_echo_enabled =
3041 prefs->GetBoolean(prefs::kWebKitPasswordEchoEnabled);
3042#else
[email protected]9d06d88d2012-02-23 22:37:083043 web_prefs->password_echo_enabled = browser_defaults::kPasswordEchoEnabled;
[email protected]af4256d52013-06-04 20:39:073044#endif
3045
[email protected]64d69de42012-02-06 00:19:543046 web_prefs->text_areas_are_resizable =
[email protected]f3986f82012-01-03 20:00:063047 prefs->GetBoolean(prefs::kWebKitTextAreasAreResizable);
[email protected]64d69de42012-02-06 00:19:543048 web_prefs->hyperlink_auditing_enabled =
[email protected]f3986f82012-01-03 20:00:063049 prefs->GetBoolean(prefs::kEnableHyperlinkAuditing);
3050
brettw00899e62016-11-12 02:10:173051#if BUILDFLAG(ENABLE_EXTENSIONS)
je_julie.kim7fbb5a1a2015-02-09 17:26:053052 std::string image_animation_policy =
3053 prefs->GetString(prefs::kAnimationPolicy);
3054 if (image_animation_policy == kAnimationPolicyOnce)
3055 web_prefs->animation_policy =
3056 content::IMAGE_ANIMATION_POLICY_ANIMATION_ONCE;
3057 else if (image_animation_policy == kAnimationPolicyNone)
3058 web_prefs->animation_policy = content::IMAGE_ANIMATION_POLICY_NO_ANIMATION;
3059 else
3060 web_prefs->animation_policy = content::IMAGE_ANIMATION_POLICY_ALLOWED;
3061#endif
3062
[email protected]f3986f82012-01-03 20:00:063063 // Make sure we will set the default_encoding with canonical encoding name.
jinsukkim79df88a2017-01-04 06:26:153064 web_prefs->default_encoding =
3065 base::GetCanonicalEncodingNameByAliasName(web_prefs->default_encoding);
[email protected]64d69de42012-02-06 00:19:543066 if (web_prefs->default_encoding.empty()) {
[email protected]ddf72142012-05-22 04:52:403067 prefs->ClearPref(prefs::kDefaultCharset);
3068 web_prefs->default_encoding = prefs->GetString(prefs::kDefaultCharset);
[email protected]f3986f82012-01-03 20:00:063069 }
[email protected]64d69de42012-02-06 00:19:543070 DCHECK(!web_prefs->default_encoding.empty());
[email protected]f3986f82012-01-03 20:00:063071
mkwst05544102015-01-10 20:26:163072 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
3073 switches::kEnablePotentiallyAnnoyingSecurityFeatures)) {
mkwst772ce8142015-01-16 13:28:073074 web_prefs->disable_reading_from_canvas = true;
mkwst05544102015-01-10 20:26:163075 web_prefs->strict_mixed_content_checking = true;
3076 web_prefs->strict_powerful_feature_restrictions = true;
3077 }
3078
Robert Ogdencf2872d2019-03-19 18:59:373079 web_prefs->data_saver_enabled = IsDataSaverEnabled(profile);
Ben Greenstein49878f52015-12-18 19:13:213080
Tarun Bansal333819e2018-05-15 16:38:423081 web_prefs->data_saver_holdback_web_api_enabled =
3082 base::GetFieldTrialParamByFeatureAsBool(features::kDataSaverHoldback,
3083 "holdback_web", false);
Tarun Bansal333819e2018-05-15 16:38:423084
Alison Maher28a73e22019-10-18 19:26:353085 auto* native_theme = GetWebTheme();
Jinsuk Kima3d393ce2019-05-27 00:57:423086 auto* contents = content::WebContents::FromRenderViewHost(rvh);
shaktisahuf97f7532017-02-24 22:46:133087 if (contents) {
Ian Vollick6243dfe02018-03-08 01:08:533088#if defined(OS_ANDROID)
Jinsuk Kima3d393ce2019-05-27 00:57:423089 auto* delegate = TabAndroid::FromWebContents(contents)
3090 ? static_cast<android::TabWebContentsDelegateAndroid*>(
3091 contents->GetDelegate())
3092 : nullptr;
3093 if (delegate) {
shaktisahuf97f7532017-02-24 22:46:133094 web_prefs->embedded_media_experience_enabled =
Jinsuk Kima3d393ce2019-05-27 00:57:423095 delegate->ShouldEnableEmbeddedMediaExperience();
shaktisahuf97f7532017-02-24 22:46:133096
Mounir Lamouri9c99a1602018-07-05 15:01:443097 web_prefs->picture_in_picture_enabled =
Jinsuk Kima3d393ce2019-05-27 00:57:423098 delegate->IsPictureInPictureEnabled();
Rune Lillesveen17e48322019-04-15 23:12:383099
Alison Maher28a73e22019-10-18 19:26:353100 // Notify NativeTheme of changes to night mode.
3101 native_theme->set_preferred_color_scheme(
3102 delegate->IsNightModeEnabled()
3103 ? ui::NativeTheme::PreferredColorScheme::kDark
3104 : ui::NativeTheme::PreferredColorScheme::kLight);
zqzhang183dc822017-02-15 17:04:113105 }
Ian Vollick6243dfe02018-03-08 01:08:533106#endif // defined(OS_ANDROID)
Giovanni Ortuño Urquidid231ca32018-05-14 04:20:533107
Mounir Lamouri6926107f2019-01-31 18:17:433108 // web_app_scope value is platform specific.
3109#if defined(OS_ANDROID)
Jinsuk Kima3d393ce2019-05-27 00:57:423110 if (delegate)
3111 web_prefs->web_app_scope = delegate->GetManifestScope();
Mounir Lamouri6926107f2019-01-31 18:17:433112#elif BUILDFLAG(ENABLE_EXTENSIONS)
3113 {
Giovanni Ortuño Urquididcd38852019-03-07 08:08:253114 web_prefs->web_app_scope = GURL();
3115 // Set |web_app_scope| based on the app associated with the app window if
3116 // any. Note that the app associated with the window never changes, even
3117 // if the app navigates off scope. This is not a problem because we still
3118 // want to use the scope of the app associated with the window, not the
3119 // WebContents.
Mounir Lamouri6926107f2019-01-31 18:17:433120 Browser* browser = chrome::FindBrowserWithWebContents(contents);
Alan Cutterd0bd51902019-05-22 04:15:233121 if (browser && browser->app_controller() &&
Eric Willigerse339c1e2019-05-13 19:22:443122 browser->app_controller()->CreatedForInstalledPwa()) {
Yining Wang234ad3272019-04-08 18:47:273123 // PWAs should be hosted apps.
Eric Willigerse339c1e2019-05-13 19:22:443124 DCHECK(browser->app_controller()->IsHostedApp());
Giovanni Ortuño Urquididcd38852019-03-07 08:08:253125 // HostedApps that are PWAs are always created through WebAppProvider
Alexey Baskakovaca7a0c2019-07-29 07:34:053126 // for profiles that support them, so we should always be able to
3127 // retrieve a WebAppProvider from the Profile.
Giovanni Ortuño Urquididcd38852019-03-07 08:08:253128 //
3129 // Similarly, if a Hosted Apps is a PWA, it will always have a scope
Alan Cutterf25cfe42019-07-16 02:40:123130 // so there is no need to test for has_value().
Giovanni Ortuño Urquididcd38852019-03-07 08:08:253131 web_prefs->web_app_scope =
3132 web_app::WebAppProvider::Get(profile)
3133 ->registrar()
Alan Cutterf25cfe42019-07-16 02:40:123134 .GetAppScope(*browser->app_controller()->GetAppId())
3135 .value();
Mounir Lamouri6926107f2019-01-31 18:17:433136 }
Mounir Lamouri6926107f2019-01-31 18:17:433137 }
3138#endif
3139
Giovanni Ortuño Urquidid231ca32018-05-14 04:20:533140#if BUILDFLAG(ENABLE_EXTENSIONS)
3141 Browser* browser = chrome::FindBrowserWithWebContents(contents);
Eric Willigerse339c1e2019-05-13 19:22:443142 if (browser && browser->app_controller() &&
3143 browser->app_controller()->CreatedForInstalledPwa()) {
Giovanni Ortuño Urquidid231ca32018-05-14 04:20:533144 web_prefs->strict_mixed_content_checking = true;
3145 }
3146#endif
3147
Ian Vollick6243dfe02018-03-08 01:08:533148 web_prefs->immersive_mode_enabled = vr::VrTabHelper::IsInVr(contents);
zqzhang183dc822017-02-15 17:04:113149 }
zqzhang93e959d12017-03-16 13:10:203150
Ian Vollick6243dfe02018-03-08 01:08:533151#if defined(OS_ANDROID)
Ted Choc81c89fc52018-06-22 23:51:143152 web_prefs->video_fullscreen_detection_enabled = true;
zqzhang183dc822017-02-15 17:04:113153#endif // defined(OS_ANDROID)
3154
Tarun Bansal73d67f02018-01-17 05:56:253155 if (base::FeatureList::IsEnabled(features::kLowPriorityIframes)) {
3156 // Obtain the maximum effective connection type at which the feature is
3157 // enabled.
3158 std::string effective_connection_type_param =
3159 base::GetFieldTrialParamValueByFeature(
3160 features::kLowPriorityIframes,
3161 "max_effective_connection_type_threshold");
3162
3163 base::Optional<net::EffectiveConnectionType> effective_connection_type =
3164 net::GetEffectiveConnectionTypeForName(effective_connection_type_param);
3165 if (effective_connection_type) {
3166 web_prefs->low_priority_iframes_threshold =
3167 effective_connection_type.value();
3168 }
3169 }
3170
rajendrant0521cee2019-07-29 06:09:263171 web_prefs->lazy_load_enabled = !contents || !contents->GetDelegate() ||
3172 contents->GetDelegate()->ShouldAllowLazyLoad();
rajendrante87ed712018-11-30 01:55:003173
Scott Little878f7d6702018-05-31 22:09:063174 if (base::FeatureList::IsEnabled(features::kLazyFrameLoading)) {
3175 const char* param_name =
3176 web_prefs->data_saver_enabled
3177 ? "lazy_frame_loading_distance_thresholds_px_by_ect"
3178 : "lazy_frame_loading_distance_thresholds_px_by_ect_with_data_"
3179 "saver_enabled";
3180
3181 base::StringPairs pairs;
3182 base::SplitStringIntoKeyValuePairs(
3183 base::GetFieldTrialParamValueByFeature(features::kLazyFrameLoading,
3184 param_name),
3185 ':', ',', &pairs);
3186
3187 for (const auto& pair : pairs) {
3188 base::Optional<net::EffectiveConnectionType> effective_connection_type =
3189 net::GetEffectiveConnectionTypeForName(pair.first);
3190 int value = 0;
3191 if (effective_connection_type && base::StringToInt(pair.second, &value)) {
3192 web_prefs->lazy_frame_loading_distance_thresholds_px
3193 [effective_connection_type.value()] = value;
3194 }
3195 }
3196 }
3197
rajendrantd8026342018-08-29 08:08:393198 if (base::FeatureList::IsEnabled(features::kLazyImageLoading)) {
3199 const char* param_name =
3200 web_prefs->data_saver_enabled
3201 ? "lazy_image_loading_distance_thresholds_px_by_ect"
3202 : "lazy_image_loading_distance_thresholds_px_by_ect_with_data_"
3203 "saver_enabled";
3204
3205 base::StringPairs pairs;
3206 base::SplitStringIntoKeyValuePairs(
3207 base::GetFieldTrialParamValueByFeature(features::kLazyImageLoading,
3208 param_name),
3209 ':', ',', &pairs);
3210
3211 for (const auto& pair : pairs) {
3212 base::Optional<net::EffectiveConnectionType> effective_connection_type =
3213 net::GetEffectiveConnectionTypeForName(pair.first);
3214 int value = 0;
3215 if (effective_connection_type && base::StringToInt(pair.second, &value)) {
3216 web_prefs->lazy_image_loading_distance_thresholds_px
3217 [effective_connection_type.value()] = value;
3218 }
3219 }
rajendrant3daeae292019-09-20 07:57:543220
3221 pairs.clear();
3222 base::SplitStringIntoKeyValuePairs(
3223 base::GetFieldTrialParamValueByFeature(features::kLazyImageLoading,
3224 "lazy_image_first_k_fully_load"),
3225 ':', ',', &pairs);
3226
3227 for (const auto& pair : pairs) {
3228 base::Optional<net::EffectiveConnectionType> effective_connection_type =
3229 net::GetEffectiveConnectionTypeForName(pair.first);
3230 int value = 0;
3231 if (effective_connection_type && base::StringToInt(pair.second, &value)) {
3232 web_prefs
3233 ->lazy_image_first_k_fully_load[effective_connection_type.value()] =
3234 value;
3235 }
3236 }
rajendrantd8026342018-08-29 08:08:393237 }
3238
Tarun Bansald10f17a02018-09-13 00:23:173239 if (base::FeatureList::IsEnabled(
3240 features::kNetworkQualityEstimatorWebHoldback)) {
3241 std::string effective_connection_type_param =
3242 base::GetFieldTrialParamValueByFeature(
3243 features::kNetworkQualityEstimatorWebHoldback,
3244 "web_effective_connection_type_override");
3245
3246 base::Optional<net::EffectiveConnectionType> effective_connection_type =
3247 net::GetEffectiveConnectionTypeForName(effective_connection_type_param);
3248 DCHECK(effective_connection_type_param.empty() ||
3249 effective_connection_type);
3250 if (effective_connection_type) {
3251 DCHECK_NE(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
3252 effective_connection_type.value());
3253 web_prefs->network_quality_estimator_web_holdback =
3254 effective_connection_type.value();
3255 }
3256 }
3257
François Beaufort4f8107d2018-03-05 12:12:103258#if !defined(OS_ANDROID)
Becca Hughesfe8c32c2018-03-21 13:36:563259 if (IsAutoplayAllowedByPolicy(contents, prefs)) {
Becca Hughes7d2bbb82018-08-07 22:56:593260 // If autoplay is allowed by policy then force the no user gesture required
3261 // autoplay policy.
François Beaufort4f8107d2018-03-05 12:12:103262 web_prefs->autoplay_policy =
3263 content::AutoplayPolicy::kNoUserGestureRequired;
Mounir Lamouric21868082018-10-11 21:09:553264 } else if (base::FeatureList::IsEnabled(media::kAutoplayDisableSettings) &&
Becca Hughes7d2bbb82018-08-07 22:56:593265 web_prefs->autoplay_policy ==
3266 content::AutoplayPolicy::kDocumentUserActivationRequired) {
Mounir Lamouric21868082018-10-11 21:09:553267 // If the autoplay disable settings feature is enabled and the autoplay
3268 // policy is set to using the unified policy then set the default autoplay
3269 // policy based on user preference.
Becca Hughes7d2bbb82018-08-07 22:56:593270 web_prefs->autoplay_policy =
3271 UnifiedAutoplayConfig::ShouldBlockAutoplay(profile)
3272 ? content::AutoplayPolicy::kDocumentUserActivationRequired
3273 : content::AutoplayPolicy::kNoUserGestureRequired;
François Beaufort4f8107d2018-03-05 12:12:103274 }
3275#endif // !defined(OS_ANDROID)
3276
Dave Tapuskac6627e12018-08-30 15:07:193277 web_prefs->translate_service_available = TranslateService::IsAvailable(prefs);
Elly Fong-Jonesf92897392019-01-24 16:05:493278
3279 // Apply native CaptionStyle parameters.
Evan Liu7cdbf8872019-06-19 16:47:213280 base::Optional<ui::CaptionStyle> style;
3281
3282 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
3283 ::switches::kForceCaptionStyle)) {
3284 style = ui::CaptionStyle::FromSpec(
3285 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
3286 switches::kForceCaptionStyle));
3287 }
3288
3289 // Apply system caption style.
3290 if (!style) {
3291 style = native_theme->GetSystemCaptionStyle();
3292 }
3293
3294 // Apply caption style from preferences if system caption style is undefined.
3295 if (!style && base::FeatureList::IsEnabled(features::kCaptionSettings)) {
evliubc2aa0472019-08-09 20:19:193296 style = pref_names_util::GetCaptionStyleFromPrefs(prefs);
Evan Liu7cdbf8872019-06-19 16:47:213297 }
3298
3299 if (style) {
3300 web_prefs->text_track_background_color = style->background_color;
3301 web_prefs->text_track_text_color = style->text_color;
3302 web_prefs->text_track_text_size = style->text_size;
3303 web_prefs->text_track_text_shadow = style->text_shadow;
3304 web_prefs->text_track_font_family = style->font_family;
3305 web_prefs->text_track_font_variant = style->font_variant;
Abigail Klein74de85bd2019-07-11 19:11:563306 web_prefs->text_track_window_color = style->window_color;
3307 web_prefs->text_track_window_padding = style->window_padding;
3308 web_prefs->text_track_window_radius = style->window_radius;
Evan Liu7cdbf8872019-06-19 16:47:213309 }
Elly Fong-Jonesf92897392019-01-24 16:05:493310
[email protected]a48ab7112014-08-01 16:48:033311 for (size_t i = 0; i < extra_parts_.size(); ++i)
creis7b2d3d12015-02-12 23:29:503312 extra_parts_[i]->OverrideWebkitPrefs(rvh, web_prefs);
[email protected]181a95ee2011-07-12 19:26:363313}
3314
[email protected]b8148ac2011-07-13 22:03:253315void ChromeContentBrowserClient::BrowserURLHandlerCreated(
3316 BrowserURLHandler* handler) {
[email protected]a48ab7112014-08-01 16:48:033317 for (size_t i = 0; i < extra_parts_.size(); ++i)
3318 extra_parts_[i]->BrowserURLHandlerCreated(handler);
[email protected]b8148ac2011-07-13 22:03:253319
[email protected]b3adbd02011-11-30 22:23:273320 // about: handler. Must come before chrome: handler, since it will
3321 // rewrite about: urls to chrome: URLs and then expect chrome: to
creis94a977f62015-02-18 23:51:053322 // actually handle them. Also relies on a preliminary fixup phase.
3323 handler->SetFixupHandler(&FixupBrowserAboutURL);
[email protected]b8148ac2011-07-13 22:03:253324 handler->AddHandlerPair(&WillHandleBrowserAboutURL,
3325 BrowserURLHandler::null_handler());
[email protected]231dba22013-07-25 23:53:033326
madfbd10852017-01-20 03:15:333327 // The group policy NTP URL handler must be registered before the other NTP
3328 // URL handlers below.
3329 handler->AddHandlerPair(&HandleNewTabPageLocationOverride,
3330 BrowserURLHandler::null_handler());
3331
zpengdb4a58e2017-01-10 17:40:323332#if defined(OS_ANDROID)
[email protected]4bd78e92014-03-28 18:54:033333 // Handler to rewrite chrome://newtab on Android.
ianwen465e17b2015-01-20 18:32:353334 handler->AddHandlerPair(&chrome::android::HandleAndroidNativePageURL,
[email protected]4bd78e92014-03-28 18:54:033335 BrowserURLHandler::null_handler());
Samuel Huange63048d2019-09-03 20:35:453336#else // defined(OS_ANDROID)
[email protected]231dba22013-07-25 23:53:033337 // Handler to rewrite chrome://newtab for InstantExtended.
sdefresne51bbec7b2015-08-03 14:18:133338 handler->AddHandlerPair(&search::HandleNewTabURLRewrite,
3339 &search::HandleNewTabURLReverseRewrite);
Samuel Huange63048d2019-09-03 20:35:453340#endif // defined(OS_ANDROID)
[email protected]231dba22013-07-25 23:53:033341
[email protected]b8148ac2011-07-13 22:03:253342 // chrome: & friends.
dbeam25472e0c2017-06-23 19:02:313343 handler->AddHandlerPair(&ChromeContentBrowserClient::HandleWebUI,
3344 &ChromeContentBrowserClient::HandleWebUIReverse);
Robert Ogdene7fdca92018-10-12 17:53:063345
3346 // Handler to rewrite Preview's Server Lite Page, to show the original URL to
3347 // the user.
Robert Ogden0f4d88682019-09-24 22:27:523348 handler->AddHandlerPair(
3349 &previews::HandlePreviewsLitePageRedirectURLRewrite,
3350 &previews::HandlePreviewsLitePageRedirectURLRewriteReverse);
[email protected]b8148ac2011-07-13 22:03:253351}
3352
[email protected]650b2d52013-02-10 03:41:453353base::FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() {
[email protected]b1d97272013-08-17 13:38:493354 return DownloadPrefs::GetDefaultDownloadDirectory();
[email protected]e1d16eb92011-08-18 23:19:323355}
3356
[email protected]c9b6eb62011-10-18 20:49:393357std::string ChromeContentBrowserClient::GetDefaultDownloadName() {
3358 return l10n_util::GetStringUTF8(IDS_DEFAULT_DOWNLOAD_FILENAME);
3359}
3360
Dominik Röttsches47347832019-03-12 17:45:013361base::FilePath ChromeContentBrowserClient::GetFontLookupTableCacheDir() {
3362 base::FilePath user_data_dir;
3363 base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
3364 DCHECK(!user_data_dir.empty());
3365 return user_data_dir.Append(FILE_PATH_LITERAL("FontLookupTableCache"));
3366}
3367
jmadill57b52d42015-08-21 18:16:133368base::FilePath ChromeContentBrowserClient::GetShaderDiskCacheDirectory() {
3369 base::FilePath user_data_dir;
Avi Drissman9098f9002018-05-04 00:11:523370 base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
jmadill57b52d42015-08-21 18:16:133371 DCHECK(!user_data_dir.empty());
3372 return user_data_dir.Append(FILE_PATH_LITERAL("ShaderCache"));
3373}
3374
Khushal7ca0b782018-07-20 05:53:273375base::FilePath ChromeContentBrowserClient::GetGrShaderDiskCacheDirectory() {
3376 base::FilePath user_data_dir;
3377 base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
3378 DCHECK(!user_data_dir.empty());
3379 return user_data_dir.Append(FILE_PATH_LITERAL("GrShaderCache"));
3380}
3381
[email protected]b7631cc2012-09-15 05:08:383382void ChromeContentBrowserClient::DidCreatePpapiPlugin(
3383 content::BrowserPpapiHost* browser_host) {
brettw4b461082016-11-19 18:55:163384#if BUILDFLAG(ENABLE_PLUGINS)
jitendra.ks42e889a2014-12-05 09:05:553385 ChromeContentBrowserClientPluginsPart::DidCreatePpapiPlugin(browser_host);
[email protected]6d17f6392012-12-05 05:24:543386#endif
[email protected]b7631cc2012-09-15 05:08:383387}
3388
[email protected]0c7193742012-11-07 19:05:033389content::BrowserPpapiHost*
Aran Gilmanf010bdd2019-08-28 19:55:443390ChromeContentBrowserClient::GetExternalBrowserPpapiHost(int plugin_process_id) {
Nico Weberaf3b00b2017-09-11 17:58:173391#if BUILDFLAG(ENABLE_NACL)
[email protected]a56f8322014-07-16 21:13:553392 content::BrowserChildProcessHostIterator iter(PROCESS_TYPE_NACL_LOADER);
[email protected]0c7193742012-11-07 19:05:033393 while (!iter.Done()) {
Aran Gilmanf010bdd2019-08-28 19:55:443394 nacl::NaClProcessHost* host =
3395 static_cast<nacl::NaClProcessHost*>(iter.GetDelegate());
3396 if (host->process() && host->process()->GetData().id == plugin_process_id) {
[email protected]0c7193742012-11-07 19:05:033397 // Found the plugin.
3398 return host->browser_ppapi_host();
3399 }
3400 ++iter;
3401 }
[email protected]a56f8322014-07-16 21:13:553402#endif
Aran Gilmanf010bdd2019-08-28 19:55:443403 return nullptr;
[email protected]0c7193742012-11-07 19:05:033404}
3405
[email protected]38cd8f7f2012-06-15 22:06:073406bool ChromeContentBrowserClient::AllowPepperSocketAPI(
[email protected]157cc902012-11-02 06:31:583407 content::BrowserContext* browser_context,
3408 const GURL& url,
[email protected]dda54822013-06-15 01:26:393409 bool private_api,
[email protected]8b92ed182013-09-21 04:47:123410 const content::SocketPermissionRequest* params) {
brettw4b461082016-11-19 18:55:163411#if BUILDFLAG(ENABLE_PLUGINS) && BUILDFLAG(ENABLE_EXTENSIONS)
jitendra.ks42e889a2014-12-05 09:05:553412 return ChromeContentBrowserClientPluginsPart::AllowPepperSocketAPI(
3413 browser_context, url, private_api, params, allowed_socket_origins_);
[email protected]93f72062013-05-29 20:29:403414#else
[email protected]a658d452012-03-02 12:45:293415 return false;
[email protected]93f72062013-05-29 20:29:403416#endif
[email protected]e461da2f2012-02-16 19:06:403417}
3418
adrian.belgund54465ba2016-05-18 10:03:583419bool ChromeContentBrowserClient::IsPepperVpnProviderAPIAllowed(
3420 content::BrowserContext* browser_context,
3421 const GURL& url) {
brettw4b461082016-11-19 18:55:163422#if BUILDFLAG(ENABLE_PLUGINS) && BUILDFLAG(ENABLE_EXTENSIONS)
adrian.belgund54465ba2016-05-18 10:03:583423 return ChromeContentBrowserClientPluginsPart::IsPepperVpnProviderAPIAllowed(
3424 browser_context, url);
3425#else
3426 return false;
3427#endif
3428}
3429
adrian.belgun5b341c72016-06-22 22:24:083430std::unique_ptr<content::VpnServiceProxy>
3431ChromeContentBrowserClient::GetVpnServiceProxy(
3432 content::BrowserContext* browser_context) {
brettw00899e62016-11-12 02:10:173433#if BUILDFLAG(ENABLE_EXTENSIONS)
adrian.belgun5b341c72016-06-22 22:24:083434 return ChromeContentBrowserClientExtensionsPart::GetVpnServiceProxy(
3435 browser_context);
3436#else
3437 return nullptr;
3438#endif
3439}
3440
Brett Wilson804e83c2017-08-18 22:57:333441std::unique_ptr<ui::SelectFilePolicy>
3442ChromeContentBrowserClient::CreateSelectFilePolicy(WebContents* web_contents) {
3443 return std::make_unique<ChromeSelectFilePolicy>(web_contents);
[email protected]a28e3302013-02-03 03:50:433444}
3445
[email protected]7d9424702013-04-14 13:14:163446void ChromeContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
3447 std::vector<std::string>* additional_allowed_schemes) {
3448 ContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
3449 additional_allowed_schemes);
[email protected]b3690f72014-02-17 00:32:483450 additional_allowed_schemes->push_back(content::kChromeDevToolsScheme);
[email protected]2d9748b22014-02-11 00:17:293451 additional_allowed_schemes->push_back(content::kChromeUIScheme);
[email protected]a48ab7112014-08-01 16:48:033452 for (size_t i = 0; i < extra_parts_.size(); ++i) {
3453 extra_parts_[i]->GetAdditionalAllowedSchemesForFileSystem(
3454 additional_allowed_schemes);
3455 }
[email protected]7d9424702013-04-14 13:14:163456}
3457
falkenad185092016-06-16 06:10:023458void ChromeContentBrowserClient::GetSchemesBypassingSecureContextCheckWhitelist(
3459 std::set<std::string>* schemes) {
Daniel Vogelheim11e59b72017-11-22 15:44:043460 *schemes = secure_origin_whitelist::GetSchemesBypassingSecureContextCheck();
falkenad185092016-06-16 06:10:023461}
3462
[email protected]c79859b82014-03-20 22:43:553463void ChromeContentBrowserClient::GetURLRequestAutoMountHandlers(
[email protected]cd501a72014-08-22 19:58:313464 std::vector<storage::URLRequestAutoMountHandler>* handlers) {
[email protected]a48ab7112014-08-01 16:48:033465 for (size_t i = 0; i < extra_parts_.size(); ++i)
3466 extra_parts_[i]->GetURLRequestAutoMountHandlers(handlers);
[email protected]c79859b82014-03-20 22:43:553467}
3468
nzolghadrd87a308d2016-12-07 15:45:563469::rappor::RapporService* ChromeContentBrowserClient::GetRapporService() {
3470 return g_browser_process->rappor_service();
3471}
3472
[email protected]f19bbf62013-07-09 01:22:323473void ChromeContentBrowserClient::GetAdditionalFileSystemBackends(
[email protected]0ff5eb52013-07-10 20:35:313474 content::BrowserContext* browser_context,
[email protected]02250952013-04-24 23:52:533475 const base::FilePath& storage_partition_path,
avid6d88b912017-01-13 00:16:003476 std::vector<std::unique_ptr<storage::FileSystemBackend>>*
3477 additional_backends) {
[email protected]b40015c2013-06-26 08:13:313478#if defined(OS_CHROMEOS)
[email protected]cd501a72014-08-22 19:58:313479 storage::ExternalMountPoints* external_mount_points =
[email protected]0ff5eb52013-07-10 20:35:313480 content::BrowserContext::GetMountPoints(browser_context);
[email protected]b40015c2013-06-26 08:13:313481 DCHECK(external_mount_points);
Jeremy Romanec48d7a2018-03-01 17:35:093482 auto backend = std::make_unique<chromeos::FileSystemBackend>(
Jeremy Romanec48d7a2018-03-01 17:35:093483 std::make_unique<chromeos::file_system_provider::BackendDelegate>(),
3484 std::make_unique<chromeos::MTPFileSystemBackendDelegate>(
hashimotoa53e7e82016-10-26 06:30:473485 storage_partition_path),
Jeremy Romanec48d7a2018-03-01 17:35:093486 std::make_unique<arc::ArcContentFileSystemBackendDelegate>(),
3487 std::make_unique<arc::ArcDocumentsProviderBackendDelegate>(),
Sam McNally47f2eac2018-08-28 06:45:053488 std::make_unique<drive::DriveFsFileSystemBackendDelegate>(
3489 Profile::FromBrowserContext(browser_context)),
hashimotoa53e7e82016-10-26 06:30:473490 external_mount_points, storage::ExternalMountPoints::GetSystemInstance());
[email protected]f19bbf62013-07-09 01:22:323491 backend->AddSystemMountPoints();
[email protected]cd501a72014-08-22 19:58:313492 DCHECK(backend->CanHandleType(storage::kFileSystemTypeExternal));
avid6d88b912017-01-13 00:16:003493 additional_backends->push_back(std::move(backend));
[email protected]b40015c2013-06-26 08:13:313494#endif
[email protected]445b7db2013-08-02 04:58:273495
[email protected]a48ab7112014-08-01 16:48:033496 for (size_t i = 0; i < extra_parts_.size(); ++i) {
3497 extra_parts_[i]->GetAdditionalFileSystemBackends(
3498 browser_context, storage_partition_path, additional_backends);
3499 }
[email protected]02250952013-04-24 23:52:533500}
3501
jcivellie6f550742017-01-06 19:29:123502#if defined(OS_POSIX) && !defined(OS_MACOSX)
[email protected]a1733df2012-06-22 11:24:183503void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess(
avi3ef9ec9e2014-12-22 22:50:173504 const base::CommandLine& command_line,
[email protected]40da3e0c2012-10-24 22:03:383505 int child_process_id,
brettw3c98c7d32017-07-25 01:44:203506 PosixFileDescriptorInfo* mappings) {
jcivellie6f550742017-01-06 19:29:123507#if defined(OS_ANDROID)
3508 base::MemoryMappedFile::Region region;
3509 int fd = ui::GetMainAndroidPackFd(&region);
3510 mappings->ShareWithRegion(kAndroidUIResourcesPakDescriptor, fd, region);
agrieve05398f52015-06-24 18:59:003511
Samuel Huang31eadf082019-08-28 19:50:433512 // For Android: Native resources for DFMs should only be used by the browser
3513 // process. Their file descriptors and memory mapped file regions are not
3514 // passed to child processes.
3515
jcivellie6f550742017-01-06 19:29:123516 fd = ui::GetCommonResourcesPackFd(&region);
3517 mappings->ShareWithRegion(kAndroidChrome100PercentPakDescriptor, fd, region);
[email protected]29699c22012-10-03 23:57:393518
jcivellie6f550742017-01-06 19:29:123519 fd = ui::GetLocalePackFd(&region);
3520 mappings->ShareWithRegion(kAndroidLocalePakDescriptor, fd, region);
[email protected]40da3e0c2012-10-24 22:03:383521
zpeng368afac82017-07-17 18:47:453522 // Optional secondary locale .pak file.
3523 fd = ui::GetSecondaryLocalePackFd(&region);
3524 if (fd != -1) {
3525 mappings->ShareWithRegion(kAndroidSecondaryLocalePakDescriptor, fd, region);
3526 }
3527
[email protected]09560f7f2014-06-10 18:40:283528 base::FilePath app_data_path;
Avi Drissman9098f9002018-05-04 00:11:523529 base::PathService::Get(base::DIR_ANDROID_APP_DATA, &app_data_path);
[email protected]09560f7f2014-06-10 18:40:283530 DCHECK(!app_data_path.empty());
Joshua Perazaf890e4b2019-01-03 19:19:023531#endif // defined(OS_ANDROID)
[email protected]40da3e0c2012-10-24 22:03:383532 int crash_signal_fd = GetCrashSignalFD(command_line);
3533 if (crash_signal_fd >= 0) {
Jay Civelli668c097f2018-05-16 20:44:133534 mappings->Share(service_manager::kCrashDumpSignal, crash_signal_fd);
[email protected]40da3e0c2012-10-24 22:03:383535 }
jcivellie6f550742017-01-06 19:29:123536}
3537#endif // defined(OS_POSIX) && !defined(OS_MACOSX)
[email protected]b80f68432011-05-02 17:22:303538
[email protected]4a65826d2011-08-25 16:04:013539#if defined(OS_WIN)
wfh182da09c2015-06-24 19:23:033540base::string16 ChromeContentBrowserClient::GetAppContainerSidForSandboxType(
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:523541 int sandbox_type) {
wfh182da09c2015-06-24 19:23:033542 // TODO(wfh): Add support for more process types here. crbug.com/499523
3543 switch (sandbox_type) {
Tom Sepez15d4e5202017-09-27 23:59:053544 case service_manager::SANDBOX_TYPE_RENDERER:
Jerry Lina0de7ce2018-06-22 15:18:363545 return base::string16(install_static::GetSandboxSidPrefix()) +
3546 L"129201922";
Tom Sepez15d4e5202017-09-27 23:59:053547 case service_manager::SANDBOX_TYPE_UTILITY:
wfh182da09c2015-06-24 19:23:033548 return base::string16();
Tom Sepez15d4e5202017-09-27 23:59:053549 case service_manager::SANDBOX_TYPE_GPU:
wfh182da09c2015-06-24 19:23:033550 return base::string16();
Tom Sepez15d4e5202017-09-27 23:59:053551 case service_manager::SANDBOX_TYPE_PPAPI:
Jerry Lina0de7ce2018-06-22 15:18:363552 return base::string16(install_static::GetSandboxSidPrefix()) +
3553 L"129201925";
Nico Weberaf3b00b2017-09-11 17:58:173554#if BUILDFLAG(ENABLE_NACL)
wfh182da09c2015-06-24 19:23:033555 case PROCESS_TYPE_NACL_LOADER:
3556 return base::string16();
3557 case PROCESS_TYPE_NACL_BROKER:
3558 return base::string16();
3559#endif
3560 }
3561
3562 // Should never reach here.
3563 CHECK(0);
3564 return base::string16();
3565}
3566
Will Harris956e0ca2019-08-23 20:47:393567bool ChromeContentBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy,
3568 RendererSpawnFlags flags) {
[email protected]34f48682013-03-20 00:30:183569 // Allow the server side of a pipe restricted to the "chrome.nacl."
3570 // namespace so that it cannot impersonate other system or other chrome
Will Harrisc196ed942019-08-03 03:45:303571 // service pipes. This is also done in nacl_broker_listener.cc.
3572 sandbox::ResultCode result =
3573 policy->AddRule(sandbox::TargetPolicy::SUBSYS_NAMED_PIPES,
3574 sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
3575 L"\\\\.\\pipe\\chrome.nacl.*");
rickyz50109312015-11-11 00:37:083576 if (result != sandbox::SBOX_ALL_OK)
3577 return false;
Will Harrisc196ed942019-08-03 03:45:303578
Will Harris1b9b4152019-08-21 22:33:503579// Does not work under component build because all the component DLLs would need
3580// to be manually added and maintained. Does not work under ASAN build because
3581// ASAN has not yet fully initialized its instrumentation by the time the CIG
3582// intercepts run.
3583#if !defined(COMPONENT_BUILD) && !defined(ADDRESS_SANITIZER)
Will Harris956e0ca2019-08-23 20:47:393584 if ((flags & RendererSpawnFlags::RENDERER_CODE_INTEGRITY) == 0)
3585 return true;
Will Harrisc196ed942019-08-03 03:45:303586 if (!base::FeatureList::IsEnabled(kRendererCodeIntegrity))
3587 return true;
3588
3589 // Only enable signing mitigation if launching from chrome.exe.
3590 base::FilePath exe_path;
3591 if (!base::PathService::Get(base::FILE_EXE, &exe_path))
3592 return true;
3593 if (chrome::kBrowserProcessExecutableName != exe_path.BaseName().value())
3594 return true;
3595
3596 sandbox::MitigationFlags mitigations = policy->GetProcessMitigations();
3597 mitigations |= sandbox::MITIGATION_FORCE_MS_SIGNED_BINS;
3598 result = policy->SetProcessMitigations(mitigations);
3599 if (result != sandbox::SBOX_ALL_OK)
3600 return false;
3601
Aran Gilmanf010bdd2019-08-28 19:55:443602 // Allow loading Chrome's DLLs. The name of this depends on whether
3603 // is_multi_dll_chrome is defined or not. For multi-DLL Chrome,
3604 // chrome_child.dll is loaded, but for single-DLL Chrome, it would be the
3605 // same DLL as the browser process.
Will Harrisc196ed942019-08-03 03:45:303606#if defined(CHROME_MULTIPLE_DLL_BROWSER)
3607 constexpr auto* child_dll_path = chrome::kChildDll;
3608#else
3609 constexpr auto* child_dll_path = chrome::kBrowserResourcesDll;
3610#endif
3611 for (const auto* dll : {child_dll_path, chrome::kElfDll}) {
3612 result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_SIGNED_BINARY,
3613 sandbox::TargetPolicy::SIGNED_ALLOW_LOAD,
3614 GetModulePath(dll).value().c_str());
3615 if (result != sandbox::SBOX_ALL_OK)
3616 return false;
3617 }
Will Harris1b9b4152019-08-21 22:33:503618#endif // !defined(COMPONENT_BUILD) && !defined(ADDRESS_SANITIZER)
Will Harrisc196ed942019-08-03 03:45:303619
3620 return true;
[email protected]34f48682013-03-20 00:30:183621}
Will Harris956e0ca2019-08-23 20:47:393622
3623bool ChromeContentBrowserClient::IsRendererCodeIntegrityEnabled() {
3624 PrefService* local_state = g_browser_process->local_state();
3625 if (local_state &&
3626 local_state->HasPrefPath(prefs::kRendererCodeIntegrityEnabled) &&
3627 !local_state->GetBoolean(prefs::kRendererCodeIntegrityEnabled))
3628 return false;
3629 return true;
3630}
3631
wfhc91e9672016-01-27 00:14:203632#endif // defined(OS_WIN)
[email protected]4a65826d2011-08-25 16:04:013633
Mario Sanchez Prada39dee4a2019-07-09 07:15:403634void ChromeContentBrowserClient::BindCredentialManagerReceiver(
Oksana Zhuravlova23ecbb402019-03-29 19:44:113635 content::RenderFrameHost* render_frame_host,
Mario Sanchez Prada39dee4a2019-07-09 07:15:403636 mojo::PendingReceiver<blink::mojom::CredentialManager> receiver) {
3637 ChromePasswordManagerClient::BindCredentialManager(std::move(receiver),
Oksana Zhuravlova23ecbb402019-03-29 19:44:113638 render_frame_host);
3639}
3640
Ken Rockotfa5d57112019-05-29 20:57:143641void ChromeContentBrowserClient::WillStartServiceManager() {
Guido Urdanetad06ae842019-10-10 20:04:123642#if defined(OS_WIN) || defined(OS_MACOSX) || \
3643 (defined(OS_LINUX) && !defined(OS_CHROMEOS))
Xi Han85079c22019-04-18 21:43:053644 if (startup_data_) {
3645 auto* chrome_feature_list_creator =
3646 startup_data_->chrome_feature_list_creator();
John Abd-El-Malek27b3ebd22019-02-12 18:59:183647 // This has to run very early before ServiceManagerContext is created.
Guido Urdanetad06ae842019-10-10 20:04:123648 const policy::PolicyMap& policies =
Xi Han85079c22019-04-18 21:43:053649 chrome_feature_list_creator->browser_policy_connector()
John Abd-El-Malek27b3ebd22019-02-12 18:59:183650 ->GetPolicyService()
3651 ->GetPolicies(policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME,
Guido Urdanetad06ae842019-10-10 20:04:123652 std::string()));
3653
3654#if defined(OS_WIN)
3655 const base::Value* force_network_in_process_value =
3656 policies.GetValue(policy::key::kForceNetworkInProcess);
John Abd-El-Malek27b3ebd22019-02-12 18:59:183657 bool force_network_in_process = false;
3658 if (force_network_in_process_value)
3659 force_network_in_process_value->GetAsBoolean(&force_network_in_process);
3660 if (force_network_in_process)
3661 content::ForceInProcessNetworkService(true);
Guido Urdanetad06ae842019-10-10 20:04:123662#endif
3663 bool enable_audio_process =
3664 base::FeatureList::IsEnabled(features::kAudioServiceOutOfProcess);
3665 bool enable_audio_sandbox = base::FeatureList::IsEnabled(
3666 service_manager::features::kAudioServiceSandbox);
3667 const base::Value* audio_sandbox_enabled_policy_value =
3668 policies.GetValue(policy::key::kAudioSandboxEnabled);
3669 if (audio_sandbox_enabled_policy_value)
3670 audio_sandbox_enabled_policy_value->GetAsBoolean(&enable_audio_sandbox);
3671 service_manager::EnableAudioSandbox(enable_audio_sandbox);
3672 if (!enable_audio_sandbox || !enable_audio_process) {
3673 // Disabling the audio process or audio sandbox implies disabling APM in
3674 // the audio service for security reasons. Append a switch so that this
3675 // is communicated to the audio and renderer processes.
3676 base::CommandLine::ForCurrentProcess()->AppendSwitch(
3677 switches::kForceDisableWebRtcApmInAudioService);
3678 }
John Abd-El-Malek27b3ebd22019-02-12 18:59:183679 }
3680#endif
xhwang5e630462015-10-30 03:18:483681}
3682
Ken Rockot8f39a272018-12-21 23:38:353683base::Optional<service_manager::Manifest>
sammc2b0375b2016-12-22 01:26:173684ChromeContentBrowserClient::GetServiceManifestOverlay(base::StringPiece name) {
Lei Zhang5b3f81f2019-04-10 00:54:583685 if (name == content::mojom::kBrowserServiceName)
Ken Rockot341089f2019-01-11 23:11:583686 return GetChromeContentBrowserOverlayManifest();
Lei Zhang5b3f81f2019-04-10 00:54:583687 if (name == content::mojom::kGpuServiceName)
Ken Rockot341089f2019-01-11 23:11:583688 return GetChromeContentGpuOverlayManifest();
Lei Zhang5b3f81f2019-04-10 00:54:583689 if (name == content::mojom::kRendererServiceName)
3690 return GetChromeContentRendererOverlayManifest();
Ken Rockot341089f2019-01-11 23:11:583691 return base::nullopt;
benc70c0e32016-09-22 03:50:373692}
3693
Ken Rockot69aade02019-01-23 21:19:513694std::vector<service_manager::Manifest>
sammc2b0375b2016-12-22 01:26:173695ChromeContentBrowserClient::GetExtraServiceManifests() {
Ken Rockot06fd2832019-05-24 17:24:443696 auto manifests = GetChromeBuiltinServiceManifests();
Ken Rockot06fd2832019-05-24 17:24:443697
Nico Weberaf3b00b2017-09-11 17:58:173698#if BUILDFLAG(ENABLE_NACL)
Ken Rockot06fd2832019-05-24 17:24:443699 manifests.push_back(GetNaClLoaderManifest());
Ken Rockot69aade02019-01-23 21:19:513700#if defined(OS_WIN) && defined(ARCH_CPU_X86)
Ken Rockot06fd2832019-05-24 17:24:443701 manifests.push_back(GetNaClBrokerManifest());
sammc2b0375b2016-12-22 01:26:173702#endif // defined(OS_WIN)
Nico Weberaf3b00b2017-09-11 17:58:173703#endif // BUILDFLAG(ENABLE_NACL)
Ken Rockot06fd2832019-05-24 17:24:443704
3705 return manifests;
sammc2b0375b2016-12-22 01:26:173706}
3707
peterbbcccc12015-02-11 22:23:333708void ChromeContentBrowserClient::OpenURL(
Matt Falkenhagen18c5c5d2018-11-26 02:55:373709 content::SiteInstance* site_instance,
peterbbcccc12015-02-11 22:23:333710 const content::OpenURLParams& params,
danakja9fe91c2019-05-01 19:02:293711 base::OnceCallback<void(content::WebContents*)> callback) {
mlamourieb40d552015-02-05 00:57:083712 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Matt Falkenhagen18c5c5d2018-11-26 02:55:373713
3714 content::BrowserContext* browser_context = site_instance->GetBrowserContext();
mlamourieb40d552015-02-05 00:57:083715
zpengdb4a58e2017-01-10 17:40:323716#if defined(OS_ANDROID)
pkotwiczaa289f02016-07-05 22:26:223717 ServiceTabLauncher::GetInstance()->LaunchTab(browser_context, params,
danakja9fe91c2019-05-01 19:02:293718 std::move(callback));
jam1c5a91492016-02-24 20:47:533719#else
cm.sanchi2522bc92017-12-04 08:04:133720 NavigateParams nav_params(Profile::FromBrowserContext(browser_context),
3721 params.url, params.transition);
3722 nav_params.FillNavigateParamsFromOpenURLParams(params);
mlamourieb40d552015-02-05 00:57:083723
3724 Navigate(&nav_params);
danakja9fe91c2019-05-01 19:02:293725 std::move(callback).Run(nav_params.navigated_or_inserted_contents);
peterbbcccc12015-02-11 22:23:333726#endif
mlamourieb40d552015-02-05 00:57:083727}
3728
zhaobinf3704f82017-01-12 07:19:363729content::ControllerPresentationServiceDelegate*
3730ChromeContentBrowserClient::GetControllerPresentationServiceDelegate(
3731 content::WebContents* web_contents) {
mfoltz99bd44c2016-03-18 20:36:463732 if (media_router::MediaRouterEnabled(web_contents->GetBrowserContext())) {
haibinlu9e605a92015-06-06 03:45:093733 return media_router::PresentationServiceDelegateImpl::
3734 GetOrCreateForWebContents(web_contents);
3735 }
haibinlu9e605a92015-06-06 03:45:093736 return nullptr;
3737}
3738
zhaobinf3704f82017-01-12 07:19:363739content::ReceiverPresentationServiceDelegate*
3740ChromeContentBrowserClient::GetReceiverPresentationServiceDelegate(
3741 content::WebContents* web_contents) {
zhaobinf3704f82017-01-12 07:19:363742 if (media_router::MediaRouterEnabled(web_contents->GetBrowserContext())) {
3743 // ReceiverPresentationServiceDelegateImpl exists only for WebContents
3744 // created for offscreen presentations. The WebContents must belong to
3745 // an incognito profile.
3746 if (auto* impl = media_router::ReceiverPresentationServiceDelegateImpl::
3747 FromWebContents(web_contents)) {
3748 DCHECK(web_contents->GetBrowserContext()->IsOffTheRecord());
3749 return impl;
3750 }
3751 }
zhaobinf3704f82017-01-12 07:19:363752 return nullptr;
3753}
3754
horo48d4d3e2015-02-27 03:04:003755void ChromeContentBrowserClient::RecordURLMetric(const std::string& metric,
3756 const GURL& url) {
mathp46284f32015-03-11 13:06:413757 if (url.is_valid()) {
3758 rappor::SampleDomainAndRegistryFromGURL(g_browser_process->rappor_service(),
3759 metric, url);
3760 }
horo48d4d3e2015-02-27 03:04:003761}
3762
Matt Falkenhagen8479b202017-07-14 04:35:313763std::string ChromeContentBrowserClient::GetMetricSuffixForURL(const GURL& url) {
3764 // Don't change these returned strings. They are written (in hashed form) into
3765 // UMA logs. If you add more strings, you must update histograms.xml and get
3766 // histograms review. Only Google domains should be here for privacy purposes.
3767 // TODO(falken): Ideally Chrome would log the relevant UMA directly and this
3768 // function could be removed.
Matt Falkenhagen2c98ee29a2017-07-20 16:43:193769 if (page_load_metrics::IsGoogleSearchResultUrl(url))
Matt Falkenhagen8479b202017-07-14 04:35:313770 return "search";
Matt Falkenhagen2c98ee29a2017-07-20 16:43:193771 if (url.host() == "docs.google.com")
3772 return "docs";
Matt Falkenhagen8479b202017-07-14 04:35:313773 return std::string();
3774}
3775
avid6d88b912017-01-13 00:16:003776std::vector<std::unique_ptr<content::NavigationThrottle>>
clamy40c9e142015-09-29 11:18:473777ChromeContentBrowserClient::CreateThrottlesForNavigation(
3778 content::NavigationHandle* handle) {
avid6d88b912017-01-13 00:16:003779 std::vector<std::unique_ptr<content::NavigationThrottle>> throttles;
trizzofo8ddaeb72016-09-01 23:18:273780
bmcquadeb4556552017-03-24 22:24:373781 // MetricsNavigationThrottle requires that it runs before NavigationThrottles
3782 // that may delay or cancel navigations, so only NavigationThrottles that
3783 // don't delay or cancel navigations (e.g. throttles that are only observing
3784 // callbacks without affecting navigation behavior) should be added before
3785 // MetricsNavigationThrottle.
3786 if (handle->IsInMainFrame()) {
3787 throttles.push_back(
3788 page_load_metrics::MetricsNavigationThrottle::Create(handle));
3789 }
3790
brettw4b461082016-11-19 18:55:163791#if BUILDFLAG(ENABLE_PLUGINS)
Lukasz Anforowicz7724d092019-10-03 23:50:213792 MaybeAddThrottle(&throttles,
3793 FlashDownloadInterception::MaybeCreateThrottleFor(handle));
trizzofo8ddaeb72016-09-01 23:18:273794#endif
3795
mmenkedb2637ff2017-03-30 23:59:423796#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
Lukasz Anforowicz7724d092019-10-03 23:50:213797 MaybeAddThrottle(
3798 &throttles,
3799 SupervisedUserNavigationThrottle::MaybeCreateThrottleFor(handle));
mmenkedb2637ff2017-03-30 23:59:423800#endif
3801
clamy40c9e142015-09-29 11:18:473802#if defined(OS_ANDROID)
3803 // TODO(davidben): This is insufficient to integrate with prerender properly.
3804 // https://crbug.com/370595
3805 prerender::PrerenderContents* prerender_contents =
3806 prerender::PrerenderContents::FromWebContents(handle->GetWebContents());
3807 if (!prerender_contents && handle->IsInMainFrame()) {
3808 throttles.push_back(
3809 navigation_interception::InterceptNavigationDelegate::CreateThrottleFor(
Charlie Harrison3286ab72019-02-13 20:13:303810 handle, navigation_interception::SynchronyMode::kAsync));
clamy40c9e142015-09-29 11:18:473811 }
Min Qin0ab0e162017-11-14 21:57:193812 throttles.push_back(InterceptOMADownloadNavigationThrottle::Create(handle));
Samuel Huang3a1ce1c32019-10-16 17:34:043813
3814#if BUILDFLAG(DFMIFY_DEV_UI)
3815 // If the DevUI DFM is already installed, then this is a no-op, except for the
3816 // side effect of ensuring that the DevUI DFM is loaded.
3817 MaybeAddThrottle(&throttles,
3818 dev_ui::DevUiLoaderThrottle::MaybeCreateThrottleFor(handle));
3819#endif // BUILDFLAG(DFMIFY_DEV_UI)
3820
Giovanni Ortuño Urquidi7ae7fb02017-10-09 01:49:573821#elif BUILDFLAG(ENABLE_EXTENSIONS)
clamy40c9e142015-09-29 11:18:473822 if (handle->IsInMainFrame()) {
3823 // Redirect some navigations to apps that have registered matching URL
3824 // handlers ('url_handlers' in the manifest).
Giovanni Ortuño Urquidi7ae7fb02017-10-09 01:49:573825 auto url_to_app_throttle =
3826 PlatformAppNavigationRedirector::MaybeCreateThrottleFor(handle);
clamy40c9e142015-09-29 11:18:473827 if (url_to_app_throttle)
dchenge73d8520c2015-12-27 01:19:093828 throttles.push_back(std::move(url_to_app_throttle));
clamy40c9e142015-09-29 11:18:473829 }
3830#endif
clamy49678312015-10-22 21:59:003831
3832#if defined(OS_CHROMEOS)
3833 // Check if we need to add merge session throttle. This throttle will postpone
3834 // loading of main frames.
3835 if (handle->IsInMainFrame()) {
3836 // Add interstitial page while merge session process (cookie reconstruction
3837 // from OAuth2 refresh token in ChromeOS login) is still in progress while
3838 // we are attempting to load a google property.
csharrisondd06bab2016-07-22 14:15:023839 if (merge_session_throttling_utils::ShouldAttachNavigationThrottle() &&
3840 !merge_session_throttling_utils::AreAllSessionMergedAlready() &&
clamy49678312015-10-22 21:59:003841 handle->GetURL().SchemeIsHTTPOrHTTPS()) {
3842 throttles.push_back(MergeSessionNavigationThrottle::Create(handle));
3843 }
Maggie Caia2f03f52019-04-02 02:13:283844 }
3845#endif
djacobo21e56e02016-07-02 01:14:313846
Maggie Caia2f03f52019-04-02 02:13:283847#if !defined(OS_ANDROID)
3848 if (base::FeatureList::IsEnabled(features::kIntentPicker)) {
Dominick Ng7c289942018-03-27 05:57:153849 auto url_to_apps_throttle =
Maggie Caia2f03f52019-04-02 02:13:283850#if defined(OS_CHROMEOS)
Maggie Cai00e2a21e2019-10-16 00:47:513851 base::FeatureList::IsEnabled(features::kAppServiceIntentHandling)
3852 ? apps::CommonAppsNavigationThrottle::MaybeCreate(handle)
3853 : chromeos::ChromeOsAppsNavigationThrottle::MaybeCreate(handle);
Avi Drissmana2969a552019-10-30 15:32:253854#elif defined(OS_MACOSX)
3855 apps::MacAppsNavigationThrottle::MaybeCreate(handle);
Maggie Caia2f03f52019-04-02 02:13:283856#else
3857 apps::AppsNavigationThrottle::MaybeCreate(handle);
3858#endif
Dominick Ng7c289942018-03-27 05:57:153859 if (url_to_apps_throttle)
3860 throttles.push_back(std::move(url_to_apps_throttle));
clamy49678312015-10-22 21:59:003861 }
3862#endif
3863
brettw00899e62016-11-12 02:10:173864#if BUILDFLAG(ENABLE_EXTENSIONS)
avid6d88b912017-01-13 00:16:003865 throttles.push_back(
Jeremy Romanec48d7a2018-03-01 17:35:093866 std::make_unique<extensions::ExtensionNavigationThrottle>(handle));
Clark DuVall2cf99249e2018-09-19 19:11:513867
Lukasz Anforowicz7724d092019-10-03 23:50:213868 MaybeAddThrottle(&throttles, extensions::ExtensionsBrowserClient::Get()
3869 ->GetUserScriptListener()
3870 ->CreateNavigationThrottle(handle));
naskob9164c42016-06-07 01:21:353871#endif
3872
bauerb8f9c37742017-03-30 15:04:123873#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
Lukasz Anforowicz7724d092019-10-03 23:50:213874 MaybeAddThrottle(
3875 &throttles,
3876 SupervisedUserGoogleAuthNavigationThrottle::MaybeCreate(handle));
bauerb8f9c37742017-03-30 15:04:123877#endif
3878
csharrisone985ebc2017-04-04 17:05:033879 content::WebContents* web_contents = handle->GetWebContents();
csharrison77bf8342017-05-04 18:23:103880 if (auto* subresource_filter_client =
3881 ChromeSubresourceFilterClient::FromWebContents(web_contents)) {
3882 subresource_filter_client->MaybeAppendNavigationThrottles(handle,
3883 &throttles);
csharrisone985ebc2017-04-04 17:05:033884 }
3885
zhenw6edd49c2017-07-12 05:49:453886#if !defined(OS_ANDROID)
3887 // BackgroundTabNavigationThrottle is used by TabManager, which is only
3888 // enabled on non-Android platforms.
Lukasz Anforowicz7724d092019-10-03 23:50:213889 MaybeAddThrottle(&throttles,
3890 resource_coordinator::BackgroundTabNavigationThrottle::
3891 MaybeCreateThrottleFor(handle));
zhenw6edd49c2017-07-12 05:49:453892#endif
3893
Nico Weberbc5b06f2019-07-26 14:00:133894#if BUILDFLAG(FULL_SAFE_BROWSING)
Lukasz Anforowicz7724d092019-10-03 23:50:213895 MaybeAddThrottle(&throttles,
3896 safe_browsing::MaybeCreateNavigationThrottle(handle));
Jialiu Linbdbb81d2017-10-11 21:29:093897#endif
3898
Lukasz Anforowicz7724d092019-10-03 23:50:213899 MaybeAddThrottle(
3900 &throttles,
Emily Starkfa0ddb42019-10-24 15:49:583901 LookalikeUrlNavigationThrottle::MaybeCreateNavigationThrottle(handle));
Joe DeBlasio6e8409a2019-02-20 23:08:273902
Lukasz Anforowicz7724d092019-10-03 23:50:213903 MaybeAddThrottle(&throttles,
3904 PDFIFrameNavigationThrottle::MaybeCreateThrottleFor(handle));
Amber Won6b5edc752017-08-17 19:23:543905
Lukasz Anforowicz7724d092019-10-03 23:50:213906 MaybeAddThrottle(&throttles, TabUnderNavigationThrottle::MaybeCreate(handle));
Charles Harrison6dd11d282017-10-03 06:14:513907
Jeremy Romanec48d7a2018-03-01 17:35:093908 throttles.push_back(std::make_unique<PolicyBlacklistNavigationThrottle>(
Doug Turner9dcaf5962017-12-21 04:38:533909 handle, handle->GetWebContents()->GetBrowserContext()));
3910
Carlos IL5a9e7512019-06-13 22:35:283911 throttles.push_back(std::make_unique<SSLErrorNavigationThrottle>(
3912 handle,
3913 std::make_unique<CertificateReportingServiceCertReporter>(web_contents),
Evan Stade1e71d6dd2019-10-29 03:04:493914 base::Bind(&SSLErrorHandler::HandleSSLError),
3915 base::Bind(&IsInHostedApp)));
Lucas Garron94b16052017-11-11 01:58:123916
Emily Starkd6896cd32019-08-21 04:55:543917 throttles.push_back(std::make_unique<LoginNavigationThrottle>(handle));
3918
Lukasz Anforowicz7724d092019-10-03 23:50:213919 MaybeAddThrottle(
3920 &throttles,
3921 TypedNavigationTimingThrottle::MaybeCreateThrottleFor(handle));
Christopher Thompson4137cec2017-12-19 05:34:233922
Dmitry Gozman57b92ce2017-12-28 22:24:543923#if !defined(OS_ANDROID)
Lukasz Anforowicz7724d092019-10-03 23:50:213924 MaybeAddThrottle(&throttles,
3925 DevToolsWindow::MaybeCreateNavigationThrottle(handle));
Conley Owensaafcf122018-02-26 18:53:513926
Lukasz Anforowicz7724d092019-10-03 23:50:213927 MaybeAddThrottle(
3928 &throttles, NewTabPageNavigationThrottle::MaybeCreateThrottleFor(handle));
jdoerrie4f9376f2018-12-12 18:26:203929
Lukasz Anforowicz7724d092019-10-03 23:50:213930 MaybeAddThrottle(
3931 &throttles,
3932 GooglePasswordManagerNavigationThrottle::MaybeCreateThrottleFor(handle));
Dmitry Gozman57b92ce2017-12-28 22:24:543933#endif
3934
Carlos IL4ee307e2018-12-22 03:19:003935 if (base::FeatureList::IsEnabled(safe_browsing::kCommittedSBInterstitials)) {
3936 throttles.push_back(
3937 std::make_unique<safe_browsing::SafeBrowsingNavigationThrottle>(
3938 handle));
3939 }
Robert Ogdenafd250b2018-07-25 22:21:033940
Nicolas Ouellet-Payeurbdcab0092018-10-22 14:50:333941#if defined(OS_WIN) || defined(OS_MACOSX) || \
3942 (defined(OS_LINUX) && !defined(OS_CHROMEOS))
Lukasz Anforowicz7724d092019-10-03 23:50:213943 MaybeAddThrottle(&throttles,
3944 browser_switcher::BrowserSwitcherNavigationThrottle::
3945 MaybeCreateThrottleFor(handle));
Nicolas Ouellet-Payeur995e7772018-09-13 16:02:133946#endif
3947
dchenge73d8520c2015-12-27 01:19:093948 return throttles;
clamy40c9e142015-09-29 11:18:473949}
3950
clamy1e5574e2016-09-29 16:48:443951std::unique_ptr<content::NavigationUIData>
3952ChromeContentBrowserClient::GetNavigationUIData(
3953 content::NavigationHandle* navigation_handle) {
Jeremy Romanec48d7a2018-03-01 17:35:093954 return std::make_unique<ChromeNavigationUIData>(navigation_handle);
clamy1e5574e2016-09-29 16:48:443955}
3956
Xiaohan Wanga4e41842018-06-26 18:45:103957void ChromeContentBrowserClient::GetHardwareSecureDecryptionCaps(
3958 const std::string& key_system,
3959 const base::flat_set<media::CdmProxy::Protocol>& cdm_proxy_protocols,
3960 base::flat_set<media::VideoCodec>* video_codecs,
3961 base::flat_set<media::EncryptionMode>* encryption_schemes) {
3962#if defined(OS_WIN) && BUILDFLAG(ENABLE_LIBRARY_CDMS) && \
Xiaohan Wangf170c732018-09-27 05:45:263963 BUILDFLAG(ENABLE_WIDEVINE)
Xiaohan Wanga4e41842018-06-26 18:45:103964 if (key_system == kWidevineKeySystem) {
3965 GetWidevineHardwareCaps(cdm_proxy_protocols, video_codecs,
3966 encryption_schemes);
3967 }
3968#endif
3969}
3970
[email protected]487974a2014-06-13 16:49:013971content::DevToolsManagerDelegate*
3972ChromeContentBrowserClient::GetDevToolsManagerDelegate() {
Pavel Feldman43f56b7c2016-08-30 00:04:353973#if defined(OS_ANDROID)
3974 return new DevToolsManagerDelegateAndroid();
3975#else
[email protected]487974a2014-06-13 16:49:013976 return new ChromeDevToolsManagerDelegate();
Pavel Feldman43f56b7c2016-08-30 00:04:353977#endif
[email protected]487974a2014-06-13 16:49:013978}
3979
Rayan Kanso411e84e2019-02-13 15:27:403980void ChromeContentBrowserClient::UpdateDevToolsBackgroundServiceExpiration(
3981 content::BrowserContext* browser_context,
3982 int service,
3983 base::Time expiration_time) {
3984 Profile* profile = Profile::FromBrowserContext(browser_context);
3985 DCHECK(profile);
3986
3987 auto* pref_service = profile->GetPrefs();
3988 DCHECK(pref_service);
3989
3990 DictionaryPrefUpdate pref_update(
3991 pref_service, prefs::kDevToolsBackgroundServicesExpirationDict);
3992 base::DictionaryValue* exp_dict = pref_update.Get();
3993
3994 // Convert |expiration_time| to minutes since that is the most granular
3995 // option that returns an int. base::Value does not accept int64.
3996 int expiration_time_minutes =
3997 expiration_time.ToDeltaSinceWindowsEpoch().InMinutes();
3998 exp_dict->SetInteger(base::NumberToString(service), expiration_time_minutes);
3999}
4000
4001base::flat_map<int, base::Time>
4002ChromeContentBrowserClient::GetDevToolsBackgroundServiceExpirations(
4003 content::BrowserContext* browser_context) {
4004 Profile* profile = Profile::FromBrowserContext(browser_context);
4005 DCHECK(profile);
4006
4007 auto* pref_service = profile->GetPrefs();
4008 DCHECK(pref_service);
4009
4010 auto* expiration_dict = pref_service->GetDictionary(
4011 prefs::kDevToolsBackgroundServicesExpirationDict);
4012 DCHECK(expiration_dict);
4013
4014 base::flat_map<int, base::Time> expiration_times;
4015 for (const auto& it : *expiration_dict) {
4016 // key.
4017 int service = 0;
4018 bool did_convert = base::StringToInt(it.first, &service);
4019 DCHECK(did_convert);
4020
4021 // value.
4022 DCHECK(it.second->is_int());
4023 base::TimeDelta delta = base::TimeDelta::FromMinutes(it.second->GetInt());
4024 base::Time expiration_time = base::Time::FromDeltaSinceWindowsEpoch(delta);
4025
4026 expiration_times[service] = expiration_time;
4027 }
4028
4029 return expiration_times;
4030}
4031
oysteinec563c582015-02-13 19:19:524032content::TracingDelegate* ChromeContentBrowserClient::GetTracingDelegate() {
oysteinec563c582015-02-13 19:19:524033 return new ChromeTracingDelegate();
oysteinec563c582015-02-13 19:19:524034}
4035
[email protected]a6868c22013-10-09 02:50:294036bool ChromeContentBrowserClient::IsPluginAllowedToCallRequestOSFileHandle(
4037 content::BrowserContext* browser_context,
4038 const GURL& url) {
brettw4b461082016-11-19 18:55:164039#if BUILDFLAG(ENABLE_PLUGINS) && BUILDFLAG(ENABLE_EXTENSIONS)
jitendra.ks42e889a2014-12-05 09:05:554040 return ChromeContentBrowserClientPluginsPart::
4041 IsPluginAllowedToCallRequestOSFileHandle(browser_context, url,
4042 allowed_file_handle_origins_);
[email protected]a6868c22013-10-09 02:50:294043#else
4044 return false;
4045#endif
4046}
4047
[email protected]aec5ed52014-06-20 07:51:424048bool ChromeContentBrowserClient::IsPluginAllowedToUseDevChannelAPIs(
4049 content::BrowserContext* browser_context,
4050 const GURL& url) {
brettw4b461082016-11-19 18:55:164051#if BUILDFLAG(ENABLE_PLUGINS) && BUILDFLAG(ENABLE_EXTENSIONS)
jitendra.ks42e889a2014-12-05 09:05:554052 return ChromeContentBrowserClientPluginsPart::
4053 IsPluginAllowedToUseDevChannelAPIs(browser_context, url,
4054 allowed_dev_channel_origins_);
[email protected]8ddc6b7c2013-12-12 20:42:064055#else
4056 return false;
4057#endif
4058}
4059
mlamourif8c23a2002015-01-27 13:10:104060void ChromeContentBrowserClient::OverridePageVisibilityState(
xzhan96cf0a3c542017-11-17 04:33:014061 RenderFrameHost* render_frame_host,
danakj0018a29a2018-12-01 01:03:434062 content::PageVisibilityState* visibility_state) {
thestig00844cea2015-09-08 21:44:524063 DCHECK_CURRENTLY_ON(BrowserThread::UI);
mlamourif8c23a2002015-01-27 13:10:104064
4065 WebContents* web_contents =
4066 WebContents::FromRenderFrameHost(render_frame_host);
4067 DCHECK(web_contents);
4068
mlamourif8c23a2002015-01-27 13:10:104069 prerender::PrerenderManager* prerender_manager =
drogerc1543152016-09-20 13:03:374070 prerender::PrerenderManagerFactory::GetForBrowserContext(
4071 web_contents->GetBrowserContext());
mlamourif8c23a2002015-01-27 13:10:104072 if (prerender_manager &&
4073 prerender_manager->IsWebContentsPrerendering(web_contents, nullptr)) {
danakj0018a29a2018-12-01 01:03:434074 *visibility_state = content::PageVisibilityState::kPrerender;
mlamourif8c23a2002015-01-27 13:10:104075 }
4076}
4077
Sam McNallyfaf9a402017-10-31 03:06:314078void ChromeContentBrowserClient::InitWebContextInterfaces() {
Jeremy Romanec48d7a2018-03-01 17:35:094079 frame_interfaces_ = std::make_unique<service_manager::BinderRegistry>();
4080 frame_interfaces_parameterized_ = std::make_unique<
Ben Goodger21ada1e2017-07-19 14:53:014081 service_manager::BinderRegistryWithArgs<content::RenderFrameHost*>>();
Sam McNallyfaf9a402017-10-31 03:06:314082 worker_interfaces_parameterized_ =
Jeremy Romanec48d7a2018-03-01 17:35:094083 std::make_unique<service_manager::BinderRegistryWithArgs<
Sam McNallyfaf9a402017-10-31 03:06:314084 content::RenderProcessHost*, const url::Origin&>>();
Ben Goodger6a695c012017-06-20 20:21:204085
Michael Martis4a542f52017-07-28 01:51:444086 // Register mojo ContentTranslateDriver interface only for main frame.
Anthony Vallee-Duboise2432137a2019-01-17 20:06:014087 frame_interfaces_parameterized_->AddInterface(
4088 base::BindRepeating(&language::BindContentTranslateDriver));
Ben Goodger6a695c012017-06-20 20:21:204089
Ben Goodger6a695c012017-06-20 20:21:204090#if defined(OS_ANDROID)
Ben Goodger6a695c012017-06-20 20:21:204091 frame_interfaces_parameterized_->AddInterface(
Dan Harringtonf60bd502019-09-05 17:30:334092 base::BindRepeating(&offline_pages::OfflinePageAutoFetcher::Create));
Dan Harringtonbc87c062018-10-31 15:21:244093#endif
Ben Goodger6a695c012017-06-20 20:21:204094}
4095
Robert Sesek466e43e2019-08-19 22:02:024096void ChromeContentBrowserClient::InitNetworkContextsParentDirectory() {
4097 base::FilePath user_data_dir;
4098 base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
4099 DCHECK(!user_data_dir.empty());
4100 network_contexts_parent_directory_.push_back(user_data_dir);
4101
4102 base::FilePath cache_dir;
4103 chrome::GetUserCacheDirectory(user_data_dir, &cache_dir);
4104 DCHECK(!cache_dir.empty());
4105 // On some platforms, the cache is a child of the user_data_dir so only
4106 // return the one path.
4107 if (!user_data_dir.IsParent(cache_dir))
4108 network_contexts_parent_directory_.push_back(cache_dir);
4109
4110 // If the cache location has been overridden by a switch or preference,
4111 // include that as well.
4112 if (auto* local_state = g_browser_process->local_state()) {
4113 base::FilePath pref_cache_dir =
4114 local_state->GetFilePath(prefs::kDiskCacheDir);
4115 if (!pref_cache_dir.empty() && !user_data_dir.IsParent(cache_dir))
4116 network_contexts_parent_directory_.push_back(pref_cache_dir);
4117 }
4118}
4119
[email protected]30335fdf02014-02-26 19:51:274120void ChromeContentBrowserClient::MaybeCopyDisableWebRtcEncryptionSwitch(
avi3ef9ec9e2014-12-22 22:50:174121 base::CommandLine* to_command_line,
4122 const base::CommandLine& from_command_line,
sdefresne6e883e42015-07-30 08:05:544123 version_info::Channel channel) {
[email protected]30335fdf02014-02-26 19:51:274124#if defined(OS_ANDROID)
sdefresne6e883e42015-07-30 08:05:544125 const version_info::Channel kMaxDisableEncryptionChannel =
4126 version_info::Channel::BETA;
[email protected]30335fdf02014-02-26 19:51:274127#else
sdefresne6e883e42015-07-30 08:05:544128 const version_info::Channel kMaxDisableEncryptionChannel =
4129 version_info::Channel::DEV;
[email protected]30335fdf02014-02-26 19:51:274130#endif
4131 if (channel <= kMaxDisableEncryptionChannel) {
4132 static const char* const kWebRtcDevSwitchNames[] = {
Aran Gilmanf010bdd2019-08-28 19:55:444133 switches::kDisableWebRtcEncryption,
[email protected]30335fdf02014-02-26 19:51:274134 };
Avi Drissmand251e912018-12-26 15:46:374135 to_command_line->CopySwitchesFrom(from_command_line, kWebRtcDevSwitchNames,
4136 base::size(kWebRtcDevSwitchNames));
[email protected]30335fdf02014-02-26 19:51:274137 }
4138}
bashi933629552016-10-13 23:32:404139
miu54dca6c2016-11-17 10:59:384140#if BUILDFLAG(ENABLE_MEDIA_REMOTING)
4141void ChromeContentBrowserClient::CreateMediaRemoter(
4142 content::RenderFrameHost* render_frame_host,
Gyuyoung Kima4f9f942019-10-26 02:55:504143 mojo::PendingRemote<media::mojom::RemotingSource> source,
4144 mojo::PendingReceiver<media::mojom::Remoter> receiver) {
miu54dca6c2016-11-17 10:59:384145 CastRemotingConnector::CreateMediaRemoter(
Gyuyoung Kima4f9f942019-10-26 02:55:504146 render_frame_host, std::move(source), std::move(receiver));
miu54dca6c2016-11-17 10:59:384147}
4148#endif // BUILDFLAG(ENABLE_MEDIA_REMOTING)
robliaobf5a32e2016-12-09 03:35:464149
Michael Giuffrida6802ffe2017-09-29 03:40:254150base::FilePath ChromeContentBrowserClient::GetLoggingFileName(
4151 const base::CommandLine& command_line) {
4152 return logging::GetLogFileName(command_line);
kerrnela67fad52017-06-14 20:18:164153}
4154
John Abd-El-Malek8efa11f2019-01-06 00:51:534155namespace {
4156// TODO(jam): move this to a separate file.
Minggang Wangf6840ecf2019-07-29 05:15:024157class ProtocolHandlerThrottle : public blink::URLLoaderThrottle {
John Abd-El-Malek8efa11f2019-01-06 00:51:534158 public:
4159 explicit ProtocolHandlerThrottle(
Clark DuValla411bda2019-08-02 03:09:174160 ProtocolHandlerRegistry* protocol_handler_registry)
John Abd-El-Malek8efa11f2019-01-06 00:51:534161 : protocol_handler_registry_(protocol_handler_registry) {}
4162 ~ProtocolHandlerThrottle() override = default;
4163
4164 void WillStartRequest(network::ResourceRequest* request,
4165 bool* defer) override {
Robbie McElrath16aaed6c2019-06-04 00:50:294166 TranslateUrl(&request->url);
John Abd-El-Malek8efa11f2019-01-06 00:51:534167 }
4168
4169 void WillRedirectRequest(net::RedirectInfo* redirect_info,
Lucas Furukawa Gadani011886592019-10-23 17:12:244170 const network::mojom::URLResponseHead& response_head,
John Abd-El-Malek8efa11f2019-01-06 00:51:534171 bool* defer,
4172 std::vector<std::string>* to_be_removed_headers,
4173 net::HttpRequestHeaders* modified_headers) override {
Robbie McElrath16aaed6c2019-06-04 00:50:294174 TranslateUrl(&redirect_info->new_url);
John Abd-El-Malek8efa11f2019-01-06 00:51:534175 }
4176
4177 private:
Robbie McElrath16aaed6c2019-06-04 00:50:294178 void TranslateUrl(GURL* url) {
4179 if (!protocol_handler_registry_->IsHandledProtocol(url->scheme()))
4180 return;
4181 GURL translated_url = protocol_handler_registry_->Translate(*url);
4182 if (!translated_url.is_empty())
4183 *url = translated_url;
4184 }
4185
Clark DuValla411bda2019-08-02 03:09:174186 ProtocolHandlerRegistry* protocol_handler_registry_;
John Abd-El-Malek8efa11f2019-01-06 00:51:534187};
4188} // namespace
4189
Minggang Wangf6840ecf2019-07-29 05:15:024190std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
Clark DuVallfffa41e2019-06-25 20:27:194191ChromeContentBrowserClient::CreateURLLoaderThrottles(
4192 const network::ResourceRequest& request,
4193 content::BrowserContext* browser_context,
4194 const base::RepeatingCallback<content::WebContents*()>& wc_getter,
4195 content::NavigationUIData* navigation_ui_data,
4196 int frame_tree_node_id) {
4197 DCHECK_CURRENTLY_ON(BrowserThread::UI);
4198
Minggang Wangf6840ecf2019-07-29 05:15:024199 std::vector<std::unique_ptr<blink::URLLoaderThrottle>> result;
Clark DuVallfffa41e2019-06-25 20:27:194200
4201 Profile* profile = Profile::FromBrowserContext(browser_context);
4202
4203 ChromeNavigationUIData* chrome_navigation_ui_data =
4204 static_cast<ChromeNavigationUIData*>(navigation_ui_data);
4205
Clark DuVall68eb997f2019-06-28 05:42:284206 auto* drp_settings =
4207 DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
4208 browser_context);
4209 if (chrome_navigation_ui_data && !profile->IsIncognitoProfile() &&
4210 data_reduction_proxy::params::IsEnabledWithNetworkService() &&
4211 drp_settings) {
4212 if (!data_reduction_proxy_throttle_manager_) {
Wojciech Dzierżanowskie7c8e3f2019-09-27 20:50:314213 data_reduction_proxy_throttle_manager_ = std::make_unique<
4214 data_reduction_proxy::DataReductionProxyThrottleManager>(
4215 drp_settings->data_reduction_proxy_service(),
4216 data_reduction_proxy::DataReductionProxyThrottleManager::CreateConfig(
4217 drp_settings->data_reduction_proxy_service()
4218 ->config()
4219 ->GetProxiesForHttp()));
Clark DuVall68eb997f2019-06-28 05:42:284220 }
4221 net::HttpRequestHeaders headers;
4222 data_reduction_proxy::DataReductionProxyRequestOptions::
4223 AddPageIDRequestHeader(
4224 &headers,
4225 chrome_navigation_ui_data->data_reduction_proxy_page_id());
4226 result.push_back(std::make_unique<
4227 data_reduction_proxy::DataReductionProxyURLLoaderThrottle>(
4228 headers, data_reduction_proxy_throttle_manager_.get()));
4229 }
4230
Nico Weberbc5b06f2019-07-26 14:00:134231#if BUILDFLAG(SAFE_BROWSING_DB_LOCAL) || BUILDFLAG(SAFE_BROWSING_DB_REMOTE)
Clark DuVall5497288d2019-07-17 00:17:564232 bool matches_enterprise_whitelist = safe_browsing::IsURLWhitelistedByPolicy(
4233 request.url, *profile->GetPrefs());
4234 if (!matches_enterprise_whitelist) {
4235 result.push_back(safe_browsing::BrowserURLLoaderThrottle::Create(
4236 base::BindOnce(
4237 &ChromeContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate,
4238 base::Unretained(this)),
4239 wc_getter, frame_tree_node_id, profile->GetResourceContext()));
4240 }
Nico Weberbc5b06f2019-07-26 14:00:134241#endif
Clark DuVall5497288d2019-07-17 00:17:564242
Clark DuVallfffa41e2019-06-25 20:27:194243 if (chrome_navigation_ui_data &&
4244 chrome_navigation_ui_data->prerender_mode() != prerender::NO_PRERENDER) {
4245 result.push_back(std::make_unique<prerender::PrerenderURLLoaderThrottle>(
4246 chrome_navigation_ui_data->prerender_mode(),
4247 chrome_navigation_ui_data->prerender_histogram_prefix(),
4248 base::BindOnce(GetPrerenderCanceller, wc_getter),
Sami Kyostila5e1306d2019-08-14 11:01:294249 base::CreateSingleThreadTaskRunner({BrowserThread::UI})));
Clark DuVallfffa41e2019-06-25 20:27:194250 }
4251
David Rogere8e83f3c2019-09-12 10:56:234252 signin::IdentityManager* identity_manager =
4253 IdentityManagerFactory::GetForProfile(profile);
4254 bool is_signed_in = identity_manager && identity_manager->HasPrimaryAccount();
Clark DuVallfffa41e2019-06-25 20:27:194255
4256 chrome::mojom::DynamicParams dynamic_params = {
4257 profile->GetPrefs()->GetBoolean(prefs::kForceGoogleSafeSearch),
4258 profile->GetPrefs()->GetInteger(prefs::kForceYouTubeRestrict),
4259 profile->GetPrefs()->GetString(prefs::kAllowedDomainsForApps),
4260 variations::VariationsHttpHeaderProvider::GetInstance()
4261 ->GetClientDataHeader(is_signed_in)};
4262 result.push_back(std::make_unique<GoogleURLLoaderThrottle>(
David Rogere8e83f3c2019-09-12 10:56:234263 profile->IsOffTheRecord(), std::move(dynamic_params)));
Clark DuVallfffa41e2019-06-25 20:27:194264
Clark DuValla411bda2019-08-02 03:09:174265 result.push_back(std::make_unique<ProtocolHandlerThrottle>(
4266 ProtocolHandlerRegistryFactory::GetForBrowserContext(browser_context)));
Clark DuVall8512cee62019-06-26 01:14:214267
Clark DuVall39c2cfc2019-06-25 21:49:284268#if BUILDFLAG(ENABLE_PLUGINS)
4269 result.push_back(std::make_unique<PluginResponseInterceptorURLLoaderThrottle>(
Clark DuVall1df2052b2019-08-05 19:58:464270 request.resource_type, frame_tree_node_id));
Clark DuVall39c2cfc2019-06-25 21:49:284271#endif
4272
Robbie McElrath127ad2b2019-07-22 22:38:114273 auto delegate =
Robbie McElrath38f47af2019-09-19 21:51:404274 std::make_unique<signin::HeaderModificationDelegateImpl>(profile);
Robbie McElrath127ad2b2019-07-22 22:38:114275 auto signin_throttle = signin::URLLoaderThrottle::MaybeCreate(
4276 std::move(delegate), navigation_ui_data, wc_getter);
4277 if (signin_throttle)
4278 result.push_back(std::move(signin_throttle));
4279
Clark DuVallfffa41e2019-06-25 20:27:194280 return result;
4281}
4282
Ken Rockot6414c4d92017-11-08 19:58:324283void ChromeContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
John Abd-El-Malekea006302018-05-10 05:50:464284 int frame_tree_node_id,
Ken Rockot6414c4d92017-11-08 19:58:324285 NonNetworkURLLoaderFactoryMap* factories) {
Robbie McElrath6a45ea62018-12-05 06:53:414286#if BUILDFLAG(ENABLE_EXTENSIONS) || defined(OS_CHROMEOS)
John Abd-El-Malekea006302018-05-10 05:50:464287 content::WebContents* web_contents =
4288 content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
Robbie McElrath6a45ea62018-12-05 06:53:414289#if BUILDFLAG(ENABLE_EXTENSIONS)
Ken Rockot6414c4d92017-11-08 19:58:324290 factories->emplace(
4291 extensions::kExtensionScheme,
Chris Mumford8f812662018-02-22 00:27:574292 extensions::CreateExtensionNavigationURLLoaderFactory(
John Abd-El-Malekea006302018-05-10 05:50:464293 web_contents->GetBrowserContext(),
4294 !!extensions::WebViewGuest::FromWebContents(web_contents)));
Robbie McElrath6a45ea62018-12-05 06:53:414295#endif // BUILDFLAG(ENABLE_EXTENSIONS)
4296#if defined(OS_CHROMEOS)
4297 Profile* profile =
4298 Profile::FromBrowserContext(web_contents->GetBrowserContext());
Robbie McElrath89cc9332019-03-05 02:12:304299 factories->emplace(content::kExternalFileScheme,
4300 std::make_unique<chromeos::ExternalFileURLLoaderFactory>(
4301 profile, content::ChildProcessHost::kInvalidUniqueID));
Robbie McElrath6a45ea62018-12-05 06:53:414302#endif // defined(OS_CHROMEOS)
4303#endif // BUILDFLAG(ENABLE_EXTENSIONS) || defined(OS_CHROMEOS)
Ken Rockot6414c4d92017-11-08 19:58:324304}
4305
Ting Shao2dc60582019-07-15 04:43:364306void ChromeContentBrowserClient::
Hiroki Nakagawa1efa31d2019-10-01 22:36:344307 RegisterNonNetworkWorkerMainResourceURLLoaderFactories(
4308 content::BrowserContext* browser_context,
4309 NonNetworkURLLoaderFactoryMap* factories) {
4310#if BUILDFLAG(ENABLE_EXTENSIONS)
4311 DCHECK(browser_context);
4312 DCHECK(factories);
4313 factories->emplace(
4314 extensions::kExtensionScheme,
4315 extensions::CreateExtensionWorkerMainResourceURLLoaderFactory(
4316 browser_context));
4317#endif // BUILDFLAG(ENABLE_EXTENSIONS)
4318}
4319
4320void ChromeContentBrowserClient::
Ting Shao2dc60582019-07-15 04:43:364321 RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories(
4322 content::BrowserContext* browser_context,
4323 NonNetworkURLLoaderFactoryMap* factories) {
Hiroki Nakagawad5e7e89d82019-09-11 09:42:114324#if BUILDFLAG(ENABLE_EXTENSIONS)
Ting Shao2dc60582019-07-15 04:43:364325 DCHECK(browser_context);
4326 DCHECK(factories);
Ting Shao2dc60582019-07-15 04:43:364327 factories->emplace(
4328 extensions::kExtensionScheme,
4329 extensions::CreateExtensionServiceWorkerScriptURLLoaderFactory(
4330 browser_context));
4331#endif // BUILDFLAG(ENABLE_EXTENSIONS)
Ting Shao2dc60582019-07-15 04:43:364332}
4333
Jay Civelli2578ebe2018-06-05 18:44:314334namespace {
4335
4336// The FileURLLoaderFactory provided to the extension background pages.
4337// Checks with the ChildProcessSecurityPolicy to validate the file access.
4338class FileURLLoaderFactory : public network::mojom::URLLoaderFactory {
4339 public:
4340 explicit FileURLLoaderFactory(int child_id) : child_id_(child_id) {}
4341
4342 private:
4343 // network::mojom::URLLoaderFactory:
Julie Jeongeun Kime003de52019-10-29 05:14:274344 void CreateLoaderAndStart(
4345 mojo::PendingReceiver<network::mojom::URLLoader> loader,
4346 int32_t routing_id,
4347 int32_t request_id,
4348 uint32_t options,
4349 const network::ResourceRequest& request,
4350 network::mojom::URLLoaderClientPtr client,
4351 const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
4352 override {
Jay Civelli2578ebe2018-06-05 18:44:314353 if (!content::ChildProcessSecurityPolicy::GetInstance()->CanRequestURL(
4354 child_id_, request.url)) {
4355 client->OnComplete(
4356 network::URLLoaderCompletionStatus(net::ERR_ACCESS_DENIED));
4357 return;
4358 }
4359 content::CreateFileURLLoader(request, std::move(loader), std::move(client),
John Abd-El-Malek916f2b82019-02-19 23:49:454360 /*observer=*/nullptr,
4361 /* allow_directory_listing */ true);
Jay Civelli2578ebe2018-06-05 18:44:314362 }
4363
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:524364 void Clone(
4365 mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) override {
4366 receivers_.Add(this, std::move(loader));
Jay Civelli2578ebe2018-06-05 18:44:314367 }
4368
4369 int child_id_;
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:524370 mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
Jay Civelli2578ebe2018-06-05 18:44:314371 DISALLOW_COPY_AND_ASSIGN(FileURLLoaderFactory);
4372};
4373
4374} // namespace
4375
Ken Rockot6414c4d92017-11-08 19:58:324376void ChromeContentBrowserClient::
4377 RegisterNonNetworkSubresourceURLLoaderFactories(
John Abd-El-Malekea006302018-05-10 05:50:464378 int render_process_id,
4379 int render_frame_id,
Ken Rockot6414c4d92017-11-08 19:58:324380 NonNetworkURLLoaderFactoryMap* factories) {
Robbie McElrath6a45ea62018-12-05 06:53:414381#if defined(OS_CHROMEOS) || BUILDFLAG(ENABLE_EXTENSIONS)
4382 content::RenderFrameHost* frame_host =
4383 RenderFrameHost::FromID(render_process_id, render_frame_id);
4384 WebContents* web_contents = WebContents::FromRenderFrameHost(frame_host);
4385#endif // defined(OS_CHROMEOS) || BUILDFLAG(ENABLE_EXTENSIONS)
4386
4387#if defined(OS_CHROMEOS)
4388 if (web_contents) {
4389 Profile* profile =
4390 Profile::FromBrowserContext(web_contents->GetBrowserContext());
Robbie McElrath89cc9332019-03-05 02:12:304391 factories->emplace(content::kExternalFileScheme,
4392 std::make_unique<chromeos::ExternalFileURLLoaderFactory>(
4393 profile, render_process_id));
Robbie McElrath6a45ea62018-12-05 06:53:414394 }
4395#endif // defined(OS_CHROMEOS)
4396
Ken Rockot6414c4d92017-11-08 19:58:324397#if BUILDFLAG(ENABLE_EXTENSIONS)
John Abd-El-Malekea006302018-05-10 05:50:464398 auto factory = extensions::CreateExtensionURLLoaderFactory(render_process_id,
4399 render_frame_id);
Ken Rockot6414c4d92017-11-08 19:58:324400 if (factory)
4401 factories->emplace(extensions::kExtensionScheme, std::move(factory));
Chris Mumfordbae8a742018-03-01 23:02:234402
4403 // This logic should match
4404 // ChromeExtensionWebContentsObserver::RenderFrameCreated.
Jay Civellic9bbf72d2018-03-24 01:58:314405 if (!web_contents)
Chris Mumfordbae8a742018-03-01 23:02:234406 return;
Jay Civellic9bbf72d2018-03-24 01:58:314407
4408 Profile* profile =
4409 Profile::FromBrowserContext(web_contents->GetBrowserContext());
4410 InstantService* instant_service =
4411 InstantServiceFactory::GetForProfile(profile);
4412 // The test below matches what's done by ShouldServiceRequestIOThread in
4413 // local_ntp_source.cc.
John Abd-El-Malekea006302018-05-10 05:50:464414 if (instant_service->IsInstantProcess(render_process_id)) {
Jay Civellic9bbf72d2018-03-24 01:58:314415 factories->emplace(
4416 chrome::kChromeSearchScheme,
4417 content::CreateWebUIURLLoader(
4418 frame_host, chrome::kChromeSearchScheme,
4419 /*allowed_webui_hosts=*/base::flat_set<std::string>()));
Chris Mumfordbae8a742018-03-01 23:02:234420 }
Jay Civellic9bbf72d2018-03-24 01:58:314421
Chris Mumfordbae8a742018-03-01 23:02:234422 extensions::ChromeExtensionWebContentsObserver* web_observer =
4423 extensions::ChromeExtensionWebContentsObserver::FromWebContents(
4424 web_contents);
4425
Karan Bhatia91928572018-03-06 01:18:074426 // There is nothing to do if no ChromeExtensionWebContentsObserver is attached
4427 // to the |web_contents|.
4428 if (!web_observer)
4429 return;
4430
Chris Mumfordbae8a742018-03-01 23:02:234431 const Extension* extension =
4432 web_observer->GetExtensionFromFrame(frame_host, false);
4433 if (!extension)
4434 return;
4435
Sam McNally7414eeb72018-09-03 04:05:304436 std::vector<std::string> allowed_webui_hosts;
Chris Mumfordbae8a742018-03-01 23:02:234437 // Support for chrome:// scheme if appropriate.
4438 if ((extension->is_extension() || extension->is_platform_app()) &&
4439 Manifest::IsComponentLocation(extension->location())) {
4440 // Components of chrome that are implemented as extensions or platform apps
4441 // are allowed to use chrome://resources/ and chrome://theme/ URLs.
Sam McNally7414eeb72018-09-03 04:05:304442 allowed_webui_hosts.emplace_back(content::kChromeUIResourcesHost);
4443 allowed_webui_hosts.emplace_back(chrome::kChromeUIThemeHost);
4444 }
4445 if (extension->is_extension() || extension->is_legacy_packaged_app() ||
4446 (extension->is_platform_app() &&
4447 Manifest::IsComponentLocation(extension->location()))) {
Chris Mumfordbae8a742018-03-01 23:02:234448 // Extensions, legacy packaged apps, and component platform apps are allowed
Lucas Tenório3dd80922019-03-27 03:51:024449 // to use chrome://favicon/, chrome://extension-icon/ and chrome://app-icon
4450 // URLs. Hosted apps are not allowed because they are served via web servers
4451 // (and are generally never given access to Chrome APIs).
Sam McNally7414eeb72018-09-03 04:05:304452 allowed_webui_hosts.emplace_back(chrome::kChromeUIExtensionIconHost);
4453 allowed_webui_hosts.emplace_back(chrome::kChromeUIFaviconHost);
Lucas Tenório3dd80922019-03-27 03:51:024454 allowed_webui_hosts.emplace_back(chrome::kChromeUIAppIconHost);
Sam McNally7414eeb72018-09-03 04:05:304455 }
4456 if (!allowed_webui_hosts.empty()) {
Chris Mumfordbae8a742018-03-01 23:02:234457 factories->emplace(
4458 content::kChromeUIScheme,
4459 content::CreateWebUIURLLoader(frame_host, content::kChromeUIScheme,
4460 std::move(allowed_webui_hosts)));
4461 }
Jay Civelli2578ebe2018-06-05 18:44:314462
4463 // Extension with a background page get file access that gets approval from
4464 // ChildProcessSecurityPolicy.
4465 extensions::ExtensionHost* host =
4466 extensions::ProcessManager::Get(web_contents->GetBrowserContext())
4467 ->GetBackgroundHostForExtension(extension->id());
4468 if (host) {
4469 factories->emplace(url::kFileScheme, std::make_unique<FileURLLoaderFactory>(
4470 render_process_id));
4471 }
Chris Mumfordbae8a742018-03-01 23:02:234472#endif // BUILDFLAG(ENABLE_EXTENSIONS)
Ken Rockot6414c4d92017-11-08 19:58:324473}
4474
Ken Rockota0dfaca12018-02-15 07:26:254475bool ChromeContentBrowserClient::WillCreateURLLoaderFactory(
Ken Rockot428b1d62018-06-06 17:12:214476 content::BrowserContext* browser_context,
Ken Rockota0dfaca12018-02-15 07:26:254477 content::RenderFrameHost* frame,
Kenichi Ishibashi09ee5e72018-11-27 07:12:384478 int render_process_id,
Karan Bhatia4a834b32019-08-16 22:26:444479 URLLoaderFactoryType type,
Lukasz Anforowicz762733652018-09-28 14:48:264480 const url::Origin& request_initiator,
Dominic Farolino1be897a2019-07-20 08:11:424481 mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver,
Julie Jeongeun Kim47499a0c2019-08-28 07:23:184482 mojo::PendingRemote<network::mojom::TrustedURLLoaderHeaderClient>*
4483 header_client,
Clark DuVall8dc4e502018-09-07 01:51:124484 bool* bypass_redirect_checks) {
Reilly Grant24bf8332018-08-27 21:55:014485 bool use_proxy = false;
4486
Ken Rockota0dfaca12018-02-15 07:26:254487#if BUILDFLAG(ENABLE_EXTENSIONS)
4488 auto* web_request_api =
4489 extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get(
Ken Rockot428b1d62018-06-06 17:12:214490 browser_context);
Ken Rockota0dfaca12018-02-15 07:26:254491
4492 // NOTE: Some unit test environments do not initialize
4493 // BrowserContextKeyedAPI factories for e.g. WebRequest.
Reilly Grant24bf8332018-08-27 21:55:014494 if (web_request_api) {
Clark DuVall8dc4e502018-09-07 01:51:124495 bool use_proxy_for_web_request =
Kenichi Ishibashi09ee5e72018-11-27 07:12:384496 web_request_api->MaybeProxyURLLoaderFactory(
Karan Bhatia4a834b32019-08-16 22:26:444497 browser_context, frame, render_process_id, type, factory_receiver,
4498 header_client);
Clark DuVall8dc4e502018-09-07 01:51:124499 if (bypass_redirect_checks)
4500 *bypass_redirect_checks = use_proxy_for_web_request;
4501 use_proxy |= use_proxy_for_web_request;
Reilly Grant24bf8332018-08-27 21:55:014502 }
Ken Rockota0dfaca12018-02-15 07:26:254503#endif
Reilly Grant24bf8332018-08-27 21:55:014504
Reilly Grantcc22e602018-09-07 15:25:204505 use_proxy |= signin::ProxyingURLLoaderFactory::MaybeProxyRequest(
Karan Bhatia4a834b32019-08-16 22:26:444506 frame, type == URLLoaderFactoryType::kNavigation, request_initiator,
4507 factory_receiver);
Reilly Grant24bf8332018-08-27 21:55:014508
4509 return use_proxy;
Ken Rockota0dfaca12018-02-15 07:26:254510}
4511
Jian Lide7b43792018-06-01 23:22:134512std::vector<std::unique_ptr<content::URLLoaderRequestInterceptor>>
4513ChromeContentBrowserClient::WillCreateURLLoaderRequestInterceptors(
4514 content::NavigationUIData* navigation_ui_data,
Ryan Sturm27d93f412019-02-15 21:30:144515 int frame_tree_node_id,
4516 const scoped_refptr<network::SharedURLLoaderFactory>&
4517 network_loader_factory) {
Jian Lide7b43792018-06-01 23:22:134518 std::vector<std::unique_ptr<content::URLLoaderRequestInterceptor>>
4519 interceptors;
4520#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
John Abd-El-Malek7577f262019-06-10 21:23:234521 interceptors.push_back(
4522 std::make_unique<offline_pages::OfflinePageURLLoaderRequestInterceptor>(
4523 navigation_ui_data, frame_tree_node_id));
Jian Lide7b43792018-06-01 23:22:134524#endif
Ryan Sturmaf523742019-01-16 00:15:454525
Robert Ogden3d5d5b42019-04-22 05:13:114526 ChromeNavigationUIData* chrome_navigation_ui_data =
4527 static_cast<ChromeNavigationUIData*>(navigation_ui_data);
4528
Ryan Sturm27d93f412019-02-15 21:30:144529 // TODO(ryansturm): Once this is on the UI thread, stop passing
4530 // |network_loader_factory| and have interceptors create one themselves.
4531 // https://crbug.com/931786
Doug Arnett27154792019-10-15 21:00:594532 if (previews::params::IsLitePageServerPreviewsEnabled()) {
Ryan Sturmaf523742019-01-16 00:15:454533 interceptors.push_back(
Robert Ogden0f4d88682019-09-24 22:27:524534 std::make_unique<
4535 previews::PreviewsLitePageRedirectURLLoaderInterceptor>(
Robert Ogden3d5d5b42019-04-22 05:13:114536 network_loader_factory,
4537 chrome_navigation_ui_data->data_reduction_proxy_page_id(),
4538 frame_tree_node_id));
Ryan Sturmaf523742019-01-16 00:15:454539 }
4540
Jian Lide7b43792018-06-01 23:22:134541 return interceptors;
4542}
4543
Yutaka Hirano8e0b4d432019-07-04 07:12:384544bool ChromeContentBrowserClient::WillInterceptWebSocket(
4545 content::RenderFrameHost* frame) {
Yutaka Hirano36c94952018-05-30 21:33:334546#if BUILDFLAG(ENABLE_EXTENSIONS)
Yutaka Hirano8e0b4d432019-07-04 07:12:384547 if (!frame) {
4548 return false;
4549 }
4550 const auto* web_request_api =
Yutaka Hirano36c94952018-05-30 21:33:334551 extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get(
4552 frame->GetProcess()->GetBrowserContext());
4553
4554 // NOTE: Some unit test environments do not initialize
4555 // BrowserContextKeyedAPI factories for e.g. WebRequest.
4556 if (!web_request_api)
Yutaka Hirano8e0b4d432019-07-04 07:12:384557 return false;
Yutaka Hirano36c94952018-05-30 21:33:334558
Yutaka Hirano8e0b4d432019-07-04 07:12:384559 return web_request_api->MayHaveProxies();
4560#else
4561 return false;
4562#endif
4563}
4564
4565void ChromeContentBrowserClient::CreateWebSocket(
4566 content::RenderFrameHost* frame,
4567 WebSocketFactory factory,
4568 const GURL& url,
4569 const GURL& site_for_cookies,
4570 const base::Optional<std::string>& user_agent,
Julie Jeongeun Kim3e973f92019-08-22 08:02:404571 mojo::PendingRemote<network::mojom::WebSocketHandshakeClient>
4572 handshake_client) {
Yutaka Hirano8e0b4d432019-07-04 07:12:384573#if BUILDFLAG(ENABLE_EXTENSIONS)
4574 if (!frame) {
4575 return;
4576 }
4577 auto* web_request_api =
4578 extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get(
4579 frame->GetProcess()->GetBrowserContext());
4580
4581 DCHECK(web_request_api);
4582 web_request_api->ProxyWebSocket(frame, std::move(factory), url,
4583 site_for_cookies, user_agent,
4584 std::move(handshake_client));
Yutaka Hirano36c94952018-05-30 21:33:334585#endif
4586}
4587
Maks Orlovich710d5e32019-07-09 20:16:454588bool ChromeContentBrowserClient::WillCreateRestrictedCookieManager(
Maks Orloviche7db7a22019-07-25 01:47:464589 network::mojom::RestrictedCookieManagerRole role,
Maks Orlovich710d5e32019-07-09 20:16:454590 content::BrowserContext* browser_context,
4591 const url::Origin& origin,
Maks Orlovich11001fa2019-10-01 20:41:404592 const GURL& site_for_cookies,
4593 const url::Origin& top_frame_origin,
Maks Orlovich710d5e32019-07-09 20:16:454594 bool is_service_worker,
4595 int process_id,
4596 int routing_id,
Julie Jeongeun Kimd20f64b2019-08-26 04:13:034597 mojo::PendingReceiver<network::mojom::RestrictedCookieManager>* receiver) {
Maks Orlovich710d5e32019-07-09 20:16:454598 DCHECK_CURRENTLY_ON(BrowserThread::UI);
4599#if BUILDFLAG(ENABLE_EXTENSIONS)
4600 if (origin.scheme() == extensions::kExtensionScheme) {
Maks Orloviche7db7a22019-07-25 01:47:464601 DCHECK_EQ(network::mojom::RestrictedCookieManagerRole::SCRIPT, role);
Maks Orlovich710d5e32019-07-09 20:16:454602 extensions::ChromeExtensionCookies::Get(browser_context)
Maks Orlovich11001fa2019-10-01 20:41:404603 ->CreateRestrictedCookieManager(origin, site_for_cookies,
4604 top_frame_origin, std::move(*receiver));
Maks Orlovich710d5e32019-07-09 20:16:454605 return true;
4606 }
4607#endif
4608 return false;
4609}
4610
Matt Menkeae4fdb12018-06-02 06:32:544611void ChromeContentBrowserClient::OnNetworkServiceCreated(
4612 network::mojom::NetworkService* network_service) {
Henrique Nakashima8941aad2018-11-29 23:01:534613 PrefService* local_state;
4614 if (g_browser_process) {
4615 DCHECK(g_browser_process->local_state());
4616 local_state = g_browser_process->local_state();
4617 } else {
Xi Han85079c22019-04-18 21:43:054618 DCHECK(startup_data_->chrome_feature_list_creator()->local_state());
4619 local_state = startup_data_->chrome_feature_list_creator()->local_state();
Henrique Nakashima8941aad2018-11-29 23:01:534620 }
4621
4622 if (!data_use_measurement::ChromeDataUseMeasurement::GetInstance())
4623 data_use_measurement::ChromeDataUseMeasurement::CreateInstance(local_state);
4624
Henrique Nakashimaa3b1c5d2019-07-03 19:25:494625 // Create SystemNetworkContextManager if it has not been created yet. We need
4626 // to set up global NetworkService state before anything else uses it and this
4627 // is the first opportunity to initialize SystemNetworkContextManager with the
4628 // NetworkService.
4629 if (!SystemNetworkContextManager::HasInstance())
Henrique Nakashima8941aad2018-11-29 23:01:534630 SystemNetworkContextManager::CreateInstance(local_state);
John Abd-El-Malek897374f42019-05-30 03:58:074631
Min Qin8caab1d2018-10-03 17:28:134632 SystemNetworkContextManager::GetInstance()->OnNetworkServiceCreated(
Matt Menkeae4fdb12018-06-02 06:32:544633 network_service);
4634}
4635
Julie Jeongeun Kim5984e992019-09-11 11:00:464636mojo::Remote<network::mojom::NetworkContext>
Ken Rockota0dfaca12018-02-15 07:26:254637ChromeContentBrowserClient::CreateNetworkContext(
4638 content::BrowserContext* context,
4639 bool in_memory,
4640 const base::FilePath& relative_partition_path) {
John Abd-El-Malekcc0b2a62018-03-20 19:32:504641 Profile* profile = Profile::FromBrowserContext(context);
Matt Menked38efd92018-08-14 20:39:454642 return profile->CreateNetworkContext(in_memory, relative_partition_path);
Ken Rockota0dfaca12018-02-15 07:26:254643}
4644
Robert Sesek34f68f312019-01-14 20:25:114645std::vector<base::FilePath>
4646ChromeContentBrowserClient::GetNetworkContextsParentDirectory() {
Robert Sesek466e43e2019-08-19 22:02:024647 DCHECK(!network_contexts_parent_directory_.empty());
4648 return network_contexts_parent_directory_;
Robert Sesek34f68f312019-01-14 20:25:114649}
4650
Min Qin75ed6df2017-12-01 20:39:154651bool ChromeContentBrowserClient::AllowRenderingMhtmlOverHttp(
Min Qin30a78a12017-12-06 01:29:134652 content::NavigationUIData* navigation_ui_data) {
Min Qin75ed6df2017-12-01 20:39:154653#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
4654 // It is OK to load the saved offline copy, in MHTML format.
4655 ChromeNavigationUIData* chrome_navigation_ui_data =
4656 static_cast<ChromeNavigationUIData*>(navigation_ui_data);
4657 if (!chrome_navigation_ui_data)
4658 return false;
4659 offline_pages::OfflinePageNavigationUIData* offline_page_data =
4660 chrome_navigation_ui_data->GetOfflinePageNavigationUIData();
4661 return offline_page_data && offline_page_data->is_offline_page();
4662#else
4663 return false;
4664#endif
4665}
4666
Min Qin30a78a12017-12-06 01:29:134667bool ChromeContentBrowserClient::ShouldForceDownloadResource(
4668 const GURL& url,
4669 const std::string& mime_type) {
4670#if BUILDFLAG(ENABLE_EXTENSIONS)
4671 // Special-case user scripts to get downloaded instead of viewed.
4672 return extensions::UserScript::IsURLUserScript(url, mime_type);
4673#else
4674 return false;
4675#endif
4676}
4677
Donna Wu838ac362018-08-10 10:36:334678void ChromeContentBrowserClient::CreateWebUsbService(
Reilly Grantc31b8192017-12-15 19:54:344679 content::RenderFrameHost* render_frame_host,
Miyoung Shin62622152019-08-27 05:13:044680 mojo::PendingReceiver<blink::mojom::WebUsbService> receiver) {
Reilly Grantc31b8192017-12-15 19:54:344681 if (!base::FeatureList::IsEnabled(features::kWebUsb))
4682 return;
4683
Reilly Grantc31b8192017-12-15 19:54:344684 WebContents* web_contents =
4685 WebContents::FromRenderFrameHost(render_frame_host);
4686 if (!web_contents) {
4687 NOTREACHED();
4688 return;
4689 }
4690
4691 UsbTabHelper* tab_helper =
4692 UsbTabHelper::GetOrCreateForWebContents(web_contents);
Miyoung Shin62622152019-08-27 05:13:044693 tab_helper->CreateWebUsbService(render_frame_host, std::move(receiver));
Reilly Grantc31b8192017-12-15 19:54:344694}
4695
Reilly Grant0d282322019-01-29 02:42:584696#if !defined(OS_ANDROID)
4697content::SerialDelegate* ChromeContentBrowserClient::GetSerialDelegate() {
4698 if (!serial_delegate_)
4699 serial_delegate_ = std::make_unique<ChromeSerialDelegate>();
4700 return serial_delegate_.get();
4701}
Matt Reynolds93616f9b2019-06-07 01:28:524702
4703content::HidDelegate* ChromeContentBrowserClient::GetHidDelegate() {
4704 if (!hid_delegate_)
4705 hid_delegate_ = std::make_unique<ChromeHidDelegate>();
4706 return hid_delegate_.get();
4707}
Reilly Grant0d282322019-01-29 02:42:584708
Balazs Engedya7ff70982018-06-04 18:14:474709std::unique_ptr<content::AuthenticatorRequestClientDelegate>
4710ChromeContentBrowserClient::GetWebAuthenticationRequestDelegate(
Adam Langleyeeac87e2019-04-13 22:58:224711 content::RenderFrameHost* render_frame_host,
4712 const std::string& relying_party_id) {
4713 return AuthenticatorRequestScheduler::CreateRequestDelegate(render_frame_host,
4714 relying_party_id);
Balazs Engedya7ff70982018-06-04 18:14:474715}
Nina Satragno8c832df2019-07-29 15:59:394716#endif
Balazs Engedya7ff70982018-06-04 18:14:474717
Jun Cai9409ded2018-01-30 00:19:464718std::unique_ptr<net::ClientCertStore>
4719ChromeContentBrowserClient::CreateClientCertStore(
4720 content::ResourceContext* resource_context) {
4721 if (!resource_context)
4722 return nullptr;
4723 return ProfileIOData::FromResourceContext(resource_context)
4724 ->CreateClientCertStore();
4725}
4726
David Benjamineced01fc2019-02-27 18:29:024727std::unique_ptr<content::LoginDelegate>
Jun Caibc561f412018-02-28 18:41:394728ChromeContentBrowserClient::CreateLoginDelegate(
Emily Starkf2c9bbd2019-04-09 17:08:584729 const net::AuthChallengeInfo& auth_info,
David Benjamineced01fc2019-02-27 18:29:024730 content::WebContents* web_contents,
Ken Rockot5f734e32018-06-13 01:41:034731 const content::GlobalRequestID& request_id,
Jun Cai8e165d22018-05-14 19:21:244732 bool is_request_for_main_frame,
Jun Caibc561f412018-02-28 18:41:394733 const GURL& url,
Ken Rockot5f734e32018-06-13 01:41:034734 scoped_refptr<net::HttpResponseHeaders> response_headers,
Jun Caibc561f412018-02-28 18:41:394735 bool first_auth_attempt,
Mark Pilgrim7cfcd112018-05-08 00:07:564736 LoginAuthRequiredCallback auth_required_callback) {
Ken Rockot5f734e32018-06-13 01:41:034737 return CreateLoginPrompt(
David Benjamineced01fc2019-02-27 18:29:024738 auth_info, web_contents, request_id, is_request_for_main_frame, url,
Emily Starkc5f15792019-05-19 17:24:204739 std::move(response_headers), LoginHandler::PRE_COMMIT,
4740 std::move(auth_required_callback));
Jun Caibc561f412018-02-28 18:41:394741}
4742
John Abd-El-Maleka67add82018-03-09 18:22:014743bool ChromeContentBrowserClient::HandleExternalProtocol(
4744 const GURL& url,
John Abd-El-Malek92bf3602019-07-31 02:25:484745 content::WebContents::Getter web_contents_getter,
John Abd-El-Maleka67add82018-03-09 18:22:014746 int child_id,
4747 content::NavigationUIData* navigation_data,
4748 bool is_main_frame,
4749 ui::PageTransition page_transition,
Tim Volodineb24393f32018-11-16 18:45:454750 bool has_user_gesture,
Emily Stark13b66bdf2019-10-04 17:11:454751 const base::Optional<url::Origin>& initiating_origin,
Julie Jeongeun Kimfb6f5302019-10-17 17:24:104752 mojo::PendingRemote<network::mojom::URLLoaderFactory>* out_factory) {
John Abd-El-Maleka67add82018-03-09 18:22:014753#if BUILDFLAG(ENABLE_EXTENSIONS)
4754 // External protocols are disabled for guests. An exception is made for the
4755 // "mailto" protocol, so that pages that utilize it work properly in a
4756 // WebView.
4757 ChromeNavigationUIData* chrome_data =
4758 static_cast<ChromeNavigationUIData*>(navigation_data);
4759 if ((extensions::WebViewRendererState::GetInstance()->IsGuest(child_id) ||
4760 (chrome_data &&
4761 chrome_data->GetExtensionNavigationUIData()->is_web_view())) &&
4762 !url.SchemeIs(url::kMailToScheme)) {
4763 return false;
4764 }
4765#endif // BUILDFLAG(ENABLE_EXTENSIONS)
4766
4767#if defined(OS_ANDROID)
4768 // Main frame external protocols are handled by
4769 // InterceptNavigationResourceThrottle.
4770 if (is_main_frame)
4771 return false;
4772#endif // defined(ANDROID)
4773
Emily Stark13b66bdf2019-10-04 17:11:454774 base::PostTask(
4775 FROM_HERE, {BrowserThread::UI},
4776 base::BindOnce(&LaunchURL, url, web_contents_getter, page_transition,
4777 has_user_gesture, initiating_origin));
John Abd-El-Maleka67add82018-03-09 18:22:014778 return true;
4779}
4780
Jennifer Apacible4f854a82018-04-06 22:22:114781std::unique_ptr<content::OverlayWindow>
Jennifer Apacible6010b0232018-04-12 23:35:284782ChromeContentBrowserClient::CreateWindowForPictureInPicture(
4783 content::PictureInPictureWindowController* controller) {
Jennifer Apacible4f854a82018-04-06 22:22:114784 // Note: content::OverlayWindow::Create() is defined by platform-specific
4785 // implementation in chrome/browser/ui/views. This layering hack, which goes
4786 // through //content and ContentBrowserClient, allows us to work around the
4787 // dependency constraints that disallow directly calling
4788 // chrome/browser/ui/views code either from here or from other code in
4789 // chrome/browser.
Jennifer Apacible6010b0232018-04-12 23:35:284790 return content::OverlayWindow::Create(controller);
Jennifer Apacible4f854a82018-04-06 22:22:114791}
4792
Kunihiko Sakamoto19aa7082019-02-25 03:14:434793void ChromeContentBrowserClient::RegisterRendererPreferenceWatcher(
Makoto Shimazuc7502932018-08-15 02:12:564794 content::BrowserContext* browser_context,
Julie Jeongeun Kim6d8b7492019-08-20 19:24:114795 mojo::PendingRemote<blink::mojom::RendererPreferenceWatcher> watcher) {
Makoto Shimazuc7502932018-08-15 02:12:564796 Profile* profile = Profile::FromBrowserContext(browser_context);
Kunihiko Sakamoto19aa7082019-02-25 03:14:434797 PrefWatcher::Get(profile)->RegisterRendererPreferenceWatcher(
4798 std::move(watcher));
Makoto Shimazuc7502932018-08-15 02:12:564799}
4800
dbeam25472e0c2017-06-23 19:02:314801// Static; handles rewriting Web UI URLs.
4802bool ChromeContentBrowserClient::HandleWebUI(
4803 GURL* url,
4804 content::BrowserContext* browser_context) {
Dan Beam141c48932019-08-22 02:29:394805 // Rewrite chrome://help to chrome://settings/help.
dbeam25472e0c2017-06-23 19:02:314806 if (url->SchemeIs(content::kChromeUIScheme) &&
Dan Beam141c48932019-08-22 02:29:394807 url->host() == chrome::kChromeUIHelpHost) {
dbeam25472e0c2017-06-23 19:02:314808 *url = ReplaceURLHostAndPath(*url, chrome::kChromeUISettingsHost,
4809 chrome::kChromeUIHelpHost);
4810 return true; // Return true to update the displayed URL.
4811 }
4812
Hector Carmona566a20b2019-09-13 22:44:424813#if defined(OS_WIN)
4814 // TODO(crbug.com/1003960): Remove when issue is resolved.
4815 if (url->SchemeIs(content::kChromeUIScheme) &&
4816 url->host() == chrome::kChromeUIWelcomeWin10Host) {
4817 url::Replacements<char> replacements;
4818 replacements.SetHost(
4819 chrome::kChromeUIWelcomeHost,
4820 url::Component(0, strlen(chrome::kChromeUIWelcomeHost)));
4821 *url = url->ReplaceComponents(replacements);
4822 return true;
4823 }
4824#endif // defined(OS_WIN)
4825
dbeam25472e0c2017-06-23 19:02:314826 if (!ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL(
4827 browser_context, *url)) {
4828 return false;
4829 }
4830
4831#if defined(OS_CHROMEOS)
4832 // Special case : in ChromeOS in Guest mode bookmarks and history are
4833 // disabled for security reasons. New tab page explains the reasons, so
4834 // we redirect user to new tab page.
4835 if (user_manager::UserManager::Get()->IsLoggedInAsGuest()) {
4836 if (url->SchemeIs(content::kChromeUIScheme) &&
4837 (url->DomainIs(chrome::kChromeUIBookmarksHost) ||
4838 url->DomainIs(chrome::kChromeUIHistoryHost))) {
4839 // Rewrite with new tab URL
4840 *url = GURL(chrome::kChromeUINewTabURL);
4841 }
4842 }
4843#endif
4844
4845 return true;
4846}
4847
Anthony Vallee-Dubois8f5e7e12018-01-12 16:14:064848bool ChromeContentBrowserClient::ShowPaymentHandlerWindow(
4849 content::BrowserContext* browser_context,
4850 const GURL& url,
Anthony Vallee-Dubois98befeaa2018-01-18 16:31:324851 base::OnceCallback<void(bool, int, int)> callback) {
Anthony Vallee-Dubois8f5e7e12018-01-12 16:14:064852#if defined(OS_ANDROID)
4853 return false;
4854#else
4855 payments::PaymentRequestDisplayManagerFactory::GetInstance()
4856 ->GetForBrowserContext(browser_context)
4857 ->ShowPaymentHandlerWindow(url, std::move(callback));
4858 return true;
4859#endif
4860}
4861
Dan Beam141c48932019-08-22 02:29:394862// static
dbeam25472e0c2017-06-23 19:02:314863bool ChromeContentBrowserClient::HandleWebUIReverse(
4864 GURL* url,
4865 content::BrowserContext* browser_context) {
Hector Carmona566a20b2019-09-13 22:44:424866#if defined(OS_WIN)
4867 // TODO(crbug.com/1003960): Remove when issue is resolved.
4868 // No need to actually reverse-rewrite the URL, but return true to update the
4869 // displayed URL when rewriting chrome://welcome-win10 to chrome://welcome.
4870 if (url->SchemeIs(content::kChromeUIScheme) &&
4871 url->host() == chrome::kChromeUIWelcomeHost) {
4872 return true;
4873 }
4874#endif // defined(OS_WIN)
4875
dbeam25472e0c2017-06-23 19:02:314876 // No need to actually reverse-rewrite the URL, but return true to update the
4877 // displayed URL when rewriting chrome://help to chrome://settings/help.
4878 return url->SchemeIs(content::kChromeUIScheme) &&
4879 url->host() == chrome::kChromeUISettingsHost;
4880}
4881
Alison Maher28a73e22019-10-18 19:26:354882ui::NativeTheme* ChromeContentBrowserClient::GetWebTheme() const {
Dan Beamf0a7e112019-06-07 18:40:584883 return ui::NativeTheme::GetInstanceForWeb();
4884}
4885
scottmgde42fb92017-02-10 17:56:034886// static
michaeln10e5fc352017-02-07 02:07:584887void ChromeContentBrowserClient::SetDefaultQuotaSettingsForTesting(
4888 const storage::QuotaSettings* settings) {
4889 g_default_quota_settings = settings;
4890}
Yuzhu Shen44094e22017-07-18 22:52:354891
Clark DuVall5497288d2019-07-17 00:17:564892scoped_refptr<safe_browsing::UrlCheckerDelegate>
Yuzhu Shencb3011f62018-02-08 02:51:504893ChromeContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate(
4894 content::ResourceContext* resource_context) {
Yuzhu Shen44094e22017-07-18 22:52:354895 DCHECK_CURRENTLY_ON(BrowserThread::IO);
4896
Yuzhu Shencb3011f62018-02-08 02:51:504897 ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
4898 if (!io_data->safe_browsing_enabled()->GetValue())
4899 return nullptr;
4900
Yuzhu Shen44094e22017-07-18 22:52:354901 // |safe_browsing_service_| may be unavailable in tests.
4902 if (safe_browsing_service_ && !safe_browsing_url_checker_delegate_) {
4903 safe_browsing_url_checker_delegate_ =
Jialiu Lin0de6756c2018-03-22 00:57:434904 base::MakeRefCounted<safe_browsing::UrlCheckerDelegateImpl>(
Yuzhu Shen44094e22017-07-18 22:52:354905 safe_browsing_service_->database_manager(),
Jialiu Lin0de6756c2018-03-22 00:57:434906 safe_browsing_service_->ui_manager());
Yuzhu Shen44094e22017-07-18 22:52:354907 }
4908
Clark DuVall5497288d2019-07-17 00:17:564909 return safe_browsing_url_checker_delegate_;
Yuzhu Shen44094e22017-07-18 22:52:354910}
Daniel Vogelheim6008f572018-09-24 14:35:144911
4912base::Optional<std::string>
4913ChromeContentBrowserClient::GetOriginPolicyErrorPage(
Andy Paicu8b6f8712019-07-16 15:02:264914 network::OriginPolicyState error_reason,
Daniel Vogelheim7badd0d2019-02-04 14:42:184915 content::NavigationHandle* handle) {
4916 return security_interstitials::OriginPolicyUI::GetErrorPageAsHTML(
4917 error_reason, handle);
Daniel Vogelheim6008f572018-09-24 14:35:144918}
Kunihiko Sakamoto73b803d2018-10-05 09:09:524919
Takashi Toyoshima5af383aa2019-07-22 15:24:224920bool ChromeContentBrowserClient::CanAcceptUntrustedExchangesIfNeeded() {
Kunihiko Sakamoto73b803d2018-10-05 09:09:524921 // We require --user-data-dir flag too so that no dangerous changes are made
4922 // in the user's regular profile.
4923 return base::CommandLine::ForCurrentProcess()->HasSwitch(
4924 switches::kUserDataDir);
4925}
rajendrantfeea8592018-10-19 18:26:064926
4927void ChromeContentBrowserClient::OnNetworkServiceDataUseUpdate(
4928 int32_t network_traffic_annotation_id_hash,
4929 int64_t recv_bytes,
4930 int64_t sent_bytes) {
Min Qincafb27b2018-10-30 18:02:034931 if (data_use_measurement::ChromeDataUseMeasurement::GetInstance()) {
4932 data_use_measurement::ChromeDataUseMeasurement::GetInstance()
4933 ->ReportNetworkServiceDataUse(network_traffic_annotation_id_hash,
4934 recv_bytes, sent_bytes);
rajendrantfeea8592018-10-19 18:26:064935 }
4936}
Ryan Sturmaa05092f2018-10-21 03:56:544937
4938content::PreviewsState ChromeContentBrowserClient::DetermineAllowedPreviews(
4939 content::PreviewsState initial_state,
Ryan Sturm647d1d92018-11-07 15:41:394940 content::NavigationHandle* navigation_handle,
4941 const GURL& current_navigation_url) {
Robert Ogden30bbc9d2019-04-30 20:15:134942 content::PreviewsState state = DetermineAllowedPreviewsWithoutHoldback(
4943 initial_state, navigation_handle, current_navigation_url);
4944
4945 return previews::MaybeCoinFlipHoldbackBeforeCommit(state, navigation_handle);
4946}
4947
4948content::PreviewsState
4949ChromeContentBrowserClient::DetermineAllowedPreviewsWithoutHoldback(
4950 content::PreviewsState initial_state,
4951 content::NavigationHandle* navigation_handle,
4952 const GURL& current_navigation_url) {
Ryan Sturmaa05092f2018-10-21 03:56:544953 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
Tarun Bansalb89c1d52019-01-16 06:56:294954 DCHECK(!navigation_handle->HasCommitted());
Ryan Sturmda2a0e02018-10-25 01:52:214955
Ryan Sturmaa05092f2018-10-21 03:56:544956 // If this is not a main frame, return the initial state. If there are no
4957 // previews in the state, return the state as is.
4958 if (!navigation_handle->IsInMainFrame() ||
4959 navigation_handle->IsSameDocument()) {
4960 return initial_state;
4961 }
4962
Robert Ogdena994eb42019-02-14 19:15:084963 if (!current_navigation_url.SchemeIsHTTPOrHTTPS())
Ryan Sturm647d1d92018-11-07 15:41:394964 return content::PREVIEWS_OFF;
Robert Ogdena994eb42019-02-14 19:15:084965
Doug Arnettb3b99bc2019-08-09 16:55:564966 // Check if initial state specifies no previews should be considered.
4967 if (initial_state == content::PREVIEWS_OFF)
4968 return initial_state;
4969
Robert Ogdena994eb42019-02-14 19:15:084970 // Do not allow previews on POST navigations since the primary opt-out
4971 // mechanism is to reload the page. Because POST navigations are not
4972 // idempotent, we do not want to show a preview on a POST navigation where
4973 // opting out would cause another navigation, i.e.: a reload.
4974 if (navigation_handle->IsPost())
4975 return content::PREVIEWS_OFF;
Ryan Sturm647d1d92018-11-07 15:41:394976
4977 content::WebContents* web_contents = navigation_handle->GetWebContents();
4978 content::WebContentsDelegate* delegate = web_contents->GetDelegate();
4979
Ryan Sturmda2a0e02018-10-25 01:52:214980 auto* browser_context = web_contents->GetBrowserContext();
Ryan Sturmaa05092f2018-10-21 03:56:544981
4982 PreviewsService* previews_service = PreviewsServiceFactory::GetForProfile(
4983 Profile::FromBrowserContext(browser_context));
4984 auto* data_reduction_proxy_settings =
4985 DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
4986 browser_context);
4987 // If the profile does not support previews or Data Saver, do not turn on
4988 // Previews.
4989 if (!previews_service || !previews_service->previews_ui_service() ||
Owen Min08a72892019-07-31 20:03:354990 !data_reduction_proxy_settings) {
Ryan Sturmaa05092f2018-10-21 03:56:544991 return content::PREVIEWS_OFF;
4992 }
4993
4994 PreviewsUITabHelper* ui_tab_helper =
Ryan Sturmda2a0e02018-10-25 01:52:214995 PreviewsUITabHelper::FromWebContents(web_contents);
Ryan Sturmaa05092f2018-10-21 03:56:544996 // If this tab does not have a PreviewsUITabHelper, no preview should be
4997 // served.
4998 if (!ui_tab_helper)
4999 return content::PREVIEWS_OFF;
5000
5001 DCHECK(!browser_context->IsOffTheRecord());
5002
5003 // Other previews objects should all exist and be initialized if we have made
5004 // it past earlier checks.
5005 previews::PreviewsDeciderImpl* previews_decider_impl =
5006 previews_service->previews_ui_service()->previews_decider_impl();
5007 DCHECK(previews_decider_impl);
5008
Ryan Sturm647d1d92018-11-07 15:41:395009 // Start with an unspecified state.
Ryan Sturmaa05092f2018-10-21 03:56:545010 content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED;
5011
Ryan Sturm647d1d92018-11-07 15:41:395012 previews::PreviewsUserData* previews_data =
5013 ui_tab_helper->GetPreviewsUserData(navigation_handle);
5014
5015 // Certain PreviewsStates are used within URLLoaders (Offline, server
Seanac57e9b92019-04-29 19:19:315016 // previews) and cannot re-evaluate PreviewsState once previews triggering
5017 // logic has already been run, so they should not change. Assume that
5018 // previews triggering logic has run when PreviewsUserData already exists and
5019 // a Lite Page Redirect preview is not being attempted, since it may also
5020 // create a previews_data before this point.
5021 bool previews_triggering_logic_already_ran = false;
Ryan Sturm647d1d92018-11-07 15:41:395022 if (previews_data) {
Seanac57e9b92019-04-29 19:19:315023 previews_triggering_logic_already_ran =
5024 !previews_data->server_lite_page_info();
Ryan Sturm647d1d92018-11-07 15:41:395025 } else {
5026 previews_data = ui_tab_helper->CreatePreviewsUserDataForNavigationHandle(
5027 navigation_handle, previews_decider_impl->GeneratePageId());
5028 }
5029
5030 DCHECK(previews_data);
5031
Robert Ogden01770b362019-05-22 17:36:435032 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
5033 previews::switches::kForceEnablePreviews)) {
Sophie Changacd9e2d2019-08-22 22:05:095034 previews_decider_impl->LoadPageHints(navigation_handle);
Robert Ogden01770b362019-05-22 17:36:435035 return content::ALL_SUPPORTED_PREVIEWS;
5036 }
5037
Ryan Sturmaa05092f2018-10-21 03:56:545038 bool is_reload =
5039 navigation_handle->GetReloadType() != content::ReloadType::NONE;
5040
Ryan Sturm647d1d92018-11-07 15:41:395041 content::PreviewsState server_previews_enabled_state =
Robert Ogden54bb4ff2019-06-19 01:31:515042 content::SERVER_LITE_PAGE_ON;
Ryan Sturm647d1d92018-11-07 15:41:395043
5044 // For now, treat server previews types as a single decision, and do not
5045 // re-evaluate upon redirect. Plumbing does not exist to modify the CPAT
5046 // header, nor does the plumbing exist to modify the PreviewsState within the
5047 // URLLoader.
Seanac57e9b92019-04-29 19:19:315048 if (previews_triggering_logic_already_ran) {
Ryan Sturm647d1d92018-11-07 15:41:395049 // Copy the server state that was used before the redirect for the initial
5050 // URL.
Robert Ogden869986f2019-06-20 19:12:055051 previews_state |=
5052 (previews_data->AllowedPreviewsState() & server_previews_enabled_state);
Ryan Sturm647d1d92018-11-07 15:41:395053 } else {
Doug Arnetta3dc71582018-11-08 00:25:105054 if (previews_decider_impl->ShouldAllowPreviewAtNavigationStart(
Sophie Changff1fc382019-08-21 16:30:215055 previews_data, navigation_handle, is_reload,
Doug Arnettd5a60032018-11-12 19:37:305056 previews::PreviewsType::LITE_PAGE)) {
Ryan Sturm647d1d92018-11-07 15:41:395057 previews_state |= server_previews_enabled_state;
5058 }
Ryan Sturmaa05092f2018-10-21 03:56:545059 }
5060
Robert Ogden198d6572019-06-26 15:15:335061 // Evaluate Offline, NoScript, and ResourceBlocking previews.
Ryan Sturmaa05092f2018-10-21 03:56:545062 previews_state |= previews::DetermineAllowedClientPreviewsState(
Seanac57e9b92019-04-29 19:19:315063 previews_data, previews_triggering_logic_already_ran,
Owen Min08a72892019-07-31 20:03:355064 data_reduction_proxy_settings->IsDataReductionProxyEnabled(),
5065 previews_decider_impl, navigation_handle);
Ryan Sturmaa05092f2018-10-21 03:56:545066
5067 if (previews_state & content::PREVIEWS_OFF) {
Ryan Sturm647d1d92018-11-07 15:41:395068 previews_data->set_allowed_previews_state(content::PREVIEWS_OFF);
Ryan Sturmaa05092f2018-10-21 03:56:545069 return content::PREVIEWS_OFF;
5070 }
5071
5072 if (previews_state & content::PREVIEWS_NO_TRANSFORM) {
Ryan Sturm647d1d92018-11-07 15:41:395073 previews_data->set_allowed_previews_state(content::PREVIEWS_NO_TRANSFORM);
Ryan Sturmaa05092f2018-10-21 03:56:545074 return content::PREVIEWS_NO_TRANSFORM;
5075 }
5076
5077 // At this point, if no Preview is allowed, don't allow previews.
Ryan Sturm647d1d92018-11-07 15:41:395078 if (previews_state == content::PREVIEWS_UNSPECIFIED) {
5079 previews_data->set_allowed_previews_state(content::PREVIEWS_OFF);
Ryan Sturmaa05092f2018-10-21 03:56:545080 return content::PREVIEWS_OFF;
Ryan Sturm647d1d92018-11-07 15:41:395081 }
5082
5083 content::PreviewsState embedder_state = content::PREVIEWS_UNSPECIFIED;
5084 if (delegate) {
5085 delegate->AdjustPreviewsStateForNavigation(web_contents, &embedder_state);
5086 }
Ryan Sturmaa05092f2018-10-21 03:56:545087
5088 // If the allowed previews are limited by the embedder, ensure previews honors
5089 // those limits.
Ryan Sturm647d1d92018-11-07 15:41:395090 if (embedder_state != content::PREVIEWS_UNSPECIFIED) {
5091 previews_state = previews_state & embedder_state;
Ryan Sturmaa05092f2018-10-21 03:56:545092 // If no valid previews are left, set the state explicitly to PREVIEWS_OFF.
5093 if (previews_state == content::PREVIEWS_UNSPECIFIED)
5094 previews_state = content::PREVIEWS_OFF;
5095 }
Ryan Sturm647d1d92018-11-07 15:41:395096 previews_data->set_allowed_previews_state(previews_state);
Ryan Sturmaa05092f2018-10-21 03:56:545097 return previews_state;
5098}
5099
5100// static
5101content::PreviewsState
5102ChromeContentBrowserClient::DetermineCommittedPreviewsForURL(
5103 const GURL& url,
5104 data_reduction_proxy::DataReductionProxyData* drp_data,
5105 previews::PreviewsUserData* previews_user_data,
5106 const previews::PreviewsDecider* previews_decider,
Ryan Sturm737bd1d2019-02-28 01:38:055107 content::PreviewsState initial_state,
5108 content::NavigationHandle* navigation_handle) {
Ryan Sturmaa05092f2018-10-21 03:56:545109 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
5110 if (!previews::HasEnabledPreviews(initial_state))
5111 return content::PREVIEWS_OFF;
5112
5113 // Check if the server sent a preview directive.
5114 content::PreviewsState previews_state =
Clark DuVall0ec52142019-06-06 19:53:555115 previews::DetermineCommittedServerPreviewsState(drp_data, initial_state);
Ryan Sturmaa05092f2018-10-21 03:56:545116
Ryan Sturmaa05092f2018-10-21 03:56:545117 // Check the various other client previews types.
5118 return previews::DetermineCommittedClientPreviewsState(
Ryan Sturm737bd1d2019-02-28 01:38:055119 previews_user_data, url, previews_state, previews_decider,
5120 navigation_handle);
Ryan Sturmaa05092f2018-10-21 03:56:545121}
5122
5123content::PreviewsState ChromeContentBrowserClient::DetermineCommittedPreviews(
5124 content::PreviewsState initial_state,
5125 content::NavigationHandle* navigation_handle,
5126 const net::HttpResponseHeaders* response_headers) {
Robert Ogden30bbc9d2019-04-30 20:15:135127 content::PreviewsState state = DetermineCommittedPreviewsWithoutHoldback(
5128 initial_state, navigation_handle, response_headers);
5129
5130 return previews::MaybeCoinFlipHoldbackAfterCommit(state, navigation_handle);
5131}
5132
5133content::PreviewsState
5134ChromeContentBrowserClient::DetermineCommittedPreviewsWithoutHoldback(
5135 content::PreviewsState initial_state,
5136 content::NavigationHandle* navigation_handle,
5137 const net::HttpResponseHeaders* response_headers) {
Ryan Sturmaa05092f2018-10-21 03:56:545138 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
5139 // Only support HTTP and HTTPS.
5140 if (navigation_handle->IsErrorPage() ||
5141 !navigation_handle->GetURL().SchemeIsHTTPOrHTTPS()) {
5142 return content::PREVIEWS_OFF;
5143 }
5144
5145 // If this is not a main frame, return the initial state. If there are no
5146 // previews in the state, return the state as is.
5147 if (!previews::HasEnabledPreviews(initial_state) ||
5148 !navigation_handle->IsInMainFrame() ||
5149 navigation_handle->IsSameDocument()) {
5150 return initial_state;
5151 }
5152
5153 // WebContents that don't have a PreviewsUITabHelper are not supported.
5154 PreviewsUITabHelper* ui_tab_helper =
5155 PreviewsUITabHelper::FromWebContents(navigation_handle->GetWebContents());
5156 if (!ui_tab_helper)
5157 return content::PREVIEWS_OFF;
5158
5159 // If we did not previously create a PreviewsUserData, do not go any further.
5160 previews::PreviewsUserData* previews_user_data =
5161 ui_tab_helper->GetPreviewsUserData(navigation_handle);
5162 if (!previews_user_data)
5163 return content::PREVIEWS_OFF;
5164
5165 PreviewsService* previews_service =
5166 PreviewsServiceFactory::GetForProfile(Profile::FromBrowserContext(
5167 navigation_handle->GetWebContents()->GetBrowserContext()));
5168
5169 if (!previews_service || !previews_service->previews_ui_service())
5170 return content::PREVIEWS_OFF;
5171
5172// Check if offline previews are being used and set it in the user data.
5173#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
5174 offline_pages::OfflinePageTabHelper* tab_helper =
5175 offline_pages::OfflinePageTabHelper::FromWebContents(
5176 navigation_handle->GetWebContents());
5177
Ryan Sturmfc7d92f2019-02-12 02:24:235178 bool is_offline_page = tab_helper && tab_helper->IsLoadingOfflinePage();
5179 bool is_offline_preview = tab_helper && tab_helper->GetOfflinePreviewItem();
5180
5181 // If this is an offline page, but not a preview, then we should not attempt
5182 // any previews or surface the previews UI.
5183 if (is_offline_page && !is_offline_preview)
5184 return content::PREVIEWS_OFF;
5185
5186 previews_user_data->set_offline_preview_used(is_offline_preview);
Ryan Sturmaa05092f2018-10-21 03:56:545187#endif // BUILDFLAG(ENABLE_OFFLINE_PAGES)
5188
5189 // Annotate request if no-transform directive found in response headers.
5190 if (response_headers &&
5191 response_headers->HasHeaderValue("cache-control", "no-transform")) {
Jered Grayba1da122018-10-31 23:06:265192 previews_user_data->set_cache_control_no_transform_directive();
Ryan Sturmaa05092f2018-10-21 03:56:545193 }
5194
5195 previews::PreviewsDeciderImpl* previews_decider_impl =
5196 previews_service->previews_ui_service()->previews_decider_impl();
5197 DCHECK(previews_decider_impl);
5198
Clark DuVall9c5a72cc2018-10-25 01:29:215199 std::unique_ptr<data_reduction_proxy::DataReductionProxyData> drp_data;
5200 auto* settings =
5201 DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
5202 navigation_handle->GetWebContents()->GetBrowserContext());
5203 if (settings) {
5204 // TODO(898326): |drp_data| may be incomplete because |navigation_handle|
5205 // does not yet have all the response information.
5206 drp_data = settings->CreateDataFromNavigationHandle(navigation_handle,
5207 response_headers);
5208 }
Ryan Sturmaa05092f2018-10-21 03:56:545209
5210 // Determine effective PreviewsState for this committed main frame response.
5211 content::PreviewsState committed_state = DetermineCommittedPreviewsForURL(
Clark DuVall9c5a72cc2018-10-25 01:29:215212 navigation_handle->GetURL(), drp_data.get(), previews_user_data,
Ryan Sturm737bd1d2019-02-28 01:38:055213 previews_decider_impl, initial_state, navigation_handle);
Ryan Sturmaa05092f2018-10-21 03:56:545214
5215 // Double check that we never serve a preview when we have a
5216 // cache-control:no-transform directive.
5217 DCHECK(!previews_user_data->cache_control_no_transform_directive() ||
5218 !previews::HasEnabledPreviews(committed_state));
5219
Robert Ogdended292c6f2019-05-03 22:44:515220 // TODO(robertogden): Consider moving this to after the holdback logic.
Ryan Sturmaa05092f2018-10-21 03:56:545221 previews_user_data->set_committed_previews_state(committed_state);
5222
5223 previews::PreviewsType committed_type =
5224 previews::GetMainFramePreviewsType(committed_state);
5225
5226 // Capture committed previews type, if any, in PreviewsUserData.
5227 // Note: this is for the subset of previews types that are decided upon
5228 // navigation commit. Previews types that are determined prior to
5229 // navigation (such as for offline pages or for redirecting to another
5230 // url), are not set here.
5231 previews_user_data->SetCommittedPreviewsType(committed_type);
5232
5233 // Log the commit decision.
5234 std::vector<previews::PreviewsEligibilityReason> passed_reasons;
5235 previews_decider_impl->LogPreviewDecisionMade(
5236 (previews_user_data->cache_control_no_transform_directive()
5237 ? previews::PreviewsEligibilityReason::CACHE_CONTROL_NO_TRANSFORM
5238 : previews::PreviewsEligibilityReason::COMMITTED),
5239 navigation_handle->GetURL(), base::Time::Now(),
Robert Ogden869986f2019-06-20 19:12:055240 previews_user_data->CommittedPreviewsType(), std::move(passed_reasons),
Robert Ogden33e36312019-05-06 19:17:055241 previews_user_data);
Ryan Sturmaa05092f2018-10-21 03:56:545242
5243 return committed_state;
5244}
Charlie Harrison650e11422018-12-04 00:37:265245
5246void ChromeContentBrowserClient::LogWebFeatureForCurrentPage(
5247 content::RenderFrameHost* render_frame_host,
5248 blink::mojom::WebFeature feature) {
5249 DCHECK_CURRENTLY_ON(BrowserThread::UI);
5250 page_load_metrics::mojom::PageLoadFeatures new_features({feature}, {}, {});
5251 page_load_metrics::MetricsWebContentsObserver::RecordFeatureUsage(
5252 render_frame_host, new_features);
5253}
Yutaka Hirano968d6252018-12-04 05:09:315254
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525255std::string ChromeContentBrowserClient::GetProduct() {
Yutaka Hirano968d6252018-12-04 05:09:315256 return ::GetProduct();
5257}
5258
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525259std::string ChromeContentBrowserClient::GetUserAgent() {
Yutaka Hirano968d6252018-12-04 05:09:315260 return ::GetUserAgent();
5261}
Sam McNallyd54e23f92019-01-16 04:42:395262
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525263blink::UserAgentMetadata ChromeContentBrowserClient::GetUserAgentMetadata() {
Mike West6e4cbb32019-02-13 09:40:175264 return ::GetUserAgentMetadata();
5265}
5266
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525267base::Optional<gfx::ImageSkia> ChromeContentBrowserClient::GetProductLogo() {
Austin Orione250d012019-05-29 02:56:275268 // This icon is available on Android, but adds 19KiB to the APK. Since it
5269 // isn't used on Android we exclude it to avoid bloat.
5270#if !defined(OS_ANDROID)
5271 return base::Optional<gfx::ImageSkia>(
5272 *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
5273 IDR_PRODUCT_LOGO_256));
5274#else
5275 return base::nullopt;
5276#endif
5277}
5278
Sam McNallyd54e23f92019-01-16 04:42:395279bool ChromeContentBrowserClient::IsBuiltinComponent(
5280 content::BrowserContext* browser_context,
5281 const url::Origin& origin) {
5282#if BUILDFLAG(ENABLE_EXTENSIONS)
5283 return ChromeContentBrowserClientExtensionsPart::IsBuiltinComponent(
5284 browser_context, origin);
5285#else
5286 return false;
5287#endif
5288}
Oleg Davydov2cc0167b2019-02-05 14:32:485289
5290bool ChromeContentBrowserClient::IsRendererDebugURLBlacklisted(
5291 const GURL& url,
5292 content::BrowserContext* context) {
5293 PolicyBlacklistService* service =
5294 PolicyBlacklistFactory::GetForBrowserContext(context);
5295
5296 using URLBlacklistState = policy::URLBlacklist::URLBlacklistState;
5297 URLBlacklistState blacklist_state = service->GetURLBlacklistState(url);
5298 return blacklist_state == URLBlacklistState::URL_IN_BLACKLIST;
5299}
Dominic Mazzoni21fb0282019-02-13 18:32:475300
5301ui::AXMode ChromeContentBrowserClient::GetAXModeForBrowserContext(
5302 content::BrowserContext* browser_context) {
5303 Profile* profile = Profile::FromBrowserContext(browser_context);
5304 return AccessibilityLabelsServiceFactory::GetForProfile(profile)->GetAXMode();
5305}
Eric Karld6cd75b2019-03-14 22:01:365306
5307#if defined(OS_ANDROID)
5308content::ContentBrowserClient::WideColorGamutHeuristic
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525309ChromeContentBrowserClient::GetWideColorGamutHeuristic() {
Eric Karld6cd75b2019-03-14 22:01:365310 if (features::UseDisplayWideColorGamut()) {
5311 return WideColorGamutHeuristic::kUseDisplay;
5312 }
Khushal1fc0da52019-10-09 00:38:565313
5314 if (display::Display::HasForceDisplayColorProfile() &&
5315 display::Display::GetForcedDisplayColorProfile() ==
5316 gfx::ColorSpace::CreateDisplayP3D65()) {
5317 return WideColorGamutHeuristic::kUseDisplay;
5318 }
5319
Eric Karld6cd75b2019-03-14 22:01:365320 return WideColorGamutHeuristic::kNone;
5321}
5322#endif
Ehsan Karamad91413d72019-03-22 16:37:485323
5324base::flat_set<std::string>
Ehsan Karamad466529d2019-05-24 03:24:435325ChromeContentBrowserClient::GetPluginMimeTypesWithExternalHandlers(
Clark DuVall1df2052b2019-08-05 19:58:465326 content::BrowserContext* browser_context) {
Ehsan Karamad91413d72019-03-22 16:37:485327 base::flat_set<std::string> mime_types;
5328#if BUILDFLAG(ENABLE_PLUGINS)
Clark DuVall1df2052b2019-08-05 19:58:465329 auto map = PluginUtils::GetMimeTypeToExtensionIdMap(browser_context);
Ehsan Karamad91413d72019-03-22 16:37:485330 for (const auto& pair : map)
5331 mime_types.insert(pair.first);
5332#endif
5333 return mime_types;
5334}
Yao Xiaod06607b2019-05-02 23:16:365335
5336void ChromeContentBrowserClient::AugmentNavigationDownloadPolicy(
5337 const content::WebContents* web_contents,
5338 const content::RenderFrameHost* frame_host,
5339 bool user_gesture,
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525340 content::NavigationDownloadPolicy* download_policy) {
Yao Xiaod06607b2019-05-02 23:16:365341 const ChromeSubresourceFilterClient* client =
5342 ChromeSubresourceFilterClient::FromWebContents(web_contents);
5343 if (client && client->GetThrottleManager()->IsFrameTaggedAsAd(frame_host)) {
Yao Xiaof60646662019-07-25 07:25:045344 download_policy->SetAllowed(content::NavigationDownloadType::kAdFrame);
Yao Xiaod06607b2019-05-02 23:16:365345 if (!user_gesture) {
5346 if (base::FeatureList::IsEnabled(
5347 blink::features::
5348 kBlockingDownloadsInAdFrameWithoutUserActivation)) {
5349 download_policy->SetDisallowed(
5350 content::NavigationDownloadType::kAdFrameNoGesture);
5351 } else {
5352 download_policy->SetAllowed(
5353 content::NavigationDownloadType::kAdFrameNoGesture);
5354 }
Yao Xiaod06607b2019-05-02 23:16:365355 }
5356 }
5357}
Jun Cai732a05e32019-05-29 19:34:195358
5359bool ChromeContentBrowserClient::IsBluetoothScanningBlocked(
5360 content::BrowserContext* browser_context,
5361 const url::Origin& requesting_origin,
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525362 const url::Origin& embedding_origin) {
Jun Cai732a05e32019-05-29 19:34:195363 const HostContentSettingsMap* const content_settings =
5364 HostContentSettingsMapFactory::GetForProfile(
5365 Profile::FromBrowserContext(browser_context));
5366
5367 if (content_settings->GetContentSetting(
5368 requesting_origin.GetURL(), embedding_origin.GetURL(),
Darin Fisher42f5e7d2019-10-30 07:15:455369 ContentSettingsType::BLUETOOTH_SCANNING,
Jun Cai732a05e32019-05-29 19:34:195370 std::string()) == CONTENT_SETTING_BLOCK) {
5371 return true;
5372 }
5373
5374 return false;
5375}
5376
5377void ChromeContentBrowserClient::BlockBluetoothScanning(
5378 content::BrowserContext* browser_context,
5379 const url::Origin& requesting_origin,
Lucas Furukawa Gadani4909f3c2019-06-18 22:36:525380 const url::Origin& embedding_origin) {
Jun Cai732a05e32019-05-29 19:34:195381 HostContentSettingsMap* const content_settings =
5382 HostContentSettingsMapFactory::GetForProfile(
5383 Profile::FromBrowserContext(browser_context));
5384
5385 content_settings->SetContentSettingDefaultScope(
5386 requesting_origin.GetURL(), embedding_origin.GetURL(),
Darin Fisher42f5e7d2019-10-30 07:15:455387 ContentSettingsType::BLUETOOTH_SCANNING, std::string(),
Jun Cai732a05e32019-05-29 19:34:195388 CONTENT_SETTING_BLOCK);
5389}
Tibor Goldschwendtbf1b96e2019-10-07 22:03:475390
5391bool ChromeContentBrowserClient::ShouldLoadExtraIcuDataFile() {
5392#if defined(OS_ANDROID)
5393 return extra_icu::ModuleProvider::IsModuleInstalled();
5394#endif
5395 return false;
5396}
Guido Urdaneta4030d6a32019-10-17 09:38:165397
5398bool ChromeContentBrowserClient::ArePersistentMediaDeviceIDsAllowed(
5399 content::BrowserContext* browser_context,
5400 const GURL& url,
5401 const GURL& site_for_cookies,
5402 const base::Optional<url::Origin>& top_frame_origin) {
5403 // Persistent MediaDevice IDs are allowed if cookies are allowed.
5404 return CookieSettingsFactory::GetForProfile(
5405 Profile::FromBrowserContext(browser_context))
5406 ->IsCookieAccessAllowed(url, site_for_cookies, top_frame_origin);
5407}
Sam Goto5cf068e82019-11-04 23:08:445408
5409#if !defined(OS_ANDROID)
5410void ChromeContentBrowserClient::FetchRemoteSms(
5411 content::BrowserContext* browser_context,
5412 const url::Origin& origin,
5413 base::OnceCallback<void(base::Optional<std::string>)> callback) {
5414 ::FetchRemoteSms(browser_context, origin, std::move(callback));
5415}
5416#endif