1 // Copyright 2015 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 #ifndef TESTING_EMBEDDER_TEST_H_ 6 #define TESTING_EMBEDDER_TEST_H_ 7 8 #include <map> 9 #include <memory> 10 #include <string> 11 12 #include "public/fpdf_dataavail.h" 13 #include "public/fpdf_ext.h" 14 #include "public/fpdf_formfill.h" 15 #include "public/fpdf_save.h" 16 #include "public/fpdfview.h" 17 #include "testing/fake_file_access.h" 18 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/test_support.h" 20 21 #ifdef PDF_ENABLE_V8 22 #include "v8/include/v8.h" 23 #endif // PDF_ENABLE_v8 24 25 class TestLoader; 26 27 // This class is used to load a PDF document, and then run programatic 28 // API tests against it. 29 class EmbedderTest : public ::testing::Test, 30 public UNSUPPORT_INFO, 31 public IPDF_JSPLATFORM, 32 public FPDF_FORMFILLINFO, 33 public FPDF_FILEWRITE { 34 public: 35 class Delegate { 36 public: ~Delegate()37 virtual ~Delegate() {} 38 39 // Equivalent to UNSUPPORT_INFO::FSDK_UnSupport_Handler(). UnsupportedHandler(int type)40 virtual void UnsupportedHandler(int type) {} 41 42 // Equivalent to IPDF_JSPLATFORM::app_alert(). Alert(FPDF_WIDESTRING message,FPDF_WIDESTRING title,int type,int icon)43 virtual int Alert(FPDF_WIDESTRING message, 44 FPDF_WIDESTRING title, 45 int type, 46 int icon) { 47 return 0; 48 } 49 50 // Equivalent to FPDF_FORMFILLINFO::FFI_SetTimer(). SetTimer(int msecs,TimerCallback fn)51 virtual int SetTimer(int msecs, TimerCallback fn) { return 0; } 52 53 // Equivalent to FPDF_FORMFILLINFO::FFI_KillTimer(). KillTimer(int id)54 virtual void KillTimer(int id) {} 55 56 // Equivalent to FPDF_FORMFILLINFO::FFI_GetPage(). 57 virtual FPDF_PAGE GetPage(FPDF_FORMFILLINFO* info, 58 FPDF_DOCUMENT document, 59 int page_index); 60 }; 61 62 EmbedderTest(); 63 virtual ~EmbedderTest(); 64 65 void SetUp() override; 66 void TearDown() override; 67 68 #ifdef PDF_ENABLE_V8 69 // Call before SetUp to pass shared isolate, otherwise PDFium creates one. SetExternalIsolate(void * isolate)70 void SetExternalIsolate(void* isolate) { 71 external_isolate_ = static_cast<v8::Isolate*>(isolate); 72 } 73 #endif // PDF_ENABLE_V8 74 SetDelegate(Delegate * delegate)75 void SetDelegate(Delegate* delegate) { 76 delegate_ = delegate ? delegate : default_delegate_.get(); 77 } 78 document()79 FPDF_DOCUMENT document() { return document_; } form_handle()80 FPDF_FORMHANDLE form_handle() { return form_handle_; } 81 82 // Create an empty document, and its form fill environment. Returns true 83 // on success or false on failure. 84 bool CreateEmptyDocument(); 85 86 // Open the document specified by |filename|, and create its form fill 87 // environment, or return false on failure. 88 // The filename is relative to the test data directory where we store all the 89 // test files. 90 // |password| can be nullptr if there is none. 91 virtual bool OpenDocumentWithOptions(const std::string& filename, 92 const char* password, 93 bool must_linearize); 94 95 // Variants provided for convenience. 96 bool OpenDocument(const std::string& filename); 97 bool OpenDocumentLinearized(const std::string& filename); 98 bool OpenDocumentWithPassword(const std::string& filename, 99 const char* password); 100 101 // Perform JavaScript actions that are to run at document open time. 102 void DoOpenActions(); 103 104 // Determine the page numbers present in the document. 105 int GetFirstPageNum(); 106 int GetPageCount(); 107 108 // Load a specific page of the open document. 109 FPDF_PAGE LoadPage(int page_number); 110 111 // Convert a loaded page into a bitmap. 112 FPDF_BITMAP RenderPage(FPDF_PAGE page); 113 114 // Convert a loaded page into a bitmap with page rendering flags specified. 115 // See public/fpdfview.h for a list of page rendering flags. 116 FPDF_BITMAP RenderPageWithFlags(FPDF_PAGE page, 117 FPDF_FORMHANDLE handle, 118 int flags); 119 120 // Relese the resources obtained from LoadPage(). Further use of |page| 121 // is prohibited after this call is made. 122 void UnloadPage(FPDF_PAGE page); 123 124 protected: 125 bool OpenDocumentHelper(const char* password, 126 bool must_linearize, 127 FakeFileAccess* network_simulator, 128 FPDF_DOCUMENT* document, 129 FPDF_AVAIL* avail, 130 FPDF_FORMHANDLE* form_handle); 131 132 FPDF_FORMHANDLE SetupFormFillEnvironment(FPDF_DOCUMENT doc); 133 134 // Return the hash of |bitmap|. 135 static std::string HashBitmap(FPDF_BITMAP bitmap); 136 137 #ifndef NDEBUG 138 // For debugging purposes. 139 // Write |bitmap| to a png file. 140 static void WriteBitmapToPng(FPDF_BITMAP bitmap, const std::string& filename); 141 #endif 142 143 // Check |bitmap| to make sure it has the right dimensions and content. 144 static void CompareBitmap(FPDF_BITMAP bitmap, 145 int expected_width, 146 int expected_height, 147 const char* expected_md5sum); 148 ClearString()149 void ClearString() { m_String.clear(); } GetString()150 const std::string& GetString() const { return m_String; } 151 152 static int GetBlockFromString(void* param, 153 unsigned long pos, 154 unsigned char* buf, 155 unsigned long size); 156 157 FPDF_DOCUMENT OpenSavedDocument(const char* password = nullptr); 158 void CloseSavedDocument(); 159 FPDF_PAGE LoadSavedPage(int page_number); 160 FPDF_BITMAP RenderSavedPage(FPDF_PAGE page); 161 void CloseSavedPage(FPDF_PAGE page); 162 void VerifySavedRendering(FPDF_PAGE page, 163 int width, 164 int height, 165 const char* md5); 166 void VerifySavedDocument(int width, int height, const char* md5); 167 168 void SetWholeFileAvailable(); 169 170 Delegate* delegate_; 171 std::unique_ptr<Delegate> default_delegate_; 172 FPDF_DOCUMENT document_; 173 FPDF_FORMHANDLE form_handle_; 174 FPDF_AVAIL avail_; 175 FPDF_FILEACCESS file_access_; // must outlive avail_. 176 void* external_isolate_; 177 TestLoader* loader_; 178 size_t file_length_; 179 std::unique_ptr<char, pdfium::FreeDeleter> file_contents_; 180 std::map<int, FPDF_PAGE> page_map_; 181 std::map<FPDF_PAGE, int> page_reverse_map_; 182 FPDF_DOCUMENT m_SavedDocument; 183 FPDF_FORMHANDLE m_SavedForm; 184 FPDF_AVAIL m_SavedAvail; 185 FPDF_FILEACCESS saved_file_access_; // must outlive m_SavedAvail. 186 std::unique_ptr<FakeFileAccess> fake_file_access_; // must outlive avail_. 187 std::unique_ptr<FakeFileAccess> 188 saved_fake_file_access_; // must outlive m_SavedAvail. 189 190 private: 191 static void UnsupportedHandlerTrampoline(UNSUPPORT_INFO*, int type); 192 static int AlertTrampoline(IPDF_JSPLATFORM* plaform, 193 FPDF_WIDESTRING message, 194 FPDF_WIDESTRING title, 195 int type, 196 int icon); 197 static int SetTimerTrampoline(FPDF_FORMFILLINFO* info, 198 int msecs, 199 TimerCallback fn); 200 static void KillTimerTrampoline(FPDF_FORMFILLINFO* info, int id); 201 static FPDF_PAGE GetPageTrampoline(FPDF_FORMFILLINFO* info, 202 FPDF_DOCUMENT document, 203 int page_index); 204 static int WriteBlockCallback(FPDF_FILEWRITE* pFileWrite, 205 const void* data, 206 unsigned long size); 207 208 std::string m_String; 209 }; 210 211 #endif // TESTING_EMBEDDER_TEST_H_ 212