blob: 90d280d419702df1622cc422ccf96c3e1cf67023 [file] [log] [blame]
[email protected]fd911dd2012-01-27 01:57:101// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]d353541f2012-05-03 22:45:415#include "content/renderer/render_process_impl.h"
6
[email protected]037fce02009-01-22 01:42:157#include "build/build_config.h"
8
[email protected]037fce02009-01-22 01:42:159#if defined(OS_WIN)
initial.commit09911bf2008-07-26 23:55:2910#include <windows.h>
11#include <objidl.h>
12#include <mlang.h>
[email protected]037fce02009-01-22 01:42:1513#endif
initial.commit09911bf2008-07-26 23:55:2914
fdorayd2233a72016-12-13 17:18:2115#include <stddef.h>
16
fdoray743f8d6d2017-02-09 15:24:2317#include <algorithm>
fdoray31cc6f82017-02-10 23:31:1018#include <utility>
fdorayd2233a72016-12-13 17:18:2119
Eric Holk1384f6d2018-01-05 00:49:3620#include "base/base_switches.h"
fdorayd2233a72016-12-13 17:18:2121#include "base/bind.h"
initial.commit09911bf2008-07-26 23:55:2922#include "base/command_line.h"
[email protected]037fce02009-01-22 01:42:1523#include "base/compiler_specific.h"
georgesak80353b52017-01-10 21:18:5124#include "base/debug/crash_logging.h"
Eric Holkdc499db2017-07-17 17:57:3525#include "base/debug/stack_trace.h"
ishell75fddc12016-04-12 14:03:1426#include "base/feature_list.h"
fdoray31cc6f82017-02-10 23:31:1027#include "base/memory/ptr_util.h"
Ross McIlroy900375b2019-05-16 20:17:4228#include "base/strings/string_split.h"
Sebastien Marchand75a7cdf2018-11-13 23:47:0329#include "base/system/sys_info.h"
Gabriel Charette52fa3ae2019-04-15 21:44:3730#include "base/task/thread_pool/initialization_util.h"
Francois Doray7f777312019-05-16 12:26:3131#include "base/task/thread_pool/thread_pool.h"
fdorayd2233a72016-12-13 17:18:2132#include "base/time/time.h"
Gabriel Charette52fa3ae2019-04-15 21:44:3733#include "content/common/thread_pool_util.h"
sammc7f6c6a02017-01-30 00:53:5134#include "content/public/common/bindings_policy.h"
fdorayd2233a72016-12-13 17:18:2135#include "content/public/common/content_client.h"
bradnelsonc79f5a6f2016-10-10 18:31:1436#include "content/public/common/content_features.h"
[email protected]c08950d22011-10-13 22:20:2937#include "content/public/common/content_switches.h"
[email protected]d344114c2011-10-01 01:24:3438#include "content/public/renderer/content_renderer_client.h"
Eric Holk1384f6d2018-01-05 00:49:3639#include "services/service_manager/embedder/switches.h"
Blink Reformata30d4232018-04-07 15:31:0640#include "third_party/blink/public/web/web_frame.h"
[email protected]067f5192014-01-29 05:22:0941#include "v8/include/v8.h"
initial.commit09911bf2008-07-26 23:55:2942
georgesak80353b52017-01-10 21:18:5143#if defined(OS_WIN)
44#include "base/win/win_util.h"
45#endif
46
ishell75fddc12016-04-12 14:03:1447namespace {
48
ishell75fddc12016-04-12 14:03:1449void SetV8FlagIfFeature(const base::Feature& feature, const char* v8_flag) {
50 if (base::FeatureList::IsEnabled(feature)) {
51 v8::V8::SetFlagsFromString(v8_flag, strlen(v8_flag));
52 }
53}
54
bradnelson2730e3512017-01-21 20:32:2155void SetV8FlagIfNotFeature(const base::Feature& feature, const char* v8_flag) {
56 if (!base::FeatureList::IsEnabled(feature)) {
57 v8::V8::SetFlagsFromString(v8_flag, strlen(v8_flag));
58 }
59}
60
ishell75fddc12016-04-12 14:03:1461void SetV8FlagIfHasSwitch(const char* switch_name, const char* v8_flag) {
62 if (base::CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
63 v8::V8::SetFlagsFromString(v8_flag, strlen(v8_flag));
64 }
65}
66
Gabriel Charette43fd3702019-05-29 16:36:5167std::unique_ptr<base::ThreadPoolInstance::InitParams>
68GetThreadPoolInitParams() {
Etienne Pierre-dorayce562962019-02-08 18:50:4869 constexpr int kMaxNumThreadsInForegroundPoolLowerBound = 3;
Gabriel Charette43fd3702019-05-29 16:36:5170 return std::make_unique<base::ThreadPoolInstance::InitParams>(
Francois Doray7f777312019-05-16 12:26:3171 std::max(kMaxNumThreadsInForegroundPoolLowerBound,
72 content::GetMinForegroundThreadsInRendererThreadPool()));
fdorayd2233a72016-12-13 17:18:2173}
74
Tomas Popelaafffa972018-11-13 20:42:0575#if defined(DCHECK_IS_CONFIGURABLE)
Sigurdur Asgeirsson379c51e42017-09-21 12:52:4576void V8DcheckCallbackHandler(const char* file, int line, const char* message) {
77 // TODO(siggi): Set a crash key or a breadcrumb so the fact that we hit a
78 // V8 DCHECK gets out in the crash report.
79 ::logging::LogMessage(file, line, logging::LOG_DCHECK).stream() << message;
80}
Tomas Popelaafffa972018-11-13 20:42:0581#endif // defined(DCHECK_IS_CONFIGURABLE)
Sigurdur Asgeirsson379c51e42017-09-21 12:52:4582
ishell75fddc12016-04-12 14:03:1483} // namespace
84
[email protected]eb398192012-10-22 20:16:1985namespace content {
86
Francois Doray7f777312019-05-16 12:26:3187RenderProcessImpl::RenderProcessImpl()
88 : RenderProcess("Renderer", GetThreadPoolInitParams()),
fdoray31cc6f82017-02-10 23:31:1089 enabled_bindings_(0) {
Tomas Popelaafffa972018-11-13 20:42:0590#if defined(DCHECK_IS_CONFIGURABLE)
Weza6ca5b92018-03-23 19:03:0791 // Some official builds ship with DCHECKs compiled in. Failing DCHECKs then
92 // are either fatal or simply log the error, based on a feature flag.
Sigurdur Asgeirsson379c51e42017-09-21 12:52:4593 // Make sure V8 follows suit by setting a Dcheck handler that forwards to
94 // the Chrome base logging implementation.
95 v8::V8::SetDcheckErrorHandler(&V8DcheckCallbackHandler);
96
Weza6ca5b92018-03-23 19:03:0797 if (!base::FeatureList::IsEnabled(base::kDCheckIsFatalFeature)) {
Sigurdur Asgeirsson379c51e42017-09-21 12:52:4598 // These V8 flags default on in this build configuration. This triggers
99 // additional verification and code generation, which both slows down V8,
100 // and can lead to fatal CHECKs. Turn these flags down to get something
101 // closer to V8s normal performance and behavior.
102 constexpr char kDisabledFlags[] =
103 "--noturbo_verify "
Sigurdur Asgeirsson379c51e42017-09-21 12:52:45104 "--noturbo_verify_allocation "
105 "--nodebug_code";
106
107 v8::V8::SetFlagsFromString(kDisabledFlags, sizeof(kDisabledFlags));
108 }
Tomas Popelaafffa972018-11-13 20:42:05109#endif // defined(DCHECK_IS_CONFIGURABLE)
Sigurdur Asgeirsson379c51e42017-09-21 12:52:45110
[email protected]35b4f0c2014-06-26 16:55:27111 if (base::SysInfo::IsLowEndDevice()) {
[email protected]067f5192014-01-29 05:22:09112 std::string optimize_flag("--optimize-for-size");
Clemens Hammacherc4a139a2019-04-25 13:55:09113 v8::V8::SetFlagsFromString(optimize_flag.c_str(), optimize_flag.size());
[email protected]067f5192014-01-29 05:22:09114 }
[email protected]987422f2013-10-01 10:33:31115
ishell75fddc12016-04-12 14:03:14116 SetV8FlagIfHasSwitch(switches::kDisableJavaScriptHarmonyShipping,
117 "--noharmony-shipping");
118 SetV8FlagIfHasSwitch(switches::kJavaScriptHarmony, "--harmony");
Kouhei Ueno14d350d2018-10-01 02:36:27119
120 constexpr char kModuleFlags[] =
121 "--harmony-dynamic-import --harmony-import-meta";
122 v8::V8::SetFlagsFromString(kModuleFlags, sizeof(kModuleFlags));
123
Michael Hablich896d52662017-10-23 15:59:57124 SetV8FlagIfFeature(features::kV8VmFuture, "--future");
125 SetV8FlagIfNotFeature(features::kV8VmFuture, "--no-future");
Clemens Hammacher0c8a15a2018-04-27 13:45:32126
Clemens Hammacherfab55102018-07-24 16:19:19127 SetV8FlagIfFeature(features::kWebAssemblyBaseline,
128 "--liftoff --wasm-tier-up");
129 SetV8FlagIfNotFeature(features::kWebAssemblyBaseline,
130 "--no-liftoff --no-wasm-tier-up");
Clemens Hammacher0c8a15a2018-04-27 13:45:32131
Clemens Hammacher082fa572019-04-25 08:22:29132 SetV8FlagIfFeature(features::kWebAssemblyCodeGC, "--wasm-code-gc");
133 SetV8FlagIfNotFeature(features::kWebAssemblyCodeGC, "--no-wasm-code-gc");
134
Deepti Gandluri11734cc42019-05-02 18:00:20135 SetV8FlagIfFeature(features::kWebAssemblySimd, "--experimental-wasm-simd");
136 SetV8FlagIfNotFeature(features::kWebAssemblySimd,
137 "--no-experimental-wasm-simd");
138
Ben Smith24c1e5c2018-06-20 01:09:02139 if (base::FeatureList::IsEnabled(features::kWebAssemblyThreads)) {
140 constexpr char kFlags[] =
141 "--harmony-sharedarraybuffer "
142 "--no-wasm-disable-structured-cloning "
143 "--experimental-wasm-threads";
144
145 v8::V8::SetFlagsFromString(kFlags, sizeof(kFlags));
146 } else {
147 SetV8FlagIfNotFeature(features::kWebAssembly,
148 "--wasm-disable-structured-cloning");
149 SetV8FlagIfFeature(features::kSharedArrayBuffer,
150 "--harmony-sharedarraybuffer");
151 SetV8FlagIfNotFeature(features::kSharedArrayBuffer,
152 "--no-harmony-sharedarraybuffer");
153 }
Michael Hablich896d52662017-10-23 15:59:57154
Michael Lippautze0fb49a32019-05-21 14:11:44155 SetV8FlagIfFeature(features::kBlinkHeapUnifiedGCScheduling,
156 "--global-gc-scheduling");
157
Eric Holkb4f60132017-08-18 19:37:41158 SetV8FlagIfNotFeature(features::kWebAssemblyTrapHandler,
159 "--no-wasm-trap-handler");
Lei Zhang2d3ead602018-07-10 01:15:50160#if defined(OS_LINUX) && defined(ARCH_CPU_X86_64)
Eric Holkdc499db2017-07-17 17:57:35161 if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) {
Eric Holk1384f6d2018-01-05 00:49:36162 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
163 if (!command_line->HasSwitch(
164 service_manager::switches::kDisableInProcessStackTraces)) {
Andreas Haasef19d592019-04-30 18:16:51165 // Only enable WebAssembly trap handler if we can set the callback.
166 if (base::debug::SetStackDumpFirstChanceCallback(
167 v8::V8::TryHandleSignal)) {
168 // We registered the WebAssembly trap handler callback with the stack
169 // dump signal handler successfully. We can tell V8 that it can enable
170 // WebAssembly trap handler without using the V8 signal handler.
171 v8::V8::EnableWebAssemblyTrapHandler(/*use_v8_signal_handler=*/false);
172 }
Eric Holk1384f6d2018-01-05 00:49:36173 } else if (!command_line->HasSwitch(switches::kEnableCrashReporter) &&
174 !command_line->HasSwitch(
175 switches::kEnableCrashReporterForTesting)) {
176 // If we are using WebAssembly trap handling but both Breakpad and
177 // in-process stack traces are disabled then there will be no signal
178 // handler. In this case, we fall back on V8's default handler
179 // (https://crbug.com/798150).
Andreas Haasef19d592019-04-30 18:16:51180 v8::V8::EnableWebAssemblyTrapHandler(/*use_v8_signal_handler=*/true);
Eric Holk1384f6d2018-01-05 00:49:36181 }
Eric Holkdc499db2017-07-17 17:57:35182 }
183#endif
Andreas Haas5ed0f502018-11-06 09:05:06184#if defined(OS_WIN) && defined(ARCH_CPU_X86_64)
185 if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) {
186 // On Windows we use the default trap handler provided by V8.
187 bool use_v8_trap_handler = true;
188 v8::V8::EnableWebAssemblyTrapHandler(use_v8_trap_handler);
189 }
190#endif
Andreas Haas3bd45322018-11-21 07:45:42191#if defined(OS_MACOSX) && defined(ARCH_CPU_X86_64)
192 if (base::FeatureList::IsEnabled(features::kWebAssemblyTrapHandler)) {
193 // On macOS, Crashpad uses exception ports to handle signals in a different
194 // process. As we cannot just pass a callback to this other process, we ask
195 // V8 to install its own signal handler to deal with WebAssembly traps.
196 bool use_v8_signal_handler = true;
197 v8::V8::EnableWebAssemblyTrapHandler(use_v8_signal_handler);
198 }
199#endif // defined(OS_MACOSX) && defined(ARCH_CPU_X86_64)
Eric Holkdc499db2017-07-17 17:57:35200
avi83883c82014-12-23 00:08:49201 const base::CommandLine& command_line =
202 *base::CommandLine::ForCurrentProcess();
ishell75fddc12016-04-12 14:03:14203
Ross McIlroy3ba92072018-08-01 00:43:30204 if (command_line.HasSwitch(switches::kNoV8UntrustedCodeMitigations)) {
205 const char* disable_mitigations = "--no-untrusted-code-mitigations";
206 v8::V8::SetFlagsFromString(disable_mitigations,
207 strlen(disable_mitigations));
208 }
209
[email protected]396c3a462010-03-03 05:03:22210 if (command_line.HasSwitch(switches::kJavaScriptFlags)) {
Ross McIlroy900375b2019-05-16 20:17:42211 std::string js_flags =
212 command_line.GetSwitchValueASCII(switches::kJavaScriptFlags);
213 std::vector<base::StringPiece> flag_list = base::SplitStringPiece(
214 js_flags, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
215 for (const auto& flag : flag_list) {
216 v8::V8::SetFlagsFromString(flag.as_string().c_str(), flag.size());
217 }
[email protected]396c3a462010-03-03 05:03:22218 }
[email protected]55dd9332013-09-04 17:17:50219
sammc7f6c6a02017-01-30 00:53:51220 if (command_line.HasSwitch(switches::kDomAutomationController))
221 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION;
222 if (command_line.HasSwitch(switches::kStatsCollectionController))
223 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION;
[email protected]e68e62fa2009-02-20 02:00:04224}
225
[email protected]396c3a462010-03-03 05:03:22226RenderProcessImpl::~RenderProcessImpl() {
[email protected]396c3a462010-03-03 05:03:22227#ifndef NDEBUG
Blink Reformat1c4d759e2017-04-09 16:34:54228 int count = blink::WebFrame::InstanceCount();
[email protected]6bd867b2013-07-24 22:10:20229 if (count)
230 DLOG(ERROR) << "WebFrame LEAKED " << count << " TIMES";
[email protected]396c3a462010-03-03 05:03:22231#endif
[email protected]e68e62fa2009-02-20 02:00:04232
[email protected]396c3a462010-03-03 05:03:22233 GetShutDownEvent()->Signal();
[email protected]396c3a462010-03-03 05:03:22234}
[email protected]e68e62fa2009-02-20 02:00:04235
fdoray31cc6f82017-02-10 23:31:10236std::unique_ptr<RenderProcess> RenderProcessImpl::Create() {
Francois Doray7f777312019-05-16 12:26:31237 return base::WrapUnique(new RenderProcessImpl());
fdoray31cc6f82017-02-10 23:31:10238}
239
[email protected]744c2a22012-03-15 18:42:04240void RenderProcessImpl::AddBindings(int bindings) {
241 enabled_bindings_ |= bindings;
242}
243
244int RenderProcessImpl::GetEnabledBindings() const {
245 return enabled_bindings_;
246}
247
Arthur Sonzognic4f8dee2018-09-05 08:51:33248void RenderProcessImpl::AddRefProcess() {
249 NOTREACHED();
250}
251
252void RenderProcessImpl::ReleaseProcess() {
253 NOTREACHED();
254}
255
[email protected]eb398192012-10-22 20:16:19256} // namespace content