diff options
author | Tom Sepez <tsepez@chromium.org> | 2018-10-25 23:25:58 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-10-25 23:25:58 +0000 |
commit | 6fe32f898af3eea875fd01a6d18f719d17dd72f3 (patch) | |
tree | f63a1a03d3fffc3e4e765442df9805b526660765 /fpdfsdk/pwl/cpwl_wnd.h | |
parent | ed7da31f67e93c8923669ad496126aa005a8d3a2 (diff) | |
download | pdfium-6fe32f898af3eea875fd01a6d18f719d17dd72f3.tar.xz |
Make CPWL_Wnd own its pAttachedData.
This requires moving it out of CreateParams, since that must be
a copyable struct, and implies that currently there is some
questionable sharing going on. To resolve this, introduce a
Clone() method so that each window gets its own copy.
Make GetAttachedData() return a const pointer, so that callers
can't free it behind our back.
Tidy initializations along the way.
Change-Id: Iadc97688b4692bf4fafefe8cff88af88672f7110
Reviewed-on: https://pdfium-review.googlesource.com/c/44590
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'fpdfsdk/pwl/cpwl_wnd.h')
-rw-r--r-- | fpdfsdk/pwl/cpwl_wnd.h | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h index 93938db648..921693f148 100644 --- a/fpdfsdk/pwl/cpwl_wnd.h +++ b/fpdfsdk/pwl/cpwl_wnd.h @@ -7,6 +7,7 @@ #ifndef FPDFSDK_PWL_CPWL_WND_H_ #define FPDFSDK_PWL_CPWL_WND_H_ +#include <memory> #include <vector> #include "core/fpdfdoc/cpdf_formcontrol.h" @@ -86,8 +87,9 @@ struct CPWL_Dash { class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> { public: class PrivateData { - protected: - ~PrivateData() {} + public: + virtual ~PrivateData() = default; + virtual std::unique_ptr<PrivateData> Clone() const = 0; }; class ProviderIface : public Observable<ProviderIface> { @@ -95,7 +97,7 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> { virtual ~ProviderIface() = default; // get a matrix which map user space to CWnd client space - virtual CFX_Matrix GetWindowMatrix(PrivateData* pAttached) = 0; + virtual CFX_Matrix GetWindowMatrix(const PrivateData* pAttached) = 0; }; class FocusHandlerIface { @@ -125,14 +127,13 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> { int32_t nTransparency; // optional float fFontSize; // optional CPWL_Dash sDash; // optional - UnownedPtr<PrivateData> pAttachedData; // optional UnownedPtr<CPWL_Wnd> pParentWnd; // ignore CPWL_MsgControl* pMsgControl; // ignore int32_t eCursorType; // ignore CFX_Matrix mtChild; // ignore }; - CPWL_Wnd(); + explicit CPWL_Wnd(std::unique_ptr<PrivateData> pAttachedData); ~CPWL_Wnd() override; // Returns |true| iff this instance is still allocated. @@ -216,9 +217,8 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> { CPWL_Wnd* GetParentWindow() const { return m_CreationParams.pParentWnd.Get(); } - PrivateData* GetAttachedData() const { - return m_CreationParams.pAttachedData.Get(); - } + const PrivateData* GetAttachedData() const { return m_pAttachedData.get(); } + std::unique_ptr<PrivateData> CloneAttachedData() const; bool WndHitTest(const CFX_PointF& point) const; bool ClientHitTest(const CFX_PointF& point) const; @@ -309,14 +309,15 @@ class CPWL_Wnd : public CPWL_TimerHandler, public Observable<CPWL_Wnd> { CPWL_MsgControl* GetMsgControl() const; CreateParams m_CreationParams; + std::unique_ptr<PrivateData> m_pAttachedData; std::vector<CPWL_Wnd*> m_Children; UnownedPtr<CPWL_ScrollBar> m_pVScrollBar; CFX_FloatRect m_rcWindow; CFX_FloatRect m_rcClip; - bool m_bCreated; - bool m_bVisible; - bool m_bNotifying; - bool m_bEnabled; + bool m_bCreated = false; + bool m_bVisible = false; + bool m_bNotifying = false; + bool m_bEnabled = true; }; #endif // FPDFSDK_PWL_CPWL_WND_H_ |