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