diff options
author | tsepez <tsepez@chromium.org> | 2014-11-12 15:46:43 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-12 23:47:01 +0000 |
commit | 9748f19ed48f9bb016317d62a362682fd5bf3bcc (patch) | |
tree | 5e6893ab86b84e64b4520f7b77398a3d7e6192e3 /pdf | |
parent | c4bbcf9c10b3b375846d3f07f3aa85638c35c241 (diff) | |
download | chromium_src-9748f19ed48f9bb016317d62a362682fd5bf3bcc.zip chromium_src-9748f19ed48f9bb016317d62a362682fd5bf3bcc.tar.gz chromium_src-9748f19ed48f9bb016317d62a362682fd5bf3bcc.tar.bz2 |
Add pdf layer code for PDFium XFA module.
This is a landing of the patch from issue 705823002. TBR because the same
patch has already been LGTM'd in https://codereview.chromium.org/705823002.
BUG=62400
TBR=thestig@chromium.org
Review URL: https://codereview.chromium.org/722863002
Cr-Commit-Position: refs/heads/master@{#303923}
Diffstat (limited to 'pdf')
-rw-r--r-- | pdf/pdfium/pdfium_engine.cc | 325 | ||||
-rw-r--r-- | pdf/pdfium/pdfium_engine.h | 64 |
2 files changed, 385 insertions, 4 deletions
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index 5e63826..e0aefcb 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc @@ -612,7 +612,23 @@ PDFiumEngine::PDFiumEngine(PDFEngine::Client* client) FPDF_FORMFILLINFO::FFI_SetTextFieldFocus = Form_SetTextFieldFocus; FPDF_FORMFILLINFO::FFI_DoURIAction = Form_DoURIAction; FPDF_FORMFILLINFO::FFI_DoGoToAction = Form_DoGoToAction; - +#ifdef PDF_USE_XFA + FPDF_FORMFILLINFO::version = 2; + FPDF_FORMFILLINFO::FFI_EmailTo = Form_EmailTo; + FPDF_FORMFILLINFO::FFI_DisplayCaret = Form_DisplayCaret; + FPDF_FORMFILLINFO::FFI_SetCurrentPage = Form_SetCurrentPage; + FPDF_FORMFILLINFO::FFI_GetCurrentPageIndex = Form_GetCurrentPageIndex; + FPDF_FORMFILLINFO::FFI_GetPageViewRect = Form_GetPageViewRect; + FPDF_FORMFILLINFO::FFI_GetPlatform = Form_GetPlatform; + FPDF_FORMFILLINFO::FFI_PopupMenu = Form_PopupMenu; + FPDF_FORMFILLINFO::FFI_PostRequestURL = Form_PostRequestURL; + FPDF_FORMFILLINFO::FFI_PutRequestURL = Form_PutRequestURL; + FPDF_FORMFILLINFO::FFI_UploadTo = Form_UploadTo; + FPDF_FORMFILLINFO::FFI_DownloadFromURL = Form_DownloadFromURL; + FPDF_FORMFILLINFO::FFI_OpenFile = Form_OpenFile; + FPDF_FORMFILLINFO::FFI_GotoURL = Form_GotoURL; + FPDF_FORMFILLINFO::FFI_GetLanguage = Form_GetLanguage; +#endif // PDF_USE_XFA IPDF_JSPLATFORM::version = 1; IPDF_JSPLATFORM::app_alert = Form_Alert; IPDF_JSPLATFORM::app_beep = Form_Beep; @@ -636,9 +652,11 @@ PDFiumEngine::~PDFiumEngine() { if (doc_) { if (form_) { FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WC); - FPDFDOC_ExitFormFillEnviroument(form_); } FPDF_CloseDocument(doc_); + if (form_) { + FPDFDOC_ExitFormFillEnviroument(form_); + } } if (fpdf_availability_) @@ -647,6 +665,294 @@ PDFiumEngine::~PDFiumEngine() { STLDeleteElements(&pages_); } +#ifdef PDF_USE_XFA + +// This is just for testing, needs to be removed later +#if defined(WIN32) +#define XFA_TESTFILE(filename) "E:/"#filename +#else +#define XFA_TESTFILE(filename) "/home/"#filename +#endif + +struct FPDF_FILE { + FPDF_FILEHANDLER file_handler; + FILE* file; +}; + +void Sample_Release(FPDF_LPVOID client_data) { + if (!client_data) + return; + FPDF_FILE* file_wrapper = (FPDF_FILE*)client_data; + fclose(file_wrapper->file); + delete file_wrapper; +} + +FPDF_DWORD Sample_GetSize(FPDF_LPVOID client_data) { + if (!client_data) + return 0; + FPDF_FILE* file_wrapper = (FPDF_FILE*)client_data; + long cur_pos = ftell(file_wrapper->file); + if (cur_pos == -1) + return 0; + if (fseek(file_wrapper->file, 0, SEEK_END)) + return 0; + long size = ftell(file_wrapper->file); + fseek(file_wrapper->file, cur_pos, SEEK_SET); + return (FPDF_DWORD)size; +} + +FPDF_RESULT Sample_ReadBlock(FPDF_LPVOID client_data, + FPDF_DWORD offset, + FPDF_LPVOID buffer, + FPDF_DWORD size) { + if (!client_data) + return -1; + FPDF_FILE* file_wrapper = (FPDF_FILE*)client_data; + if (fseek(file_wrapper->file, (long)offset, SEEK_SET)) + return -1; + size_t read_size = fread(buffer, 1, size, file_wrapper->file); + return read_size == size ? 0 : -1; +} + +FPDF_RESULT Sample_WriteBlock(FPDF_LPVOID client_data, + FPDF_DWORD offset, + FPDF_LPCVOID buffer, + FPDF_DWORD size) { + if (!client_data) + return -1; + FPDF_FILE* file_wrapper = (FPDF_FILE*)client_data; + if (fseek(file_wrapper->file, (long)offset, SEEK_SET)) + return -1; + // Write data + size_t write_size = fwrite(buffer, 1, size, file_wrapper->file); + return write_size == size ? 0 : -1; +} + +FPDF_RESULT Sample_Flush(FPDF_LPVOID client_data) { + if (!client_data) + return -1; + // Flush file + fflush(((FPDF_FILE*)client_data)->file); + return 0; +} + +FPDF_RESULT Sample_Truncate(FPDF_LPVOID client_data, FPDF_DWORD size) { + return 0; +} + +void PDFiumEngine::Form_EmailTo(FPDF_FORMFILLINFO* param, + FPDF_FILEHANDLER* file_handler, + FPDF_WIDESTRING to, + FPDF_WIDESTRING subject, + FPDF_WIDESTRING cc, + FPDF_WIDESTRING bcc, + FPDF_WIDESTRING message) { + std::string to_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(to)); + std::string subject_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(subject)); + std::string cc_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(cc)); + std::string bcc_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(bcc)); + std::string message_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(message)); + + PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); + engine->client_->Email(to_str, cc_str, bcc_str, subject_str, message_str); +} + +void PDFiumEngine::Form_DisplayCaret(FPDF_FORMFILLINFO* param, + FPDF_PAGE page, + FPDF_BOOL visible, + double left, + double top, + double right, + double bottom) { + PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); + engine->client_->UpdateCursor(PP_CURSORTYPE_IBEAM); + std::vector<pp::Rect> tickmarks; + pp::Rect rect(left, top, right, bottom); + tickmarks.push_back(rect); + engine->client_->UpdateTickMarks(tickmarks); +} + +void PDFiumEngine::Form_SetCurrentPage(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT document, + int page) { + PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); + pp::Rect page_view_rect = engine->GetPageContentsRect(page); + engine->ScrolledToYPosition(page_view_rect.height()); + pp::Point pos(1, page_view_rect.height()); + engine->SetScrollPosition(pos); +} + +int PDFiumEngine::Form_GetCurrentPageIndex(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT document) { + PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); + return engine->GetMostVisiblePage(); +} + +void PDFiumEngine::Form_GetPageViewRect(FPDF_FORMFILLINFO* param, + FPDF_PAGE page, + double* left, + double* top, + double* right, + double* bottom) { + PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); + int page_index = engine->GetMostVisiblePage(); + pp::Rect page_view_rect = engine->GetPageContentsRect(page_index); + + *left = page_view_rect.x(); + *right = page_view_rect.right(); + *top = page_view_rect.y(); + *bottom = page_view_rect.bottom(); +} + +int PDFiumEngine::Form_GetPlatform(FPDF_FORMFILLINFO* param, + void* platform, + int length) { + int platform_flag = -1; + +#if defined(WIN32) + platform_flag = 0; +#elif defined(__linux__) + platform_flag = 1; +#else + platform_flag = 2; +#endif + + std::string javascript = "alert(\"Platform:" + + base::DoubleToString(platform_flag) + + "\")"; + + return platform_flag; +} + +FPDF_BOOL PDFiumEngine::Form_PopupMenu(FPDF_FORMFILLINFO* param, + FPDF_PAGE page, + FPDF_WIDGET widget, + int menu_flag, + float x, + float y) { + return false; +} + +FPDF_BOOL PDFiumEngine::Form_PostRequestURL(FPDF_FORMFILLINFO* param, + FPDF_WIDESTRING url, + FPDF_WIDESTRING data, + FPDF_WIDESTRING content_type, + FPDF_WIDESTRING encode, + FPDF_WIDESTRING header, + FPDF_BSTR* response) { + std::string url_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); + std::string data_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(data)); + std::string content_type_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(content_type)); + std::string encode_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(encode)); + std::string header_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(header)); + + std::string javascript = "alert(\"Post:" + + url_str + "," + data_str + "," + content_type_str + "," + + encode_str + "," + header_str + + "\")"; + return true; +} + +FPDF_BOOL PDFiumEngine::Form_PutRequestURL(FPDF_FORMFILLINFO* param, + FPDF_WIDESTRING url, + FPDF_WIDESTRING data, + FPDF_WIDESTRING encode) { + std::string url_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); + std::string data_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(data)); + std::string encode_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(encode)); + + std::string javascript = "alert(\"Put:" + + url_str + "," + data_str + "," + encode_str + + "\")"; + + return true; +} + +void PDFiumEngine::Form_UploadTo(FPDF_FORMFILLINFO* param, + FPDF_FILEHANDLER* file_handle, + int file_flag, + FPDF_WIDESTRING to) { + std::string to_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(to)); + // TODO: needs the full implementation of form uploading +} + +FPDF_LPFILEHANDLER PDFiumEngine::Form_DownloadFromURL(FPDF_FORMFILLINFO* param, + FPDF_WIDESTRING url) { + std::string url_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); + + // Now should get data from url. + // For testing purpose, use data read from file + // TODO: needs the full implementation here + FILE* file = fopen(XFA_TESTFILE("downloadtest.tem"), "w"); + + FPDF_FILE* file_wrapper = new FPDF_FILE; + file_wrapper->file = file; + file_wrapper->file_handler.clientData = file_wrapper; + file_wrapper->file_handler.Flush = Sample_Flush; + file_wrapper->file_handler.GetSize = Sample_GetSize; + file_wrapper->file_handler.ReadBlock = Sample_ReadBlock; + file_wrapper->file_handler.Release = Sample_Release; + file_wrapper->file_handler.Truncate = Sample_Truncate; + file_wrapper->file_handler.WriteBlock = Sample_WriteBlock; + + return &file_wrapper->file_handler; +} + +FPDF_FILEHANDLER* PDFiumEngine::Form_OpenFile(FPDF_FORMFILLINFO* param, + int file_flag, + FPDF_WIDESTRING url, + const char* mode) { + std::string url_str = "NULL"; + if (url != NULL) { + url_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); + } + // TODO: need to implement open file from the url + // Use a file path for the ease of testing + FILE* file = fopen(XFA_TESTFILE("tem.txt"), mode); + FPDF_FILE* file_wrapper = new FPDF_FILE; + file_wrapper->file = file; + file_wrapper->file_handler.clientData = file_wrapper; + file_wrapper->file_handler.Flush = Sample_Flush; + file_wrapper->file_handler.GetSize = Sample_GetSize; + file_wrapper->file_handler.ReadBlock = Sample_ReadBlock; + file_wrapper->file_handler.Release = Sample_Release; + file_wrapper->file_handler.Truncate = Sample_Truncate; + file_wrapper->file_handler.WriteBlock = Sample_WriteBlock; + return &file_wrapper->file_handler; +} + +void PDFiumEngine::Form_GotoURL(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT document, + FPDF_WIDESTRING url) { + std::string url_str = + base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); + // TODO: needs to implement GOTO URL action +} + +int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param, + void* language, + int length) { + return 0; +} + +#endif // PDF_USE_XFA + int PDFiumEngine::GetBlock(void* param, unsigned long position, unsigned char* buffer, unsigned long size) { DocumentLoader* loader = static_cast<DocumentLoader*>(param); @@ -918,9 +1224,11 @@ void PDFiumEngine::FinishLoadingDocument() { void PDFiumEngine::UnsupportedFeature(int type) { std::string feature; switch (type) { +#ifndef PDF_USE_XFA case FPDF_UNSP_DOC_XFAFORM: feature = "XFA"; break; +#endif case FPDF_UNSP_DOC_PORTABLECOLLECTION: feature = "Portfolios_Packages"; break; @@ -1346,8 +1654,13 @@ bool PDFiumEngine::OnMouseDown(const pp::MouseInputEvent& event) { int control = FPDPage_HasFormFieldAtPoint( form_, pages_[page_index]->GetPage(), page_x, page_y); if (control > FPDF_FORMFIELD_UNKNOWN) { // returns -1 sometimes... - client_->FormTextFieldFocusChange(control == FPDF_FORMFIELD_TEXTFIELD || - control == FPDF_FORMFIELD_COMBOBOX); +#ifdef PDF_USE_XFA + client_->FormTextFieldFocusChange(control == FPDF_FORMFIELD_TEXTFIELD || + control == FPDF_FORMFIELD_COMBOBOX || control == FPDF_FORMFIELD_XFA); +#else + client_->FormTextFieldFocusChange(control == FPDF_FORMFIELD_TEXTFIELD || + control == FPDF_FORMFIELD_COMBOBOX); +#endif return true; // Return now before we get into the selection code. } } @@ -2229,6 +2542,10 @@ void PDFiumEngine::ContinueLoadingDocument( form_ = FPDFDOC_InitFormFillEnviroument( doc_, static_cast<FPDF_FORMFILLINFO*>(this)); +#ifdef PDF_USE_XFA + FPDF_LoadXFA(doc_); +#endif + FPDF_SetFormFieldHighlightColor(form_, 0, kFormHighlightColor); FPDF_SetFormFieldHighlightAlpha(form_, kFormHighlightAlpha); } diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h index 4bea1e6..91408a5 100644 --- a/pdf/pdfium/pdfium_engine.h +++ b/pdf/pdfium/pdfium_engine.h @@ -496,6 +496,70 @@ class PDFiumEngine : public PDFEngine, static void Form_GotoPage(IPDF_JSPLATFORM* param, int page_number); static int Form_Browse(IPDF_JSPLATFORM* param, void* file_path, int length); +#ifdef PDF_USE_XFA + static void Form_EmailTo(FPDF_FORMFILLINFO* param, + FPDF_FILEHANDLER* file_handler, + FPDF_WIDESTRING to, + FPDF_WIDESTRING subject, + FPDF_WIDESTRING cc, + FPDF_WIDESTRING bcc, + FPDF_WIDESTRING message); + static void Form_DisplayCaret(FPDF_FORMFILLINFO* param, + FPDF_PAGE page, + FPDF_BOOL visible, + double left, + double top, + double right, + double bottom); + static void Form_SetCurrentPage(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT document, + int page); + static int Form_GetCurrentPageIndex(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT document); + static void Form_GetPageViewRect(FPDF_FORMFILLINFO* param, + FPDF_PAGE page, + double* left, + double* top, + double* right, + double* bottom); + static int Form_GetPlatform(FPDF_FORMFILLINFO* param, + void* platform, + int length); + static FPDF_BOOL Form_PopupMenu(FPDF_FORMFILLINFO* param, + FPDF_PAGE page, + FPDF_WIDGET widget, + int menu_flag, + float x, + float y); + static FPDF_BOOL Form_PostRequestURL(FPDF_FORMFILLINFO* param, + FPDF_WIDESTRING url, + FPDF_WIDESTRING data, + FPDF_WIDESTRING content_type, + FPDF_WIDESTRING encode, + FPDF_WIDESTRING header, + FPDF_BSTR* response); + static FPDF_BOOL Form_PutRequestURL(FPDF_FORMFILLINFO* param, + FPDF_WIDESTRING url, + FPDF_WIDESTRING data, + FPDF_WIDESTRING encode); + static void Form_UploadTo(FPDF_FORMFILLINFO* param, + FPDF_FILEHANDLER* file_handler, + int file_flag, + FPDF_WIDESTRING dest); + static FPDF_LPFILEHANDLER Form_DownloadFromURL(FPDF_FORMFILLINFO* param, + FPDF_WIDESTRING url); + static FPDF_FILEHANDLER* Form_OpenFile(FPDF_FORMFILLINFO* param, + int file_flag, + FPDF_WIDESTRING url, + const char* mode); + static void Form_GotoURL(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT document, + FPDF_WIDESTRING url); + static int Form_GetLanguage(FPDF_FORMFILLINFO* param, + void* language, + int length); +#endif // PDF_USE_XFA + // IFSDK_PAUSE callbacks static FPDF_BOOL Pause_NeedToPauseNow(IFSDK_PAUSE* param); |