blob: ed91ac6968a2ce4542317ff2dbfe9ce0b2c9ac5b [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
5#include "public/fpdf_javascript.h"
6
7#include <memory>
Tom Sepez525a4272022-09-28 21:35:24 +00008#include <utility>
Lei Zhang25661d12019-08-01 21:57:23 +00009
10#include "core/fpdfapi/parser/cpdf_dictionary.h"
11#include "core/fpdfapi/parser/cpdf_document.h"
12#include "core/fpdfdoc/cpdf_action.h"
13#include "core/fpdfdoc/cpdf_nametree.h"
14#include "fpdfsdk/cpdfsdk_helpers.h"
Tom Sepez5ea5fa92022-03-08 00:15:23 +000015#include "third_party/base/numerics/safe_conversions.h"
Lei Zhang25661d12019-08-01 21:57:23 +000016
17struct CPDF_JavaScript {
18 WideString name;
19 WideString script;
20};
21
22FPDF_EXPORT int FPDF_CALLCONV
23FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) {
24 CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document);
Lei Zhang1575b472020-04-02 23:09:15 +000025 if (!doc)
26 return -1;
27
28 auto name_tree = CPDF_NameTree::Create(doc, "JavaScript");
Tom Sepez5ea5fa92022-03-08 00:15:23 +000029 return name_tree ? pdfium::base::checked_cast<int>(name_tree->GetCount()) : 0;
Lei Zhang25661d12019-08-01 21:57:23 +000030}
31
32FPDF_EXPORT FPDF_JAVASCRIPT_ACTION FPDF_CALLCONV
33FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) {
34 CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document);
35 if (!doc || index < 0)
36 return nullptr;
37
Lei Zhang1575b472020-04-02 23:09:15 +000038 auto name_tree = CPDF_NameTree::Create(doc, "JavaScript");
39 if (!name_tree || static_cast<size_t>(index) >= name_tree->GetCount())
Lei Zhang25661d12019-08-01 21:57:23 +000040 return nullptr;
41
42 WideString name;
Tom Sepez525a4272022-09-28 21:35:24 +000043 RetainPtr<CPDF_Dictionary> obj =
Lei Zhang1575b472020-04-02 23:09:15 +000044 ToDictionary(name_tree->LookupValueAndName(index, &name));
Lei Zhang25661d12019-08-01 21:57:23 +000045 if (!obj)
46 return nullptr;
47
48 // Validate |obj|. Type is optional, but must be valid if present.
Tom Sepez525a4272022-09-28 21:35:24 +000049 CPDF_Action action(std::move(obj));
Lei Zhang7f195a12021-04-13 18:56:36 +000050 if (action.GetType() != CPDF_Action::Type::kJavaScript)
Lei Zhang25661d12019-08-01 21:57:23 +000051 return nullptr;
52
Lei Zhang2c495302021-10-07 23:13:30 +000053 absl::optional<WideString> script = action.MaybeGetJavaScript();
Lei Zhang25661d12019-08-01 21:57:23 +000054 if (!script.has_value())
55 return nullptr;
56
Tom Sepez5af95432020-05-15 22:55:16 +000057 auto js = std::make_unique<CPDF_JavaScript>();
Lei Zhang25661d12019-08-01 21:57:23 +000058 js->name = name;
59 js->script = script.value();
60 return FPDFJavaScriptActionFromCPDFJavaScriptAction(js.release());
61}
62
63FPDF_EXPORT void FPDF_CALLCONV
64FPDFDoc_CloseJavaScriptAction(FPDF_JAVASCRIPT_ACTION javascript) {
65 // Take object back across API and destroy it.
66 std::unique_ptr<CPDF_JavaScript>(
67 CPDFJavaScriptActionFromFPDFJavaScriptAction(javascript));
68}
69
70FPDF_EXPORT unsigned long FPDF_CALLCONV
71FPDFJavaScriptAction_GetName(FPDF_JAVASCRIPT_ACTION javascript,
72 FPDF_WCHAR* buffer,
73 unsigned long buflen) {
74 CPDF_JavaScript* js =
75 CPDFJavaScriptActionFromFPDFJavaScriptAction(javascript);
76 if (!js)
77 return 0;
78 return Utf16EncodeMaybeCopyAndReturnLength(js->name, buffer, buflen);
79}
80
81FPDF_EXPORT unsigned long FPDF_CALLCONV
82FPDFJavaScriptAction_GetScript(FPDF_JAVASCRIPT_ACTION javascript,
83 FPDF_WCHAR* buffer,
84 unsigned long buflen) {
85 CPDF_JavaScript* js =
86 CPDFJavaScriptActionFromFPDFJavaScriptAction(javascript);
87 if (!js)
88 return 0;
89 return Utf16EncodeMaybeCopyAndReturnLength(js->script, buffer, buflen);
90}