Add missing reflexive equality operators to RetainPtr<>

Use where appropriate.

Change-Id: Ibf17ff88d9669e45498d3eabbfbfd8d97944b536
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59470
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp
index 8a8edd7..00936a3 100644
--- a/core/fpdfapi/edit/cpdf_creator.cpp
+++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -154,7 +154,7 @@
     return false;
 
   std::unique_ptr<CPDF_Encryptor> encryptor;
-  if (GetCryptoHandler() && pObj != m_pEncryptDict.Get())
+  if (GetCryptoHandler() && pObj != m_pEncryptDict)
     encryptor = pdfium::MakeUnique<CPDF_Encryptor>(GetCryptoHandler(), objnum);
 
   if (!pObj->WriteTo(m_Archive.get(), encryptor.get()))
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index 1365f8a..c20abba 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -1130,7 +1130,7 @@
     return 0;
 
   const CPDF_Object* pBaseObj = pArray->GetDirectObjectAt(1);
-  if (pBaseObj == m_pArray.Get())
+  if (pBaseObj == m_pArray)
     return 0;
 
   auto* pDocPageData = CPDF_DocPageData::FromDocument(pDoc);
@@ -1229,7 +1229,7 @@
 
   m_Type = Colorant;
   const CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2);
-  if (pAltCS == m_pArray.Get())
+  if (pAltCS == m_pArray)
     return 0;
 
   m_pAltCS = Load(pDoc, pAltCS, pVisited);
@@ -1309,7 +1309,7 @@
     return 0;
 
   const CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2);
-  if (!pAltCS || pAltCS == m_pArray.Get())
+  if (!pAltCS || pAltCS == m_pArray)
     return 0;
 
   m_pAltCS = Load(pDoc, pAltCS, pVisited);
diff --git a/core/fpdfapi/page/cpdf_patterncs.cpp b/core/fpdfapi/page/cpdf_patterncs.cpp
index 1887ae6..1c5dc6c 100644
--- a/core/fpdfapi/page/cpdf_patterncs.cpp
+++ b/core/fpdfapi/page/cpdf_patterncs.cpp
@@ -23,7 +23,7 @@
                                 const CPDF_Array* pArray,
                                 std::set<const CPDF_Object*>* pVisited) {
   const CPDF_Object* pBaseCS = pArray->GetDirectObjectAt(1);
-  if (pBaseCS == m_pArray.Get())
+  if (pBaseCS == m_pArray)
     return 0;
 
   auto* pDocPageData = CPDF_DocPageData::FromDocument(pDoc);
diff --git a/core/fpdfapi/parser/cpdf_object_avail.cpp b/core/fpdfapi/parser/cpdf_object_avail.cpp
index 9d92c11..1dc5125 100644
--- a/core/fpdfapi/parser/cpdf_object_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_object_avail.cpp
@@ -92,7 +92,7 @@
 
     const CPDF_ReadValidator::Session parse_session(validator_);
     const CPDF_Object* direct = holder_->GetOrParseIndirectObject(obj_num);
-    if (direct == root_.Get())
+    if (direct == root_)
       continue;
 
     if (validator_->has_read_problems() ||
@@ -117,9 +117,9 @@
 
     // Skip if this object if it's an inlined root, the parent object or
     // explicitily excluded.
-    const bool skip = (walker.GetParent() && obj == root_.Get()) ||
+    const bool skip = (walker.GetParent() && obj == root_) ||
                       walker.dictionary_key() == "Parent" ||
-                      (obj != root_.Get() && ExcludeObject(obj));
+                      (obj != root_ && ExcludeObject(obj));
 
     // We need to parse the object before we can do the exclusion check.
     // This is because the exclusion check may check against a referenced
diff --git a/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp b/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp
index 7de4e9a..4dde72f 100644
--- a/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_walker_unittest.cpp
@@ -112,7 +112,7 @@
   int non_array_objects = 0;
   CPDF_ObjectWalker walker(root_array.Get());
   while (const CPDF_Object* obj = walker.GetNext()) {
-    if (obj != root_array.Get() && obj->IsArray()) {
+    if (obj != root_array && obj->IsArray()) {
       // skip other array except root.
       walker.SkipWalkIntoCurrentObject();
     }
diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp
index 8341ca1..d50db34 100644
--- a/core/fpdfapi/parser/cpdf_reference.cpp
+++ b/core/fpdfapi/parser/cpdf_reference.cpp
@@ -107,7 +107,7 @@
 
 RetainPtr<CPDF_Object> CPDF_Reference::MakeReference(
     CPDF_IndirectObjectHolder* holder) const {
-  ASSERT(holder == m_pObjList.Get());
+  ASSERT(holder == m_pObjList);
   // Do not allow reference to reference, just create other reference for same
   // object.
   return pdfium::MakeRetain<CPDF_Reference>(holder, GetRefObjNum());
diff --git a/core/fxcrt/retain_ptr.h b/core/fxcrt/retain_ptr.h
index 688a622..5cfc231 100644
--- a/core/fxcrt/retain_ptr.h
+++ b/core/fxcrt/retain_ptr.h
@@ -125,6 +125,16 @@
   mutable intptr_t m_nRefCount = 0;
 };
 
+template <typename T, typename U>
+inline bool operator==(const U* lhs, const RetainPtr<T>& rhs) {
+  return rhs == lhs;
+}
+
+template <typename T, typename U>
+inline bool operator!=(const U* lhs, const RetainPtr<T>& rhs) {
+  return rhs != lhs;
+}
+
 }  // namespace fxcrt
 
 using fxcrt::ReleaseDeleter;
diff --git a/core/fxcrt/retain_ptr_unittest.cpp b/core/fxcrt/retain_ptr_unittest.cpp
index 4405cd2..47277df 100644
--- a/core/fxcrt/retain_ptr_unittest.cpp
+++ b/core/fxcrt/retain_ptr_unittest.cpp
@@ -217,6 +217,17 @@
   EXPECT_FALSE(obj1_ptr1 == obj2_ptr1);
 }
 
+TEST(RetainPtr, EqualsReflexive) {
+  PseudoRetainable obj1;
+  PseudoRetainable obj2;
+  RetainPtr<PseudoRetainable> obj1_ptr(&obj1);
+  RetainPtr<PseudoRetainable> obj2_ptr(&obj2);
+  EXPECT_TRUE(&obj1 == obj1_ptr);
+  EXPECT_FALSE(&obj1 == obj2_ptr);
+  EXPECT_FALSE(&obj2 == obj1_ptr);
+  EXPECT_TRUE(&obj2 == obj2_ptr);
+}
+
 TEST(RetainPtr, NotEquals) {
   PseudoRetainable obj1;
   PseudoRetainable obj2;
@@ -236,6 +247,17 @@
   EXPECT_TRUE(obj1_ptr1 != obj2_ptr1);
 }
 
+TEST(RetainPtr, NotEqualsReflexive) {
+  PseudoRetainable obj1;
+  PseudoRetainable obj2;
+  RetainPtr<PseudoRetainable> obj1_ptr(&obj1);
+  RetainPtr<PseudoRetainable> obj2_ptr(&obj2);
+  EXPECT_FALSE(&obj1 != obj1_ptr);
+  EXPECT_TRUE(&obj1 != obj2_ptr);
+  EXPECT_TRUE(&obj2 != obj1_ptr);
+  EXPECT_FALSE(&obj2 != obj2_ptr);
+}
+
 TEST(RetainPtr, LessThan) {
   PseudoRetainable objs[2];
   RetainPtr<PseudoRetainable> obj1_ptr(&objs[0]);
diff --git a/xfa/fwl/cfwl_messagekillfocus.h b/xfa/fwl/cfwl_messagekillfocus.h
index 56cfc39..b94fc3f 100644
--- a/xfa/fwl/cfwl_messagekillfocus.h
+++ b/xfa/fwl/cfwl_messagekillfocus.h
@@ -23,7 +23,7 @@
   std::unique_ptr<CFWL_Message> Clone() override;
 
   bool IsFocusedOnWidget(const CFWL_Widget* pWidget) const {
-    return pWidget == m_pSetFocus.Get();
+    return pWidget == m_pSetFocus;
   }
 
  private: