blob: 30b547f7e00d28c04e3add8ccbf9f10dcae3b8fa [file] [log] [blame]
// Copyright (c) 2012 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 "base/auto_reset.h"
#include "base/message_loop/message_loop.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/content_settings/cookie_settings.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "content/public/test/test_browser_thread.h"
#include "net/base/static_cookie_policy.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using content::BrowserThread;
namespace {
class CookieSettingsTest : public testing::Test {
public:
CookieSettingsTest()
: ui_thread_(BrowserThread::UI, &message_loop_),
cookie_settings_(CookieSettings::Factory::GetForProfile(&profile_)
.get()),
kBlockedSite("http://ads.thirdparty.com"),
kAllowedSite("http://good.allays.com"),
kFirstPartySite("http://cool.things.com"),
kBlockedFirstPartySite("http://no.thirdparties.com"),
kExtensionURL("chrome-extension://deadbeef"),
kHttpsSite("https://example.com"),
kAllHttpsSitesPattern(ContentSettingsPattern::FromString("https://*")) {
}
protected:
base::MessageLoop message_loop_;
content::TestBrowserThread ui_thread_;
TestingProfile profile_;
CookieSettings* cookie_settings_;
const GURL kBlockedSite;
const GURL kAllowedSite;
const GURL kFirstPartySite;
const GURL kBlockedFirstPartySite;
const GURL kExtensionURL;
const GURL kHttpsSite;
ContentSettingsPattern kAllHttpsSitesPattern;
};
TEST_F(CookieSettingsTest, CookiesBlockSingle) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kBlockedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_BLOCK);
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kBlockedSite, kBlockedSite));
}
TEST_F(CookieSettingsTest, CookiesBlockThirdParty) {
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kBlockedSite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kBlockedSite, kFirstPartySite));
}
TEST_F(CookieSettingsTest, CookiesAllowThirdParty) {
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kBlockedSite));
}
TEST_F(CookieSettingsTest, CookiesExplicitBlockSingleThirdParty) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kBlockedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_BLOCK);
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
}
TEST_F(CookieSettingsTest, CookiesExplicitSessionOnly) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kBlockedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_SESSION_ONLY);
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kBlockedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsCookieSessionOnly(kBlockedSite));
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
EXPECT_TRUE(cookie_settings_->
IsReadingCookieAllowed(kBlockedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->
IsSettingCookieAllowed(kBlockedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsCookieSessionOnly(kBlockedSite));
}
TEST_F(CookieSettingsTest, CookiesThirdPartyBlockedExplicitAllow) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kAllowedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_ALLOW);
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite));
// Extensions should always be allowed to use cookies.
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kExtensionURL));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kExtensionURL));
}
TEST_F(CookieSettingsTest, CookiesThirdPartyBlockedAllSitesAllowed) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kAllowedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_ALLOW);
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
// As an example for a pattern that matches all hosts but not all origins,
// match all HTTPS sites.
cookie_settings_->SetCookieSetting(
kAllHttpsSitesPattern,
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_ALLOW);
cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY);
// |kAllowedSite| should be allowed.
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kBlockedSite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kBlockedSite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite));
// HTTPS sites should be allowed in a first-party context.
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kHttpsSite, kHttpsSite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kHttpsSite, kHttpsSite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite));
// HTTP sites should be allowed, but session-only.
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kFirstPartySite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kFirstPartySite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsCookieSessionOnly(kFirstPartySite));
// Third-party cookies should be blocked.
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kFirstPartySite, kBlockedSite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kFirstPartySite, kBlockedSite));
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kHttpsSite, kBlockedSite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kHttpsSite, kBlockedSite));
}
TEST_F(CookieSettingsTest, CookiesBlockEverything) {
cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kFirstPartySite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kFirstPartySite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
}
TEST_F(CookieSettingsTest, CookiesBlockEverythingExceptAllowed) {
cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kAllowedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_ALLOW);
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kFirstPartySite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kFirstPartySite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kAllowedSite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kAllowedSite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite));
}
TEST_F(CookieSettingsTest, CookiesBlockSingleFirstParty) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kAllowedSite),
ContentSettingsPattern::FromURL(kFirstPartySite),
CONTENT_SETTING_ALLOW);
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kAllowedSite),
ContentSettingsPattern::FromURL(kBlockedFirstPartySite),
CONTENT_SETTING_BLOCK);
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite));
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kBlockedFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kBlockedFirstPartySite));
cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsCookieSessionOnly(kAllowedSite));
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kBlockedFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kBlockedFirstPartySite));
cookie_settings_->ResetCookieSetting(
ContentSettingsPattern::FromURL(kAllowedSite),
ContentSettingsPattern::FromURL(kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kAllowedSite, kFirstPartySite));
EXPECT_FALSE(cookie_settings_->IsSettingCookieAllowed(
kAllowedSite, kFirstPartySite));
}
TEST_F(CookieSettingsTest, ExtensionsRegularSettings) {
cookie_settings_->SetCookieSetting(
ContentSettingsPattern::FromURL(kBlockedSite),
ContentSettingsPattern::Wildcard(),
CONTENT_SETTING_BLOCK);
// Regular cookie settings also apply to extensions.
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kBlockedSite, kExtensionURL));
}
TEST_F(CookieSettingsTest, ExtensionsOwnCookies) {
cookie_settings_->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
#if defined(ENABLE_EXTENSIONS)
// Extensions can always use cookies (and site data) in their own origin.
EXPECT_TRUE(cookie_settings_->IsReadingCookieAllowed(
kExtensionURL, kExtensionURL));
#else
// Except if extensions are disabled. Then the extension-specific checks do
// not exist and the default setting is to block.
EXPECT_FALSE(cookie_settings_->IsReadingCookieAllowed(
kExtensionURL, kExtensionURL));
#endif
}
TEST_F(CookieSettingsTest, ExtensionsThirdParty) {
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
// XHRs stemming from extensions are exempt from third-party cookie blocking
// rules (as the first party is always the extension's security origin).
EXPECT_TRUE(cookie_settings_->IsSettingCookieAllowed(
kBlockedSite, kExtensionURL));
}
} // namespace