Use WeakPtr for callbacks in BrowsingDataRemoverEfl 41/316941/3
authorChandan Padhi <c.padhi@samsung.com>
Fri, 30 Aug 2024 10:47:58 +0000 (16:17 +0530)
committerBot Blink <blinkbot@samsung.com>
Sat, 31 Aug 2024 07:10:54 +0000 (07:10 +0000)
It seems BrowsingDataRemoverEfl is already destroyed by the time its
callbacks are executed. Therefore, use of base::Unretained(this) may
result in crash due to unretained dangling pointer when the tasks are
run.

This commit replaces Unretained with weak ptr to fix the crash reported
in the KONA issue DF240830-00534.

Change-Id: I1db1bba496ec880d240d3be4776b03609ae8e42b
Signed-off-by: Chandan Padhi <c.padhi@samsung.com>
tizen_src/ewk/efl_integration/browser/browsing_data_remover_efl.cc
tizen_src/ewk/efl_integration/browser/browsing_data_remover_efl.h

index 9e0c8bd12942188d7f0635002c9faee0e55f1e68..42798d470311fdb57d8dae8f5986e3bba9b9d8aa 100644 (file)
@@ -66,6 +66,7 @@ BrowsingDataRemoverEfl::BrowsingDataRemoverEfl(
             << " browser_context = " << (browser_context_ != nullptr)
             << " delete_begin_ = " << delete_begin_
             << " delete_end_ = " << delete_end_;
+  weak_this_ = weak_factory_.GetWeakPtr();
 }
 
 BrowsingDataRemoverEfl::~BrowsingDataRemoverEfl() {
@@ -139,9 +140,10 @@ void BrowsingDataRemoverEfl::RemoveImpl(int remove_mask,
           browser_context_->GetStoragePartition(NULL)->GetQuotaManager();
     }
     waiting_for_clear_quota_managed_data_ = true;
-    content::GetIOThreadTaskRunner({})->PostTask(FROM_HERE,
+    content::GetIOThreadTaskRunner({})->PostTask(
+        FROM_HERE,
         base::BindOnce(&BrowsingDataRemoverEfl::ClearQuotaManagedDataOnIOThread,
-                       base::Unretained(this)));
+                       weak_this_));
   }
 }
 
@@ -149,9 +151,8 @@ void BrowsingDataRemoverEfl::ClearLocalStorageOnUIThread() {
   DCHECK(waiting_for_clear_local_storage_);
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
 
-  dom_storage_context_->GetLocalStorageUsage(
-      base::BindOnce(&BrowsingDataRemoverEfl::OnGotLocalStorageUsageInfo,
-                     base::Unretained(this)));
+  dom_storage_context_->GetLocalStorageUsage(base::BindOnce(
+      &BrowsingDataRemoverEfl::OnGotLocalStorageUsageInfo, weak_this_));
 }
 
 void BrowsingDataRemoverEfl::OnGotLocalStorageUsageInfo(
@@ -174,9 +175,8 @@ void BrowsingDataRemoverEfl::ClearSessionStorageOnUIThread() {
   DCHECK(waiting_for_clear_session_storage_);
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
 
-  dom_storage_context_->GetSessionStorageUsage(
-      base::BindOnce(&BrowsingDataRemoverEfl::OnGotSessionStorageUsageInfo,
-                     base::Unretained(this)));
+  dom_storage_context_->GetSessionStorageUsage(base::BindOnce(
+      &BrowsingDataRemoverEfl::OnGotSessionStorageUsageInfo, weak_this_));
 }
 
 void BrowsingDataRemoverEfl::OnGotSessionStorageUsageInfo(
@@ -214,7 +214,7 @@ void BrowsingDataRemoverEfl::ClearQuotaManagedDataInternal(
   quota_manager_->GetBucketsModifiedBetween(
       type, delete_begin_, delete_end_,
       base::BindOnce(&BrowsingDataRemoverEfl::OnGotQuotaManagedBuckets,
-                     base::Unretained(this)));
+                     weak_this_));
 }
 
 void BrowsingDataRemoverEfl::OnGotQuotaManagedBuckets(
@@ -234,7 +234,7 @@ void BrowsingDataRemoverEfl::OnGotQuotaManagedBuckets(
     quota_manager_->DeleteBucketData(
         bucket, quota_client_types,
         base::BindOnce(&BrowsingDataRemoverEfl::OnQuotaManagedBucketDeleted,
-                       base::Unretained(this), bucket));
+                       weak_this_, bucket));
   }
 
   --quota_managed_storage_types_to_delete_count_;
@@ -263,9 +263,10 @@ void BrowsingDataRemoverEfl::CheckQuotaManagedDataDeletionStatus() {
       quota_managed_origins_to_delete_count_ != 0)
   return;
 
-  content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE,
+  content::GetUIThreadTaskRunner({})->PostTask(
+      FROM_HERE,
       base::BindOnce(&BrowsingDataRemoverEfl::OnQuotaManagedDataDeleted,
-                     base::Unretained(this)));
+                     weak_this_));
 }
 
 void BrowsingDataRemoverEfl::OnQuotaManagedDataDeleted() {
index 6c8885a3d1984d801cfda1e198554477a7ae5c7e..0e949c414bcdb7d010feb4c6d3510bfbab24137e 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "content/public/browser/notification_observer.h"
@@ -134,5 +135,8 @@ class BrowsingDataRemoverEfl {
 
   // The origin for the current removal operation.
   url::Origin remove_origin_;
+
+  base::WeakPtr<BrowsingDataRemoverEfl> weak_this_;
+  base::WeakPtrFactory<BrowsingDataRemoverEfl> weak_factory_{this};
 };
 #endif