OLD | NEW |
1 // Copyright (c) 2015 PDFium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "embedder_test.h" | 5 #include "embedder_test.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <stdio.h> | |
9 #include <stdlib.h> | |
10 #include <string.h> | |
11 | 8 |
12 #include <list> | 9 #include <list> |
13 #include <string> | 10 #include <string> |
14 #include <utility> | 11 #include <utility> |
15 #include <vector> | 12 #include <vector> |
16 | 13 |
17 #include "../public/fpdf_text.h" | 14 #include "../public/fpdf_text.h" |
18 #include "../public/fpdfview.h" | 15 #include "../public/fpdfview.h" |
| 16 #include "test_support.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
20 | 18 |
21 #ifdef PDF_ENABLE_V8 | 19 #ifdef PDF_ENABLE_V8 |
22 #include "v8/include/libplatform/libplatform.h" | 20 #include "v8/include/libplatform/libplatform.h" |
23 #include "v8/include/v8.h" | 21 #include "v8/include/v8.h" |
24 #endif // PDF_ENABLE_V8 | 22 #endif // PDF_ENABLE_V8 |
25 | 23 |
26 #ifdef _WIN32 | |
27 #define snprintf _snprintf | |
28 #define PATH_SEPARATOR '\\' | |
29 #else | |
30 #define PATH_SEPARATOR '/' | |
31 #endif | |
32 | |
33 namespace { | 24 namespace { |
34 | |
35 const char* g_exe_path_ = nullptr; | 25 const char* g_exe_path_ = nullptr; |
36 | |
37 // Reads the entire contents of a file into a newly malloc'd buffer. | |
38 static char* GetFileContents(const char* filename, size_t* retlen) { | |
39 FILE* file = fopen(filename, "rb"); | |
40 if (!file) { | |
41 fprintf(stderr, "Failed to open: %s\n", filename); | |
42 return nullptr; | |
43 } | |
44 (void)fseek(file, 0, SEEK_END); | |
45 size_t file_length = ftell(file); | |
46 if (!file_length) { | |
47 return nullptr; | |
48 } | |
49 (void)fseek(file, 0, SEEK_SET); | |
50 char* buffer = (char*)malloc(file_length); | |
51 if (!buffer) { | |
52 return nullptr; | |
53 } | |
54 size_t bytes_read = fread(buffer, 1, file_length, file); | |
55 (void)fclose(file); | |
56 if (bytes_read != file_length) { | |
57 fprintf(stderr, "Failed to read: %s\n", filename); | |
58 free(buffer); | |
59 return nullptr; | |
60 } | |
61 *retlen = bytes_read; | |
62 return buffer; | |
63 } | |
64 | |
65 #ifdef PDF_ENABLE_V8 | |
66 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | |
67 // Returns the full path for an external V8 data file based on either | |
68 // the currect exectuable path or an explicit override. | |
69 static std::string GetFullPathForSnapshotFile(const std::string& exe_path, | |
70 const std::string& filename) { | |
71 std::string result; | |
72 if (!exe_path.empty()) { | |
73 size_t last_separator = exe_path.rfind(PATH_SEPARATOR); | |
74 if (last_separator != std::string::npos) { | |
75 result = exe_path.substr(0, last_separator + 1); | |
76 } | |
77 } | |
78 result += filename; | |
79 return result; | |
80 } | |
81 | |
82 // Reads an extenal V8 data file from the |options|-indicated location, | |
83 // returing true on success and false on error. | |
84 static bool GetExternalData(const std::string& exe_path, | |
85 const std::string& filename, | |
86 v8::StartupData* result_data) { | |
87 std::string full_path = GetFullPathForSnapshotFile(exe_path, filename); | |
88 size_t data_length = 0; | |
89 char* data_buffer = GetFileContents(full_path.c_str(), &data_length); | |
90 if (!data_buffer) { | |
91 return false; | |
92 } | |
93 result_data->data = const_cast<const char*>(data_buffer); | |
94 result_data->raw_size = data_length; | |
95 return true; | |
96 } | |
97 #endif // V8_USE_EXTERNAL_STARTUP_DATA | |
98 #endif // PDF_ENABLE_V8 | |
99 } // namespace | 26 } // namespace |
100 | 27 |
101 class TestLoader { | |
102 public: | |
103 TestLoader(const char* pBuf, size_t len); | |
104 | |
105 const char* m_pBuf; | |
106 size_t m_Len; | |
107 }; | |
108 | |
109 TestLoader::TestLoader(const char* pBuf, size_t len) | |
110 : m_pBuf(pBuf), m_Len(len) {} | |
111 | |
112 int Get_Block(void* param, | |
113 unsigned long pos, | |
114 unsigned char* pBuf, | |
115 unsigned long size) { | |
116 TestLoader* pLoader = (TestLoader*)param; | |
117 if (pos + size < pos || pos + size > pLoader->m_Len) | |
118 return 0; | |
119 memcpy(pBuf, pLoader->m_pBuf + pos, size); | |
120 return 1; | |
121 } | |
122 | |
123 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { | 28 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { |
124 return true; | 29 return true; |
125 } | 30 } |
126 | 31 |
127 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} | 32 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} |
128 | 33 |
129 EmbedderTest::EmbedderTest() | 34 EmbedderTest::EmbedderTest() |
130 : default_delegate_(new EmbedderTest::Delegate()), | 35 : default_delegate_(new EmbedderTest::Delegate()), |
131 document_(nullptr), | 36 document_(nullptr), |
132 form_handle_(nullptr), | 37 form_handle_(nullptr), |
133 avail_(nullptr), | 38 avail_(nullptr), |
134 external_isolate_(nullptr), | 39 external_isolate_(nullptr), |
135 loader_(nullptr), | 40 loader_(nullptr), |
136 file_length_(0), | 41 file_length_(0), |
137 file_contents_(nullptr) { | 42 file_contents_(nullptr) { |
138 memset(&hints_, 0, sizeof(hints_)); | 43 memset(&hints_, 0, sizeof(hints_)); |
139 memset(&file_access_, 0, sizeof(file_access_)); | 44 memset(&file_access_, 0, sizeof(file_access_)); |
140 memset(&file_avail_, 0, sizeof(file_avail_)); | 45 memset(&file_avail_, 0, sizeof(file_avail_)); |
141 delegate_ = default_delegate_.get(); | 46 delegate_ = default_delegate_.get(); |
142 } | 47 } |
143 | 48 |
144 EmbedderTest::~EmbedderTest() { | 49 EmbedderTest::~EmbedderTest() { |
145 } | 50 } |
146 | 51 |
147 void EmbedderTest::SetUp() { | 52 void EmbedderTest::SetUp() { |
148 #ifdef PDF_ENABLE_V8 | 53 #ifdef PDF_ENABLE_V8 |
149 v8::V8::InitializeICU(); | |
150 | |
151 platform_ = v8::platform::CreateDefaultPlatform(); | |
152 v8::V8::InitializePlatform(platform_); | |
153 v8::V8::Initialize(); | |
154 | |
155 // By enabling predictable mode, V8 won't post any background tasks. | |
156 const char predictable_flag[] = "--predictable"; | |
157 v8::V8::SetFlagsFromString(predictable_flag, | |
158 static_cast<int>(strlen(predictable_flag))); | |
159 | |
160 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | 54 #ifdef V8_USE_EXTERNAL_STARTUP_DATA |
161 ASSERT_TRUE(GetExternalData(g_exe_path_, "natives_blob.bin", &natives_)); | 55 InitializeV8ForPDFium(g_exe_path_, std::string(), &natives_, &snapshot_, |
162 ASSERT_TRUE(GetExternalData(g_exe_path_, "snapshot_blob.bin", &snapshot_)); | 56 &platform_); |
163 v8::V8::SetNativesDataBlob(&natives_); | 57 #else |
164 v8::V8::SetSnapshotDataBlob(&snapshot_); | 58 InitializeV8ForPDFium(&platform_); |
165 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 59 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
166 #endif // FPDF_ENABLE_V8 | 60 #endif // FPDF_ENABLE_V8 |
167 | 61 |
168 FPDF_LIBRARY_CONFIG config; | 62 FPDF_LIBRARY_CONFIG config; |
169 config.version = 2; | 63 config.version = 2; |
170 config.m_pUserFontPaths = nullptr; | 64 config.m_pUserFontPaths = nullptr; |
171 config.m_v8EmbedderSlot = 0; | 65 config.m_v8EmbedderSlot = 0; |
172 config.m_pIsolate = external_isolate_; | 66 config.m_pIsolate = external_isolate_; |
173 FPDF_InitLibraryWithConfig(&config); | 67 FPDF_InitLibraryWithConfig(&config); |
174 | 68 |
(...skipping 23 matching lines...) Expand all Loading... |
198 } | 92 } |
199 | 93 |
200 bool EmbedderTest::OpenDocument(const std::string& filename) { | 94 bool EmbedderTest::OpenDocument(const std::string& filename) { |
201 file_contents_ = GetFileContents(filename.c_str(), &file_length_); | 95 file_contents_ = GetFileContents(filename.c_str(), &file_length_); |
202 if (!file_contents_) { | 96 if (!file_contents_) { |
203 return false; | 97 return false; |
204 } | 98 } |
205 | 99 |
206 loader_ = new TestLoader(file_contents_, file_length_); | 100 loader_ = new TestLoader(file_contents_, file_length_); |
207 file_access_.m_FileLen = static_cast<unsigned long>(file_length_); | 101 file_access_.m_FileLen = static_cast<unsigned long>(file_length_); |
208 file_access_.m_GetBlock = Get_Block; | 102 file_access_.m_GetBlock = TestLoader::GetBlock; |
209 file_access_.m_Param = loader_; | 103 file_access_.m_Param = loader_; |
210 | 104 |
211 file_avail_.version = 1; | 105 file_avail_.version = 1; |
212 file_avail_.IsDataAvail = Is_Data_Avail; | 106 file_avail_.IsDataAvail = Is_Data_Avail; |
213 | 107 |
214 hints_.version = 1; | 108 hints_.version = 1; |
215 hints_.AddSegment = Add_Segment; | 109 hints_.AddSegment = Add_Segment; |
216 | 110 |
217 avail_ = FPDFAvail_Create(&file_avail_, &file_access_); | 111 avail_ = FPDFAvail_Create(&file_avail_, &file_access_); |
218 (void)FPDFAvail_IsDocAvail(avail_, &hints_); | 112 (void)FPDFAvail_IsDocAvail(avail_, &hints_); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 } | 250 } |
357 | 251 |
358 // Can't use gtest-provided main since we need to stash the path to the | 252 // Can't use gtest-provided main since we need to stash the path to the |
359 // executable in order to find the external V8 binary data files. | 253 // executable in order to find the external V8 binary data files. |
360 int main(int argc, char** argv) { | 254 int main(int argc, char** argv) { |
361 g_exe_path_ = argv[0]; | 255 g_exe_path_ = argv[0]; |
362 testing::InitGoogleTest(&argc, argv); | 256 testing::InitGoogleTest(&argc, argv); |
363 testing::InitGoogleMock(&argc, argv); | 257 testing::InitGoogleMock(&argc, argv); |
364 return RUN_ALL_TESTS(); | 258 return RUN_ALL_TESTS(); |
365 } | 259 } |
OLD | NEW |