1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
#pragma allow_unsafe_libc_calls
#endif
#include "content/common/content_switches_internal.h"
#include <string>
#include <string_view>
#include "base/command_line.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/field_trial_params.h"
#include "base/process/process_handle.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "build/branding_buildflags.h"
#include "build/build_config.h"
#include "content/public/common/content_switches.h"
#include "third_party/blink/public/mojom/v8_cache_options.mojom.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/debug/debugger.h"
#include "base/feature_list.h"
#endif
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
#include <signal.h>
static void SigUSR1Handler(int signal) {}
#endif
#if BUILDFLAG(IS_WIN)
#include <windows.h>
#include "base/win/windows_version.h"
#endif
namespace content {
namespace {
#if BUILDFLAG(IS_WIN)
std::wstring ToNativeString(std::string_view string) {
return base::ASCIIToWide(string);
}
std::string FromNativeString(std::wstring_view string) {
return base::WideToASCII(string);
}
#else // BUILDFLAG(IS_WIN)
std::string ToNativeString(const std::string& string) {
return string;
}
std::string FromNativeString(const std::string& string) {
return string;
}
#endif // BUILDFLAG(IS_WIN)
} // namespace
blink::mojom::V8CacheOptions GetV8CacheOptions() {
const base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
std::string v8_cache_options =
command_line.GetSwitchValueASCII(switches::kV8CacheOptions);
if (v8_cache_options.empty())
v8_cache_options = base::FieldTrialList::FindFullName("V8CacheOptions");
if (v8_cache_options == "none") {
return blink::mojom::V8CacheOptions::kNone;
} else if (v8_cache_options == "code") {
return blink::mojom::V8CacheOptions::kCode;
} else {
return blink::mojom::V8CacheOptions::kDefault;
}
}
void WaitForDebugger(const std::string& label) {
#if BUILDFLAG(IS_WIN)
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
std::string title = "Google Chrome";
#else // BUILDFLAG(CHROMIUM_BRANDING)
std::string title = "Chromium";
#endif // BUILDFLAG(CHROMIUM_BRANDING)
title += " ";
title += label; // makes attaching to process easier
std::string message = label;
message += " starting with pid: ";
message += base::NumberToString(base::GetCurrentProcId());
::MessageBox(NULL, base::UTF8ToWide(message).c_str(),
base::UTF8ToWide(title).c_str(), MB_OK | MB_SETFOREGROUND);
#elif BUILDFLAG(IS_POSIX)
#if BUILDFLAG(IS_ANDROID)
LOG(ERROR) << label << " waiting for GDB.";
// Wait 24 hours for a debugger to be attached to the current process.
base::debug::WaitForDebugger(24 * 60 * 60, true);
#else
// TODO(playmobil): In the long term, overriding this flag doesn't seem
// right, either use our own flag or open a dialog we can use.
// This is just to ease debugging in the interim.
LOG(ERROR) << label << " (" << getpid()
<< ") paused waiting for debugger to attach. "
<< "Send SIGUSR1 to unpause.";
// Install a signal handler so that pause can be woken.
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SigUSR1Handler;
sigaction(SIGUSR1, &sa, nullptr);
pause();
#endif // BUILDFLAG(IS_ANDROID)
#endif // BUILDFLAG(IS_POSIX)
}
std::vector<std::string> FeaturesFromSwitch(
const base::CommandLine& command_line,
const char* switch_name) {
using NativeString = base::CommandLine::StringType;
using NativeStringView = base::CommandLine::StringViewType;
std::vector<std::string> features;
if (!command_line.HasSwitch(switch_name))
return features;
// Store prefix as native string to avoid conversions for every arg.
// (No string copies for the args that don't match the prefix.)
NativeString prefix =
ToNativeString(base::StringPrintf("--%s=", switch_name));
for (NativeStringView arg : command_line.argv()) {
// Switch names are case insensitive on Windows, but base::CommandLine has
// already made them lowercase when building argv().
if (!base::StartsWith(arg, prefix, base::CompareCase::SENSITIVE)) {
continue;
}
arg.remove_prefix(prefix.size());
if (!base::IsStringASCII(arg)) {
continue;
}
auto vals = base::SplitString(FromNativeString(NativeString(arg)), ",",
base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
features.insert(features.end(), vals.begin(), vals.end());
}
return features;
}
} // namespace content
|