Do not cache unowned dictionary in CPDF_ShadingPattern.

It may change unexpectedly. We would like to reduce the unowned
ptrs to parser objects over time ...

Change-Id: I394d558a20bb1054c75fccbac4d1b9c57e360966
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53671
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.cpp b/core/fpdfapi/page/cpdf_shadingpattern.cpp
index bb0291d..0a6f4c6 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.cpp
+++ b/core/fpdfapi/page/cpdf_shadingpattern.cpp
@@ -30,14 +30,10 @@
                                          CPDF_Object* pPatternObj,
                                          bool bShading,
                                          const CFX_Matrix& parentMatrix)
-    : CPDF_Pattern(pDoc, bShading ? nullptr : pPatternObj, parentMatrix),
-      m_bShadingObj(bShading),
-      m_pShadingObj(pPatternObj) {
+    : CPDF_Pattern(pDoc, pPatternObj, parentMatrix), m_bShading(bShading) {
   ASSERT(document());
-  if (!bShading) {
-    m_pShadingObj = pattern_obj()->GetDict()->GetDirectObjectFor("Shading");
+  if (!bShading)
     SetPatternToFormMatrix();
-  }
 }
 
 CPDF_ShadingPattern::~CPDF_ShadingPattern() {
@@ -63,8 +59,9 @@
   if (m_ShadingType != kInvalidShading)
     return true;
 
+  const CPDF_Object* pShadingObj = GetShadingObject();
   const CPDF_Dictionary* pShadingDict =
-      m_pShadingObj ? m_pShadingObj->GetDict() : nullptr;
+      pShadingObj ? pShadingObj->GetDict() : nullptr;
   if (!pShadingDict)
     return false;
 
@@ -96,12 +93,17 @@
   return Validate();
 }
 
+const CPDF_Object* CPDF_ShadingPattern::GetShadingObject() const {
+  return m_bShading ? pattern_obj()
+                    : pattern_obj()->GetDict()->GetDirectObjectFor("Shading");
+}
+
 bool CPDF_ShadingPattern::Validate() const {
   if (m_ShadingType == kInvalidShading)
     return false;
 
   // We expect to have a stream if our shading type is a mesh.
-  if (IsMeshShading() && !ToStream(m_pShadingObj.Get()))
+  if (IsMeshShading() && !ToStream(GetShadingObject()))
     return false;
 
   // Validate color space
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.h b/core/fpdfapi/page/cpdf_shadingpattern.h
index dbf8087..a59ee51 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.h
+++ b/core/fpdfapi/page/cpdf_shadingpattern.h
@@ -53,8 +53,8 @@
   bool Load();
 
   ShadingType GetShadingType() const { return m_ShadingType; }
-  bool IsShadingObject() const { return m_bShadingObj; }
-  const CPDF_Object* GetShadingObject() const { return m_pShadingObj.Get(); }
+  bool IsShadingObject() const { return m_bShading; }
+  const CPDF_Object* GetShadingObject() const;
   const CPDF_ColorSpace* GetCS() const { return m_pCS.Get(); }
   const std::vector<std::unique_ptr<CPDF_Function>>& GetFuncs() const {
     return m_pFunctions;
@@ -68,8 +68,7 @@
                          uint32_t nExpectedNumOutputs) const;
 
   ShadingType m_ShadingType = kInvalidShading;
-  const bool m_bShadingObj;
-  UnownedPtr<const CPDF_Object> m_pShadingObj;
+  const bool m_bShading;
 
   // Still keep |m_pCS| as some CPDF_ColorSpace (name object) are not managed
   // as counted objects. Refer to CPDF_DocPageData::GetColorSpace.