1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profile_resetter/profile_resetter.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profile_resetter/profile_resetter_test_base.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/test/base/in_process_browser_test.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_utils.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/cookies/cookie_store.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/url_request/url_request_context.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/url_request/url_request_context_getter.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kCookieDefinition[] = "A=1"; 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kCookieHostname[] = "http://host1"; 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing content::BrowserThread; 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// RemoveCookieTester provides the user with the ability to set and get a 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// cookie for given profile. 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass RemoveCookieTester { 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch explicit RemoveCookieTester(Profile* profile); 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~RemoveCookieTester(); 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string GetCookie(const std::string& host); 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void AddCookie(const std::string& host, const std::string& definition); 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void GetCookieOnIOThread(net::URLRequestContextGetter* context_getter, 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& host); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetCookieOnIOThread(net::URLRequestContextGetter* context_getter, 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& host, 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& definition); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void GetCookieCallback(const std::string& cookies); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetCookieCallback(bool result); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void BlockUntilNotified(); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Notify(); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string last_cookies_; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool waiting_callback_; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Profile* profile_; 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<content::MessageLoopRunner> runner_; 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester); 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRemoveCookieTester::RemoveCookieTester(Profile* profile) 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : waiting_callback_(false), 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_(profile) { 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRemoveCookieTester::~RemoveCookieTester() {} 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true, if the given cookie exists in the cookie store. 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string RemoveCookieTester::GetCookie(const std::string& host) { 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch last_cookies_.clear(); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!waiting_callback_); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch waiting_callback_ = true; 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::PostTask( 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::IO, FROM_HERE, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RemoveCookieTester::GetCookieOnIOThread, 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this), 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(profile_->GetRequestContext()), 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host)); 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockUntilNotified(); 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return last_cookies_; 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::AddCookie(const std::string& host, 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& definition) { 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!waiting_callback_); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch waiting_callback_ = true; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::PostTask( 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::IO, FROM_HERE, 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RemoveCookieTester::SetCookieOnIOThread, 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this), 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(profile_->GetRequestContext()), 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch definition)); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockUntilNotified(); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::GetCookieOnIOThread( 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLRequestContextGetter* context_getter, 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& host) { 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::CookieStore* cookie_store = context_getter-> 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetURLRequestContext()->cookie_store(); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cookie_store->GetCookiesWithOptionsAsync( 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL(host), net::CookieOptions(), 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RemoveCookieTester::GetCookieCallback, 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::SetCookieOnIOThread( 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLRequestContextGetter* context_getter, 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& host, 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& definition) { 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::CookieStore* cookie_store = context_getter-> 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetURLRequestContext()->cookie_store(); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cookie_store->SetCookieWithOptionsAsync( 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL(host), definition, net::CookieOptions(), 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RemoveCookieTester::SetCookieCallback, 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::GetCookieCallback(const std::string& cookies) { 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::PostTask( 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::UI, FROM_HERE, 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RemoveCookieTester::GetCookieCallback, 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this), cookies)); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch last_cookies_ = cookies; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Notify(); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::SetCookieCallback(bool result) { 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::PostTask( 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserThread::UI, FROM_HERE, 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RemoveCookieTester::SetCookieCallback, 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this), result)); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(result); 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Notify(); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::BlockUntilNotified() { 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!runner_.get()); 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (waiting_callback_) { 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch runner_ = new content::MessageLoopRunner; 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch runner_->Run(); 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch runner_ = NULL; 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::Notify() { 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(waiting_callback_); 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch waiting_callback_ = false; 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (runner_.get()) 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch runner_->Quit(); 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ProfileResetTest : public InProcessBrowserTest, 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public ProfileResetterTestBase { 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetUpOnMainThread() OVERRIDE { 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resetter_.reset(new ProfileResetter(browser()->profile())); 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(ProfileResetTest, ResetCookiesAndSiteData) { 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RemoveCookieTester tester(browser()->profile()); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tester.AddCookie(kCookieHostname, kCookieDefinition); 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(kCookieDefinition, tester.GetCookie(kCookieHostname)); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResetAndWait(ProfileResetter::COOKIES_AND_SITE_DATA); 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("", tester.GetCookie(kCookieHostname)); 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 175