summaryrefslogtreecommitdiffstats
path: root/pdf
diff options
context:
space:
mode:
authortsepez <tsepez@chromium.org>2014-11-12 15:46:43 -0800
committerCommit bot <commit-bot@chromium.org>2014-11-12 23:47:01 +0000
commit9748f19ed48f9bb016317d62a362682fd5bf3bcc (patch)
tree5e6893ab86b84e64b4520f7b77398a3d7e6192e3 /pdf
parentc4bbcf9c10b3b375846d3f07f3aa85638c35c241 (diff)
downloadchromium_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.cc325
-rw-r--r--pdf/pdfium/pdfium_engine.h64
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);