Fix CefCommandLine character case requirements (fixes issue #1872)

Switch names will now be converted to lowercase ASCII on all platforms.
Switch values will retain the original case and UTF8 encoding.
This commit is contained in:
Marshall Greenblatt 2021-09-27 13:36:08 +03:00
parent 6516b569a9
commit 4d1c5ebdd2
6 changed files with 58 additions and 15 deletions

View File

@ -33,7 +33,7 @@
// by hand. See the translator.README.txt file in the tools directory for // by hand. See the translator.README.txt file in the tools directory for
// more information. // more information.
// //
// $hash=5af5bf1e877dd53f21f751d332a9e2166817324c$ // $hash=3ecebd6b30bb8fb837e062eacd021c1a1ff3620a$
// //
#ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_ #ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_
@ -53,8 +53,9 @@ extern "C" {
// optionally have a value specified using the '=' delimiter (e.g. // optionally have a value specified using the '=' delimiter (e.g.
// "-switch=value"). An argument of "--" will terminate switch parsing with all // "-switch=value"). An argument of "--" will terminate switch parsing with all
// subsequent tokens, regardless of prefix, being interpreted as non-switch // subsequent tokens, regardless of prefix, being interpreted as non-switch
// arguments. Switch names are considered case-insensitive. This structure can // arguments. Switch names should be lowercase ASCII and will be converted to
// be used before cef_initialize() is called. // such if necessary. Switch values will retain the original case and UTF8
// encoding. This structure can be used before cef_initialize() is called.
/// ///
typedef struct _cef_command_line_t { typedef struct _cef_command_line_t {
/// ///

View File

@ -49,8 +49,9 @@
// optionally have a value specified using the '=' delimiter (e.g. // optionally have a value specified using the '=' delimiter (e.g.
// "-switch=value"). An argument of "--" will terminate switch parsing with all // "-switch=value"). An argument of "--" will terminate switch parsing with all
// subsequent tokens, regardless of prefix, being interpreted as non-switch // subsequent tokens, regardless of prefix, being interpreted as non-switch
// arguments. Switch names are considered case-insensitive. This class can be // arguments. Switch names should be lowercase ASCII and will be converted to
// used before CefInitialize() is called. // such if necessary. Switch values will retain the original case and UTF8
// encoding. This class can be used before CefInitialize() is called.
/// ///
/*--cef(source=library,no_debugct_check)--*/ /*--cef(source=library,no_debugct_check)--*/
class CefCommandLine : public virtual CefBaseRefCounted { class CefCommandLine : public virtual CefBaseRefCounted {

View File

@ -6,6 +6,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/strings/string_util.h"
CefCommandLineImpl::CefCommandLineImpl(base::CommandLine* value, CefCommandLineImpl::CefCommandLineImpl(base::CommandLine* value,
bool will_delete, bool will_delete,
@ -90,12 +91,13 @@ bool CefCommandLineImpl::HasSwitches() {
bool CefCommandLineImpl::HasSwitch(const CefString& name) { bool CefCommandLineImpl::HasSwitch(const CefString& name) {
CEF_VALUE_VERIFY_RETURN(false, false); CEF_VALUE_VERIFY_RETURN(false, false);
return const_value().HasSwitch(name.ToString()); return const_value().HasSwitch(base::ToLowerASCII(name.ToString()));
} }
CefString CefCommandLineImpl::GetSwitchValue(const CefString& name) { CefString CefCommandLineImpl::GetSwitchValue(const CefString& name) {
CEF_VALUE_VERIFY_RETURN(false, CefString()); CEF_VALUE_VERIFY_RETURN(false, CefString());
return const_value().GetSwitchValueNative(name.ToString()); return const_value().GetSwitchValueNative(
base::ToLowerASCII(name.ToString()));
} }
void CefCommandLineImpl::GetSwitches(SwitchMap& switches) { void CefCommandLineImpl::GetSwitches(SwitchMap& switches) {

View File

@ -483,6 +483,11 @@ patches = [
# https://bitbucket.org/chromiumembedded/cef/issues/123 # https://bitbucket.org/chromiumembedded/cef/issues/123
'name': 'print_preview_123', 'name': 'print_preview_123',
}, },
{
# Store command-line switch names as lower-case ASCII on all platforms.
# https://bitbucket.org/chromiumembedded/cef/issues/1872
'name': 'base_command_line_1872',
},
{ {
# Remove cef_sandbox dependency on boringssl MD5/SHA1 functions. # Remove cef_sandbox dependency on boringssl MD5/SHA1 functions.
# https://bitbucket.org/chromiumembedded/cef/issues/2743 # https://bitbucket.org/chromiumembedded/cef/issues/2743

View File

@ -0,0 +1,17 @@
diff --git base/command_line.cc base/command_line.cc
index 3ef2e87e40687..f7b91a202a377 100644
--- base/command_line.cc
+++ base/command_line.cc
@@ -333,11 +333,10 @@ void CommandLine::AppendSwitchPath(StringPiece switch_string,
void CommandLine::AppendSwitchNative(StringPiece switch_string,
CommandLine::StringPieceType value) {
-#if defined(OS_WIN)
const std::string switch_key = ToLowerASCII(switch_string);
+#if defined(OS_WIN)
StringType combined_switch_string(UTF8ToWide(switch_key));
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
- StringPiece switch_key = switch_string;
StringType combined_switch_string(switch_key);
#endif
size_t prefix_length = GetSwitchPrefixLength(combined_switch_string);

View File

@ -18,9 +18,10 @@ void VerifyCommandLine(CefRefPtr<CefCommandLine> command_line,
EXPECT_TRUE(command_line->HasSwitch("switch1")); EXPECT_TRUE(command_line->HasSwitch("switch1"));
std::string switch1 = command_line->GetSwitchValue("switch1"); std::string switch1 = command_line->GetSwitchValue("switch1");
EXPECT_EQ("", switch1); EXPECT_EQ("", switch1);
EXPECT_TRUE(command_line->HasSwitch("switch2")); // Switch names are converted to lowercase but values are left unchanged.
std::string switch2 = command_line->GetSwitchValue("switch2"); EXPECT_TRUE(command_line->HasSwitch("SWITCH2"));
EXPECT_EQ("val2", switch2); std::string switch2 = command_line->GetSwitchValue("SWITCH2");
EXPECT_EQ("VAL2", switch2);
EXPECT_TRUE(command_line->HasSwitch("switch3")); EXPECT_TRUE(command_line->HasSwitch("switch3"));
std::string switch3 = command_line->GetSwitchValue("switch3"); std::string switch3 = command_line->GetSwitchValue("switch3");
EXPECT_EQ("val3", switch3); EXPECT_EQ("val3", switch3);
@ -45,7 +46,7 @@ void VerifyCommandLine(CefRefPtr<CefCommandLine> command_line,
EXPECT_EQ("", val); EXPECT_EQ("", val);
} else if (name == "switch2") { } else if (name == "switch2") {
has2 = true; has2 = true;
EXPECT_EQ("val2", val); EXPECT_EQ("VAL2", val);
} else if (name == "switch3") { } else if (name == "switch3") {
has3 = true; has3 = true;
EXPECT_EQ("val3", val); EXPECT_EQ("val3", val);
@ -86,10 +87,10 @@ TEST(CommandLineTest, Init) {
#if defined(OS_WIN) #if defined(OS_WIN)
command_line->InitFromString( command_line->InitFromString(
"test.exe --switch1 -switch2=val2 /switch3=val3 " "test.exe --switch1 -switch2=VAL2 /switch3=val3 "
"-switch4=\"val 4\" arg1 \"arg 2\""); "-switch4=\"val 4\" arg1 \"arg 2\"");
#else #else
const char* args[] = {"test.exe", "--switch1", "-switch2=val2", const char* args[] = {"test.exe", "--switch1", "-switch2=VAL2",
"-switch3=val3", "-switch4=val 4", "arg1", "-switch3=val3", "-switch4=val 4", "arg1",
"arg 2"}; "arg 2"};
command_line->InitFromArgv(sizeof(args) / sizeof(char*), args); command_line->InitFromArgv(sizeof(args) / sizeof(char*), args);
@ -105,7 +106,7 @@ TEST(CommandLineTest, Manual) {
command_line->SetProgram("test.exe"); command_line->SetProgram("test.exe");
command_line->AppendSwitch("switch1"); command_line->AppendSwitch("switch1");
command_line->AppendSwitchWithValue("switch2", "val2"); command_line->AppendSwitchWithValue("switch2", "VAL2");
command_line->AppendSwitchWithValue("switch3", "val3"); command_line->AppendSwitchWithValue("switch3", "val3");
command_line->AppendSwitchWithValue("switch4", "val 4"); command_line->AppendSwitchWithValue("switch4", "val 4");
command_line->AppendArgument("arg1"); command_line->AppendArgument("arg1");
@ -121,7 +122,7 @@ TEST(CommandLineTest, IgnorePrefixes) {
command_line->SetProgram("test.exe"); command_line->SetProgram("test.exe");
command_line->AppendSwitch("-switch1"); command_line->AppendSwitch("-switch1");
command_line->AppendSwitchWithValue("--switch2", "val2"); command_line->AppendSwitchWithValue("--switch2", "VAL2");
command_line->AppendSwitchWithValue("-switch3", "val3"); command_line->AppendSwitchWithValue("-switch3", "val3");
command_line->AppendSwitchWithValue("-switch4", "val 4"); command_line->AppendSwitchWithValue("-switch4", "val 4");
@ -133,3 +134,19 @@ TEST(CommandLineTest, IgnorePrefixes) {
VerifyCommandLine(command_line, arg1, arg2); VerifyCommandLine(command_line, arg1, arg2);
} }
// Test that command line switch names are converted to lowercase ASCII.
TEST(CommandLineTest, IgnoreCase) {
CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();
EXPECT_TRUE(command_line.get() != nullptr);
command_line->SetProgram("test.exe");
command_line->AppendSwitch("-Switch1");
command_line->AppendSwitchWithValue("-SWITCH2", "VAL2");
command_line->AppendSwitchWithValue("-switch3", "val3");
command_line->AppendSwitchWithValue("-switch4", "val 4");
command_line->AppendArgument("arg1");
command_line->AppendArgument("arg 2");
VerifyCommandLine(command_line);
}