cookie_policy_browsertest.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/task.h" 6#include "base/waitable_event.h" 7#include "chrome/browser/browser.h" 8#include "chrome/browser/host_content_settings_map.h" 9#include "chrome/browser/profile.h" 10#include "chrome/common/net/url_request_context_getter.h" 11#include "chrome/test/in_process_browser_test.h" 12#include "chrome/test/ui_test_utils.h" 13#include "net/base/cookie_store.h" 14#include "net/base/mock_host_resolver.h" 15#include "net/test/test_server.h" 16 17namespace { 18 19class GetCookiesTask : public Task { 20 public: 21 GetCookiesTask(const GURL& url, 22 URLRequestContextGetter* context_getter, 23 base::WaitableEvent* event, 24 std::string* cookies) 25 : url_(url), 26 context_getter_(context_getter), 27 event_(event), 28 cookies_(cookies) {} 29 30 virtual void Run() { 31 *cookies_ = context_getter_->GetCookieStore()->GetCookies(url_); 32 event_->Signal(); 33 } 34 35 private: 36 const GURL& url_; 37 URLRequestContextGetter* const context_getter_; 38 base::WaitableEvent* const event_; 39 std::string* const cookies_; 40 41 DISALLOW_COPY_AND_ASSIGN(GetCookiesTask); 42}; 43 44class CookiePolicyBrowserTest : public InProcessBrowserTest { 45 protected: 46 CookiePolicyBrowserTest() {} 47 48 std::string GetCookies(const GURL& url) { 49 std::string cookies; 50 base::WaitableEvent event(true /* manual reset */, 51 false /* not initially signaled */); 52 URLRequestContextGetter* context_getter = 53 browser()->profile()->GetRequestContext(); 54 EXPECT_TRUE( 55 ChromeThread::PostTask( 56 ChromeThread::IO, FROM_HERE, 57 new GetCookiesTask(url, context_getter, &event, &cookies))); 58 EXPECT_TRUE(event.Wait()); 59 return cookies; 60 } 61 62 private: 63 DISALLOW_COPY_AND_ASSIGN(CookiePolicyBrowserTest); 64}; 65 66// Visits a page that sets a first-party cookie. 67IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest, AllowFirstPartyCookies) { 68 ASSERT_TRUE(test_server()->Start()); 69 70 browser()->profile()->GetHostContentSettingsMap()-> 71 SetBlockThirdPartyCookies(true); 72 73 GURL url(test_server()->GetURL("set-cookie?cookie1")); 74 75 std::string cookie = GetCookies(url); 76 ASSERT_EQ("", cookie); 77 78 ui_test_utils::NavigateToURL(browser(), url); 79 80 cookie = GetCookies(url); 81 EXPECT_EQ("cookie1", cookie); 82} 83 84// Visits a page that is a redirect across domain boundary to a page that sets 85// a first-party cookie. 86IN_PROC_BROWSER_TEST_F(CookiePolicyBrowserTest, 87 AllowFirstPartyCookiesRedirect) { 88 ASSERT_TRUE(test_server()->Start()); 89 90 browser()->profile()->GetHostContentSettingsMap()-> 91 SetBlockThirdPartyCookies(true); 92 93 GURL url(test_server()->GetURL("server-redirect?")); 94 GURL redirected_url(test_server()->GetURL("set-cookie?cookie2")); 95 96 // Change the host name from 127.0.0.1 to www.example.com so it triggers 97 // third-party cookie blocking if the first party for cookies URL is not 98 // changed when we follow a redirect. 99 ASSERT_EQ("127.0.0.1", redirected_url.host()); 100 GURL::Replacements replacements; 101 std::string new_host("www.example.com"); 102 replacements.SetHostStr(new_host); 103 redirected_url = redirected_url.ReplaceComponents(replacements); 104 105 std::string cookie = GetCookies(redirected_url); 106 ASSERT_EQ("", cookie); 107 108 host_resolver()->AddRule("www.example.com", "127.0.0.1"); 109 110 ui_test_utils::NavigateToURL(browser(), 111 GURL(url.spec() + redirected_url.spec())); 112 113 cookie = GetCookies(redirected_url); 114 EXPECT_EQ("cookie2", cookie); 115} 116 117} // namespace 118