f6842d23c3233701f51d94c4887303ebf0b7709f
[pdfium.git] / testing / embedder_test.h
1 // Copyright (c) 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 <string>
10
11 #include "../public/fpdf_dataavail.h"
12 #include "../public/fpdf_ext.h"
13 #include "../public/fpdf_formfill.h"
14 #include "../public/fpdfview.h"
15 #include "../third_party/base/nonstd_unique_ptr.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "v8/include/v8.h"
18
19 class TestLoader;
20
21 // This class is used to load a PDF document, and then run programatic
22 // API tests against it.
23 class EmbedderTest : public ::testing::Test,
24                      public UNSUPPORT_INFO,
25                      public IPDF_JSPLATFORM,
26                      public FPDF_FORMFILLINFO {
27  public:
28   class Delegate {
29    public:
30     virtual ~Delegate() {}
31
32     // Equivalent to UNSUPPORT_INFO::FSDK_UnSupport_Handler().
33     virtual void UnsupportedHandler(int type) {}
34
35     // Equivalent to IPDF_JSPLATFORM::app_alert().
36     virtual int Alert(FPDF_WIDESTRING message,
37                       FPDF_WIDESTRING title,
38                       int type,
39                       int icon) {
40       return 0;
41     }
42
43     // Equivalent to FPDF_FORMFILLINFO::FFI_SetTimer().
44     virtual int SetTimer(int msecs, TimerCallback fn) { return 0; }
45
46     // Equivalent to FPDF_FORMFILLINFO::FFI_KillTimer().
47     virtual void KillTimer(int id) {}
48
49     // Equivalent to FPDF_FORMFILLINFO::FFI_GetPage().
50     virtual FPDF_PAGE GetPage(FPDF_FORMHANDLE form_handle,
51                               FPDF_DOCUMENT document,
52                               int page_index);
53
54    private:
55     std::map<int, FPDF_PAGE> m_pageMap;
56   };
57
58   EmbedderTest();
59   virtual ~EmbedderTest();
60
61   void SetUp() override;
62   void TearDown() override;
63
64   // Call before SetUp to pass shared isolate, otherwise PDFium creates one.
65   void SetExternalIsolate(v8::Isolate* isolate) { external_isolate_ = isolate; }
66
67   void SetDelegate(Delegate* delegate) {
68     delegate_ = delegate ? delegate : default_delegate_.get();
69   }
70
71   FPDF_DOCUMENT document() { return document_; }
72   FPDF_FORMHANDLE form_handle() { return form_handle_; }
73
74   // Open the document specified by |filename|, and create its form fill
75   // environment, or return false on failure.
76   virtual bool OpenDocument(const std::string& filename);
77
78   // Perform JavaScript actions that are to run at document open time.
79   virtual void DoOpenActions();
80
81   // Determine the page numbers present in the document.
82   virtual int GetFirstPageNum();
83   virtual int GetPageCount();
84
85   // Load a specific page of the open document.
86   virtual FPDF_PAGE LoadPage(int page_number);
87
88   // Load a specific page of the open document using delegate_->GetPage.
89   // delegate_->GetPage also caches loaded page.
90   virtual FPDF_PAGE LoadAndCachePage(int page_number);
91
92   // Convert a loaded page into a bitmap.
93   virtual FPDF_BITMAP RenderPage(FPDF_PAGE page);
94
95   // Relese the resources obtained from LoadPage(). Further use of |page|
96   // is prohibited after this call is made.
97   virtual void UnloadPage(FPDF_PAGE page);
98
99  protected:
100   Delegate* delegate_;
101   nonstd::unique_ptr<Delegate> default_delegate_;
102   FPDF_DOCUMENT document_;
103   FPDF_FORMHANDLE form_handle_;
104   FPDF_AVAIL avail_;
105   FX_DOWNLOADHINTS hints_;
106   FPDF_FILEACCESS file_access_;
107   FX_FILEAVAIL file_avail_;
108   v8::Platform* platform_;
109   v8::StartupData natives_;
110   v8::StartupData snapshot_;
111   v8::Isolate* external_isolate_;
112   TestLoader* loader_;
113   size_t file_length_;
114   char* file_contents_;
115
116  private:
117   static void UnsupportedHandlerTrampoline(UNSUPPORT_INFO*, int type);
118   static int AlertTrampoline(IPDF_JSPLATFORM* plaform,
119                              FPDF_WIDESTRING message,
120                              FPDF_WIDESTRING title,
121                              int type,
122                              int icon);
123   static int SetTimerTrampoline(FPDF_FORMFILLINFO* info,
124                                 int msecs,
125                                 TimerCallback fn);
126   static void KillTimerTrampoline(FPDF_FORMFILLINFO* info, int id);
127   static FPDF_PAGE GetPageTrampoline(FPDF_FORMFILLINFO* info,
128                                      FPDF_DOCUMENT document,
129                                      int page_index);
130 };
131
132 #endif  // TESTING_EMBEDDER_TEST_H_