From c9aa2f8bfdf74ffae633c7bb1a4d908dda9caed5 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Mon, 2 Jul 2018 23:08:53 +0000 Subject: Virtualize Observable::ObservedPtr::OnDestroy() for CPDF_Avail cleanup This enables more complicated cleanup when an observed object is destroyed. Use it to make documents observable and to allow the CPDF_Avail to cleanup without the need for intermediate class. Change-Id: I3a8e758b7ff542e0a58710eff1ac8017205cbd45 Reviewed-on: https://pdfium-review.googlesource.com/36373 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- core/fpdfapi/parser/cpdf_data_avail.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) (limited to 'core/fpdfapi/parser/cpdf_data_avail.cpp') diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp index 89b576bdea..a251d6ff61 100644 --- a/core/fpdfapi/parser/cpdf_data_avail.cpp +++ b/core/fpdfapi/parser/cpdf_data_avail.cpp @@ -70,17 +70,6 @@ class HintsScope { UnownedPtr validator_; }; -class CPDF_DocumentForAvail : public CPDF_Document { - public: - explicit CPDF_DocumentForAvail(CPDF_DataAvail* avail) : m_pAvail(avail) { - DCHECK(avail); - } - ~CPDF_DocumentForAvail() override { m_pAvail->BeforeDocumentDestroyed(); } - - private: - UnownedPtr m_pAvail; -}; - } // namespace CPDF_DataAvail::FileAvail::~FileAvail() {} @@ -98,9 +87,11 @@ CPDF_DataAvail::CPDF_DataAvail( CPDF_DataAvail::~CPDF_DataAvail() { m_pHintTables.reset(); + if (m_pDocument) + m_pDocument->RemoveObserver(this); } -void CPDF_DataAvail::BeforeDocumentDestroyed() { +void CPDF_DataAvail::OnObservableDestroyed() { m_pDocument = nullptr; m_pFormAvail.reset(); m_PagesArray.clear(); @@ -1031,7 +1022,8 @@ CPDF_DataAvail::ParseDocument(const char* password) { // We already returned parsed document. return std::make_pair(CPDF_Parser::HANDLER_ERROR, nullptr); } - auto document = pdfium::MakeUnique(this); + auto document = pdfium::MakeUnique(); + document->AddObserver(this); CPDF_ReadValidator::Session read_session(GetValidator().Get()); CPDF_Parser::Error error = -- cgit v1.2.3