Chromium Code Reviews| Index: testing/embedder_test.cpp |
| diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp |
| index 6cbfbf5191da7f160de717e2b6be4f2250e1aabc..adacd582648ed199db1f416d4a33532dcb00b7d0 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_)); |
| + original_delegate_ = new EmbedderTestDefaultDelegate(); |
| + delegate_ = original_delegate_; |
| +} |
| + |
| +EmbedderTest::~EmbedderTest() { |
| + delete original_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); |
|
Lei Zhang
2015/02/25 23:02:50
I'm surprised this ever worked. Wouldn't |unsuppor
Tom Sepez
2015/02/25 23:25:22
I thought it copied its contents, but further insp
|
| + UNSUPPORT_INFO *info = static_cast<UNSUPPORT_INFO*>(this); |
|
Lei Zhang
2015/02/25 23:02:50
nit: * on the left
Tom Sepez
2015/02/25 23:25:22
Done.
|
| + 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,28 @@ void EmbedderTest::UnloadPage(FPDF_PAGE page) { |
| FPDF_ClosePage(page); |
| } |
| +// static |
| +void EmbedderTest::UnsupportedHandlerTrampoline(UNSUPPORT_INFO* info, |
| + int type) { |
| + EmbedderTest* test = static_cast<EmbedderTest*>(info); |
| + if (test->delegate_) { |
|
Lei Zhang
2015/02/25 23:02:51
Should we just assume |delegate_| is always valid?
Tom Sepez
2015/02/25 23:25:22
Yep. In fact, we can make SetDelegate(0) mean res
|
| + 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); |
| + if (!test->delegate_) { |
| + return 0; |
| + } |
| + 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) { |