diff options
author | dsinclair <dsinclair@chromium.org> | 2016-11-02 12:37:12 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-11-02 12:37:12 -0700 |
commit | 25ec646b2c128a6beaa961ec2b2eeb673ed034ca (patch) | |
tree | 1487a9657719d45d3198bae5af744cf515f93e14 /fpdfsdk/fpdfxfa/cpdfxfa_document.cpp | |
parent | 6fe8795d9022105a0061a0a81be9a49d49fda345 (diff) | |
download | pdfium-25ec646b2c128a6beaa961ec2b2eeb673ed034ca.tar.xz |
Merge CPDFXFA_App into CPDFXFA_Document.
This Cl moves the CPDFXFA_App code into CPDFXFA_Document.
Review-Url: https://codereview.chromium.org/2424993002
Diffstat (limited to 'fpdfsdk/fpdfxfa/cpdfxfa_document.cpp')
-rw-r--r-- | fpdfsdk/fpdfxfa/cpdfxfa_document.cpp | 272 |
1 files changed, 253 insertions, 19 deletions
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp index b04b9504dd..0b840e4641 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp @@ -10,10 +10,10 @@ #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_interform.h" #include "fpdfsdk/cpdfsdk_pageview.h" -#include "fpdfsdk/fpdfxfa/cpdfxfa_app.h" #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" #include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" #include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/javascript/cjs_runtime.h" #include "fpdfsdk/javascript/ijs_runtime.h" #include "public/fpdf_formfill.h" #include "third_party/base/ptr_util.h" @@ -23,6 +23,7 @@ #include "xfa/fxfa/xfa_ffdocview.h" #include "xfa/fxfa/xfa_ffpageview.h" #include "xfa/fxfa/xfa_ffwidgethandler.h" +#include "xfa/fxfa/xfa_fontmgr.h" #ifndef _WIN32 extern void SetLastError(int err); @@ -36,16 +37,16 @@ CPDFXFA_Document::CPDFXFA_Document(std::unique_ptr<CPDF_Document> pPDFDoc) m_pXFADocView(nullptr), m_nLoadStatus(FXFA_LOADSTATUS_PRELOAD), m_nPageCount(0), - m_DocEnv(this) {} + m_DocEnv(this) { + m_pXFAApp = pdfium::MakeUnique<CXFA_FFApp>(this); + m_pXFAApp->SetDefaultFontMgr(pdfium::MakeUnique<CXFA_DefFontMgr>()); +} CPDFXFA_Document::~CPDFXFA_Document() { m_nLoadStatus = FXFA_LOADSTATUS_CLOSING; // Must happen before we remove the form fill environment. - if (m_pXFADoc) { - if (CXFA_FFApp* pApp = GetApp()->GetXFAApp()) - CloseXFADoc(pApp->GetDocHandler()); - } + CloseXFADoc(); if (m_pFormFillEnv) { m_pFormFillEnv->ClearAllFocusedAnnots(); @@ -58,20 +59,14 @@ CPDFXFA_Document::~CPDFXFA_Document() { m_nLoadStatus = FXFA_LOADSTATUS_CLOSED; } -void CPDFXFA_Document::CloseXFADoc(CXFA_FFDocHandler* pDoc) { - if (!pDoc) +void CPDFXFA_Document::CloseXFADoc() { + if (!m_pXFADoc) return; m_pXFADoc->CloseDoc(); m_pXFADoc.reset(); m_pXFADocView = nullptr; } -CPDFXFA_App* CPDFXFA_Document::GetApp() { - if (!m_pApp) - m_pApp = pdfium::MakeUnique<CPDFXFA_App>(); - return m_pApp.get(); -} - void CPDFXFA_Document::SetFormFillEnv( CPDFSDK_FormFillEnvironment* pFormFillEnv) { // The layout data can have pointers back into the script context. That @@ -80,7 +75,6 @@ void CPDFXFA_Document::SetFormFillEnv( if (m_pXFADoc && m_pXFADoc->GetXFADoc()) m_pXFADoc->GetXFADoc()->ClearLayoutData(); - GetApp()->SetFormFillEnv(pFormFillEnv); m_pFormFillEnv = pFormFillEnv; } @@ -92,7 +86,7 @@ FX_BOOL CPDFXFA_Document::LoadXFADoc() { m_XFAPageList.RemoveAll(); - CXFA_FFApp* pApp = GetApp()->GetXFAApp(); + CXFA_FFApp* pApp = GetXFAApp(); if (!pApp) return FALSE; @@ -111,12 +105,12 @@ FX_BOOL CPDFXFA_Document::LoadXFADoc() { m_pXFADoc->StartLoad(); int iStatus = m_pXFADoc->DoLoad(nullptr); if (iStatus != XFA_PARSESTATUS_Done) { - CloseXFADoc(pDocHandler); + CloseXFADoc(); SetLastError(FPDF_ERR_XFALOAD); return FALSE; } m_pXFADoc->StopLoad(); - m_pXFADoc->GetXFADoc()->InitScriptContext(GetApp()->GetJSERuntime()); + m_pXFADoc->GetXFADoc()->InitScriptContext(GetJSERuntime()); if (m_pXFADoc->GetDocType() == XFA_DOCTYPE_Dynamic) m_iDocType = DOCTYPE_DYNAMIC_XFA; @@ -125,7 +119,7 @@ FX_BOOL CPDFXFA_Document::LoadXFADoc() { m_pXFADocView = m_pXFADoc->CreateDocView(XFA_DOCVIEW_View); if (m_pXFADocView->StartLayout() < 0) { - CloseXFADoc(pDocHandler); + CloseXFADoc(); SetLastError(FPDF_ERR_XFALAYOUT); return FALSE; } @@ -224,3 +218,243 @@ void CPDFXFA_Document::ClearChangeMark() { if (m_pFormFillEnv) m_pFormFillEnv->ClearChangeMark(); } + +v8::Isolate* CPDFXFA_Document::GetJSERuntime() const { + if (!m_pFormFillEnv) + return nullptr; + + // XFA requires V8, if we have V8 then we have a CJS_Runtime and not the stub. + CJS_Runtime* runtime = + static_cast<CJS_Runtime*>(m_pFormFillEnv->GetJSRuntime()); + return runtime->GetIsolate(); +} + +void CPDFXFA_Document::GetAppName(CFX_WideString& wsName) { + if (m_pFormFillEnv) + wsName = m_pFormFillEnv->FFI_GetAppName(); +} + +void CPDFXFA_Document::GetLanguage(CFX_WideString& wsLanguage) { + if (m_pFormFillEnv) + wsLanguage = m_pFormFillEnv->GetLanguage(); +} + +void CPDFXFA_Document::GetPlatform(CFX_WideString& wsPlatform) { + if (m_pFormFillEnv) + wsPlatform = m_pFormFillEnv->GetPlatform(); +} + +void CPDFXFA_Document::Beep(uint32_t dwType) { + if (m_pFormFillEnv) + m_pFormFillEnv->JS_appBeep(dwType); +} + +int32_t CPDFXFA_Document::MsgBox(const CFX_WideString& wsMessage, + const CFX_WideString& wsTitle, + uint32_t dwIconType, + uint32_t dwButtonType) { + if (!m_pFormFillEnv) + return -1; + + uint32_t iconType = 0; + int iButtonType = 0; + switch (dwIconType) { + case XFA_MBICON_Error: + iconType |= 0; + break; + case XFA_MBICON_Warning: + iconType |= 1; + break; + case XFA_MBICON_Question: + iconType |= 2; + break; + case XFA_MBICON_Status: + iconType |= 3; + break; + } + switch (dwButtonType) { + case XFA_MB_OK: + iButtonType |= 0; + break; + case XFA_MB_OKCancel: + iButtonType |= 1; + break; + case XFA_MB_YesNo: + iButtonType |= 2; + break; + case XFA_MB_YesNoCancel: + iButtonType |= 3; + break; + } + int32_t iRet = m_pFormFillEnv->JS_appAlert(wsMessage.c_str(), wsTitle.c_str(), + iButtonType, iconType); + switch (iRet) { + case 1: + return XFA_IDOK; + case 2: + return XFA_IDCancel; + case 3: + return XFA_IDNo; + case 4: + return XFA_IDYes; + } + return XFA_IDYes; +} + +CFX_WideString CPDFXFA_Document::Response(const CFX_WideString& wsQuestion, + const CFX_WideString& wsTitle, + const CFX_WideString& wsDefaultAnswer, + FX_BOOL bMark) { + CFX_WideString wsAnswer; + if (!m_pFormFillEnv) + return wsAnswer; + + int nLength = 2048; + char* pBuff = new char[nLength]; + nLength = m_pFormFillEnv->JS_appResponse(wsQuestion.c_str(), wsTitle.c_str(), + wsDefaultAnswer.c_str(), nullptr, + bMark, pBuff, nLength); + if (nLength > 0) { + nLength = nLength > 2046 ? 2046 : nLength; + pBuff[nLength] = 0; + pBuff[nLength + 1] = 0; + wsAnswer = CFX_WideString::FromUTF16LE( + reinterpret_cast<const unsigned short*>(pBuff), + nLength / sizeof(unsigned short)); + } + delete[] pBuff; + return wsAnswer; +} + +IFX_SeekableReadStream* CPDFXFA_Document::DownloadURL( + const CFX_WideString& wsURL) { + return m_pFormFillEnv ? m_pFormFillEnv->DownloadFromURL(wsURL.c_str()) + : nullptr; +} + +FX_BOOL CPDFXFA_Document::PostRequestURL(const CFX_WideString& wsURL, + const CFX_WideString& wsData, + const CFX_WideString& wsContentType, + const CFX_WideString& wsEncode, + const CFX_WideString& wsHeader, + CFX_WideString& wsResponse) { + if (!m_pFormFillEnv) + return FALSE; + + wsResponse = m_pFormFillEnv->PostRequestURL( + wsURL.c_str(), wsData.c_str(), wsContentType.c_str(), wsEncode.c_str(), + wsHeader.c_str()); + return TRUE; +} + +FX_BOOL CPDFXFA_Document::PutRequestURL(const CFX_WideString& wsURL, + const CFX_WideString& wsData, + const CFX_WideString& wsEncode) { + return m_pFormFillEnv && + m_pFormFillEnv->PutRequestURL(wsURL.c_str(), wsData.c_str(), + wsEncode.c_str()); +} + +void CPDFXFA_Document::LoadString(int32_t iStringID, CFX_WideString& wsString) { + switch (iStringID) { + case XFA_IDS_ValidateFailed: + wsString = L"%s validation failed"; + return; + case XFA_IDS_CalcOverride: + wsString = L"Calculate Override"; + return; + case XFA_IDS_ModifyField: + wsString = L"Are you sure you want to modify this field?"; + return; + case XFA_IDS_NotModifyField: + wsString = L"You are not allowed to modify this field."; + return; + case XFA_IDS_AppName: + wsString = L"pdfium"; + return; + case XFA_IDS_Unable_TO_SET: + wsString = L"Unable to set "; + return; + case XFA_IDS_INVAlID_PROP_SET: + wsString = L"Invalid property set operation."; + return; + case XFA_IDS_NOT_DEFAUL_VALUE: + wsString = L" doesn't have a default property."; + return; + case XFA_IDS_UNABLE_SET_LANGUAGE: + wsString = L"Unable to set language value."; + return; + case XFA_IDS_UNABLE_SET_NUMPAGES: + wsString = L"Unable to set numPages value."; + return; + case XFA_IDS_UNABLE_SET_PLATFORM: + wsString = L"Unable to set platform value."; + return; + case XFA_IDS_UNABLE_SET_VARIATION: + wsString = L"Unable to set variation value."; + return; + case XFA_IDS_UNABLE_SET_VERSION: + wsString = L"Unable to set version value."; + return; + case XFA_IDS_UNABLE_SET_READY: + wsString = L"Unable to set ready value."; + return; + case XFA_IDS_COMPILER_ERROR: + wsString = L"Compiler error."; + return; + case XFA_IDS_DIVIDE_ZERO: + wsString = L"Divide by zero."; + return; + case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT: + wsString = + L"An attempt was made to reference property '%s' of a non-object in " + L"SOM expression %s."; + return; + case XFA_IDS_INDEX_OUT_OF_BOUNDS: + wsString = L"Index value is out of bounds."; + return; + case XFA_IDS_INCORRECT_NUMBER_OF_METHOD: + wsString = L"Incorrect number of parameters calling method '%s'."; + return; + case XFA_IDS_ARGUMENT_MISMATCH: + wsString = L"Argument mismatch in property or function argument."; + return; + case XFA_IDS_NOT_HAVE_PROPERTY: + wsString = L"'%s' doesn't have property '%s'."; + return; + case XFA_IDS_VIOLATE_BOUNDARY: + wsString = + L"The element [%s] has violated its allowable number of occurrences."; + return; + case XFA_IDS_SERVER_DENY: + wsString = L"Server does not permit."; + return; + case XFA_IDS_ValidateLimit: + wsString = + L"Message limit exceeded. Remaining %d validation errors not " + L"reported."; + return; + case XFA_IDS_ValidateNullWarning: + wsString = + L"%s cannot be blank. To ignore validations for %s, click Ignore."; + return; + case XFA_IDS_ValidateNullError: + wsString = L"%s cannot be blank."; + return; + case XFA_IDS_ValidateWarning: + wsString = + L"The value you entered for %s is invalid. To ignore validations for " + L"%s, click Ignore."; + return; + case XFA_IDS_ValidateError: + wsString = L"The value you entered for %s is invalid."; + return; + } +} + +IFWL_AdapterTimerMgr* CPDFXFA_Document::GetTimerMgr() { + CXFA_FWLAdapterTimerMgr* pAdapter = nullptr; + if (m_pFormFillEnv) + pAdapter = new CXFA_FWLAdapterTimerMgr(m_pFormFillEnv); + return pAdapter; +} |