blob: 0aaae81637ef39fb93ef92191f0580942819135b [file] [log] [blame]
Lei Zhang25661d12019-08-01 21:57:23 +00001// Copyright 2019 PDFium Authors. All rights reserved.
2// 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>
8
9#include "core/fpdfapi/parser/cpdf_dictionary.h"
10#include "core/fpdfapi/parser/cpdf_document.h"
11#include "core/fpdfdoc/cpdf_action.h"
12#include "core/fpdfdoc/cpdf_nametree.h"
13#include "fpdfsdk/cpdfsdk_helpers.h"
Lei Zhang25661d12019-08-01 21:57:23 +000014
15struct CPDF_JavaScript {
16 WideString name;
17 WideString script;
18};
19
20FPDF_EXPORT int FPDF_CALLCONV
21FPDFDoc_GetJavaScriptActionCount(FPDF_DOCUMENT document) {
22 CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document);
Lei Zhang1575b472020-04-02 23:09:15 +000023 if (!doc)
24 return -1;
25
26 auto name_tree = CPDF_NameTree::Create(doc, "JavaScript");
27 return name_tree ? name_tree->GetCount() : 0;
Lei Zhang25661d12019-08-01 21:57:23 +000028}
29
30FPDF_EXPORT FPDF_JAVASCRIPT_ACTION FPDF_CALLCONV
31FPDFDoc_GetJavaScriptAction(FPDF_DOCUMENT document, int index) {
32 CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document);
33 if (!doc || index < 0)
34 return nullptr;
35
Lei Zhang1575b472020-04-02 23:09:15 +000036 auto name_tree = CPDF_NameTree::Create(doc, "JavaScript");
37 if (!name_tree || static_cast<size_t>(index) >= name_tree->GetCount())
Lei Zhang25661d12019-08-01 21:57:23 +000038 return nullptr;
39
40 WideString name;
41 CPDF_Dictionary* obj =
Lei Zhang1575b472020-04-02 23:09:15 +000042 ToDictionary(name_tree->LookupValueAndName(index, &name));
Lei Zhang25661d12019-08-01 21:57:23 +000043 if (!obj)
44 return nullptr;
45
46 // Validate |obj|. Type is optional, but must be valid if present.
47 CPDF_Action action(obj);
48 if (action.GetType() != CPDF_Action::JavaScript)
49 return nullptr;
50
51 Optional<WideString> script = action.MaybeGetJavaScript();
52 if (!script.has_value())
53 return nullptr;
54
Tom Sepez5af95432020-05-15 22:55:16 +000055 auto js = std::make_unique<CPDF_JavaScript>();
Lei Zhang25661d12019-08-01 21:57:23 +000056 js->name = name;
57 js->script = script.value();
58 return FPDFJavaScriptActionFromCPDFJavaScriptAction(js.release());
59}
60
61FPDF_EXPORT void FPDF_CALLCONV
62FPDFDoc_CloseJavaScriptAction(FPDF_JAVASCRIPT_ACTION javascript) {
63 // Take object back across API and destroy it.
64 std::unique_ptr<CPDF_JavaScript>(
65 CPDFJavaScriptActionFromFPDFJavaScriptAction(javascript));
66}
67
68FPDF_EXPORT unsigned long FPDF_CALLCONV
69FPDFJavaScriptAction_GetName(FPDF_JAVASCRIPT_ACTION javascript,
70 FPDF_WCHAR* buffer,
71 unsigned long buflen) {
72 CPDF_JavaScript* js =
73 CPDFJavaScriptActionFromFPDFJavaScriptAction(javascript);
74 if (!js)
75 return 0;
76 return Utf16EncodeMaybeCopyAndReturnLength(js->name, buffer, buflen);
77}
78
79FPDF_EXPORT unsigned long FPDF_CALLCONV
80FPDFJavaScriptAction_GetScript(FPDF_JAVASCRIPT_ACTION javascript,
81 FPDF_WCHAR* buffer,
82 unsigned long buflen) {
83 CPDF_JavaScript* js =
84 CPDFJavaScriptActionFromFPDFJavaScriptAction(javascript);
85 if (!js)
86 return 0;
87 return Utf16EncodeMaybeCopyAndReturnLength(js->script, buffer, buflen);
88}