// Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/common/content_switches_internal.h" #include #include "base/command_line.h" #include "base/metrics/field_trial.h" #include "base/metrics/field_trial_params.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 "content/public/common/use_zoom_for_dsf_policy.h" #include "third_party/blink/public/mojom/v8_cache_options.mojom.h" #if defined(OS_ANDROID) #include "base/debug/debugger.h" #include "base/feature_list.h" #endif #if defined(OS_POSIX) && !defined(OS_ANDROID) #include static void SigUSR1Handler(int signal) {} #endif #if defined(OS_WIN) #include "base/win/windows_version.h" #endif namespace content { namespace { #if defined(OS_WIN) base::string16 ToNativeString(base::StringPiece string) { return base::ASCIIToUTF16(string); } std::string FromNativeString(base::StringPiece16 string) { return base::UTF16ToASCII(string); } #else // defined(OS_WIN) std::string ToNativeString(const std::string& string) { return string; } std::string FromNativeString(const std::string& string) { return string; } #endif // defined(OS_WIN) } // namespace bool IsPinchToZoomEnabled() { const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); // Enable pinch everywhere unless it's been explicitly disabled. return !command_line.HasSwitch(switches::kDisablePinch); } 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 defined(OS_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 defined(OS_POSIX) #if defined(OS_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 // defined(OS_ANDROID) #endif // defined(OS_POSIX) } std::vector FeaturesFromSwitch( const base::CommandLine& command_line, const char* switch_name) { using NativeString = base::CommandLine::StringType; using NativeStringPiece = base::BasicStringPiece; std::vector 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 (NativeStringPiece arg : command_line.argv()) { // Switch names are case insensitive on Windows, but base::CommandLine has // already made them lowercase when building argv(). if (!StartsWith(arg, prefix, base::CompareCase::SENSITIVE)) continue; arg.remove_prefix(prefix.size()); if (!IsStringASCII(arg)) continue; auto vals = SplitString(FromNativeString(NativeString(arg)), ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); features.insert(features.end(), vals.begin(), vals.end()); } return features; } } // namespace content