Prefer single-byte form of CFX_V8::NewString() with literals. Otherwise, we store 3 extra bytes of zeros per character, which we then throw away at runtime when we turn it back into a bytestring before entering V8. Add small test for equivalence of L"123" vs. "123". Change-Id: I18d4a3677924372297ea62e36ee96489bad7c264 Reviewed-on: https://pdfium-review.googlesource.com/c/44893 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cfx_v8_unittest.cpp b/fxjs/cfx_v8_unittest.cpp index f8e0be6..91188c3 100644 --- a/fxjs/cfx_v8_unittest.cpp +++ b/fxjs/cfx_v8_unittest.cpp
@@ -118,7 +118,7 @@ v8::HandleScope handle_scope(isolate()); v8::Context::Scope context_scope(v8::Context::New(isolate())); - auto str = cfx_v8()->NewString(L"123"); + auto str = cfx_v8()->NewString("123"); EXPECT_TRUE(cfx_v8()->ToBoolean(str)); EXPECT_EQ(123, cfx_v8()->ToInt32(str)); EXPECT_EQ(123, cfx_v8()->ToDouble(str)); @@ -126,6 +126,15 @@ EXPECT_EQ(L"123", cfx_v8()->ToWideString(str)); EXPECT_TRUE(cfx_v8()->ToObject(str).IsEmpty()); EXPECT_TRUE(cfx_v8()->ToArray(str).IsEmpty()); + + auto str2 = cfx_v8()->NewString(L"123"); + EXPECT_TRUE(cfx_v8()->ToBoolean(str2)); + EXPECT_EQ(123, cfx_v8()->ToInt32(str2)); + EXPECT_EQ(123, cfx_v8()->ToDouble(str2)); + EXPECT_EQ("123", cfx_v8()->ToByteString(str2)); + EXPECT_EQ(L"123", cfx_v8()->ToWideString(str2)); + EXPECT_TRUE(cfx_v8()->ToObject(str2).IsEmpty()); + EXPECT_TRUE(cfx_v8()->ToArray(str2).IsEmpty()); } TEST_F(FXV8UnitTest, NewDate) {
diff --git a/fxjs/cjs_color.cpp b/fxjs/cjs_color.cpp index 0d4065e..e51cf54 100644 --- a/fxjs/cjs_color.cpp +++ b/fxjs/cjs_color.cpp
@@ -56,23 +56,23 @@ switch (color.nColorType) { case CFX_Color::kTransparent: array = pRuntime->NewArray(); - pRuntime->PutArrayElement(array, 0, pRuntime->NewString(L"T")); + pRuntime->PutArrayElement(array, 0, pRuntime->NewString("T")); break; case CFX_Color::kGray: array = pRuntime->NewArray(); - pRuntime->PutArrayElement(array, 0, pRuntime->NewString(L"G")); + pRuntime->PutArrayElement(array, 0, pRuntime->NewString("G")); pRuntime->PutArrayElement(array, 1, pRuntime->NewNumber(color.fColor1)); break; case CFX_Color::kRGB: array = pRuntime->NewArray(); - pRuntime->PutArrayElement(array, 0, pRuntime->NewString(L"RGB")); + pRuntime->PutArrayElement(array, 0, pRuntime->NewString("RGB")); pRuntime->PutArrayElement(array, 1, pRuntime->NewNumber(color.fColor1)); pRuntime->PutArrayElement(array, 2, pRuntime->NewNumber(color.fColor2)); pRuntime->PutArrayElement(array, 3, pRuntime->NewNumber(color.fColor3)); break; case CFX_Color::kCMYK: array = pRuntime->NewArray(); - pRuntime->PutArrayElement(array, 0, pRuntime->NewString(L"CMYK")); + pRuntime->PutArrayElement(array, 0, pRuntime->NewString("CMYK")); pRuntime->PutArrayElement(array, 1, pRuntime->NewNumber(color.fColor1)); pRuntime->PutArrayElement(array, 2, pRuntime->NewNumber(color.fColor2)); pRuntime->PutArrayElement(array, 3, pRuntime->NewNumber(color.fColor3));
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp index 8f60d13..33d1087 100644 --- a/fxjs/cjs_document.cpp +++ b/fxjs/cjs_document.cpp
@@ -1002,7 +1002,7 @@ if (i > 0 && i < wsFilePath.GetLength()) return CJS_Result::Success(pRuntime->NewString(wsFilePath.c_str() + i)); - return CJS_Result::Success(pRuntime->NewString(L"")); + return CJS_Result::Success(pRuntime->NewString("")); } CJS_Result CJS_Document::set_document_file_name(CJS_Runtime* pRuntime,
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp index 3676717..eb594cf 100644 --- a/fxjs/cjs_field.cpp +++ b/fxjs/cjs_field.cpp
@@ -665,13 +665,13 @@ switch (pFormControl->GetControlAlignment()) { case 0: - return CJS_Result::Success(pRuntime->NewString(L"left")); + return CJS_Result::Success(pRuntime->NewString("left")); case 1: - return CJS_Result::Success(pRuntime->NewString(L"center")); + return CJS_Result::Success(pRuntime->NewString("center")); case 2: - return CJS_Result::Success(pRuntime->NewString(L"right")); + return CJS_Result::Success(pRuntime->NewString("right")); } - return CJS_Result::Success(pRuntime->NewString(L"")); + return CJS_Result::Success(pRuntime->NewString("")); } CJS_Result CJS_Field::set_alignment(CJS_Runtime* pRuntime, @@ -697,17 +697,17 @@ switch (pWidget->GetBorderStyle()) { case BorderStyle::SOLID: - return CJS_Result::Success(pRuntime->NewString(L"solid")); + return CJS_Result::Success(pRuntime->NewString("solid")); case BorderStyle::DASH: - return CJS_Result::Success(pRuntime->NewString(L"dashed")); + return CJS_Result::Success(pRuntime->NewString("dashed")); case BorderStyle::BEVELED: - return CJS_Result::Success(pRuntime->NewString(L"beveled")); + return CJS_Result::Success(pRuntime->NewString("beveled")); case BorderStyle::INSET: - return CJS_Result::Success(pRuntime->NewString(L"inset")); + return CJS_Result::Success(pRuntime->NewString("inset")); case BorderStyle::UNDERLINE: - return CJS_Result::Success(pRuntime->NewString(L"underline")); + return CJS_Result::Success(pRuntime->NewString("underline")); } - return CJS_Result::Success(pRuntime->NewString(L"")); + return CJS_Result::Success(pRuntime->NewString("")); } CJS_Result CJS_Field::set_border_style(CJS_Runtime* pRuntime, @@ -1374,15 +1374,15 @@ int eHM = pFormControl->GetHighlightingMode(); switch (eHM) { case CPDF_FormControl::None: - return CJS_Result::Success(pRuntime->NewString(L"none")); + return CJS_Result::Success(pRuntime->NewString("none")); case CPDF_FormControl::Push: - return CJS_Result::Success(pRuntime->NewString(L"push")); + return CJS_Result::Success(pRuntime->NewString("push")); case CPDF_FormControl::Invert: - return CJS_Result::Success(pRuntime->NewString(L"invert")); + return CJS_Result::Success(pRuntime->NewString("invert")); case CPDF_FormControl::Outline: - return CJS_Result::Success(pRuntime->NewString(L"outline")); + return CJS_Result::Success(pRuntime->NewString("outline")); case CPDF_FormControl::Toggle: - return CJS_Result::Success(pRuntime->NewString(L"toggle")); + return CJS_Result::Success(pRuntime->NewString("toggle")); } return CJS_Result::Success(); } @@ -2024,23 +2024,23 @@ switch (pFormField->GetFieldType()) { case FormFieldType::kUnknown: - return CJS_Result::Success(pRuntime->NewString(L"unknown")); + return CJS_Result::Success(pRuntime->NewString("unknown")); case FormFieldType::kPushButton: - return CJS_Result::Success(pRuntime->NewString(L"button")); + return CJS_Result::Success(pRuntime->NewString("button")); case FormFieldType::kCheckBox: - return CJS_Result::Success(pRuntime->NewString(L"checkbox")); + return CJS_Result::Success(pRuntime->NewString("checkbox")); case FormFieldType::kRadioButton: - return CJS_Result::Success(pRuntime->NewString(L"radiobutton")); + return CJS_Result::Success(pRuntime->NewString("radiobutton")); case FormFieldType::kComboBox: - return CJS_Result::Success(pRuntime->NewString(L"combobox")); + return CJS_Result::Success(pRuntime->NewString("combobox")); case FormFieldType::kListBox: - return CJS_Result::Success(pRuntime->NewString(L"listbox")); + return CJS_Result::Success(pRuntime->NewString("listbox")); case FormFieldType::kTextField: - return CJS_Result::Success(pRuntime->NewString(L"text")); + return CJS_Result::Success(pRuntime->NewString("text")); case FormFieldType::kSignature: - return CJS_Result::Success(pRuntime->NewString(L"signature")); + return CJS_Result::Success(pRuntime->NewString("signature")); default: - return CJS_Result::Success(pRuntime->NewString(L"unknown")); + return CJS_Result::Success(pRuntime->NewString("unknown")); } } @@ -2113,7 +2113,7 @@ } } if (!bFind) - ret = pRuntime->NewString(L"Off"); + ret = pRuntime->NewString("Off"); break; } @@ -2171,12 +2171,12 @@ pFormField->GetControl(i)->GetExportValue().AsStringView())); } } - return CJS_Result::Success(pRuntime->NewString(L"Off")); + return CJS_Result::Success(pRuntime->NewString("Off")); } if (pFormField->GetFieldType() == FormFieldType::kListBox && (pFormField->CountSelectedItems() > 1)) { - return CJS_Result::Success(pRuntime->NewString(L"")); + return CJS_Result::Success(pRuntime->NewString("")); } return CJS_Result::Success( pRuntime->NewString(pFormField->GetValue().AsStringView()));
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp index e412c70..38dac89 100644 --- a/fxjs/cjs_publicmethods.cpp +++ b/fxjs/cjs_publicmethods.cpp
@@ -965,7 +965,7 @@ if (iNegStyle == 1 || iNegStyle == 3) { if (CJS_Field* fTarget = pEvent->Target_Field()) { v8::Local<v8::Array> arColor = pRuntime->NewArray(); - pRuntime->PutArrayElement(arColor, 0, pRuntime->NewString(L"RGB")); + pRuntime->PutArrayElement(arColor, 0, pRuntime->NewString("RGB")); pRuntime->PutArrayElement(arColor, 1, pRuntime->NewNumber(1)); pRuntime->PutArrayElement(arColor, 2, pRuntime->NewNumber(0)); pRuntime->PutArrayElement(arColor, 3, pRuntime->NewNumber(0)); @@ -976,7 +976,7 @@ if (iNegStyle == 1 || iNegStyle == 3) { if (CJS_Field* fTarget = pEvent->Target_Field()) { v8::Local<v8::Array> arColor = pRuntime->NewArray(); - pRuntime->PutArrayElement(arColor, 0, pRuntime->NewString(L"RGB")); + pRuntime->PutArrayElement(arColor, 0, pRuntime->NewString("RGB")); pRuntime->PutArrayElement(arColor, 1, pRuntime->NewNumber(0)); pRuntime->PutArrayElement(arColor, 2, pRuntime->NewNumber(0)); pRuntime->PutArrayElement(arColor, 3, pRuntime->NewNumber(0));
diff --git a/fxjs/cjs_publicmethods_embeddertest.cpp b/fxjs/cjs_publicmethods_embeddertest.cpp index 93c526a..56f04aa 100644 --- a/fxjs/cjs_publicmethods_embeddertest.cpp +++ b/fxjs/cjs_publicmethods_embeddertest.cpp
@@ -193,9 +193,8 @@ runtime.GetCurrentEventContext()->GetEventHandler()->m_pValue = &result; auto ary = runtime.NewArray(); - - runtime.PutArrayElement(ary, 0, runtime.NewString(L"Calc1_A")); - runtime.PutArrayElement(ary, 1, runtime.NewString(L"Calc1_B")); + runtime.PutArrayElement(ary, 0, runtime.NewString("Calc1_A")); + runtime.PutArrayElement(ary, 1, runtime.NewString("Calc1_B")); std::vector<v8::Local<v8::Value>> params; params.push_back(runtime.NewString("SUM")); @@ -239,8 +238,8 @@ handler->SetSelEnd(0); std::vector<v8::Local<v8::Value>> params; - params.push_back(runtime.NewString(L"-10")); - params.push_back(runtime.NewString(L"")); + params.push_back(runtime.NewString("-10")); + params.push_back(runtime.NewString("")); CJS_Result ret = CJS_PublicMethods::AFNumber_Keystroke(&runtime, params); EXPECT_TRUE(valid);