Home | History | Annotate | Download | only in testing
      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/fpdfview.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 #include "testing/test_support.h"
     18 
     19 #ifdef PDF_ENABLE_V8
     20 #include "v8/include/v8.h"
     21 #endif  // PDF_ENABLE_v8
     22 
     23 class TestLoader;
     24 
     25 // This class is used to load a PDF document, and then run programatic
     26 // API tests against it.
     27 class EmbedderTest : public ::testing::Test,
     28                      public UNSUPPORT_INFO,
     29                      public IPDF_JSPLATFORM,
     30                      public FPDF_FORMFILLINFO {
     31  public:
     32   class Delegate {
     33    public:
     34     virtual ~Delegate() {}
     35 
     36     // Equivalent to UNSUPPORT_INFO::FSDK_UnSupport_Handler().
     37     virtual void UnsupportedHandler(int type) {}
     38 
     39     // Equivalent to IPDF_JSPLATFORM::app_alert().
     40     virtual int Alert(FPDF_WIDESTRING message,
     41                       FPDF_WIDESTRING title,
     42                       int type,
     43                       int icon) {
     44       return 0;
     45     }
     46 
     47     // Equivalent to FPDF_FORMFILLINFO::FFI_SetTimer().
     48     virtual int SetTimer(int msecs, TimerCallback fn) { return 0; }
     49 
     50     // Equivalent to FPDF_FORMFILLINFO::FFI_KillTimer().
     51     virtual void KillTimer(int id) {}
     52 
     53     // Equivalent to FPDF_FORMFILLINFO::FFI_GetPage().
     54     virtual FPDF_PAGE GetPage(FPDF_FORMHANDLE form_handle,
     55                               FPDF_DOCUMENT document,
     56                               int page_index);
     57 
     58    private:
     59     std::map<int, FPDF_PAGE> m_pageMap;
     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.
     70   void SetExternalIsolate(void* isolate) {
     71     external_isolate_ = static_cast<v8::Isolate*>(isolate);
     72   }
     73 #endif  // PDF_ENABLE_V8
     74 
     75   void SetDelegate(Delegate* delegate) {
     76     delegate_ = delegate ? delegate : default_delegate_.get();
     77   }
     78 
     79   FPDF_DOCUMENT document() { return document_; }
     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   virtual 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   virtual bool OpenDocument(const std::string& filename,
     91                             bool must_linearize = false);
     92 
     93   // Perform JavaScript actions that are to run at document open time.
     94   virtual void DoOpenActions();
     95 
     96   // Determine the page numbers present in the document.
     97   virtual int GetFirstPageNum();
     98   virtual int GetPageCount();
     99 
    100   // Load a specific page of the open document.
    101   virtual FPDF_PAGE LoadPage(int page_number);
    102 
    103   // Load a specific page of the open document using delegate_->GetPage.
    104   // delegate_->GetPage also caches loaded page.
    105   virtual FPDF_PAGE LoadAndCachePage(int page_number);
    106 
    107   // Convert a loaded page into a bitmap.
    108   virtual FPDF_BITMAP RenderPage(FPDF_PAGE page);
    109 
    110   // Relese the resources obtained from LoadPage(). Further use of |page|
    111   // is prohibited after this call is made.
    112   virtual void UnloadPage(FPDF_PAGE page);
    113 
    114  protected:
    115   void SetupFormFillEnvironment();
    116 
    117   Delegate* delegate_;
    118   std::unique_ptr<Delegate> default_delegate_;
    119   FPDF_DOCUMENT document_;
    120   FPDF_FORMHANDLE form_handle_;
    121   FPDF_AVAIL avail_;
    122   FX_DOWNLOADHINTS hints_;
    123   FPDF_FILEACCESS file_access_;
    124   FX_FILEAVAIL file_avail_;
    125 #ifdef PDF_ENABLE_V8
    126   v8::Platform* platform_;
    127   v8::StartupData natives_;
    128   v8::StartupData snapshot_;
    129 #endif  // PDF_ENABLE_V8
    130   void* external_isolate_;
    131   TestLoader* loader_;
    132   size_t file_length_;
    133   std::unique_ptr<char, pdfium::FreeDeleter> file_contents_;
    134 
    135  private:
    136   static void UnsupportedHandlerTrampoline(UNSUPPORT_INFO*, int type);
    137   static int AlertTrampoline(IPDF_JSPLATFORM* plaform,
    138                              FPDF_WIDESTRING message,
    139                              FPDF_WIDESTRING title,
    140                              int type,
    141                              int icon);
    142   static int SetTimerTrampoline(FPDF_FORMFILLINFO* info,
    143                                 int msecs,
    144                                 TimerCallback fn);
    145   static void KillTimerTrampoline(FPDF_FORMFILLINFO* info, int id);
    146   static FPDF_PAGE GetPageTrampoline(FPDF_FORMFILLINFO* info,
    147                                      FPDF_DOCUMENT document,
    148                                      int page_index);
    149 };
    150 
    151 #endif  // TESTING_EMBEDDER_TEST_H_
    152