summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fxjs/cjs_publicmethods.cpp4
-rw-r--r--fxjs/cjs_publicmethods_embeddertest.cpp44
2 files changed, 46 insertions, 2 deletions
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index d613f4888a..28df0a305b 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -1009,8 +1009,8 @@ CJS_Return CJS_PublicMethods::AFNumber_Keystroke(
bool bHasSign = wstrValue.Contains(L'-') && !wstrSelected.Contains(L'-');
if (bHasSign) {
- // can't insert "change" in front to sign postion.
- if (pEvent->SelStart() == 0) {
+ // can't insert "change" in front of sign position.
+ if (!wstrSelected.IsEmpty() && pEvent->SelStart() == 0) {
pEvent->Rc() = false;
return CJS_Return(true);
}
diff --git a/fxjs/cjs_publicmethods_embeddertest.cpp b/fxjs/cjs_publicmethods_embeddertest.cpp
index 874f59f5ae..90efee9078 100644
--- a/fxjs/cjs_publicmethods_embeddertest.cpp
+++ b/fxjs/cjs_publicmethods_embeddertest.cpp
@@ -196,3 +196,47 @@ TEST_F(CJS_PublicMethodsEmbedderTest, AFSimple_CalculateSum) {
ASSERT_TRUE(!ret.HasReturn());
ASSERT_EQ(L"7", result);
}
+
+TEST_F(CJS_PublicMethodsEmbedderTest, AFNumber_Keystroke) {
+ v8::Isolate::Scope isolate_scope(isolate());
+ v8::HandleScope handle_scope(isolate());
+ v8::Context::Scope context_scope(GetV8Context());
+
+ EXPECT_TRUE(OpenDocument("calculate.pdf"));
+ auto* page = LoadPage(0);
+ ASSERT_TRUE(page);
+
+ CJS_Runtime runtime(static_cast<CPDFSDK_FormFillEnvironment*>(form_handle()));
+ runtime.NewEventContext();
+
+ auto* handler = runtime.GetCurrentEventContext()->GetEventHandler();
+
+ bool valid = true;
+ WideString result = L"-10";
+ WideString change = L"";
+
+ handler->m_pValue = &result;
+ handler->m_pbRc = &valid;
+ handler->m_pWideStrChange = &change;
+
+ handler->m_bWillCommit = 0;
+ handler->SetSelStart(0);
+ handler->SetSelEnd(0);
+
+ std::vector<v8::Local<v8::Value>> params;
+ params.push_back(runtime.NewString(L"-10"));
+ params.push_back(runtime.NewString(L""));
+
+ CJS_Return ret = CJS_PublicMethods::AFNumber_Keystroke(&runtime, params);
+ EXPECT_TRUE(valid);
+ EXPECT_TRUE(!ret.HasError());
+ EXPECT_TRUE(!ret.HasReturn());
+
+ UnloadPage(page);
+
+ // Keep the *SAN bots happy. One of these is an UnownedPtr, another seems to
+ // used during destruction. Clear them all to be safe and consistent.
+ handler->m_pValue = nullptr;
+ handler->m_pbRc = nullptr;
+ handler->m_pWideStrChange = nullptr;
+}