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