1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2019 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_memory.h"
8*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_javascript.h"
9*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdfview.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "testing/embedder_test.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "testing/fx_string_testhelpers.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "testing/utils/hash.h"
13*3ac0a46fSAndroid Build Coastguard Worker
14*3ac0a46fSAndroid Build Coastguard Worker class FPDFJavaScriptEmbedderTest : public EmbedderTest {};
15*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFJavaScriptEmbedderTest,CountJS)16*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFJavaScriptEmbedderTest, CountJS) {
17*3ac0a46fSAndroid Build Coastguard Worker // Open a file with JS.
18*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_679649.pdf"));
19*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(1, FPDFDoc_GetJavaScriptActionCount(document()));
20*3ac0a46fSAndroid Build Coastguard Worker }
21*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFJavaScriptEmbedderTest,CountNoJS)22*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFJavaScriptEmbedderTest, CountNoJS) {
23*3ac0a46fSAndroid Build Coastguard Worker // Open a file without JS.
24*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("hello_world.pdf"));
25*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, FPDFDoc_GetJavaScriptActionCount(document()));
26*3ac0a46fSAndroid Build Coastguard Worker
27*3ac0a46fSAndroid Build Coastguard Worker // Provide no document.
28*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(-1, FPDFDoc_GetJavaScriptActionCount(nullptr));
29*3ac0a46fSAndroid Build Coastguard Worker }
30*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFJavaScriptEmbedderTest,GetJS)31*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFJavaScriptEmbedderTest, GetJS) {
32*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("js.pdf"));
33*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(5, FPDFDoc_GetJavaScriptActionCount(document()));
34*3ac0a46fSAndroid Build Coastguard Worker
35*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFJavaScriptAction js;
36*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), -1));
37*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
38*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), 5));
39*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
40*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(nullptr, -1));
41*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
42*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(nullptr, 0));
43*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
44*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(nullptr, 1));
45*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
46*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(nullptr, 2));
47*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
48*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(nullptr, 5));
49*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
50*3ac0a46fSAndroid Build Coastguard Worker
51*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), 0));
52*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(js);
53*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), 1));
54*3ac0a46fSAndroid Build Coastguard Worker EXPECT_TRUE(js);
55*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), 2));
56*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
57*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), 3));
58*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
59*3ac0a46fSAndroid Build Coastguard Worker js.reset(FPDFDoc_GetJavaScriptAction(document(), 4));
60*3ac0a46fSAndroid Build Coastguard Worker EXPECT_FALSE(js);
61*3ac0a46fSAndroid Build Coastguard Worker }
62*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFJavaScriptEmbedderTest,GetJSName)63*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFJavaScriptEmbedderTest, GetJSName) {
64*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_679649.pdf"));
65*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFJavaScriptAction js(FPDFDoc_GetJavaScriptAction(document(), 0));
66*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(js);
67*3ac0a46fSAndroid Build Coastguard Worker
68*3ac0a46fSAndroid Build Coastguard Worker {
69*3ac0a46fSAndroid Build Coastguard Worker FPDF_WCHAR buf[10];
70*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFJavaScriptAction_GetName(nullptr, nullptr, 0));
71*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFJavaScriptAction_GetName(nullptr, buf, 0));
72*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFJavaScriptAction_GetName(nullptr, buf, sizeof(buf)));
73*3ac0a46fSAndroid Build Coastguard Worker }
74*3ac0a46fSAndroid Build Coastguard Worker
75*3ac0a46fSAndroid Build Coastguard Worker constexpr size_t kExpectedLength = 22;
76*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedLength,
77*3ac0a46fSAndroid Build Coastguard Worker FPDFJavaScriptAction_GetName(js.get(), nullptr, 0));
78*3ac0a46fSAndroid Build Coastguard Worker
79*3ac0a46fSAndroid Build Coastguard Worker // Check that the name not returned if the buffer is too small.
80*3ac0a46fSAndroid Build Coastguard Worker // The result buffer should be overwritten with an empty string.
81*3ac0a46fSAndroid Build Coastguard Worker std::vector<FPDF_WCHAR> buf = GetFPDFWideStringBuffer(kExpectedLength);
82*3ac0a46fSAndroid Build Coastguard Worker // Write in the buffer to verify it's not overwritten.
83*3ac0a46fSAndroid Build Coastguard Worker memcpy(buf.data(), "abcdefgh", 8);
84*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, FPDFJavaScriptAction_GetName(js.get(), buf.data(),
85*3ac0a46fSAndroid Build Coastguard Worker kExpectedLength - 1));
86*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), "abcdefgh", 8));
87*3ac0a46fSAndroid Build Coastguard Worker
88*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, FPDFJavaScriptAction_GetName(js.get(), buf.data(),
89*3ac0a46fSAndroid Build Coastguard Worker kExpectedLength));
90*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(L"startDelay", GetPlatformWString(buf.data()));
91*3ac0a46fSAndroid Build Coastguard Worker }
92*3ac0a46fSAndroid Build Coastguard Worker
TEST_F(FPDFJavaScriptEmbedderTest,GetJSScript)93*3ac0a46fSAndroid Build Coastguard Worker TEST_F(FPDFJavaScriptEmbedderTest, GetJSScript) {
94*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(OpenDocument("bug_679649.pdf"));
95*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFJavaScriptAction js(FPDFDoc_GetJavaScriptAction(document(), 0));
96*3ac0a46fSAndroid Build Coastguard Worker ASSERT_TRUE(js);
97*3ac0a46fSAndroid Build Coastguard Worker
98*3ac0a46fSAndroid Build Coastguard Worker {
99*3ac0a46fSAndroid Build Coastguard Worker FPDF_WCHAR buf[10];
100*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFJavaScriptAction_GetScript(nullptr, nullptr, 0));
101*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFJavaScriptAction_GetScript(nullptr, buf, 0));
102*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0u, FPDFJavaScriptAction_GetScript(nullptr, buf, sizeof(buf)));
103*3ac0a46fSAndroid Build Coastguard Worker }
104*3ac0a46fSAndroid Build Coastguard Worker
105*3ac0a46fSAndroid Build Coastguard Worker constexpr size_t kExpectedLength = 218;
106*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedLength,
107*3ac0a46fSAndroid Build Coastguard Worker FPDFJavaScriptAction_GetScript(js.get(), nullptr, 0));
108*3ac0a46fSAndroid Build Coastguard Worker
109*3ac0a46fSAndroid Build Coastguard Worker // Check that the string value of an AP is not returned if the buffer is too
110*3ac0a46fSAndroid Build Coastguard Worker // small. The result buffer should be overwritten with an empty string.
111*3ac0a46fSAndroid Build Coastguard Worker std::vector<FPDF_WCHAR> buf = GetFPDFWideStringBuffer(kExpectedLength);
112*3ac0a46fSAndroid Build Coastguard Worker // Write in the buffer to verify it's not overwritten.
113*3ac0a46fSAndroid Build Coastguard Worker memcpy(buf.data(), "abcdefgh", 8);
114*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, FPDFJavaScriptAction_GetScript(
115*3ac0a46fSAndroid Build Coastguard Worker js.get(), buf.data(), kExpectedLength - 1));
116*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buf.data(), "abcdefgh", 8));
117*3ac0a46fSAndroid Build Coastguard Worker
118*3ac0a46fSAndroid Build Coastguard Worker static const wchar_t kExpectedScript[] =
119*3ac0a46fSAndroid Build Coastguard Worker L"function ping() {\n app.alert(\"ping\");\n}\n"
120*3ac0a46fSAndroid Build Coastguard Worker L"var timer = app.setTimeOut(\"ping()\", 100);\napp.clearTimeOut(timer);";
121*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedLength, FPDFJavaScriptAction_GetScript(
122*3ac0a46fSAndroid Build Coastguard Worker js.get(), buf.data(), kExpectedLength));
123*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedScript, GetPlatformWString(buf.data()));
124*3ac0a46fSAndroid Build Coastguard Worker }
125