From 42a8adad1c53c060bb93457902243a53270cec36 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 25 Feb 2015 16:00:06 -0800 Subject: Implement a delegate for EmbedderTests. This is the first step in allowing an embedder test to someday gMock its callbacks, so that it can check that they fired as expected. gMock wants a class, not a C-style function-based API, and EmbedderTest is made to bridge between the two. The EmbedderTest class itself is modified to inherit from the C JS API classes themselves, to make finding the delegate easier. For example, a future embedder test might send a keystroke to a page, which would then trigger JS, which would then trigger an Alert(). Mocking the Alert() callback would allow the test to check that the alert happened as expected. R=thestig@chromium.org Review URL: https://codereview.chromium.org/960663002 --- testing/embedder_test.cpp | 159 ++++++++++++++++++++++++++++------------------ testing/embedder_test.h | 44 +++++++++---- 2 files changed, 129 insertions(+), 74 deletions(-) diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp index 6cbfbf5191..fc6b4dbc80 100644 --- a/testing/embedder_test.cpp +++ b/testing/embedder_test.cpp @@ -14,7 +14,6 @@ #include #include -#include "../fpdfsdk/include/fpdf_ext.h" #include "../fpdfsdk/include/fpdftext.h" #include "../fpdfsdk/include/fpdfview.h" #include "../core/include/fxcrt/fx_system.h" @@ -94,54 +93,57 @@ static bool GetExternalData(const std::string& exe_path, } // namespace -int Form_Alert(IPDF_JSPLATFORM*, FPDF_WIDESTRING, FPDF_WIDESTRING, int, int) { - printf("Form_Alert called.\n"); - return 0; -} +class EmbedderTestDefaultDelegate : public EmbedderTest::Delegate { + public: + int Alert(FPDF_WIDESTRING, FPDF_WIDESTRING, int, int) override { + 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; + void UnsupportedHandler(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()); } - printf("Unsupported feature: %s.\n", feature.c_str()); -} +}; class TestLoader { public: @@ -170,6 +172,24 @@ bool Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { 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 EmbedderTestDefaultDelegate(); + delegate_ = default_delegate_; +} + +EmbedderTest::~EmbedderTest() { + delete default_delegate_; +} + void EmbedderTest::SetUp() { v8::V8::InitializeICU(); @@ -182,11 +202,11 @@ void EmbedderTest::SetUp() { 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(this); + memset(info, 0, sizeof(UNSUPPORT_INFO)); + info->version = 1; + info->FSDK_UnSupport_Handler = UnsupportedHandlerTrampoline; + FSDK_SetUnSpObjProcessHandler(info); } void EmbedderTest::TearDown() { @@ -236,17 +256,17 @@ bool EmbedderTest::OpenDocument(const std::string& filename) { (void) FPDF_GetDocPermissions(document_); (void) FPDFAvail_IsFormAvail(avail_, &hints_); - IPDF_JSPLATFORM platform_callbacks; - memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); - platform_callbacks.version = 1; - platform_callbacks.app_alert = Form_Alert; + IPDF_JSPLATFORM* platform = static_cast(this); + memset(platform, 0, sizeof(IPDF_JSPLATFORM)); + platform->version = 1; + platform->app_alert = AlertTrampoline; - FPDF_FORMFILLINFO form_callbacks; - memset(&form_callbacks, '\0', sizeof(form_callbacks)); - form_callbacks.version = 1; - form_callbacks.m_pJsPlatform = &platform_callbacks; + FPDF_FORMFILLINFO* formfillinfo = static_cast(this); + memset(formfillinfo, 0, sizeof(FPDF_FORMFILLINFO)); + formfillinfo->version = 1; + formfillinfo->m_pJsPlatform = platform; - form_handle_ = FPDFDOC_InitFormFillEnvironment(document_, &form_callbacks); + form_handle_ = FPDFDOC_InitFormFillEnvironment(document_, formfillinfo); FPDF_SetFormFieldHighlightColor(form_handle_, 0, 0xFFE4DD); FPDF_SetFormFieldHighlightAlpha(form_handle_, 100); @@ -298,6 +318,23 @@ void EmbedderTest::UnloadPage(FPDF_PAGE page) { FPDF_ClosePage(page); } +// static +void EmbedderTest::UnsupportedHandlerTrampoline(UNSUPPORT_INFO* info, + int type) { + EmbedderTest* test = static_cast(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(platform); + return test->delegate_->Alert(message, title, type, icon); +} + // 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) { diff --git a/testing/embedder_test.h b/testing/embedder_test.h index 072dce3bc3..ea93131749 100644 --- a/testing/embedder_test.h +++ b/testing/embedder_test.h @@ -9,6 +9,7 @@ #include "../core/include/fxcrt/fx_system.h" #include "../fpdfsdk/include/fpdf_dataavail.h" +#include "../fpdfsdk/include/fpdf_ext.h" #include "../fpdfsdk/include/fpdfformfill.h" #include "../fpdfsdk/include/fpdfview.h" #include "testing/gtest/include/gtest/gtest.h" @@ -18,25 +19,35 @@ class TestLoader; // This class is used to load a PDF document, and then run programatic // API tests against it. -class EmbedderTest : public ::testing::Test { +class EmbedderTest : public ::testing::Test, + public UNSUPPORT_INFO, + public IPDF_JSPLATFORM, + public FPDF_FORMFILLINFO { public: - 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_)); - } + class Delegate { + public: + virtual ~Delegate() { } + + // Equivalent to UNSUPPORT_INFO::FSDK_UnSupport_Handler(). + virtual void UnsupportedHandler(int type) { } + + // Equivalent to IPDF_JSPLATFORM::app_alert(). + virtual int Alert(FPDF_WIDESTRING message, FPDF_WIDESTRING title, + int type, int icon) { + return 0; + } + }; - virtual ~EmbedderTest() { } + EmbedderTest(); + virtual ~EmbedderTest(); void SetUp() override; void TearDown() override; + void SetDelegate(Delegate* delegate) { + delegate_ = delegate ? delegate : default_delegate_; + } + FPDF_DOCUMENT document() { return document_; } FPDF_FORMHANDLE form_handle() { return form_handle_; } @@ -62,6 +73,8 @@ class EmbedderTest : public ::testing::Test { virtual void UnloadPage(FPDF_PAGE page); protected: + Delegate* delegate_; + Delegate* default_delegate_; FPDF_DOCUMENT document_; FPDF_FORMHANDLE form_handle_; FPDF_AVAIL avail_; @@ -73,6 +86,11 @@ class EmbedderTest : public ::testing::Test { TestLoader* loader_; size_t file_length_; char* file_contents_; + + private: + static void UnsupportedHandlerTrampoline(UNSUPPORT_INFO*, int type); + static int AlertTrampoline(IPDF_JSPLATFORM* plaform, FPDF_WIDESTRING message, + FPDF_WIDESTRING title, int type, int icon); }; #endif // TESTING_EMBEDDER_TEST_H_ -- cgit v1.2.3