diff options
author | dsinclair <dsinclair@chromium.org> | 2016-10-13 10:48:22 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-10-13 10:48:22 -0700 |
commit | abefb79577b32d291d14d7e01a70f6f8cf213bd3 (patch) | |
tree | 489ab4a6f8ddc0d7de4359e186134292434e2ea0 /fpdfsdk/fpdfxfa/cpdfxfa_document.cpp | |
parent | d66f9d0b1fb0af57960f9c7163c475968505ee4a (diff) | |
download | pdfium-abefb79577b32d291d14d7e01a70f6f8cf213bd3.tar.xz |
Make the CPDFXFA_App non-global
This CL changes CPDFXFA_App from a global object to a child of the
CPDFXFA_Document objects.
BUG=pdfium:623
Review-Url: https://codereview.chromium.org/2416753002
Diffstat (limited to 'fpdfsdk/fpdfxfa/cpdfxfa_document.cpp')
-rw-r--r-- | fpdfsdk/fpdfxfa/cpdfxfa_document.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp index df0da31beb..79d28c0637 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp @@ -16,6 +16,7 @@ #include "fpdfsdk/fsdk_define.h" #include "fpdfsdk/javascript/ijs_runtime.h" #include "public/fpdf_formfill.h" +#include "third_party/base/ptr_util.h" #include "xfa/fxfa/cxfa_eventparam.h" #include "xfa/fxfa/xfa_ffapp.h" #include "xfa/fxfa/xfa_ffdoc.h" @@ -28,13 +29,11 @@ extern void SetLastError(int err); extern int GetLastError(); #endif -CPDFXFA_Document::CPDFXFA_Document(std::unique_ptr<CPDF_Document> pPDFDoc, - CPDFXFA_App* pProvider) +CPDFXFA_Document::CPDFXFA_Document(std::unique_ptr<CPDF_Document> pPDFDoc) : m_iDocType(DOCTYPE_PDF), m_pPDFDoc(std::move(pPDFDoc)), m_pFormFillEnv(nullptr), m_pXFADocView(nullptr), - m_pApp(pProvider), m_nLoadStatus(FXFA_LOADSTATUS_PRELOAD), m_nPageCount(0), m_DocEnv(this) {} @@ -42,6 +41,12 @@ CPDFXFA_Document::CPDFXFA_Document(std::unique_ptr<CPDF_Document> pPDFDoc, 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()); + } + if (m_pFormFillEnv) { m_pFormFillEnv->ClearAllFocusedAnnots(); // Once we're deleted the FormFillEnvironment will point at a bad underlying @@ -50,19 +55,23 @@ CPDFXFA_Document::~CPDFXFA_Document() { m_pFormFillEnv = nullptr; } - if (m_pXFADoc) { - CXFA_FFApp* pApp = m_pApp->GetXFAApp(); - if (pApp) { - CXFA_FFDocHandler* pDocHandler = pApp->GetDocHandler(); - if (pDocHandler) - CloseXFADoc(pDocHandler); - } - m_pXFADoc.reset(); - } - m_nLoadStatus = FXFA_LOADSTATUS_CLOSED; } +void CPDFXFA_Document::CloseXFADoc(CXFA_FFDocHandler* pDoc) { + if (!pDoc) + 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(); +} + FX_BOOL CPDFXFA_Document::LoadXFADoc() { m_nLoadStatus = FXFA_LOADSTATUS_LOADING; @@ -71,7 +80,7 @@ FX_BOOL CPDFXFA_Document::LoadXFADoc() { m_XFAPageList.RemoveAll(); - CXFA_FFApp* pApp = m_pApp->GetXFAApp(); + CXFA_FFApp* pApp = GetApp()->GetXFAApp(); if (!pApp) return FALSE; @@ -95,7 +104,7 @@ FX_BOOL CPDFXFA_Document::LoadXFADoc() { return FALSE; } m_pXFADoc->StopLoad(); - m_pXFADoc->GetXFADoc()->InitScriptContext(m_pApp->GetJSERuntime()); + m_pXFADoc->GetXFADoc()->InitScriptContext(GetApp()->GetJSERuntime()); if (m_pXFADoc->GetDocType() == XFA_DOCTYPE_Dynamic) m_iDocType = DOCTYPE_DYNAMIC_XFA; |