#include <utility>
#include <vector>
-#include "../fpdfsdk/include/fpdf_ext.h"
-#include "../fpdfsdk/include/fpdftext.h"
-#include "../fpdfsdk/include/fpdfview.h"
-#include "../core/include/fxcrt/fx_system.h"
+#include "../public/fpdf_text.h"
+#include "../public/fpdfview.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "v8/include/libplatform/libplatform.h"
#include "v8/include/v8.h"
#ifdef _WIN32
FILE* file = fopen(filename, "rb");
if (!file) {
fprintf(stderr, "Failed to open: %s\n", filename);
- return NULL;
+ return nullptr;
}
(void) fseek(file, 0, SEEK_END);
size_t file_length = ftell(file);
if (!file_length) {
- return NULL;
+ return nullptr;
}
(void) fseek(file, 0, SEEK_SET);
char* buffer = (char*) malloc(file_length);
if (!buffer) {
- return NULL;
+ return nullptr;
}
size_t bytes_read = fread(buffer, 1, file_length, file);
(void) fclose(file);
if (bytes_read != file_length) {
fprintf(stderr, "Failed to read: %s\n", filename);
free(buffer);
- return NULL;
+ return nullptr;
}
*retlen = bytes_read;
return buffer;
} // namespace
-int Form_Alert(IPDF_JSPLATFORM*, FPDF_WIDESTRING, FPDF_WIDESTRING, int, int) {
- printf("Form_Alert called.\n");
- return 0;
-}
-
-void Unsupported_Handler(UNSUPPORT_INFO*, int type) {
- std::string feature = "Unknown";
- switch (type) {
- case FPDF_UNSP_DOC_XFAFORM:
- feature = "XFA";
- break;
- case FPDF_UNSP_DOC_PORTABLECOLLECTION:
- feature = "Portfolios_Packages";
- break;
- case FPDF_UNSP_DOC_ATTACHMENT:
- case FPDF_UNSP_ANNOT_ATTACHMENT:
- feature = "Attachment";
- break;
- case FPDF_UNSP_DOC_SECURITY:
- feature = "Rights_Management";
- break;
- case FPDF_UNSP_DOC_SHAREDREVIEW:
- feature = "Shared_Review";
- break;
- case FPDF_UNSP_DOC_SHAREDFORM_ACROBAT:
- case FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM:
- case FPDF_UNSP_DOC_SHAREDFORM_EMAIL:
- feature = "Shared_Form";
- break;
- case FPDF_UNSP_ANNOT_3DANNOT:
- feature = "3D";
- break;
- case FPDF_UNSP_ANNOT_MOVIE:
- feature = "Movie";
- break;
- case FPDF_UNSP_ANNOT_SOUND:
- feature = "Sound";
- break;
- case FPDF_UNSP_ANNOT_SCREEN_MEDIA:
- case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA:
- feature = "Screen";
- break;
- case FPDF_UNSP_ANNOT_SIG:
- feature = "Digital_Signature";
- break;
- }
- printf("Unsupported feature: %s.\n", feature.c_str());
-}
-
class TestLoader {
public:
TestLoader(const char* pBuf, size_t len);
return 1;
}
-bool Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
+FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
return true;
}
void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {
}
+EmbedderTest::EmbedderTest() :
+ document_(nullptr),
+ form_handle_(nullptr),
+ avail_(nullptr),
+ loader_(nullptr),
+ file_length_(0),
+ file_contents_(nullptr) {
+ memset(&hints_, 0, sizeof(hints_));
+ memset(&file_access_, 0, sizeof(file_access_));
+ memset(&file_avail_, 0, sizeof(file_avail_));
+ default_delegate_ = new EmbedderTest::Delegate();
+ delegate_ = default_delegate_;
+}
+
+EmbedderTest::~EmbedderTest() {
+ delete default_delegate_;
+}
+
void EmbedderTest::SetUp() {
v8::V8::InitializeICU();
+ platform_ = v8::platform::CreateDefaultPlatform();
+ v8::V8::InitializePlatform(platform_);
+ v8::V8::Initialize();
+
+ // By enabling predictable mode, V8 won't post any background tasks.
+ const char predictable_flag[] = "--predictable";
+ v8::V8::SetFlagsFromString(predictable_flag,
+ static_cast<int>(strlen(predictable_flag)));
+
#ifdef V8_USE_EXTERNAL_STARTUP_DATA
ASSERT_TRUE(GetExternalData(g_exe_path_, "natives_blob.bin", &natives_));
ASSERT_TRUE(GetExternalData(g_exe_path_, "snapshot_blob.bin", &snapshot_));
FPDF_InitLibrary();
- UNSUPPORT_INFO unsuppored_info;
- memset(&unsuppored_info, '\0', sizeof(unsuppored_info));
- unsuppored_info.version = 1;
- unsuppored_info.FSDK_UnSupport_Handler = Unsupported_Handler;
- FSDK_SetUnSpObjProcessHandler(&unsuppored_info);
+ UNSUPPORT_INFO* info = static_cast<UNSUPPORT_INFO*>(this);
+ memset(info, 0, sizeof(UNSUPPORT_INFO));
+ info->version = 1;
+ info->FSDK_UnSupport_Handler = UnsupportedHandlerTrampoline;
+ FSDK_SetUnSpObjProcessHandler(info);
}
void EmbedderTest::TearDown() {
- FPDF_CloseDocument(document_);
+ if (document_) {
+ FORM_DoDocumentAAction(form_handle_, FPDFDOC_AACTION_WC);
+ FPDF_CloseDocument(document_);
+ FPDFDOC_ExitFormFillEnvironment(form_handle_);
+ }
FPDFAvail_Destroy(avail_);
FPDF_DestroyLibrary();
- if (loader_) {
- delete loader_;
- }
- if (file_contents_) {
- free(file_contents_);
- }
+ v8::V8::ShutdownPlatform();
+ delete platform_;
+ delete loader_;
+ free(file_contents_);
}
bool EmbedderTest::OpenDocument(const std::string& filename) {
(void) FPDFAvail_IsDocAvail(avail_, &hints_);
if (!FPDFAvail_IsLinearized(avail_)) {
- document_ = FPDF_LoadCustomDocument(&file_access_, NULL);
+ document_ = FPDF_LoadCustomDocument(&file_access_, nullptr);
} else {
- document_ = FPDFAvail_GetDocument(avail_, NULL);
+ document_ = FPDFAvail_GetDocument(avail_, nullptr);
}
(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;
- platform_callbacks.app_alert = Form_Alert;
-
- FPDF_FORMFILLINFO form_callbacks;
- memset(&form_callbacks, '\0', sizeof(form_callbacks));
- 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;
-}
+ IPDF_JSPLATFORM* platform = static_cast<IPDF_JSPLATFORM*>(this);
+ memset(platform, 0, sizeof(IPDF_JSPLATFORM));
+ platform->version = 1;
+ platform->app_alert = AlertTrampoline;
+
+ FPDF_FORMFILLINFO* formfillinfo = static_cast<FPDF_FORMFILLINFO*>(this);
+ memset(formfillinfo, 0, sizeof(FPDF_FORMFILLINFO));
+ formfillinfo->version = 1;
+ formfillinfo->FFI_SetTimer = SetTimerTrampoline;
+ formfillinfo->FFI_KillTimer = KillTimerTrampoline;
+ formfillinfo->m_pJsPlatform = platform;
-void EmbedderTest::ClearFormFillEnvironment(FPDF_FORMHANDLE form) {
- FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);
- FPDFDOC_ExitFormFillEnvironment(form);
+ form_handle_ = FPDFDOC_InitFormFillEnvironment(document_, formfillinfo);
+ FPDF_SetFormFieldHighlightColor(form_handle_, 0, 0xFFE4DD);
+ FPDF_SetFormFieldHighlightAlpha(form_handle_, 100);
+
+ 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() {
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);
}
+// static
+void EmbedderTest::UnsupportedHandlerTrampoline(UNSUPPORT_INFO* info,
+ int type) {
+ EmbedderTest* test = static_cast<EmbedderTest*>(info);
+ test->delegate_->UnsupportedHandler(type);
+}
+
+// static
+int EmbedderTest::AlertTrampoline(IPDF_JSPLATFORM* platform,
+ FPDF_WIDESTRING message,
+ FPDF_WIDESTRING title,
+ int type,
+ int icon) {
+ EmbedderTest* test = static_cast<EmbedderTest*>(platform);
+ return test->delegate_->Alert(message, title, type, icon);
+}
+
+// static
+int EmbedderTest::SetTimerTrampoline(FPDF_FORMFILLINFO* info,
+ int msecs, TimerCallback fn) {
+ EmbedderTest* test = static_cast<EmbedderTest*>(info);
+ return test->delegate_->SetTimer(msecs, fn);
+}
+
+// static
+void EmbedderTest::KillTimerTrampoline(FPDF_FORMFILLINFO* info, int id) {
+ EmbedderTest* test = static_cast<EmbedderTest*>(info);
+ return test->delegate_->KillTimer(id);
+}
+
// 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);
+ testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}