Skip to content

Commit c246dbf

Browse files
authored
[Shred] Implement back-end for manual site data shredding (#32197)
Implemented an ability to enforce shred by user request for desktop and android, it means site data cleaning and and related tabs closing. Resolves: brave/brave-browser#50670 --------- Signed-off-by: Vadym Struts <vstruts@brave.com>
1 parent b128593 commit c246dbf

23 files changed

Lines changed: 765 additions & 48 deletions

browser/brave_shields/DEPS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
include_rules = [
22
"+brave/components/brave_shields/core/browser",
3+
"+brave/components/ephemeral_storage",
34
"+brave/components/brave_shields/content/test",
45
"+services/network/host_resolver.h",
56
]

browser/brave_shields/brave_shields_tab_helper.cc

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "base/types/cxx23_to_underlying.h"
1717
#include "brave/browser/brave_shields/brave_shields_settings_service_factory.h"
1818
#include "brave/browser/brave_shields/brave_shields_web_contents_observer.h"
19+
#include "brave/browser/ephemeral_storage/ephemeral_storage_service_factory.h"
1920
#include "brave/components/brave_shields/core/browser/brave_shields_locale_utils.h"
2021
#include "brave/components/brave_shields/core/browser/brave_shields_settings_service.h"
2122
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
@@ -65,8 +66,9 @@ BraveShieldsTabHelper::BraveShieldsTabHelper(content::WebContents* web_contents)
6566
web_contents->GetBrowserContext()))),
6667
brave_shields_settings_(
6768
CHECK_DEREF(BraveShieldsSettingsServiceFactory::GetForProfile(
68-
Profile::FromBrowserContext(
69-
web_contents->GetBrowserContext())))) {
69+
Profile::FromBrowserContext(web_contents->GetBrowserContext())))),
70+
ephemeral_storage_service_(EphemeralStorageServiceFactory::GetForContext(
71+
web_contents->GetBrowserContext())) {
7072
favicon::ContentFaviconDriver::FromWebContents(web_contents)
7173
->AddObserver(this);
7274
observation_.Observe(&*host_content_settings_map_);
@@ -476,6 +478,20 @@ void BraveShieldsTabHelper::BlockAllowedScripts(
476478
ReloadWebContents();
477479
}
478480

481+
void BraveShieldsTabHelper::EnforceSiteDataCleanup() {
482+
auto* site_instance = web_contents()->GetSiteInstance();
483+
CHECK(site_instance);
484+
485+
if (!ephemeral_storage_service_) {
486+
return;
487+
}
488+
489+
// Start manual cleanup.
490+
ephemeral_storage_service_->CleanupTLDFirstPartyStorage(
491+
web_contents()->GetLastCommittedURL(),
492+
site_instance->GetStoragePartitionConfig(), true);
493+
}
494+
479495
void BraveShieldsTabHelper::AllowScriptsOnce(
480496
const std::vector<std::string>& origins) {
481497
BraveShieldsWebContentsObserver* observer =

browser/brave_shields/brave_shields_tab_helper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "base/scoped_observation.h"
1818
#include "brave/components/brave_shields/core/common/brave_shields_panel.mojom.h"
1919
#include "brave/components/brave_shields/core/common/shields_settings.mojom.h"
20+
#include "brave/components/ephemeral_storage/ephemeral_storage_service.h"
2021
#include "components/content_settings/core/browser/content_settings_observer.h"
2122
#include "components/content_settings/core/browser/host_content_settings_map.h"
2223
#include "components/favicon/core/favicon_driver_observer.h"
@@ -86,6 +87,7 @@ class BraveShieldsTabHelper
8687
void SetHttpsUpgradeMode(mojom::HttpsUpgradeMode mode);
8788
void SetIsNoScriptEnabled(bool is_enabled);
8889
void SetForgetFirstPartyStorageEnabled(bool is_enabled);
90+
void EnforceSiteDataCleanup();
8991
void AllowScriptsOnce(const std::vector<std::string>& origins);
9092
void BlockAllowedScripts(const std::vector<std::string>& origins);
9193
void SetWebcompatEnabled(ContentSettingsType webcompat_settings_type,
@@ -146,6 +148,8 @@ class BraveShieldsTabHelper
146148
const raw_ref<BraveShieldsSettingsService> brave_shields_settings_;
147149

148150
PrefChangeRegistrar local_state_change_registrar_;
151+
const raw_ptr<ephemeral_storage::EphemeralStorageService>
152+
ephemeral_storage_service_;
149153

150154
WEB_CONTENTS_USER_DATA_KEY_DECL();
151155
};

browser/brave_shields/sources.gni

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ brave_browser_brave_shields_deps = [
2929
"//brave/components/brave_shields/core/browser",
3030
"//brave/components/brave_shields/core/common",
3131
"//brave/components/constants",
32+
"//brave/components/ephemeral_storage",
3233
"//chrome/browser/profiles:profile",
3334
"//chrome/common",
3435
"//components/content_settings/core/browser",
@@ -49,4 +50,6 @@ if (is_android) {
4950
"//brave/browser/android:android_browser_process",
5051
"//brave/build/android:jni_headers",
5152
]
53+
} else {
54+
brave_browser_brave_shields_deps += [ "//brave/browser/ui/tabs:tab_strip" ]
5255
}

browser/ephemeral_storage/DEPS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
include_rules = [
22
"+brave/components/ephemeral_storage",
33
"+brave/components/brave_shields/content/test",
4+
"+brave/build/android/jni_headers/TabUtils_jni.h",
45
"!brave/components/brave_component_updater/browser/local_data_files_service.h",
56
"!brave/components/brave_component_updater/browser/local_data_files_observer.h",
67
]

browser/ephemeral_storage/brave_ephemeral_storage_service_delegate.cc

Lines changed: 126 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,97 @@
55

66
#include "brave/browser/ephemeral_storage/brave_ephemeral_storage_service_delegate.h"
77

8+
#include <memory>
89
#include <utility>
10+
#include <vector>
911

1012
#include "base/check.h"
13+
#include "base/containers/flat_set.h"
14+
#include "base/functional/bind.h"
15+
#include "base/functional/callback_helpers.h"
1116
#include "base/logging.h"
17+
#include "base/memory/raw_ptr.h"
1218
#include "base/memory/scoped_refptr.h"
19+
#include "brave/browser/brave_shields/brave_shields_settings_service_factory.h"
20+
#include "brave/browser/ephemeral_storage/ephemeral_storage_tab_helper.h"
21+
#include "brave/components/brave_shields/core/browser/brave_shields_settings_service.h"
1322
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
1423
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_constants.h"
1524
#include "chrome/browser/profiles/profile.h"
25+
#include "chrome/browser/ui/browser_finder.h"
26+
#include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
1627
#include "components/content_settings/core/browser/host_content_settings_map.h"
28+
#include "components/tabs/public/tab_interface.h"
1729
#include "content/public/browser/browser_context.h"
1830
#include "content/public/browser/browsing_data_filter_builder.h"
1931
#include "content/public/browser/browsing_data_remover.h"
20-
#include "content/public/browser/dom_storage_context.h"
32+
#include "content/public/browser/render_process_host.h"
33+
#include "content/public/browser/web_contents.h"
2134
#include "net/base/features.h"
2235
#include "net/base/schemeful_site.h"
36+
#include "net/base/url_util.h"
2337
#include "url/origin.h"
2438

2539
#if !BUILDFLAG(IS_ANDROID)
40+
#include "brave/browser/ui/brave_browser.h"
2641
#include "chrome/browser/ui/browser.h"
2742
#include "chrome/browser/ui/browser_list.h"
43+
#include "chrome/browser/ui/tabs/tab_strip_model.h"
44+
#else
45+
#include "chrome/browser/android/tab_android.h"
46+
#include "chrome/browser/ui/android/tab_model/tab_model.h"
47+
#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
48+
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
2849
#endif
2950

51+
namespace {
52+
53+
bool PrepareTabForFirstPartyStorageCleanup(tabs::TabHandle tab_handle,
54+
const std::string& etldplusone) {
55+
if (tab_handle == tabs::TabHandle::Null()) {
56+
return false;
57+
}
58+
auto* tab = tab_handle.Get();
59+
if (!tab) {
60+
return false;
61+
}
62+
63+
content::WebContents* contents = tab->GetContents();
64+
if (!contents) {
65+
return false;
66+
}
67+
68+
const auto tab_tld =
69+
net::URLToEphemeralStorageDomain(contents->GetLastCommittedURL());
70+
if (tab_tld.empty() || tab_tld != etldplusone) {
71+
return false;
72+
}
73+
if (auto* ephemeral_storage_tab_helper =
74+
ephemeral_storage::EphemeralStorageTabHelper::FromWebContents(
75+
contents)) {
76+
ephemeral_storage_tab_helper->EnforceFirstPartyStorageCleanup();
77+
return true;
78+
}
79+
return false;
80+
}
81+
82+
} // namespace
83+
3084
namespace ephemeral_storage {
3185

3286
BraveEphemeralStorageServiceDelegate::BraveEphemeralStorageServiceDelegate(
3387
content::BrowserContext* context,
3488
HostContentSettingsMap* host_content_settings_map,
35-
scoped_refptr<content_settings::CookieSettings> cookie_settings)
89+
scoped_refptr<content_settings::CookieSettings> cookie_settings,
90+
brave_shields::BraveShieldsSettingsService* shields_settings_service)
3691
: context_(context),
3792
host_content_settings_map_(host_content_settings_map),
38-
cookie_settings_(std::move(cookie_settings)) {
93+
cookie_settings_(std::move(cookie_settings)),
94+
shields_settings_service_(shields_settings_service) {
3995
DCHECK(context_);
4096
DCHECK(host_content_settings_map_);
4197
DCHECK(cookie_settings_);
98+
CHECK(shields_settings_service_);
4299
}
43100

44101
BraveEphemeralStorageServiceDelegate::~BraveEphemeralStorageServiceDelegate() {
@@ -145,4 +202,70 @@ void BraveEphemeralStorageServiceDelegate::OnBrowserAdded(Browser* browser) {
145202
}
146203
#endif
147204

205+
void BraveEphemeralStorageServiceDelegate::
206+
PrepareTabsForFirstPartyStorageCleanup(
207+
const std::string& ephemeral_domain) {
208+
auto* profile = Profile::FromBrowserContext(context_);
209+
CHECK(profile);
210+
211+
#if !BUILDFLAG(IS_ANDROID)
212+
for (auto* browser : GetAllBrowserWindowInterfaces()) {
213+
if (profile != browser->GetProfile()) {
214+
continue;
215+
}
216+
auto* tab_strip = browser->GetTabStripModel();
217+
if (!tab_strip) {
218+
continue;
219+
}
220+
221+
base::flat_set<tabs::TabHandle> tab_handlers;
222+
for (auto* tab : *tab_strip) {
223+
if (!tab || !PrepareTabForFirstPartyStorageCleanup(tab->GetHandle(),
224+
ephemeral_domain)) {
225+
continue;
226+
}
227+
tab_handlers.emplace(tab->GetHandle());
228+
}
229+
static_cast<BraveBrowser*>(browser)->SetTabsToIgnoreBeforeUnloadHandlers(
230+
tab_handlers);
231+
232+
for (auto& tab_handle : tab_handlers) {
233+
if (tab_handle == tabs::TabHandle::Null() || !tab_handle.Get()) {
234+
continue;
235+
}
236+
237+
// initiate the closing of the tab
238+
tab_handle.Get()->Close();
239+
}
240+
}
241+
#else
242+
for (TabModel* model : TabModelList::models()) {
243+
const size_t tab_count = model->GetTabCount();
244+
std::vector<tabs::TabHandle> tabs_to_close;
245+
for (size_t index = 0; index < tab_count; index++) {
246+
auto* tab = model->GetTabAt(index);
247+
// Do not process tabs from other profiles.
248+
if (!tab || profile != tab->profile()) {
249+
continue;
250+
}
251+
252+
if (!PrepareTabForFirstPartyStorageCleanup(tab->GetHandle(),
253+
ephemeral_domain)) {
254+
continue;
255+
}
256+
tabs_to_close.emplace_back(tab->GetHandle());
257+
}
258+
for (auto& tab_handle : tabs_to_close) {
259+
tab_handle.Get()->Close();
260+
}
261+
}
262+
#endif
263+
}
264+
265+
bool BraveEphemeralStorageServiceDelegate::
266+
IsShieldsDisabledOnAnyHostMatchingDomainOf(const GURL& url) const {
267+
return shields_settings_service_->IsShieldsDisabledOnAnyHostMatchingDomainOf(
268+
url);
269+
}
270+
148271
} // namespace ephemeral_storage

browser/ephemeral_storage/brave_ephemeral_storage_service_delegate.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
#ifndef BRAVE_BROWSER_EPHEMERAL_STORAGE_BRAVE_EPHEMERAL_STORAGE_SERVICE_DELEGATE_H_
77
#define BRAVE_BROWSER_EPHEMERAL_STORAGE_BRAVE_EPHEMERAL_STORAGE_SERVICE_DELEGATE_H_
88

9+
#include <memory>
10+
911
#include "base/memory/raw_ptr.h"
1012
#include "base/memory/scoped_refptr.h"
13+
#include "brave/components/brave_shields/core/browser/brave_shields_settings_service.h"
1114
#include "brave/components/ephemeral_storage/ephemeral_storage_service_delegate.h"
1215
#include "components/content_settings/core/browser/cookie_settings.h"
16+
#include "content/public/browser/web_contents_delegate.h"
1317

1418
#if !BUILDFLAG(IS_ANDROID)
1519
#include "chrome/browser/ui/browser_list_observer.h"
@@ -32,7 +36,8 @@ class BraveEphemeralStorageServiceDelegate :
3236
BraveEphemeralStorageServiceDelegate(
3337
content::BrowserContext* context,
3438
HostContentSettingsMap* host_content_settings_map,
35-
scoped_refptr<content_settings::CookieSettings> cookie_settings);
39+
scoped_refptr<content_settings::CookieSettings> cookie_settings,
40+
brave_shields::BraveShieldsSettingsService* shields_settings_service);
3641
~BraveEphemeralStorageServiceDelegate() override;
3742

3843
#if !BUILDFLAG(IS_ANDROID)
@@ -44,6 +49,10 @@ class BraveEphemeralStorageServiceDelegate :
4449
void CleanupTLDEphemeralArea(const TLDEphemeralAreaKey& key) override;
4550
void CleanupFirstPartyStorageArea(const TLDEphemeralAreaKey& key) override;
4651
void RegisterFirstWindowOpenedCallback(base::OnceClosure callback) override;
52+
void PrepareTabsForFirstPartyStorageCleanup(
53+
const std::string& ephemeral_domain) override;
54+
bool IsShieldsDisabledOnAnyHostMatchingDomainOf(
55+
const GURL& url) const override;
4756

4857
private:
4958
raw_ptr<content::BrowserContext> context_ = nullptr;
@@ -52,6 +61,8 @@ class BraveEphemeralStorageServiceDelegate :
5261
#if !BUILDFLAG(IS_ANDROID)
5362
base::OnceClosure first_window_opened_callback_;
5463
#endif // !BUILDFLAG(IS_ANDROID)
64+
raw_ptr<brave_shields::BraveShieldsSettingsService>
65+
shields_settings_service_ = nullptr;
5566
};
5667

5768
} // namespace ephemeral_storage

0 commit comments

Comments
 (0)