summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2015-02-25 16:00:06 -0800
committerTom Sepez <tsepez@chromium.org>2015-02-25 16:00:06 -0800
commit42a8adad1c53c060bb93457902243a53270cec36 (patch)
tree5e047c66f44f0f8cf555dd9d984f834c9ff0f8b0
parent57e4c86145a247915c59ae5130cfc3ef9b36aa4c (diff)
downloadpdfium-42a8adad1c53c060bb93457902243a53270cec36.tar.xz
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
-rw-r--r--testing/embedder_test.cpp159
-rw-r--r--testing/embedder_test.h44
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 <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"
@@ -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<UNSUPPORT_INFO*>(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<IPDF_JSPLATFORM*>(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<FPDF_FORMFILLINFO*>(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<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);
+}
+
// 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_