| Index: fpdfsdk/fpdfxfa/cpdfxfa_document.cpp
|
| diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_document.cpp
|
| index df0da31beb1d304f5dcce1712970e618c03479ef..79d28c0637ffcd2480d653de491ec0b7e479c3f3 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;
|
|
|