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