Clear browsing data on exit when instructed by the user.

Fixes brave/brave-browser#492

1. Adds a new "On exit" tab to chrome://settings/clearBrowserData dialog
with the same options as on the "Advanced" tab and a "Save" button. By
default all "On exit" options are turned off. When an option is modified
from the current state the Save button becomes enabled and allows the
user to save the "on exit" options. The options are saved to profile's
preferences: new *OnExit preferences have been added for each option.

2. Clear browsing data on exit functionality is triggered from
BraveBrowserMainParts::PreShutdown override. For each loaded profile
the code checks if user selected any on exit options and if so then a
BrowsingDataRemover is called.

3. Adds BraveClearDataOnExitTest and BraveClearDataOnExitTwoBrowsersTest
browser tests that verify that:
- the removal of the browsing data is triggered only when an "on exit"
  preference is set;
- the removal flags are constrcuted correctly;
- the removal is called only when the browser is exiting (tests with
  OTR/Guest/multiple profiles).
This commit is contained in:
Max Karolinskiy
2019-02-28 22:42:45 -05:00
parent 157249f20c
commit 02e63a950d
23 changed files with 1130 additions and 2 deletions
+4
View File
@@ -373,6 +373,10 @@ By installing this extension, you are agreeing to the Google Widevine Terms of U
<message name="IDS_MD_EXTENSIONS_BRAVE_ITEM_CHROME_WEB_STORE" desc="Label for button to visit the Web Extensions Store.">
View in Web Extensions Store
</message>
<!-- Brave Clear Browsing Data On Exit Settings -->
<message name="IDS_SETTINGS_BRAVE_ON_EXIT" desc="Clear Browsing Data dialog On exit tab label">
On exit
</message>
</messages>
<includes>
<include name="IDR_BRAVE_TAG_SERVICES_POLYFILL" file="resources/js/tag_services_polyfill.js" type="BINDATA" />
+5
View File
@@ -12,6 +12,8 @@ source_set("browser_process") {
"bookmarks/brave_bookmark_client.h",
"brave_browser_main_extra_parts.cc",
"brave_browser_main_extra_parts.h",
"brave_browser_main_parts.cc",
"brave_browser_main_parts.h",
"brave_browser_main_parts_mac.mm",
"brave_browser_main_parts_mac.h",
"brave_browser_process_impl.cc",
@@ -34,6 +36,8 @@ source_set("browser_process") {
"brave_rewards/donations_dialog.h",
"browser_context_keyed_service_factories.cc",
"browser_context_keyed_service_factories.h",
"browsing_data/brave_clear_browsing_data.cc",
"browsing_data/brave_clear_browsing_data.h",
"component_updater/brave_component_installer.cc",
"component_updater/brave_component_installer.h",
"component_updater/brave_component_updater_configurator.cc",
@@ -72,6 +76,7 @@ source_set("browser_process") {
"//brave/components/content_settings/core/browser",
"//brave/components/services:brave_content_manifest_overlays",
"//chrome/common",
"//components/browsing_data/core",
"//components/component_updater",
"//components/prefs",
"//components/safe_browsing/common:safe_browsing_prefs",
+12
View File
@@ -0,0 +1,12 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/browser/brave_browser_main_parts.h"
#include "brave/browser/browsing_data/brave_clear_browsing_data.h"
void BraveBrowserMainParts::PreShutdown() {
content::BraveClearBrowsingData::ClearOnExit();
ChromeBrowserMainParts::PreShutdown();
}
+27
View File
@@ -0,0 +1,27 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_BROWSER_BRAVE_BROWSER_MAIN_PARTS_H_
#define BRAVE_BROWSER_BRAVE_BROWSER_MAIN_PARTS_H_
#include "base/macros.h"
#include "chrome/browser/chrome_browser_main.h"
class BraveBrowserMainParts : public ChromeBrowserMainParts {
public:
using ChromeBrowserMainParts::ChromeBrowserMainParts;
~BraveBrowserMainParts() override = default;
// ChromeBrowserMainParts overrides:
// Marking this method final so that if any of the OS specific subclasses
// (e.g. ChromeBrowserMainPartsWin) decides to override this method in the
// future we would get a compilation error.
void PreShutdown() final;
private:
DISALLOW_COPY_AND_ASSIGN(BraveBrowserMainParts);
};
#endif // BRAVE_BROWSER_BRAVE_BROWSER_MAIN_PARTS_H_
@@ -0,0 +1,188 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/browser/browsing_data/brave_clear_browsing_data.h"
#include <vector>
#include "base/run_loop.h"
#include "base/scoped_observer.h"
#include "base/trace_event/common/trace_event_common.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/pref_names.h"
#include "components/browsing_data/core/pref_names.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browsing_data_remover.h"
namespace content {
namespace {
using content::BraveClearBrowsingData;
class BrowsingDataRemovalWatcher
: public content::BrowsingDataRemover::Observer {
public:
BrowsingDataRemovalWatcher() : observer_(this) {}
void ClearBrowsingDataForLoadedProfiles(
BraveClearBrowsingData::OnExitTestingCallback* testing_callback);
// BrowsingDataRemover::Observer implementation.
void OnBrowsingDataRemoverDone() override;
private:
bool GetClearBrowsingDataOnExitSettings(const Profile* profile,
int* remove_mask,
int* origin_mask);
void Wait();
int num_profiles_to_clear_ = 0;
base::RunLoop run_loop_;
// Keep track of the set of BrowsingDataRemover instances this object has
// attached itself to as an observer. When ScopedObserver is destroyed it
// removes this object as an observer from all those instances.
ScopedObserver<content::BrowsingDataRemover,
content::BrowsingDataRemover::Observer>
observer_;
};
// See ClearBrowsingDataHandler::HandleClearBrowsingData which constructs the
// remove_mask and the origin_mask for the same functionality not on exit.
bool BrowsingDataRemovalWatcher::GetClearBrowsingDataOnExitSettings(
const Profile* profile,
int* remove_mask,
int* origin_mask) {
DCHECK(remove_mask);
DCHECK(origin_mask);
const PrefService* prefs = profile->GetPrefs();
*remove_mask = 0;
*origin_mask = 0;
int site_data_mask = ChromeBrowsingDataRemoverDelegate::DATA_TYPE_SITE_DATA;
// Don't try to clear LSO data if it's not supported.
if (!prefs->GetBoolean(prefs::kClearPluginLSODataEnabled))
site_data_mask &= ~ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA;
if (prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryOnExit) &&
prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory))
*remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY;
if (prefs->GetBoolean(browsing_data::prefs::kDeleteDownloadHistoryOnExit) &&
prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory))
*remove_mask |= content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS;
if (prefs->GetBoolean(browsing_data::prefs::kDeleteCacheOnExit))
*remove_mask |= content::BrowsingDataRemover::DATA_TYPE_CACHE;
if (prefs->GetBoolean(browsing_data::prefs::kDeleteCookiesOnExit)) {
*remove_mask |= site_data_mask;
*origin_mask |= content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB;
}
if (prefs->GetBoolean(browsing_data::prefs::kDeletePasswordsOnExit))
*remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS;
if (prefs->GetBoolean(browsing_data::prefs::kDeleteFormDataOnExit))
*remove_mask |= ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA;
if (prefs->GetBoolean(browsing_data::prefs::kDeleteHostedAppsDataOnExit)) {
*remove_mask |= site_data_mask;
*origin_mask |= content::BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB;
}
// Note: this will also delete Brave Shields site-specific settings.
// Corresponds to "Content settings" checkbox in the Clear Browsing Data
// dialog.
if (prefs->GetBoolean(browsing_data::prefs::kDeleteSiteSettingsOnExit))
*remove_mask |=
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_CONTENT_SETTINGS;
return (*remove_mask != 0);
}
// This method will, for each loaded profile that is not off-the-record, gather
// the user specified types of data that need to be cleared. It will then get
// the BrowsingDataRemover for that profile and call its RemoveAndReply method.
// BrowsingDataRemover will create a number of tasks to clear the data. Because
// these tasks, on their own, will neither prevent shutdown nor stop the profile
// from being destroyed, we have to block shutdown execution from proceeding any
// further. Otherwise the tasks will be cancelled and the profiles destroyed.
// Since we can't actually block the UI thread, instead we implement the Wait
// method below, which just runs a RunLoop. When a BrowsingDataRemover finishes
// its tasks it will reply back to us by calling the OnBrowsingDataRemoverDone
// method below. When that happens we decrement the counter of profiles that
// need to be cleared. Once the counter reaches 0 we exit the RunLoop and let
// shutdown proceed.
void BrowsingDataRemovalWatcher::ClearBrowsingDataForLoadedProfiles(
BraveClearBrowsingData::OnExitTestingCallback* testing_callback) {
ProfileManager* profile_manager = g_browser_process->profile_manager();
DCHECK(profile_manager);
std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles();
for (Profile* profile : profiles) {
if (profile->IsOffTheRecord())
continue;
int remove_mask;
int origin_mask;
if (!GetClearBrowsingDataOnExitSettings(profile, &remove_mask,
&origin_mask))
continue;
++num_profiles_to_clear_;
content::BrowsingDataRemover* remover =
content::BrowserContext::GetBrowsingDataRemover(profile);
observer_.Add(remover);
if (testing_callback)
testing_callback->BeforeClearOnExitRemoveData(remover, remove_mask,
origin_mask);
remover->RemoveAndReply(base::Time(), base::Time::Max(), remove_mask,
origin_mask, this);
}
Wait();
}
void BrowsingDataRemovalWatcher::Wait() {
if (num_profiles_to_clear_ > 0)
run_loop_.Run();
}
void BrowsingDataRemovalWatcher::OnBrowsingDataRemoverDone() {
--num_profiles_to_clear_;
if (num_profiles_to_clear_ > 0)
return;
run_loop_.Quit();
}
} // namespace
BraveClearBrowsingData::OnExitTestingCallback*
BraveClearBrowsingData::on_exit_testing_callback_ = nullptr;
// static
void BraveClearBrowsingData::ClearOnExit() {
TRACE_EVENT0("browser", "BraveClearBrowsingData::ClearOnExit");
// Do not clear browsing data when the OS is ending session (logout/reboot/
// shutdown) to avoid corrupting data if the process is killed.
if (browser_shutdown::GetShutdownType() == browser_shutdown::END_SESSION) {
LOG(INFO) << "Will not clear browsing data on exit due to session ending.";
return;
}
BrowsingDataRemovalWatcher watcher;
watcher.ClearBrowsingDataForLoadedProfiles(on_exit_testing_callback_);
}
// static
void BraveClearBrowsingData::SetOnExitTestingCallback(
OnExitTestingCallback* callback) {
on_exit_testing_callback_ = callback;
}
} // namespace content
@@ -0,0 +1,50 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_BROWSER_BROWSING_DATA_BRAVE_CLEAR_BROWSING_DATA_H_
#define BRAVE_BROWSER_BROWSING_DATA_BRAVE_CLEAR_BROWSING_DATA_H_
#include "base/macros.h"
namespace content {
class BrowsingDataRemover;
}
class Profile;
class BraveClearDataOnExitTest;
namespace content {
class BraveClearBrowsingData {
public:
// Clears browsing data for all loaded non-off-the-record profiles.
// Profile's *OnExit preferences determine what gets cleared.
// Note: this method will wait until browsing data has been cleared.
static void ClearOnExit();
// Used for testing only.
struct OnExitTestingCallback {
// Called from ClearOnExit right before the call to BrowsingDataRemover
// to remove data.
virtual void BeforeClearOnExitRemoveData(
content::BrowsingDataRemover* remover,
int remove_mask,
int origin_mask) = 0;
};
protected:
friend class ::BraveClearDataOnExitTest;
// Used for testing only.
static void SetOnExitTestingCallback(OnExitTestingCallback* callback);
private:
static OnExitTestingCallback* on_exit_testing_callback_;
DISALLOW_COPY_AND_ASSIGN(BraveClearBrowsingData);
};
} // namespace content
#endif // BRAVE_BROWSER_BROWSING_DATA_BRAVE_CLEAR_BROWSING_DATA_H_
@@ -0,0 +1,389 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/task/post_task.h"
#include "base/test/scoped_feature_list.h"
#include "brave/browser/browsing_data/brave_clear_browsing_data.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/search_test_utils.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/browsing_data/core/pref_names.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browsing_data_remover.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
using content::BraveClearBrowsingData;
using content::WebContents;
namespace {
class BrowserRemovedObserver : public BrowserListObserver {
public:
BrowserRemovedObserver() : removed_browser_(nullptr) {
BrowserList::AddObserver(this);
original_browsers_count_ = BrowserList::GetInstance()->size();
}
~BrowserRemovedObserver() override { BrowserList::RemoveObserver(this); }
Browser* CheckReturn() const {
EXPECT_EQ(original_browsers_count_ - 1, chrome::GetTotalBrowserCount());
return removed_browser_;
}
// Wait for a new browser to be removed.
Browser* WaitForBrowserRemoval() {
if (removed_browser_)
return CheckReturn();
run_loop_.Run();
EXPECT_NE(removed_browser_, nullptr);
return CheckReturn();
}
private:
// BrowserListObserver
void OnBrowserRemoved(Browser* browser) override {
removed_browser_ = browser;
run_loop_.Quit();
}
size_t original_browsers_count_;
Browser* removed_browser_;
base::RunLoop run_loop_;
DISALLOW_COPY_AND_ASSIGN(BrowserRemovedObserver);
};
} // namespace
class BraveClearDataOnExitTest
: public InProcessBrowserTest,
public BraveClearBrowsingData::OnExitTestingCallback {
public:
BraveClearDataOnExitTest() = default;
void SetUpOnMainThread() override {
BraveClearBrowsingData::SetOnExitTestingCallback(this);
}
void TearDownOnMainThread() override {
// Borrowed from browser_browsertest.cc.
// Cycle the MessageLoop: one for each browser.
for (unsigned int i = 0; i < browsers_count_; ++i)
content::RunAllPendingInMessageLoop();
// Run the application event loop to completion, which will cycle the
// native MessagePump on all platforms.
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated());
base::RunLoop().Run();
// Take care of any remaining message loop work.
content::RunAllPendingInMessageLoop();
// At this point, quit should be for real now.
ASSERT_EQ(0u, chrome::GetTotalBrowserCount());
}
void TearDownInProcessBrowserTestFixture() override {
// Verify expected number of calls to remove browsing data.
EXPECT_EQ(remove_data_call_count_, expected_remove_data_call_count_);
BraveClearBrowsingData::SetOnExitTestingCallback(nullptr);
}
int remove_data_call_count() { return remove_data_call_count_; }
void SetExepectedRemoveDataCallCount(int count) {
expected_remove_data_call_count_ = count;
}
void SetExpectedRemoveDataRemovalMasks(int remove_mask, int origin_mask) {
expected_remove_mask_ = remove_mask;
expected_origin_mask_ = origin_mask;
}
void SetClearAll(PrefService* prefService) {
prefService->SetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryOnExit,
true);
prefService->SetBoolean(browsing_data::prefs::kDeleteDownloadHistoryOnExit,
true);
prefService->SetBoolean(browsing_data::prefs::kDeleteCacheOnExit, true);
prefService->SetBoolean(browsing_data::prefs::kDeleteCookiesOnExit, true);
prefService->SetBoolean(browsing_data::prefs::kDeletePasswordsOnExit, true);
prefService->SetBoolean(browsing_data::prefs::kDeleteFormDataOnExit, true);
prefService->SetBoolean(browsing_data::prefs::kDeleteHostedAppsDataOnExit,
true);
prefService->SetBoolean(browsing_data::prefs::kDeleteSiteSettingsOnExit,
true);
}
int GetRemoveMaskAll() {
return ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY |
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS |
content::BrowsingDataRemover::DATA_TYPE_CACHE |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_SITE_DATA |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_CONTENT_SETTINGS;
}
int GetOriginMaskAll() {
return content::BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB |
content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB;
}
// BraveClearBrowsingData::OnExitTestingCallback implementation.
void BeforeClearOnExitRemoveData(content::BrowsingDataRemover* remover,
int remove_mask,
int origin_mask) override {
remove_data_call_count_++;
if (expected_remove_mask_ != -1)
EXPECT_EQ(expected_remove_mask_, remove_mask);
if (expected_origin_mask_ != -1)
EXPECT_EQ(expected_origin_mask_, origin_mask);
}
protected:
unsigned int browsers_count_ = 1u;
int remove_data_call_count_ = 0;
int expected_remove_data_call_count_ = 0;
int expected_remove_mask_ = -1;
int expected_origin_mask_ = -1;
DISALLOW_COPY_AND_ASSIGN(BraveClearDataOnExitTest);
};
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTest, NoPrefsSet) {
// No set preferences to clear data.
SetExepectedRemoveDataCallCount(0);
// Tell the application to quit.
chrome::ExecuteCommand(browser(), IDC_EXIT);
}
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTest, VerifyRemovalMasks) {
// Set all clear data on exit preferences and corresponding expected remove
// mask and origin flags.
SetClearAll(browser()->profile()->GetPrefs());
// Given those preferences the following removal mask is expected.
SetExpectedRemoveDataRemovalMasks(GetRemoveMaskAll(), GetOriginMaskAll());
// Expect a call to clear data.
SetExepectedRemoveDataCallCount(1);
// Tell the application to quit.
chrome::ExecuteCommand(browser(), IDC_EXIT);
}
class BraveClearDataOnExitTwoBrowsersTest : public BraveClearDataOnExitTest {
public:
BraveClearDataOnExitTwoBrowsersTest() : BraveClearDataOnExitTest() {
browsers_count_ = 2u;
}
protected:
// Open a new browser window with the provided |profile|.
Browser* NewBrowserWindow(Profile* profile) {
DCHECK(profile);
ui_test_utils::BrowserAddedObserver browser_added_observer;
chrome::NewEmptyWindow(profile);
Browser* browser = browser_added_observer.WaitForSingleNewBrowser();
DCHECK(browser);
content::WaitForLoadStopWithoutSuccessCheck(
browser->tab_strip_model()->GetActiveWebContents());
return browser;
}
// Open a new browser window with a guest session.
Browser* NewGuestBrowserWindow() {
ui_test_utils::BrowserAddedObserver browser_added_observer;
profiles::SwitchToGuestProfile(ProfileManager::CreateCallback());
Browser* browser = browser_added_observer.WaitForSingleNewBrowser();
DCHECK(browser);
// When a guest |browser| closes a BrowsingDataRemover will be created and
// executed. It needs a loaded TemplateUrlService or else it hangs on to a
// CallbackList::Subscription forever.
Profile* guest = g_browser_process->profile_manager()->GetProfileByPath(
ProfileManager::GetGuestProfilePath());
DCHECK(guest);
search_test_utils::WaitForTemplateURLServiceToLoad(
TemplateURLServiceFactory::GetForProfile(guest));
// Navigate to about:blank.
ui_test_utils::NavigateToURL(browser, GURL(url::kAboutBlankURL));
return browser;
}
// Open a new browser window with a new profile.
Browser* NewProfileBrowserWindow() {
base::FilePath path;
base::PathService::Get(chrome::DIR_USER_DATA, &path);
path = path.AppendASCII("Profile 2");
base::ScopedAllowBlockingForTesting allow_blocking;
// Clean up profile directory when the test is done.
ignore_result(profile2_dir_.Set(path));
ProfileManager* profile_manager = g_browser_process->profile_manager();
size_t starting_number_of_profiles = profile_manager->GetNumberOfProfiles();
if (!base::PathExists(path) && !base::CreateDirectory(path))
NOTREACHED() << "Could not create directory at " << path.MaybeAsASCII();
Profile* profile = profile_manager->GetProfile(path);
DCHECK(profile);
EXPECT_EQ(starting_number_of_profiles + 1,
profile_manager->GetNumberOfProfiles());
return NewBrowserWindow(profile);
}
// Close the provided |browser| window and wait until done.
void CloseBrowserWindow(Browser* browser) {
BrowserRemovedObserver bro;
chrome::ExecuteCommand(browser, IDC_CLOSE_WINDOW);
EXPECT_EQ(bro.WaitForBrowserRemoval(), browser);
}
// Enable deletion of browsing history on exit.
void SetDeleteBrowsingHistoryOnExit(Profile* profile) {
profile->GetPrefs()->SetBoolean(
browsing_data::prefs::kDeleteBrowsingHistoryOnExit, true);
}
void SetDeleteBrowsingHistoryOnExit() {
SetDeleteBrowsingHistoryOnExit(browser()->profile());
}
private:
base::ScopedTempDir profile2_dir_;
DISALLOW_COPY_AND_ASSIGN(BraveClearDataOnExitTwoBrowsersTest);
};
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTwoBrowsersTest, SameProfile) {
// Delete browsing history on exit.
SetDeleteBrowsingHistoryOnExit();
// Same profile, so expect a single call.
SetExepectedRemoveDataCallCount(1);
// Open a second browser window.
Browser* second_window = NewBrowserWindow(browser()->profile());
// Close second browser window
CloseBrowserWindow(second_window);
EXPECT_EQ(0, remove_data_call_count());
// Tell the application to quit.
chrome::ExecuteCommand(browser(), IDC_EXIT);
}
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTwoBrowsersTest, OneOTR) {
// Delete browsing history on exit.
SetDeleteBrowsingHistoryOnExit();
// OTR sessions don't count, so expect a single call.
SetExepectedRemoveDataCallCount(1);
// Open a second browser window with OTR profile.
Browser* second_window =
NewBrowserWindow(browser()->profile()->GetOffTheRecordProfile());
// Close second browser window
CloseBrowserWindow(second_window);
EXPECT_EQ(0, remove_data_call_count());
// Tell the application to quit.
chrome::ExecuteCommand(browser(), IDC_EXIT);
}
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTwoBrowsersTest, OneOTRExitsLast) {
// Delete browsing history on exit.
SetDeleteBrowsingHistoryOnExit();
// OTR sessions don't count, so expect a single call.
SetExepectedRemoveDataCallCount(1);
// Open a second browser window with OTR profile.
Browser* second_window =
NewBrowserWindow(browser()->profile()->GetOffTheRecordProfile());
// Close regular profile window.
CloseBrowserWindow(browser());
EXPECT_EQ(0, remove_data_call_count());
// Tell the application to quit.
chrome::ExecuteCommand(second_window, IDC_EXIT);
}
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTwoBrowsersTest, OneGuest) {
// Delete browsing history on exit.
SetDeleteBrowsingHistoryOnExit();
// Guest sessions don't count, so expect a single call.
SetExepectedRemoveDataCallCount(1);
// Open a second browser window with Guest session.
Browser* guest_window = NewGuestBrowserWindow();
// Close Guest session window: regular profile cleanup shouldn't happen.
CloseBrowserWindow(guest_window);
EXPECT_EQ(0, remove_data_call_count());
// Tell the application to quit.
chrome::ExecuteCommand(browser(), IDC_EXIT);
}
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTwoBrowsersTest, OneGuestExitsLast) {
// Delete browsing history on exit.
SetDeleteBrowsingHistoryOnExit();
// Guest sessions don't count, so expect a single call.
SetExepectedRemoveDataCallCount(1);
// Open a second browser window with Guest session.
Browser* guest_window = NewGuestBrowserWindow();
// Close regular profile window.
CloseBrowserWindow(browser());
EXPECT_EQ(0, remove_data_call_count());
// Tell the application to quit.
chrome::ExecuteCommand(guest_window, IDC_EXIT);
}
IN_PROC_BROWSER_TEST_F(BraveClearDataOnExitTwoBrowsersTest, TwoProfiles) {
// Delete browsing history on exit.
SetDeleteBrowsingHistoryOnExit();
// Open a second browser window with a different profile.
Browser* second_profile_window = NewProfileBrowserWindow();
DCHECK(second_profile_window);
// Delete browsing history for this profile on exit too.
Profile* second_profile = second_profile_window->profile();
SetDeleteBrowsingHistoryOnExit(second_profile);
// Both profiles have browsing data removal set, so expect two calls.
SetExepectedRemoveDataCallCount(2);
// Close second profile window.
CloseBrowserWindow(second_profile_window);
EXPECT_EQ(0, remove_data_call_count());
// Tell the application to quit.
chrome::ExecuteCommand(browser(), IDC_EXIT);
}
@@ -9,6 +9,7 @@
#include "chrome/browser/extensions/api/settings_private/prefs_util.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/extensions/api/settings_private.h"
#include "components/browsing_data/core/pref_names.h"
namespace extensions {
@@ -43,6 +44,23 @@ const PrefsUtil::TypedPrefMap& BravePrefsUtil::GetWhitelistedKeys() {
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[kHideBraveRewardsButton] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
// Clear browsing data on exit prefs.
(*s_brave_whitelist)[browsing_data::prefs::kDeleteBrowsingHistoryOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeleteDownloadHistoryOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeleteCacheOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeleteCookiesOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeletePasswordsOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeleteFormDataOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeleteSiteSettingsOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
(*s_brave_whitelist)[browsing_data::prefs::kDeleteHostedAppsDataOnExit] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
// WebTorrent pref
(*s_brave_whitelist)[kWebTorrentEnabled] =
settings_api::PrefType::PREF_TYPE_BOOLEAN;
@@ -0,0 +1,3 @@
<link rel="import" href="brave_clear_browsing_data_on_exit_page.html">
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<script src="brave_clear_browsing_data_dialog_behavior.js"></script>
@@ -0,0 +1,115 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
BraveClearBrowsingDataOnExitBehaviorImpl = {
ready: function() {
this.addOnExitElements_();
this.addWebUIListener(
'update-counter-text', this.updateOnExitCountersText.bind(this));
},
attached: function() {
this.listen(this.$.tabs, 'selected-item-changed',
'onSelectedTabChanged_');
this.listen(this.$$('#on-exit-tab'), 'clear-data-on-exit-page-change',
'updateSaveButtonState_');
this.listen(this.$$('#saveOnExitSettingsConfirm'), 'click',
'saveOnExitSettings_');
},
detached: function() {
this.unlisten(this.$.tabs, 'selected-item-changed',
'onSelectedTabChanged_');
this.unlisten(this.$$('#on-exit-tab'), 'clear-data-on-exit-page-change',
'updateSaveButtonState_');
this.unlisten(this.$$('#saveOnExitSettingsConfirm'), 'click',
'saveOnExitSettings_');
},
/**
* Adds OnExit tab and Save button to the DOM.
* @private
*/
addOnExitElements_: function() {
// Append On exit tab to tab selector.
let paperTab = document.createElement('paper-tab');
paperTab.id = 'onExitTabTitle';
paperTab.innerText = this.i18n('onExitPageTitle');
Polymer.dom(this.$.clearBrowsingDataDialog).querySelector(
'paper-tabs').appendChild(paperTab);
// Append On exit tab page.
let onExitPage = document.createElement(
'settings-brave-clear-browsing-data-on-exit-page');
onExitPage.id = 'on-exit-tab';
onExitPage.prefs = this.prefs;
Polymer.dom(this.$.tabs).appendChild(onExitPage);
// Append Save button.
let saveButton = document.createElement('paper-button');
saveButton.id = 'saveOnExitSettingsConfirm';
saveButton.disabled = true;
saveButton.hidden = true;
saveButton.className = 'action-button';
saveButton.innerText = this.i18n('save');
Polymer.dom(this.$.clearBrowsingDataConfirm).parentNode.appendChild(
saveButton);
},
/**
* Updates the text of a browsing data counter corresponding to the given
* preference.
* @param {string} prefName Browsing data type deletion preference.
* @param {string} text The text with which to update the counter
* @private
*/
updateOnExitCountersText: function(prefName, text) {
// Data type deletion preferences are named "browser.clear_data.<datatype>".
// Strip the common prefix, i.e. use only "<datatype>".
const matches = prefName.match(/^browser\.clear_data\.(\w+)$/);
this.$$('#on-exit-tab').setCounter(matches[1], text);
},
/**
* Updates Clear and Save buttons visibility based on the selected tab.
* @private
*/
onSelectedTabChanged_: function () {
const tab = this.$.tabs.selectedItem;
if (!tab) {
return;
}
const isOnExitTab = (this.$.tabs.selectedItem.id == 'on-exit-tab');
this.$.clearBrowsingDataConfirm.hidden = isOnExitTab;
this.$$('#saveOnExitSettingsConfirm').hidden = !isOnExitTab;
},
/**
* Updates Save button enabled state based on on-exit-tab's changed state.
* @private
*/
updateSaveButtonState_: function () {
this.$$('#saveOnExitSettingsConfirm').disabled =
!this.$$('#on-exit-tab').isModified;
},
/**
* Saves on exit settings selections.
* @private
*/
saveOnExitSettings_: function () {
const changed = this.$$('#on-exit-tab').getChangedSettings();
changed.forEach((change) => {
this.set('prefs.' + change.key + '.value', change.value);
});
this.updateSaveButtonState_();
if (!this.clearingInProgress_) {
this.$.clearBrowsingDataDialog.close();
}
},
};
// Extend I18nBehavior so that we can use i18n.
BraveClearBrowsingDataOnExitBehavior =
[I18nBehavior, BraveClearBrowsingDataOnExitBehaviorImpl]
@@ -0,0 +1,78 @@
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="../controls/settings_checkbox.html">
<link rel="import" href="../settings_shared_css.html">
<link rel="import" href="../settings_vars_css.html">
<dom-module id="settings-brave-clear-browsing-data-on-exit-page">
<template>
<style include="settings-shared">
settings-checkbox {
--settings-row-two-line-min-height: 48px;
--settings-checkbox-label: {
line-height: 1.25rem;
}
}
</style>
<div id="checkboxes">
<settings-checkbox id="browsingCheckboxOnExit"
pref="{{prefs.browser.clear_data.browsing_history_on_exit}}"
label="$i18n{clearBrowsingHistory}"
sub-label="[[counters.browsing_history]]"
hidden="[[isSupervised_]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="downloadCheckboxOnExit"
pref="{{prefs.browser.clear_data.download_history_on_exit}}"
label="$i18n{clearDownloadHistory}"
sub-label="[[counters.download_history]]"
hidden="[[isSupervised_]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="cookiesCheckboxOnExit"
class="cookies-checkbox"
pref="{{prefs.browser.clear_data.cookies_on_exit}}"
label="$i18n{clearCookies}"
sub-label="[[counters.cookies]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="cacheCheckboxOnExit"
class="cache-checkbox"
pref="{{prefs.browser.clear_data.cache_on_exit}}"
label="$i18n{clearCache}"
sub-label="[[counters.cache]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="passwordsCheckboxOnExit"
pref="{{prefs.browser.clear_data.passwords_on_exit}}"
label="$i18n{clearPasswords}"
sub-label="[[counters.passwords]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="formDataCheckboxOnExit"
pref="{{prefs.browser.clear_data.form_data_on_exit}}"
label="$i18n{clearFormData}"
sub-label="[[counters.form_data]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="siteSettingsCheckboxOnExit"
pref="{{prefs.browser.clear_data.site_settings_on_exit}}"
label="[[siteSettingsLabel_(
'$i18nPolymer{siteSettings}',
'$i18nPolymer{contentSettings}')]]"
sub-label="[[counters.site_settings]]"
no-set-pref>
</settings-checkbox>
<settings-checkbox id="hostedAppDataCheckboxOnExit"
pref="{{prefs.browser.clear_data.hosted_apps_data_on_exit}}"
label="$i18n{clearHostedAppData}"
sub-label="[[counters.hosted_apps_data]]"
no-set-pref>
</settings-checkbox>
</div>
</template>
<script src="brave_clear_browsing_data_on_exit_page.js"></script>
</dom-module>
@@ -0,0 +1,78 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
(function() {
'use strict';
Polymer({
is: 'settings-brave-clear-browsing-data-on-exit-page',
properties: {
prefs: {
type: Object,
notify: true,
},
counters: {
type: Object,
// Will be filled as results are reported.
value: function() {
return {};
}
},
isModified: {
type: Boolean,
value: false,
},
isSupervised_: {
type: Boolean,
value: function() {
return loadTimeData.getBoolean('isSupervised');
},
},
},
listeners: {'settings-boolean-control-change': 'updateModified_'},
setCounter: function (counter, text) {
this.set('counters.' + counter, text);
},
getChangedSettings: function () {
let changed = [];
const boxes = this.$.checkboxes.querySelectorAll('settings-checkbox');
boxes.forEach((checkbox) => {
if (checkbox.checked != this.get(checkbox.pref.key, this.prefs).value) {
changed.push({key:checkbox.pref.key, value:checkbox.checked});
}
});
return changed;
},
siteSettingsLabel_: function (siteSettings, contentSettings) {
return loadTimeData.getBoolean('enableSiteSettings') ? siteSettings :
contentSettings;
},
updateModified_: function (checkbox) {
let modified = false;
const boxes = this.$.checkboxes.querySelectorAll('settings-checkbox');
for (let checkbox of boxes) {
if (checkbox.checked != this.get(checkbox.pref.key, this.prefs).value) {
modified = true;
break;
}
}
if (this.isModified !== modified) {
this.isModified = modified;
this.fire('clear-data-on-exit-page-change');
}
},
});
})();
@@ -23,6 +23,10 @@
<structure name="IDR_SETTINGS_BRAVE_PERSONALIZATION_OPTIONS_JS" file="brave_privacy_page/brave_personalization_options.js" type="chrome_html" preprocess="true" />
<structure name="IDR_SETTINGS_BRAVE_PRIVACY_PAGE_BROWSER_PROXY_HTML" file="brave_privacy_page/brave_privacy_page_browser_proxy.html" type="chrome_html" />
<structure name="IDR_SETTINGS_BRAVE_PRIVACY_PAGE_BROWSER_PROXY_JS" file="brave_privacy_page/brave_privacy_page_browser_proxy.js" type="chrome_html" preprocess="true" />
<structure name="IDR_SETTINGS_BRAVE_CLEAR_BROWSING_DATA_ON_EXIT_PAGE_HTML" file="brave_clear_browsing_data_dialog/brave_clear_browsing_data_on_exit_page.html" type="chrome_html" preprocess="true" allowexternalscript="true" />
<structure name="IDR_SETTINGS_BRAVE_CLEAR_BROWSING_DATA_ON_EXIT_PAGE_JS" file="brave_clear_browsing_data_dialog/brave_clear_browsing_data_on_exit_page.js" type="chrome_html" preprocess="true" />
<structure name="IDR_SETTINGS_BRAVE_CLEAR_BROWSING_DATA_DIALOG_BEHAVIOR_HTML" file="brave_clear_browsing_data_dialog/brave_clear_browsing_data_dialog_behavior.html" type="chrome_html" preprocess="true" allowexternalscript="true" />
<structure name="IDR_SETTINGS_BRAVE_CLEAR_BROWSING_DATA_DIALOG_BEHAVIOR_JS" file="brave_clear_browsing_data_dialog/brave_clear_browsing_data_dialog_behavior.js" type="chrome_html" preprocess="true" />
<!-- brave sync -->
<structure name="IDR_SETTINGS_BRAVE_SYNC_BROWSER_PROXY_HTML" file="brave_sync_page/brave_sync_browser_proxy.html" type="chrome_html" />
<structure name="IDR_SETTINGS_BRAVE_SYNC_BROWSER_PROXY_JS" file="brave_sync_page/brave_sync_browser_proxy.js" type="chrome_html" preprocess="true" />
@@ -0,0 +1,13 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/chromium_src/chrome/browser/chrome_browser_main_posix.h"
#include "brave/browser/brave_browser_main_parts.h"
#include "chrome/browser/chrome_browser_main.h"
#define ChromeBrowserMainParts BraveBrowserMainParts
#include "../../../../chrome/browser/chrome_browser_main_posix.cc" // NOLINT
#undef ChromeBrowserMainParts
@@ -0,0 +1,16 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_CHROMIUM_SRC_CHROME_BROWSER_CHROME_BROWSER_MAIN_POSIX_H_
#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_CHROME_BROWSER_MAIN_POSIX_H_
#include "brave/browser/brave_browser_main_parts.h"
#include "chrome/browser/chrome_browser_main.h"
#define ChromeBrowserMainParts BraveBrowserMainParts
#include "../../../../chrome/browser/chrome_browser_main_posix.h" // NOLINT
#undef ChromeBrowserMainParts
#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_CHROME_BROWSER_MAIN_POSIX_H_
@@ -0,0 +1,13 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/chromium_src/chrome/browser/chrome_browser_main_win.h"
#include "brave/browser/brave_browser_main_parts.h"
#include "chrome/browser/chrome_browser_main.h"
#define ChromeBrowserMainParts BraveBrowserMainParts
#include "../../../../chrome/browser/chrome_browser_main_win.cc" // NOLINT
#undef ChromeBrowserMainParts
@@ -0,0 +1,16 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_CHROMIUM_SRC_CHROME_BROWSER_CHROME_BROWSER_MAIN_WIN_H_
#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_CHROME_BROWSER_MAIN_WIN_H_
#include "brave/browser/brave_browser_main_parts.h"
#include "chrome/browser/chrome_browser_main.h"
#define ChromeBrowserMainParts BraveBrowserMainParts
#include "../../../../chrome/browser/chrome_browser_main_win.h" // NOLINT
#undef ChromeBrowserMainParts
#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_CHROME_BROWSER_MAIN_WIN_H_
@@ -27,8 +27,8 @@ void BraveAddImportDataStrings(content::WebUIDataSource* html_source) {
}
const char kWebRTCLearnMoreURL[] =
"https://support.brave.com/hc/en-us/articles/"
"360017989132-How-do-I-change-my-Privacy-Settings-#webrtc";
"https://support.brave.com/hc/en-us/articles/"
"360017989132-How-do-I-change-my-Privacy-Settings-#webrtc";
void BraveAddCommonStrings(content::WebUIDataSource* html_source,
Profile* profile) {
@@ -93,6 +93,8 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_BRAVE_SYNC_TITLE},
{"braveSyncLabel",
IDS_SETTINGS_BRAVE_SYNC_LINK_LABEL},
{"onExitPageTitle",
IDS_SETTINGS_BRAVE_ON_EXIT},
{"braveDefaultExtensions",
IDS_SETTINGS_BRAVE_DEFAULT_EXTENSIONS_TITLE},
{"webTorrentEnabledDesc",
@@ -0,0 +1,42 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/chromium_src/components/browsing_data/core/pref_names.h"
#define RegisterBrowserUserPrefs RegisterBrowserUserPrefs_ChromiumImpl
#include "../../../../components/browsing_data/core/pref_names.cc" // NOLINT
#undef RegisterBrowserUserPrefs
namespace browsing_data {
namespace prefs {
const char kDeleteBrowsingHistoryOnExit[] =
"browser.clear_data.browsing_history_on_exit";
const char kDeleteDownloadHistoryOnExit[] =
"browser.clear_data.download_history_on_exit";
const char kDeleteCacheOnExit[] = "browser.clear_data.cache_on_exit";
const char kDeleteCookiesOnExit[] = "browser.clear_data.cookies_on_exit";
const char kDeletePasswordsOnExit[] = "browser.clear_data.passwords_on_exit";
const char kDeleteFormDataOnExit[] = "browser.clear_data.form_data_on_exit";
const char kDeleteHostedAppsDataOnExit[] =
"browser.clear_data.hosted_apps_data_on_exit";
const char kDeleteSiteSettingsOnExit[] =
"browser.clear_data.site_settings_on_exit";
void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) {
RegisterBrowserUserPrefs_ChromiumImpl(registry);
registry->RegisterBooleanPref(kDeleteBrowsingHistoryOnExit, false);
registry->RegisterBooleanPref(kDeleteDownloadHistoryOnExit, false);
registry->RegisterBooleanPref(kDeleteCacheOnExit, false);
registry->RegisterBooleanPref(kDeleteCookiesOnExit, false);
registry->RegisterBooleanPref(kDeletePasswordsOnExit, false);
registry->RegisterBooleanPref(kDeleteFormDataOnExit, false);
registry->RegisterBooleanPref(kDeleteHostedAppsDataOnExit, false);
registry->RegisterBooleanPref(kDeleteSiteSettingsOnExit, false);
}
} // namespace prefs
} // namespace browsing_data
@@ -0,0 +1,28 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_CHROMIUM_SRC_COMPONENTS_BROWSING_DATA_CORE_PREF_NAMES_H_
#define BRAVE_CHROMIUM_SRC_COMPONENTS_BROWSING_DATA_CORE_PREF_NAMES_H_
#include "../../../../components/browsing_data/core/pref_names.h"
namespace browsing_data {
namespace prefs {
extern const char kDeleteBrowsingHistoryOnExit[];
extern const char kDeleteDownloadHistoryOnExit[];
extern const char kDeleteCacheOnExit[];
extern const char kDeleteCookiesOnExit[];
extern const char kDeletePasswordsOnExit[];
extern const char kDeleteFormDataOnExit[];
extern const char kDeleteHostedAppsDataOnExit[];
extern const char kDeleteSiteSettingsOnExit[];
} // namespace prefs
} // namespace browsing_data
#endif // BRAVE_CHROMIUM_SRC_COMPONENTS_BROWSING_DATA_CORE_PREF_NAMES_H_
@@ -0,0 +1,12 @@
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
index 0a19b70ad2dde91cc593e96d597bb7e5b8798b44..915ecd32a8a7e26092353dec067a90ae3cbc5d7c 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
@@ -17,6 +17,7 @@
<link rel="import" href="../route.html">
<link rel="import" href="../settings_shared_css.html">
<link rel="import" href="../settings_vars_css.html">
+<link rel="import" href="../brave_clear_browsing_data_dialog/brave_clear_browsing_data_dialog_behavior.html">
<dom-module id="settings-clear-browsing-data-dialog">
<template>
@@ -0,0 +1,14 @@
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
index 64f57b57b24e8df7f0fefa44aa893a39af8c7676..1a303c0a22de8645d35d3ada513f62cec2d113cc 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
@@ -9,7 +9,8 @@
Polymer({
is: 'settings-clear-browsing-data-dialog',
- behaviors: [WebUIListenerBehavior, settings.RouteObserverBehavior],
+ behaviors: [WebUIListenerBehavior, settings.RouteObserverBehavior,
+ BraveClearBrowsingDataOnExitBehavior],
properties: {
/**
+1
View File
@@ -277,6 +277,7 @@ test("brave_browser_tests") {
"//brave/browser/brave_profile_prefs_browsertest.cc",
"//brave/browser/brave_resources_browsertest.cc",
"//brave/browser/brave_stats_updater_browsertest.cc",
"//brave/browser/browsing_data/brave_clear_browsing_data_browsertest.cc",
"//brave/browser/devtools/brave_devtools_ui_bindings_browsertest.cc",
"//brave/browser/extensions/brave_tor_client_updater_browsertest.cc",
"//brave/browser/extensions/brave_extension_functional_test.cc",