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