1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2015 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker #ifndef TESTING_EMBEDDER_TEST_H_ 6*3ac0a46fSAndroid Build Coastguard Worker #define TESTING_EMBEDDER_TEST_H_ 7*3ac0a46fSAndroid Build Coastguard Worker 8*3ac0a46fSAndroid Build Coastguard Worker #include <fstream> 9*3ac0a46fSAndroid Build Coastguard Worker #include <map> 10*3ac0a46fSAndroid Build Coastguard Worker #include <memory> 11*3ac0a46fSAndroid Build Coastguard Worker #include <string> 12*3ac0a46fSAndroid Build Coastguard Worker #include <vector> 13*3ac0a46fSAndroid Build Coastguard Worker 14*3ac0a46fSAndroid Build Coastguard Worker #include "build/build_config.h" 15*3ac0a46fSAndroid Build Coastguard Worker #include "public/cpp/fpdf_scopers.h" 16*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_dataavail.h" 17*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_ext.h" 18*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_formfill.h" 19*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_save.h" 20*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdfview.h" 21*3ac0a46fSAndroid Build Coastguard Worker #include "testing/fake_file_access.h" 22*3ac0a46fSAndroid Build Coastguard Worker #include "testing/free_deleter.h" 23*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h" 24*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/span.h" 25*3ac0a46fSAndroid Build Coastguard Worker 26*3ac0a46fSAndroid Build Coastguard Worker class TestLoader; 27*3ac0a46fSAndroid Build Coastguard Worker 28*3ac0a46fSAndroid Build Coastguard Worker // The loading time of the CFGAS_FontMgr is linear in the number of times it is 29*3ac0a46fSAndroid Build Coastguard Worker // loaded. So, if a test suite has a lot of tests that need a font manager they 30*3ac0a46fSAndroid Build Coastguard Worker // can end up executing very, very slowly. 31*3ac0a46fSAndroid Build Coastguard Worker 32*3ac0a46fSAndroid Build Coastguard Worker // This class is used to load a PDF document, and then run programatic 33*3ac0a46fSAndroid Build Coastguard Worker // API tests against it. 34*3ac0a46fSAndroid Build Coastguard Worker class EmbedderTest : public ::testing::Test, 35*3ac0a46fSAndroid Build Coastguard Worker public UNSUPPORT_INFO, 36*3ac0a46fSAndroid Build Coastguard Worker public IPDF_JSPLATFORM, 37*3ac0a46fSAndroid Build Coastguard Worker public FPDF_FORMFILLINFO, 38*3ac0a46fSAndroid Build Coastguard Worker public FPDF_FILEWRITE { 39*3ac0a46fSAndroid Build Coastguard Worker public: 40*3ac0a46fSAndroid Build Coastguard Worker enum class LinearizeOption { kDefaultLinearize, kMustLinearize }; 41*3ac0a46fSAndroid Build Coastguard Worker enum class JavaScriptOption { kDisableJavaScript, kEnableJavaScript }; 42*3ac0a46fSAndroid Build Coastguard Worker 43*3ac0a46fSAndroid Build Coastguard Worker class Delegate { 44*3ac0a46fSAndroid Build Coastguard Worker public: 45*3ac0a46fSAndroid Build Coastguard Worker virtual ~Delegate() = default; 46*3ac0a46fSAndroid Build Coastguard Worker 47*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to UNSUPPORT_INFO::FSDK_UnSupport_Handler(). UnsupportedHandler(int type)48*3ac0a46fSAndroid Build Coastguard Worker virtual void UnsupportedHandler(int type) {} 49*3ac0a46fSAndroid Build Coastguard Worker 50*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to IPDF_JSPLATFORM::app_alert(). Alert(FPDF_WIDESTRING message,FPDF_WIDESTRING title,int type,int icon)51*3ac0a46fSAndroid Build Coastguard Worker virtual int Alert(FPDF_WIDESTRING message, 52*3ac0a46fSAndroid Build Coastguard Worker FPDF_WIDESTRING title, 53*3ac0a46fSAndroid Build Coastguard Worker int type, 54*3ac0a46fSAndroid Build Coastguard Worker int icon) { 55*3ac0a46fSAndroid Build Coastguard Worker return 0; 56*3ac0a46fSAndroid Build Coastguard Worker } 57*3ac0a46fSAndroid Build Coastguard Worker 58*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_SetTimer(). SetTimer(int msecs,TimerCallback fn)59*3ac0a46fSAndroid Build Coastguard Worker virtual int SetTimer(int msecs, TimerCallback fn) { return 0; } 60*3ac0a46fSAndroid Build Coastguard Worker 61*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_KillTimer(). KillTimer(int id)62*3ac0a46fSAndroid Build Coastguard Worker virtual void KillTimer(int id) {} 63*3ac0a46fSAndroid Build Coastguard Worker 64*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_GetPage(). 65*3ac0a46fSAndroid Build Coastguard Worker virtual FPDF_PAGE GetPage(FPDF_FORMFILLINFO* info, 66*3ac0a46fSAndroid Build Coastguard Worker FPDF_DOCUMENT document, 67*3ac0a46fSAndroid Build Coastguard Worker int page_index); 68*3ac0a46fSAndroid Build Coastguard Worker 69*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_DoURIAction(). DoURIAction(FPDF_BYTESTRING uri)70*3ac0a46fSAndroid Build Coastguard Worker virtual void DoURIAction(FPDF_BYTESTRING uri) {} 71*3ac0a46fSAndroid Build Coastguard Worker 72*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_DoGoToAction(). DoGoToAction(FPDF_FORMFILLINFO * info,int page_index,int zoom_mode,float * pos_arry,int array_size)73*3ac0a46fSAndroid Build Coastguard Worker virtual void DoGoToAction(FPDF_FORMFILLINFO* info, 74*3ac0a46fSAndroid Build Coastguard Worker int page_index, 75*3ac0a46fSAndroid Build Coastguard Worker int zoom_mode, 76*3ac0a46fSAndroid Build Coastguard Worker float* pos_arry, 77*3ac0a46fSAndroid Build Coastguard Worker int array_size) {} 78*3ac0a46fSAndroid Build Coastguard Worker 79*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_OnFocusChange(). OnFocusChange(FPDF_FORMFILLINFO * info,FPDF_ANNOTATION annot,int page_index)80*3ac0a46fSAndroid Build Coastguard Worker virtual void OnFocusChange(FPDF_FORMFILLINFO* info, 81*3ac0a46fSAndroid Build Coastguard Worker FPDF_ANNOTATION annot, 82*3ac0a46fSAndroid Build Coastguard Worker int page_index) {} 83*3ac0a46fSAndroid Build Coastguard Worker 84*3ac0a46fSAndroid Build Coastguard Worker // Equivalent to FPDF_FORMFILLINFO::FFI_DoURIActionWithKeyboardModifier(). DoURIActionWithKeyboardModifier(FPDF_FORMFILLINFO * info,FPDF_BYTESTRING uri,int modifiers)85*3ac0a46fSAndroid Build Coastguard Worker virtual void DoURIActionWithKeyboardModifier(FPDF_FORMFILLINFO* info, 86*3ac0a46fSAndroid Build Coastguard Worker FPDF_BYTESTRING uri, 87*3ac0a46fSAndroid Build Coastguard Worker int modifiers) {} 88*3ac0a46fSAndroid Build Coastguard Worker }; 89*3ac0a46fSAndroid Build Coastguard Worker 90*3ac0a46fSAndroid Build Coastguard Worker EmbedderTest(); 91*3ac0a46fSAndroid Build Coastguard Worker virtual ~EmbedderTest(); 92*3ac0a46fSAndroid Build Coastguard Worker 93*3ac0a46fSAndroid Build Coastguard Worker void SetUp() override; 94*3ac0a46fSAndroid Build Coastguard Worker void TearDown() override; 95*3ac0a46fSAndroid Build Coastguard Worker GetDelegate()96*3ac0a46fSAndroid Build Coastguard Worker Delegate* GetDelegate() { return delegate_; } SetDelegate(Delegate * delegate)97*3ac0a46fSAndroid Build Coastguard Worker void SetDelegate(Delegate* delegate) { 98*3ac0a46fSAndroid Build Coastguard Worker delegate_ = delegate ? delegate : default_delegate_.get(); 99*3ac0a46fSAndroid Build Coastguard Worker } 100*3ac0a46fSAndroid Build Coastguard Worker SetFormFillInfoVersion(int form_fill_info_version)101*3ac0a46fSAndroid Build Coastguard Worker void SetFormFillInfoVersion(int form_fill_info_version) { 102*3ac0a46fSAndroid Build Coastguard Worker form_fill_info_version_ = form_fill_info_version; 103*3ac0a46fSAndroid Build Coastguard Worker } 104*3ac0a46fSAndroid Build Coastguard Worker 105*3ac0a46fSAndroid Build Coastguard Worker void SetDocumentFromAvail(); document()106*3ac0a46fSAndroid Build Coastguard Worker FPDF_DOCUMENT document() const { return document_.get(); } saved_document()107*3ac0a46fSAndroid Build Coastguard Worker FPDF_DOCUMENT saved_document() const { return saved_document_.get(); } form_handle()108*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE form_handle() const { return form_handle_.get(); } saved_form_handle()109*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE saved_form_handle() const { return saved_form_handle_.get(); } 110*3ac0a46fSAndroid Build Coastguard Worker 111*3ac0a46fSAndroid Build Coastguard Worker // Wrapper for FPDFAvail_Create() to set `avail_`. 112*3ac0a46fSAndroid Build Coastguard Worker void CreateAvail(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file); avail()113*3ac0a46fSAndroid Build Coastguard Worker FPDF_AVAIL avail() { return avail_.get(); } 114*3ac0a46fSAndroid Build Coastguard Worker 115*3ac0a46fSAndroid Build Coastguard Worker // Create an empty document, and its form fill environment. 116*3ac0a46fSAndroid Build Coastguard Worker void CreateEmptyDocument(); 117*3ac0a46fSAndroid Build Coastguard Worker 118*3ac0a46fSAndroid Build Coastguard Worker // Create an empty document without a form fill environment. 119*3ac0a46fSAndroid Build Coastguard Worker void CreateEmptyDocumentWithoutFormFillEnvironment(); 120*3ac0a46fSAndroid Build Coastguard Worker 121*3ac0a46fSAndroid Build Coastguard Worker // Open the document specified by |filename|, and create its form fill 122*3ac0a46fSAndroid Build Coastguard Worker // environment, or return false on failure. The |filename| is relative to 123*3ac0a46fSAndroid Build Coastguard Worker // the test data directory where we store all the test files. |password| can 124*3ac0a46fSAndroid Build Coastguard Worker // be nullptr if the file is not password protected. If |javascript_opts| 125*3ac0a46fSAndroid Build Coastguard Worker // is kDisableJavascript, then the document will be given stubs in place 126*3ac0a46fSAndroid Build Coastguard Worker // of the real JS engine. 127*3ac0a46fSAndroid Build Coastguard Worker virtual bool OpenDocumentWithOptions(const std::string& filename, 128*3ac0a46fSAndroid Build Coastguard Worker const char* password, 129*3ac0a46fSAndroid Build Coastguard Worker LinearizeOption linearize_option, 130*3ac0a46fSAndroid Build Coastguard Worker JavaScriptOption javascript_option); 131*3ac0a46fSAndroid Build Coastguard Worker 132*3ac0a46fSAndroid Build Coastguard Worker // Variants provided for convenience. 133*3ac0a46fSAndroid Build Coastguard Worker bool OpenDocument(const std::string& filename); 134*3ac0a46fSAndroid Build Coastguard Worker bool OpenDocumentLinearized(const std::string& filename); 135*3ac0a46fSAndroid Build Coastguard Worker bool OpenDocumentWithPassword(const std::string& filename, 136*3ac0a46fSAndroid Build Coastguard Worker const char* password); 137*3ac0a46fSAndroid Build Coastguard Worker bool OpenDocumentWithoutJavaScript(const std::string& filename); 138*3ac0a46fSAndroid Build Coastguard Worker 139*3ac0a46fSAndroid Build Coastguard Worker // Close the document from a previous OpenDocument() call. This happens 140*3ac0a46fSAndroid Build Coastguard Worker // automatically at tear-down, and is usually not explicitly required, 141*3ac0a46fSAndroid Build Coastguard Worker // unless testing multiple documents or duplicate destruction. 142*3ac0a46fSAndroid Build Coastguard Worker void CloseDocument(); 143*3ac0a46fSAndroid Build Coastguard Worker 144*3ac0a46fSAndroid Build Coastguard Worker // Perform JavaScript actions that are to run at document open time. 145*3ac0a46fSAndroid Build Coastguard Worker void DoOpenActions(); 146*3ac0a46fSAndroid Build Coastguard Worker 147*3ac0a46fSAndroid Build Coastguard Worker // Determine the page numbers present in the document. 148*3ac0a46fSAndroid Build Coastguard Worker int GetFirstPageNum(); 149*3ac0a46fSAndroid Build Coastguard Worker int GetPageCount(); 150*3ac0a46fSAndroid Build Coastguard Worker 151*3ac0a46fSAndroid Build Coastguard Worker // Load a specific page of the open document with a given non-negative 152*3ac0a46fSAndroid Build Coastguard Worker // |page_number|. On success, fire form events for the page and return a page 153*3ac0a46fSAndroid Build Coastguard Worker // handle. On failure, return nullptr. 154*3ac0a46fSAndroid Build Coastguard Worker // The caller does not own the returned page handle, but must call 155*3ac0a46fSAndroid Build Coastguard Worker // UnloadPage() on it when done. 156*3ac0a46fSAndroid Build Coastguard Worker // The caller cannot call this for a |page_number| if it already obtained and 157*3ac0a46fSAndroid Build Coastguard Worker // holds the page handle for that page. 158*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE LoadPage(int page_number); 159*3ac0a46fSAndroid Build Coastguard Worker 160*3ac0a46fSAndroid Build Coastguard Worker // Same as LoadPage(), but does not fire form events. 161*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE LoadPageNoEvents(int page_number); 162*3ac0a46fSAndroid Build Coastguard Worker 163*3ac0a46fSAndroid Build Coastguard Worker // Fire form unload events and release the resources for a |page| obtained 164*3ac0a46fSAndroid Build Coastguard Worker // from LoadPage(). Further use of |page| is prohibited after calling this. 165*3ac0a46fSAndroid Build Coastguard Worker void UnloadPage(FPDF_PAGE page); 166*3ac0a46fSAndroid Build Coastguard Worker 167*3ac0a46fSAndroid Build Coastguard Worker // Same as UnloadPage(), but does not fire form events. 168*3ac0a46fSAndroid Build Coastguard Worker void UnloadPageNoEvents(FPDF_PAGE page); 169*3ac0a46fSAndroid Build Coastguard Worker 170*3ac0a46fSAndroid Build Coastguard Worker // Apply standard highlighting color/alpha to forms. 171*3ac0a46fSAndroid Build Coastguard Worker void SetInitialFormFieldHighlight(FPDF_FORMHANDLE form); 172*3ac0a46fSAndroid Build Coastguard Worker 173*3ac0a46fSAndroid Build Coastguard Worker // RenderLoadedPageWithFlags() with no flags. 174*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap RenderLoadedPage(FPDF_PAGE page); 175*3ac0a46fSAndroid Build Coastguard Worker 176*3ac0a46fSAndroid Build Coastguard Worker // Convert |page| loaded via LoadPage() into a bitmap with the specified page 177*3ac0a46fSAndroid Build Coastguard Worker // rendering |flags|. 178*3ac0a46fSAndroid Build Coastguard Worker // 179*3ac0a46fSAndroid Build Coastguard Worker // See public/fpdfview.h for a list of page rendering flags. 180*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap RenderLoadedPageWithFlags(FPDF_PAGE page, int flags); 181*3ac0a46fSAndroid Build Coastguard Worker 182*3ac0a46fSAndroid Build Coastguard Worker // RenderSavedPageWithFlags() with no flags. 183*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap RenderSavedPage(FPDF_PAGE page); 184*3ac0a46fSAndroid Build Coastguard Worker 185*3ac0a46fSAndroid Build Coastguard Worker // Convert |page| loaded via LoadSavedPage() into a bitmap with the specified 186*3ac0a46fSAndroid Build Coastguard Worker // page rendering |flags|. 187*3ac0a46fSAndroid Build Coastguard Worker // 188*3ac0a46fSAndroid Build Coastguard Worker // See public/fpdfview.h for a list of page rendering flags. 189*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFBitmap RenderSavedPageWithFlags(FPDF_PAGE page, int flags); 190*3ac0a46fSAndroid Build Coastguard Worker 191*3ac0a46fSAndroid Build Coastguard Worker // Convert |page| into a bitmap with the specified page rendering |flags|. 192*3ac0a46fSAndroid Build Coastguard Worker // The form handle associated with |page| should be passed in via |handle|. 193*3ac0a46fSAndroid Build Coastguard Worker // If |handle| is nullptr, then forms on the page will not be rendered. 194*3ac0a46fSAndroid Build Coastguard Worker // 195*3ac0a46fSAndroid Build Coastguard Worker // See public/fpdfview.h for a list of page rendering flags. 196*3ac0a46fSAndroid Build Coastguard Worker // If none of the above Render methods are appropriate, then use this one. 197*3ac0a46fSAndroid Build Coastguard Worker static ScopedFPDFBitmap RenderPageWithFlags(FPDF_PAGE page, 198*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE handle, 199*3ac0a46fSAndroid Build Coastguard Worker int flags); 200*3ac0a46fSAndroid Build Coastguard Worker 201*3ac0a46fSAndroid Build Coastguard Worker // Simplified form of RenderPageWithFlags() with no handle and no flags. 202*3ac0a46fSAndroid Build Coastguard Worker static ScopedFPDFBitmap RenderPage(FPDF_PAGE page); 203*3ac0a46fSAndroid Build Coastguard Worker 204*3ac0a46fSAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 205*3ac0a46fSAndroid Build Coastguard Worker // Convert |page| into EMF with the specified page rendering |flags|. 206*3ac0a46fSAndroid Build Coastguard Worker static std::vector<uint8_t> RenderPageWithFlagsToEmf(FPDF_PAGE page, 207*3ac0a46fSAndroid Build Coastguard Worker int flags); 208*3ac0a46fSAndroid Build Coastguard Worker 209*3ac0a46fSAndroid Build Coastguard Worker // Get the PostScript data from |emf_data|. 210*3ac0a46fSAndroid Build Coastguard Worker static std::string GetPostScriptFromEmf(pdfium::span<const uint8_t> emf_data); 211*3ac0a46fSAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) 212*3ac0a46fSAndroid Build Coastguard Worker 213*3ac0a46fSAndroid Build Coastguard Worker // Return bytes for each of the FPDFBitmap_* format types. 214*3ac0a46fSAndroid Build Coastguard Worker static int BytesPerPixelForFormat(int format); 215*3ac0a46fSAndroid Build Coastguard Worker 216*3ac0a46fSAndroid Build Coastguard Worker protected: 217*3ac0a46fSAndroid Build Coastguard Worker using PageNumberToHandleMap = std::map<int, FPDF_PAGE>; 218*3ac0a46fSAndroid Build Coastguard Worker 219*3ac0a46fSAndroid Build Coastguard Worker bool OpenDocumentHelper(const char* password, 220*3ac0a46fSAndroid Build Coastguard Worker LinearizeOption linearize_option, 221*3ac0a46fSAndroid Build Coastguard Worker JavaScriptOption javascript_option, 222*3ac0a46fSAndroid Build Coastguard Worker FakeFileAccess* network_simulator, 223*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFDocument* document, 224*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFAvail* avail, 225*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFFormHandle* form_handle); 226*3ac0a46fSAndroid Build Coastguard Worker 227*3ac0a46fSAndroid Build Coastguard Worker FPDF_FORMHANDLE SetupFormFillEnvironment(FPDF_DOCUMENT doc, 228*3ac0a46fSAndroid Build Coastguard Worker JavaScriptOption javascript_option); 229*3ac0a46fSAndroid Build Coastguard Worker 230*3ac0a46fSAndroid Build Coastguard Worker // Return the hash of only the pixels in |bitmap|. i.e. Excluding the gap, if 231*3ac0a46fSAndroid Build Coastguard Worker // any, at the end of a row where the stride is larger than width * bpp. 232*3ac0a46fSAndroid Build Coastguard Worker static std::string HashBitmap(FPDF_BITMAP bitmap); 233*3ac0a46fSAndroid Build Coastguard Worker 234*3ac0a46fSAndroid Build Coastguard Worker // For debugging purposes. 235*3ac0a46fSAndroid Build Coastguard Worker // Write |bitmap| as a PNG to |filename|. 236*3ac0a46fSAndroid Build Coastguard Worker static void WriteBitmapToPng(FPDF_BITMAP bitmap, const std::string& filename); 237*3ac0a46fSAndroid Build Coastguard Worker 238*3ac0a46fSAndroid Build Coastguard Worker // Check |bitmap| to make sure it has the right dimensions and content. 239*3ac0a46fSAndroid Build Coastguard Worker static void CompareBitmap(FPDF_BITMAP bitmap, 240*3ac0a46fSAndroid Build Coastguard Worker int expected_width, 241*3ac0a46fSAndroid Build Coastguard Worker int expected_height, 242*3ac0a46fSAndroid Build Coastguard Worker const char* expected_md5sum); 243*3ac0a46fSAndroid Build Coastguard Worker ClearString()244*3ac0a46fSAndroid Build Coastguard Worker void ClearString() { data_string_.clear(); } GetString()245*3ac0a46fSAndroid Build Coastguard Worker const std::string& GetString() const { return data_string_; } 246*3ac0a46fSAndroid Build Coastguard Worker 247*3ac0a46fSAndroid Build Coastguard Worker static int GetBlockFromString(void* param, 248*3ac0a46fSAndroid Build Coastguard Worker unsigned long pos, 249*3ac0a46fSAndroid Build Coastguard Worker unsigned char* buf, 250*3ac0a46fSAndroid Build Coastguard Worker unsigned long size); 251*3ac0a46fSAndroid Build Coastguard Worker 252*3ac0a46fSAndroid Build Coastguard Worker // See comments in the respective non-Saved versions of these methods. 253*3ac0a46fSAndroid Build Coastguard Worker FPDF_DOCUMENT OpenSavedDocument(); 254*3ac0a46fSAndroid Build Coastguard Worker FPDF_DOCUMENT OpenSavedDocumentWithPassword(const char* password); 255*3ac0a46fSAndroid Build Coastguard Worker void CloseSavedDocument(); 256*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE LoadSavedPage(int page_number); 257*3ac0a46fSAndroid Build Coastguard Worker void CloseSavedPage(FPDF_PAGE page); 258*3ac0a46fSAndroid Build Coastguard Worker 259*3ac0a46fSAndroid Build Coastguard Worker void VerifySavedRendering(FPDF_PAGE page, 260*3ac0a46fSAndroid Build Coastguard Worker int width, 261*3ac0a46fSAndroid Build Coastguard Worker int height, 262*3ac0a46fSAndroid Build Coastguard Worker const char* md5); 263*3ac0a46fSAndroid Build Coastguard Worker void VerifySavedDocument(int width, int height, const char* md5); 264*3ac0a46fSAndroid Build Coastguard Worker 265*3ac0a46fSAndroid Build Coastguard Worker void SetWholeFileAvailable(); 266*3ac0a46fSAndroid Build Coastguard Worker 267*3ac0a46fSAndroid Build Coastguard Worker #ifndef NDEBUG 268*3ac0a46fSAndroid Build Coastguard Worker // For debugging purposes. 269*3ac0a46fSAndroid Build Coastguard Worker // While open, write any data that gets passed to WriteBlockCallback() to 270*3ac0a46fSAndroid Build Coastguard Worker // |filename|. This is typically used to capture data from FPDF_SaveAsCopy() 271*3ac0a46fSAndroid Build Coastguard Worker // calls. 272*3ac0a46fSAndroid Build Coastguard Worker void OpenPDFFileForWrite(const std::string& filename); 273*3ac0a46fSAndroid Build Coastguard Worker void ClosePDFFileForWrite(); 274*3ac0a46fSAndroid Build Coastguard Worker #endif 275*3ac0a46fSAndroid Build Coastguard Worker 276*3ac0a46fSAndroid Build Coastguard Worker private: 277*3ac0a46fSAndroid Build Coastguard Worker static int WriteBlockCallback(FPDF_FILEWRITE* pFileWrite, 278*3ac0a46fSAndroid Build Coastguard Worker const void* data, 279*3ac0a46fSAndroid Build Coastguard Worker unsigned long size); 280*3ac0a46fSAndroid Build Coastguard Worker 281*3ac0a46fSAndroid Build Coastguard Worker // Helper method for the methods below. 282*3ac0a46fSAndroid Build Coastguard Worker static int GetPageNumberForPage(const PageNumberToHandleMap& page_map, 283*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE page); 284*3ac0a46fSAndroid Build Coastguard Worker // Find |page| inside |page_map_| and return the associated page number, or -1 285*3ac0a46fSAndroid Build Coastguard Worker // if |page| cannot be found. 286*3ac0a46fSAndroid Build Coastguard Worker int GetPageNumberForLoadedPage(FPDF_PAGE page) const; 287*3ac0a46fSAndroid Build Coastguard Worker 288*3ac0a46fSAndroid Build Coastguard Worker // Same as GetPageNumberForLoadedPage(), but with |saved_page_map_|. 289*3ac0a46fSAndroid Build Coastguard Worker int GetPageNumberForSavedPage(FPDF_PAGE page) const; 290*3ac0a46fSAndroid Build Coastguard Worker 291*3ac0a46fSAndroid Build Coastguard Worker void UnloadPageCommon(FPDF_PAGE page, bool do_events); 292*3ac0a46fSAndroid Build Coastguard Worker FPDF_PAGE LoadPageCommon(int page_number, bool do_events); 293*3ac0a46fSAndroid Build Coastguard Worker 294*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<Delegate> default_delegate_; 295*3ac0a46fSAndroid Build Coastguard Worker Delegate* delegate_; 296*3ac0a46fSAndroid Build Coastguard Worker 297*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA 298*3ac0a46fSAndroid Build Coastguard Worker int form_fill_info_version_ = 2; 299*3ac0a46fSAndroid Build Coastguard Worker #else // PDF_ENABLE_XFA 300*3ac0a46fSAndroid Build Coastguard Worker int form_fill_info_version_ = 1; 301*3ac0a46fSAndroid Build Coastguard Worker #endif // PDF_ENABLE_XFA 302*3ac0a46fSAndroid Build Coastguard Worker 303*3ac0a46fSAndroid Build Coastguard Worker size_t file_length_ = 0; 304*3ac0a46fSAndroid Build Coastguard Worker // must outlive `loader_`. 305*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<char, pdfium::FreeDeleter> file_contents_; 306*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<TestLoader> loader_; 307*3ac0a46fSAndroid Build Coastguard Worker FPDF_FILEACCESS file_access_; // must outlive `avail_`. 308*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<FakeFileAccess> fake_file_access_; // must outlive `avail_`. 309*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFAvail avail_; 310*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFDocument document_; 311*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFFormHandle form_handle_; 312*3ac0a46fSAndroid Build Coastguard Worker PageNumberToHandleMap page_map_; 313*3ac0a46fSAndroid Build Coastguard Worker 314*3ac0a46fSAndroid Build Coastguard Worker FPDF_FILEACCESS saved_file_access_; // must outlive `saved_avail_`. 315*3ac0a46fSAndroid Build Coastguard Worker // must outlive `saved_avail_`. 316*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<FakeFileAccess> saved_fake_file_access_; 317*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFAvail saved_avail_; 318*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFDocument saved_document_; 319*3ac0a46fSAndroid Build Coastguard Worker ScopedFPDFFormHandle saved_form_handle_; 320*3ac0a46fSAndroid Build Coastguard Worker PageNumberToHandleMap saved_page_map_; 321*3ac0a46fSAndroid Build Coastguard Worker 322*3ac0a46fSAndroid Build Coastguard Worker std::string data_string_; 323*3ac0a46fSAndroid Build Coastguard Worker std::string saved_document_file_data_; 324*3ac0a46fSAndroid Build Coastguard Worker std::ofstream filestream_; 325*3ac0a46fSAndroid Build Coastguard Worker }; 326*3ac0a46fSAndroid Build Coastguard Worker 327*3ac0a46fSAndroid Build Coastguard Worker #endif // TESTING_EMBEDDER_TEST_H_ 328