summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Sinclair <dsinclair@chromium.org>2018-02-27 15:46:52 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-02-27 15:46:52 +0000
commite839a6adb305467759e0d22fe7532a72fe4d8fa7 (patch)
treedae604b1010cb9bd33bca9cfa0dcc6c31ef31988
parent6d69dfca14621c907ca9d6c6bd3d3a5d4428e85b (diff)
downloadpdfium-e839a6adb305467759e0d22fe7532a72fe4d8fa7.tar.xz
[Merge M65] Fixup AFSimple_Calculate indexing bug
The refactoring in [1] introduced a bug where we pulled the wrong array index to get the array of fields to use in the AFSimple_Calculate method. This caused the calculation to not be performed as the fields could not be found. This CL fixes up the index and adds a test to verify we use AFSimple_Calucate to sum two fields. 1- https://pdfium-review.googlesource.com/c/pdfium/+/16670 TBR: rharrision@chromium.org Bug: chromium:811913 Change-Id: I2abb9fe4fe2d6969ce1876736faadf252ef90575 Reviewed-on: https://pdfium-review.googlesource.com/27670 Commit-Queue: dsinclair <dsinclair@chromium.org> Reviewed-by: Ryan Harrison <rharrison@chromium.org> (cherry picked from commit 9141116074f9209f617d9607e747c8947c952c46) Reviewed-on: https://pdfium-review.googlesource.com/27750 Reviewed-by: dsinclair <dsinclair@chromium.org>
-rw-r--r--fxjs/cjs_publicmethods.cpp2
-rw-r--r--fxjs/cjs_publicmethods_embeddertest.cpp36
-rw-r--r--testing/resources/calculate.in62
-rw-r--r--testing/resources/calculate.pdf127
4 files changed, 226 insertions, 1 deletions
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index 45eae7f8d2..65edd2e05b 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -1586,7 +1586,7 @@ CJS_Return CJS_PublicMethods::AFSimple_Calculate(
double dValue = wcscmp(sFunction.c_str(), L"PRD") == 0 ? 1.0 : 0.0;
v8::Local<v8::Array> FieldNameArray =
- AF_MakeArrayFromList(pRuntime, params[0]);
+ AF_MakeArrayFromList(pRuntime, params[1]);
int nFieldsCount = 0;
for (size_t i = 0; i < pRuntime->GetArrayLength(FieldNameArray); ++i) {
WideString wsFieldName =
diff --git a/fxjs/cjs_publicmethods_embeddertest.cpp b/fxjs/cjs_publicmethods_embeddertest.cpp
index dbab0817ce..874f59f5ae 100644
--- a/fxjs/cjs_publicmethods_embeddertest.cpp
+++ b/fxjs/cjs_publicmethods_embeddertest.cpp
@@ -3,8 +3,10 @@
// found in the LICENSE file.
#include <cmath>
+#include <vector>
#include "core/fxcrt/fx_string.h"
+#include "fxjs/cjs_event_context.h"
#include "fxjs/cjs_publicmethods.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/js_embedder_test.h"
@@ -160,3 +162,37 @@ TEST_F(CJS_PublicMethodsEmbedderTest, MakeFormatDate) {
CJS_PublicMethods::MakeFormatDate(3947356800000.0, L"mmddyyyy");
EXPECT_STREQ(L"02012095", formatted_date.c_str());
}
+
+TEST_F(CJS_PublicMethodsEmbedderTest, AFSimple_CalculateSum) {
+ 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();
+
+ WideString result;
+ 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"));
+
+ std::vector<v8::Local<v8::Value>> params;
+ params.push_back(runtime.NewString("SUM"));
+ params.push_back(ary);
+
+ CJS_Return ret = CJS_PublicMethods::AFSimple_Calculate(&runtime, params);
+ UnloadPage(page);
+
+ runtime.GetCurrentEventContext()->GetEventHandler()->m_pValue = nullptr;
+
+ ASSERT_TRUE(!ret.HasError());
+ ASSERT_TRUE(!ret.HasReturn());
+ ASSERT_EQ(L"7", result);
+}
diff --git a/testing/resources/calculate.in b/testing/resources/calculate.in
new file mode 100644
index 0000000000..3e40bf8ff5
--- /dev/null
+++ b/testing/resources/calculate.in
@@ -0,0 +1,62 @@
+{{header}}
+{{object 1 0}} <<
+ /AcroForm 11 0 R
+ /Pages 5 0 R
+ /Type /Catalog
+>>
+endobj
+
+{{object 11 0}} <<
+ /Fields [57 0 R 61 0 R]
+>>
+endobj
+
+{{object 5 0}} <<
+ /Count 1
+ /Type /Pages
+ /Kids [12 0 R]
+>>
+endobj
+
+{{object 12 0}} <<
+ /CropBox [0.0 0.0 720.0 540.0]
+ /Annots [57 0 R 61 0 R]
+ /Parent 5 0 R
+ /MediaBox[0.0 0.0 720.0 540.0]
+ /TrimBox[0.0 0.0 720.0 540.0]
+ /Type /Page
+>>
+endobj
+
+{{object 57 0}} <<
+ /Rect [142.13 307.409 208.842 331.442]
+ /Subtype /Widget
+ /F 4
+ /P 12 0 R
+ /Q 2
+ /T (Calc1_A)
+ /V (5)
+ /DV (5)
+ /FT /Tx
+ /Type /Annot
+>>
+endobj
+
+{{object 61 0}} <<
+ /Rect [290.306 307.409 357.793 331.442]
+ /Subtype /Widget
+ /F 4
+ /P 12 0 R
+ /Q 2
+ /T (Calc1_B)
+ /V (2)
+ /DV (2)
+ /FT /Tx
+ /Type /Annot
+>>
+endobj
+
+{{xref}}
+{{trailer}}
+{{startxref}}
+%%EOF
diff --git a/testing/resources/calculate.pdf b/testing/resources/calculate.pdf
new file mode 100644
index 0000000000..8b2b9441d7
--- /dev/null
+++ b/testing/resources/calculate.pdf
@@ -0,0 +1,127 @@
+%PDF-1.7
+% ò¤ô
+1 0 obj <<
+ /AcroForm 11 0 R
+ /Pages 5 0 R
+ /Type /Catalog
+>>
+endobj
+
+11 0 obj <<
+ /Fields [57 0 R 61 0 R]
+>>
+endobj
+
+5 0 obj <<
+ /Count 1
+ /Type /Pages
+ /Kids [12 0 R]
+>>
+endobj
+
+12 0 obj <<
+ /CropBox [0.0 0.0 720.0 540.0]
+ /Annots [57 0 R 61 0 R]
+ /Parent 5 0 R
+ /MediaBox[0.0 0.0 720.0 540.0]
+ /TrimBox[0.0 0.0 720.0 540.0]
+ /Type /Page
+>>
+endobj
+
+57 0 obj <<
+ /Rect [142.13 307.409 208.842 331.442]
+ /Subtype /Widget
+ /F 4
+ /P 12 0 R
+ /Q 2
+ /T (Calc1_A)
+ /V (5)
+ /DV (5)
+ /FT /Tx
+ /Type /Annot
+>>
+endobj
+
+61 0 obj <<
+ /Rect [290.306 307.409 357.793 331.442]
+ /Subtype /Widget
+ /F 4
+ /P 12 0 R
+ /Q 2
+ /T (Calc1_B)
+ /V (2)
+ /DV (2)
+ /FT /Tx
+ /Type /Annot
+>>
+endobj
+
+xref
+0 62
+0000000000 65535 f
+0000000015 00000 n
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000137 00000 n
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000088 00000 n
+0000000202 00000 n
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000379 00000 n
+0000000000 65535 f
+0000000000 65535 f
+0000000000 65535 f
+0000000547 00000 n
+trailer<< /Root 1 0 R /Size 62 >>
+startxref
+716
+%%EOF