Merge to XFA: Fix stack exhaustion in CPDF_DataAvail::HaveResourceAncestor()
[pdfium.git] / testing / embedder_test.cpp
index 539f48c..46eaf8c 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace {
 
+const char* g_exe_path_ = nullptr;
+
 // Reads the entire contents of a file into a newly malloc'd buffer.
 static char* GetFileContents(const char* filename, size_t* retlen) {
   FILE* file = fopen(filename, "rb");
@@ -60,18 +62,13 @@ static char* GetFileContents(const char* filename, size_t* retlen) {
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
 // Returns the full path for an external V8 data file based on either
 // the currect exectuable path or an explicit override.
-static std::string GetFullPathForSnapshotFile(const Options& options,
+static std::string GetFullPathForSnapshotFile(const std::string& exe_path,
                                               const std::string& filename) {
   std::string result;
-  if (!options.bin_directory.empty()) {
-    result = options.bin_directory;
-    if (*options.bin_directory.rbegin() != PATH_SEPARATOR) {
-      result += PATH_SEPARATOR;
-    }
-  } else if (!options.exe_path.empty()) {
-    size_t last_separator = options.exe_path.rfind(PATH_SEPARATOR);
+  if (!exe_path.empty()) {
+    size_t last_separator = exe_path.rfind(PATH_SEPARATOR);
     if (last_separator != std::string::npos)  {
-      result = options.exe_path.substr(0, last_separator + 1);
+      result = exe_path.substr(0, last_separator + 1);
     }
   }
   result += filename;
@@ -80,10 +77,10 @@ static std::string GetFullPathForSnapshotFile(const Options& options,
 
 // Reads an extenal V8 data file from the |options|-indicated location,
 // returing true on success and false on error.
-static bool GetExternalData(const Options& options,
-                            const std::string& bin_filename,
+static bool GetExternalData(const std::string& exe_path,
+                            const std::string& filename,
                             v8::StartupData* result_data) {
-  std::string full_path = GetFullPathForSnapshotFile(options, bin_filename);
+  std::string full_path = GetFullPathForSnapshotFile(exe_path, filename);
   size_t data_length = 0;
   char* data_buffer = GetFileContents(full_path.c_str(), &data_length);
   if (!data_buffer) {
@@ -177,10 +174,10 @@ void EmbedderTest::SetUp() {
     v8::V8::InitializeICU();
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
-    ASSERT_TRUE(GetExternalData(options, "natives_blob.bin", &natives_));
-    ASSERT_TRUE(GetExternalData(options, "snapshot_blob.bin", &snapshot_));
-    v8::V8::SetNativesDataBlob(&natives);
-    v8::V8::SetSnapshotDataBlob(&snapshot);
+    ASSERT_TRUE(GetExternalData(g_exe_path_, "natives_blob.bin", &natives_));
+    ASSERT_TRUE(GetExternalData(g_exe_path_, "snapshot_blob.bin", &snapshot_));
+    v8::V8::SetNativesDataBlob(&natives_);
+    v8::V8::SetSnapshotDataBlob(&snapshot_);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
     FPDF_InitLibrary();
@@ -193,7 +190,13 @@ void EmbedderTest::SetUp() {
   }
 
 void EmbedderTest::TearDown() {
-  FPDF_CloseDocument(document_);
+  if (form_handle_) {
+    FORM_DoDocumentAAction(form_handle_, FPDFDOC_AACTION_WC);
+    FPDFDOC_ExitFormFillEnvironment(form_handle_);
+  }
+  if (document_) {
+    FPDF_CloseDocument(document_);
+  }
   FPDFAvail_Destroy(avail_);
   FPDF_DestroyLibrary();
   if (loader_) {
@@ -235,10 +238,7 @@ bool EmbedderTest::OpenDocument(const std::string& filename) {
   (void) FPDF_LoadXFA(document_);
   (void) FPDF_GetDocPermissions(document_);
   (void) FPDFAvail_IsFormAvail(avail_, &hints_);
-  return true;
-}
 
-FPDF_FORMHANDLE EmbedderTest::SetFormFillEnvironment() {
   IPDF_JSPLATFORM platform_callbacks;
   memset(&platform_callbacks, '\0', sizeof(platform_callbacks));
   platform_callbacks.version = 1;
@@ -249,21 +249,16 @@ FPDF_FORMHANDLE EmbedderTest::SetFormFillEnvironment() {
   form_callbacks.version = 1;
   form_callbacks.m_pJsPlatform = &platform_callbacks;
 
-  FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(document_,
-                                                         &form_callbacks);
-  FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD);
-  FPDF_SetFormFieldHighlightAlpha(form, 100);
-  return form;
-}
+  form_handle_ = FPDFDOC_InitFormFillEnvironment(document_, &form_callbacks);
+  FPDF_SetFormFieldHighlightColor(form_handle_, 0, 0xFFE4DD);
+  FPDF_SetFormFieldHighlightAlpha(form_handle_, 100);
 
-void EmbedderTest::ClearFormFillEnvironment(FPDF_FORMHANDLE form) {
-  FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);
-  FPDFDOC_ExitFormFillEnvironment(form);
+  return true;
 }
 
-void EmbedderTest::DoOpenActions(FPDF_FORMHANDLE form) {
-  FORM_DoDocumentJSAction(form);
-  FORM_DoDocumentOpenAction(form);
+void EmbedderTest::DoOpenActions() {
+  FORM_DoDocumentJSAction(form_handle_);
+  FORM_DoDocumentOpenAction(form_handle_);
 }
 
 int EmbedderTest::GetFirstPageNum() {
@@ -280,30 +275,36 @@ int EmbedderTest::GetPageCount() {
   return page_count;
 }
 
-FPDF_PAGE EmbedderTest::LoadPage(int page_number,
-                                 FPDF_FORMHANDLE form) {
+FPDF_PAGE EmbedderTest::LoadPage(int page_number) {
   FPDF_PAGE page = FPDF_LoadPage(document_, page_number);
   if (!page) {
     return nullptr;
   }
-  FORM_OnAfterLoadPage(page, form);
-  FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN);
+  FORM_OnAfterLoadPage(page, form_handle_);
+  FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_OPEN);
   return page;
 }
 
-FPDF_BITMAP EmbedderTest::RenderPage(FPDF_PAGE page,
-                                     FPDF_FORMHANDLE form) {
+FPDF_BITMAP EmbedderTest::RenderPage(FPDF_PAGE page) {
   int width = static_cast<int>(FPDF_GetPageWidth(page));
   int height = static_cast<int>(FPDF_GetPageHeight(page));
   FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);
   FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF);
   FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);
-  FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0);
+  FPDF_FFLDraw(form_handle_, bitmap, page, 0, 0, width, height, 0, 0);
   return bitmap;
 }
 
-void EmbedderTest::UnloadPage(FPDF_PAGE page, FPDF_FORMHANDLE form) {
-  FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE);
-  FORM_OnBeforeClosePage(page, form);
+void EmbedderTest::UnloadPage(FPDF_PAGE page) {
+  FORM_DoPageAAction(page, form_handle_, FPDFPAGE_AACTION_CLOSE);
+  FORM_OnBeforeClosePage(page, form_handle_);
   FPDF_ClosePage(page);
 }
+
+// Can't use gtest-provided main since we need to stash the path to the
+// executable in order to find the external V8 binary data files.
+int main(int argc, char** argv) {
+  g_exe_path_ = argv[0];
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}