blob: 9bb9be80bedc7f0358d96ad75fa89d61bf8f740d [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/test_browser_window.h"
#include "content/public/browser/browser_context.h"
#include "content/public/test/mock_browsing_data_remover_delegate.h"
#include "testing/gtest/include/gtest/gtest.h"
using extension_function_test_utils::RunFunctionAndReturnError;
using extension_function_test_utils::RunFunctionAndReturnSingleResult;
namespace extensions {
namespace {
enum OriginTypeMask {
UNPROTECTED_WEB = content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
PROTECTED_WEB = content::BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB,
EXTENSION = ChromeBrowsingDataRemoverDelegate::ORIGIN_TYPE_EXTENSION
};
}
class BrowsingDataApiTest : public ExtensionServiceTestBase {
protected:
void SetUp() override {
ExtensionServiceTestBase::SetUp();
InitializeEmptyExtensionService();
browser_window_ = std::make_unique<TestBrowserWindow>();
Browser::CreateParams params(profile(), true);
params.type = Browser::TYPE_TABBED;
params.window = browser_window_.get();
browser_ = std::make_unique<Browser>(params);
remover_ = content::BrowserContext::GetBrowsingDataRemover(profile());
remover_->SetEmbedderDelegate(&delegate_);
}
void TearDown() override {
browser_.reset();
browser_window_.reset();
ExtensionServiceTestBase::TearDown();
}
void CheckInvalidRemovalArgs(const std::string& args,
const std::string& expected_error) {
auto function = base::MakeRefCounted<BrowsingDataRemoveFunction>();
EXPECT_EQ(RunFunctionAndReturnError(function.get(), args, browser()),
expected_error)
<< " for " << args;
}
void VerifyFilterBuilder(
const std::string& options,
const content::BrowsingDataFilterBuilder& filter_builder) {
delegate()->ExpectCall(
base::Time::UnixEpoch(), base::Time::Max(),
content::BrowsingDataRemover::DATA_TYPE_LOCAL_STORAGE, UNPROTECTED_WEB,
filter_builder);
auto function = base::MakeRefCounted<BrowsingDataRemoveFunction>();
EXPECT_EQ(RunFunctionAndReturnSingleResult(
function.get(), "[" + options + ", {\"localStorage\": true}]",
browser()),
nullptr)
<< options;
delegate()->VerifyAndClearExpectations();
}
Browser* browser() { return browser_.get(); }
content::MockBrowsingDataRemoverDelegate* delegate() { return &delegate_; }
private:
std::unique_ptr<TestBrowserWindow> browser_window_;
std::unique_ptr<Browser> browser_;
content::BrowsingDataRemover* remover_;
content::MockBrowsingDataRemoverDelegate delegate_;
};
TEST_F(BrowsingDataApiTest, RemoveWithoutFilter) {
auto filter_builder = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::BLACKLIST);
ASSERT_TRUE(filter_builder->IsEmptyBlacklist());
VerifyFilterBuilder("{}", *filter_builder);
}
TEST_F(BrowsingDataApiTest, RemoveWithWhitelistFilter) {
auto filter_builder = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::WHITELIST);
filter_builder->AddOrigin(url::Origin::Create(GURL("http://example.com")));
VerifyFilterBuilder(R"({"origins": ["http://example.com"]})",
*filter_builder);
}
TEST_F(BrowsingDataApiTest, RemoveWithBlacklistFilter) {
auto filter_builder = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::BLACKLIST);
filter_builder->AddOrigin(url::Origin::Create(GURL("http://example.com")));
VerifyFilterBuilder(R"({"excludeOrigins": ["http://example.com"]})",
*filter_builder);
}
TEST_F(BrowsingDataApiTest, RemoveWithSpecialUrlFilter) {
auto filter_builder = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::BLACKLIST);
filter_builder->AddOrigin(url::Origin::Create(GURL("file:///")));
filter_builder->AddOrigin(url::Origin::Create(GURL("http://example.com")));
VerifyFilterBuilder(
R"({"excludeOrigins": ["file:///tmp/foo.html/",
"filesystem:http://example.com/foo.txt"]})",
*filter_builder);
}
TEST_F(BrowsingDataApiTest, RemoveCookiesWithFilter) {
auto filter_builder = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::BLACKLIST);
filter_builder->AddRegisterableDomain("example.com");
delegate()->ExpectCall(base::Time::UnixEpoch(), base::Time::Max(),
content::BrowsingDataRemover::DATA_TYPE_COOKIES,
UNPROTECTED_WEB, *filter_builder);
auto function = base::MakeRefCounted<BrowsingDataRemoveFunction>();
EXPECT_EQ(RunFunctionAndReturnSingleResult(
function.get(),
R"([{"excludeOrigins": ["http://example.com"]},
{"cookies": true}])",
browser()),
nullptr);
delegate()->VerifyAndClearExpectations();
}
// Expect two separate BrowsingDataRemover calls if cookies and localstorage
// are passed with a filter.
TEST_F(BrowsingDataApiTest, RemoveCookiesAndStorageWithFilter) {
auto filter_builder1 = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::WHITELIST);
filter_builder1->AddRegisterableDomain("example.com");
delegate()->ExpectCall(base::Time::UnixEpoch(), base::Time::Max(),
content::BrowsingDataRemover::DATA_TYPE_COOKIES,
UNPROTECTED_WEB, *filter_builder1);
auto filter_builder2 = content::BrowsingDataFilterBuilder::Create(
content::BrowsingDataFilterBuilder::WHITELIST);
filter_builder2->AddOrigin(
url::Origin::Create(GURL("http://www.example.com")));
delegate()->ExpectCall(base::Time::UnixEpoch(), base::Time::Max(),
content::BrowsingDataRemover::DATA_TYPE_LOCAL_STORAGE,
UNPROTECTED_WEB, *filter_builder2);
auto function = base::MakeRefCounted<BrowsingDataRemoveFunction>();
EXPECT_EQ(RunFunctionAndReturnSingleResult(
function.get(),
R"([{"origins": ["http://www.example.com"]},
{"cookies": true, "localStorage": true}])",
browser()),
nullptr);
delegate()->VerifyAndClearExpectations();
}
TEST_F(BrowsingDataApiTest, RemoveWithFilterAndInvalidParameters) {
CheckInvalidRemovalArgs(
R"([{"origins": ["http://example.com"]}, {"passwords": true}])",
extension_browsing_data_api_constants::kNonFilterableError);
CheckInvalidRemovalArgs(
R"([{"origins": ["http://example.com"],
"excludeOrigins": ["https://example.com"]},
{"localStorage": true}])",
extension_browsing_data_api_constants::kIncompatibleFilterError);
CheckInvalidRemovalArgs(
R"([{"origins": ["foo"]}, {"localStorage": true}])",
base::StringPrintf(
extension_browsing_data_api_constants::kInvalidOriginError, "foo"));
CheckInvalidRemovalArgs(
R"([{"excludeOrigins": ["foo"]}, {"localStorage": true}])",
base::StringPrintf(
extension_browsing_data_api_constants::kInvalidOriginError, "foo"));
}
} // namespace extensions