1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2015 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "testing/embedder_test.h"
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <limits.h>
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <list>
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <string>
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <utility>
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <vector>
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_dataavail.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_edit.h"
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_text.h"
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdfview.h"
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "testing/gmock/include/gmock/gmock.h"
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "testing/test_support.h"
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "testing/utils/path_service.h"
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "v8/include/v8.h"
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "v8/include/v8-platform.h"
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // PDF_ENABLE_V8
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovnamespace {
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst char* g_exe_path_ = nullptr;
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}  // namespace
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return true;
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {}
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannEmbedderTest::EmbedderTest()
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : default_delegate_(new EmbedderTest::Delegate()),
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      document_(nullptr),
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      form_handle_(nullptr),
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      avail_(nullptr),
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      external_isolate_(nullptr),
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      loader_(nullptr),
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      file_length_(0),
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      file_contents_(nullptr) {
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  memset(&hints_, 0, sizeof(hints_));
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  memset(&file_access_, 0, sizeof(file_access_));
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  memset(&file_avail_, 0, sizeof(file_avail_));
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delegate_ = default_delegate_.get();
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef V8_USE_EXTERNAL_STARTUP_DATA
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  InitializeV8ForPDFium(g_exe_path_, std::string(), &natives_, &snapshot_,
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        &platform_);
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  InitializeV8ForPDFium(&platform_);
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif  // V8_USE_EXTERNAL_STARTUP_DATA
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // FPDF_ENABLE_V8
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannEmbedderTest::~EmbedderTest() {}
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid EmbedderTest::SetUp() {
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_LIBRARY_CONFIG config;
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  config.version = 2;
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  config.m_pUserFontPaths = nullptr;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  config.m_v8EmbedderSlot = 0;
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  config.m_pIsolate = external_isolate_;
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_InitLibraryWithConfig(&config);
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  UNSUPPORT_INFO* info = static_cast<UNSUPPORT_INFO*>(this);
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  memset(info, 0, sizeof(UNSUPPORT_INFO));
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  info->version = 1;
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  info->FSDK_UnSupport_Handler = UnsupportedHandlerTrampoline;
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FSDK_SetUnSpObjProcessHandler(info);
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid EmbedderTest::TearDown() {
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (document_) {
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FORM_DoDocumentAAction(form_handle_, FPDFDOC_AACTION_WC);
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // Note: The shut down order here is the reverse of the non-XFA branch
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // order. Need to work out if this is required, and if it is, the lifetimes
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    // of objects owned by |doc| that |form| reference.
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FPDF_CloseDocument(document_);
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FPDFDOC_ExitFormFillEnvironment(form_handle_);
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else   // PDF_ENABLE_XFA
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FPDFDOC_ExitFormFillEnvironment(form_handle_);
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FPDF_CloseDocument(document_);
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // PDF_ENABLE_XFA
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDFAvail_Destroy(avail_);
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_DestroyLibrary();
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_V8
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  v8::V8::ShutdownPlatform();
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  delete platform_;
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // PDF_ENABLE_V8
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  delete loader_;
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool EmbedderTest::CreateEmptyDocument() {
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  document_ = FPDF_CreateNewDocument();
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!document_)
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return false;
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetupFormFillEnvironment();
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return true;
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool EmbedderTest::OpenDocument(const std::string& filename,
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                bool must_linearize) {
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::string file_path;
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!PathService::GetTestFilePath(filename, &file_path))
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return false;
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  file_contents_ = GetFileContents(file_path.c_str(), &file_length_);
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!file_contents_)
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return false;
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  loader_ = new TestLoader(file_contents_.get(), file_length_);
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  file_access_.m_FileLen = static_cast<unsigned long>(file_length_);
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  file_access_.m_GetBlock = TestLoader::GetBlock;
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  file_access_.m_Param = loader_;
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  file_avail_.version = 1;
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  file_avail_.IsDataAvail = Is_Data_Avail;
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  hints_.version = 1;
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  hints_.AddSegment = Add_Segment;
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  avail_ = FPDFAvail_Create(&file_avail_, &file_access_);
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (FPDFAvail_IsLinearized(avail_) == PDF_LINEARIZED) {
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    document_ = FPDFAvail_GetDocument(avail_, nullptr);
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!document_) {
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return false;
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t nRet = PDF_DATA_NOTAVAIL;
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (nRet == PDF_DATA_NOTAVAIL) {
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nRet = FPDFAvail_IsDocAvail(avail_, &hints_);
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nRet == PDF_DATA_ERROR) {
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return false;
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nRet = FPDFAvail_IsFormAvail(avail_, &hints_);
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) {
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return false;
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int page_count = FPDF_GetPageCount(document_);
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 0; i < page_count; ++i) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nRet = PDF_DATA_NOTAVAIL;
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (nRet == PDF_DATA_NOTAVAIL) {
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nRet = FPDFAvail_IsPageAvail(avail_, i, &hints_);
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nRet == PDF_DATA_ERROR) {
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return false;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (must_linearize) {
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return false;
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    document_ = FPDF_LoadCustomDocument(&file_access_, nullptr);
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!document_) {
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return false;
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int docType = DOCTYPE_PDF;
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (FPDF_HasXFAField(document_, &docType)) {
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (docType != DOCTYPE_PDF)
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (void)FPDF_LoadXFA(document_);
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // PDF_ENABLE_XFA
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  (void)FPDF_GetDocPermissions(document_);
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetupFormFillEnvironment();
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return true;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid EmbedderTest::SetupFormFillEnvironment() {
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  IPDF_JSPLATFORM* platform = static_cast<IPDF_JSPLATFORM*>(this);
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  memset(platform, 0, sizeof(IPDF_JSPLATFORM));
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  platform->version = 2;
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  platform->app_alert = AlertTrampoline;
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_FORMFILLINFO* formfillinfo = static_cast<FPDF_FORMFILLINFO*>(this);
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  memset(formfillinfo, 0, sizeof(FPDF_FORMFILLINFO));
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  formfillinfo->version = 2;
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else   // PDF_ENABLE_XFA
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  formfillinfo->version = 1;
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // PDF_ENABLE_XFA
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  formfillinfo->FFI_SetTimer = SetTimerTrampoline;
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  formfillinfo->FFI_KillTimer = KillTimerTrampoline;
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  formfillinfo->FFI_GetPage = GetPageTrampoline;
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  formfillinfo->m_pJsPlatform = platform;
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  form_handle_ = FPDFDOC_InitFormFillEnvironment(document_, formfillinfo);
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_SetFormFieldHighlightColor(form_handle_, 0, 0xFFE4DD);
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_SetFormFieldHighlightAlpha(form_handle_, 100);
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid EmbedderTest::DoOpenActions() {
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FORM_DoDocumentJSAction(form_handle_);
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FORM_DoDocumentOpenAction(form_handle_);
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint EmbedderTest::GetFirstPageNum() {
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int first_page = FPDFAvail_GetFirstPageNum(document_);
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  (void)FPDFAvail_IsPageAvail(avail_, first_page, &hints_);
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return first_page;
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint EmbedderTest::GetPageCount() {
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int page_count = FPDF_GetPageCount(document_);
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  for (int i = 0; i < page_count; ++i) {
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    (void)FPDFAvail_IsPageAvail(avail_, i, &hints_);
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return page_count;
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFPDF_PAGE EmbedderTest::LoadPage(int page_number) {
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_PAGE page = FPDF_LoadPage(document_, page_number);
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (!page) {
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return nullptr;
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FORM_OnAfterLoadPage(page, form_handle_);
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_OPEN);
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return page;
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFPDF_PAGE EmbedderTest::LoadAndCachePage(int page_number) {
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_PAGE page = delegate_->GetPage(form_handle_, document_, page_number);
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!page) {
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_OPEN);
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return page;
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFPDF_BITMAP EmbedderTest::RenderPage(FPDF_PAGE page) {
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int width = static_cast<int>(FPDF_GetPageWidth(page));
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int height = static_cast<int>(FPDF_GetPageHeight(page));
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int alpha = FPDFPage_HasTransparency(page) ? 1 : 0;
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, alpha);
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF;
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDFBitmap_FillRect(bitmap, 0, 0, width, height, fill_color);
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_FFLDraw(form_handle_, bitmap, page, 0, 0, width, height, 0, 0);
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return bitmap;
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid EmbedderTest::UnloadPage(FPDF_PAGE page) {
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_CLOSE);
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FORM_OnBeforeClosePage(page, form_handle_);
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  FPDF_ClosePage(page);
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFPDF_PAGE EmbedderTest::Delegate::GetPage(FPDF_FORMHANDLE form_handle,
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          FPDF_DOCUMENT document,
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          int page_index) {
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_pageMap.find(page_index);
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it != m_pageMap.end()) {
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return it->second;
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDF_PAGE page = FPDF_LoadPage(document, page_index);
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!page) {
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pageMap[page_index] = page;
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FORM_OnAfterLoadPage(page, form_handle);
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return page;
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// static
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid EmbedderTest::UnsupportedHandlerTrampoline(UNSUPPORT_INFO* info,
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                int type) {
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  EmbedderTest* test = static_cast<EmbedderTest*>(info);
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  test->delegate_->UnsupportedHandler(type);
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// static
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint EmbedderTest::AlertTrampoline(IPDF_JSPLATFORM* platform,
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                  FPDF_WIDESTRING message,
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                  FPDF_WIDESTRING title,
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                  int type,
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                  int icon) {
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  EmbedderTest* test = static_cast<EmbedderTest*>(platform);
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return test->delegate_->Alert(message, title, type, icon);
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// static
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint EmbedderTest::SetTimerTrampoline(FPDF_FORMFILLINFO* info,
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     int msecs,
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     TimerCallback fn) {
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  EmbedderTest* test = static_cast<EmbedderTest*>(info);
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return test->delegate_->SetTimer(msecs, fn);
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// static
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid EmbedderTest::KillTimerTrampoline(FPDF_FORMFILLINFO* info, int id) {
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  EmbedderTest* test = static_cast<EmbedderTest*>(info);
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return test->delegate_->KillTimer(id);
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// static
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFPDF_PAGE EmbedderTest::GetPageTrampoline(FPDF_FORMFILLINFO* info,
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          FPDF_DOCUMENT document,
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          int page_index) {
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EmbedderTest* test = static_cast<EmbedderTest*>(info);
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return test->delegate_->GetPage(test->form_handle(), document, page_index);
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Can't use gtest-provided main since we need to stash the path to the
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// executable in order to find the external V8 binary data files.
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint main(int argc, char** argv) {
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  g_exe_path_ = argv[0];
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  testing::InitGoogleTest(&argc, argv);
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  testing::InitGoogleMock(&argc, argv);
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  return RUN_ALL_TESTS();
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
326