OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include "base/bind.h" |
5 #include "base/file_path.h" | 6 #include "base/file_path.h" |
6 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
7 #include "base/test/thread_test_helper.h" | 8 #include "base/test/thread_test_helper.h" |
8 #include "chrome/browser/net/sqlite_persistent_cookie_store.h" | 9 #include "chrome/browser/net/sqlite_persistent_cookie_store.h" |
9 #include "chrome/common/chrome_constants.h" | 10 #include "chrome/common/chrome_constants.h" |
10 #include "chrome/test/automation/automation_proxy.h" | 11 #include "chrome/test/automation/automation_proxy.h" |
11 #include "chrome/test/automation/browser_proxy.h" | 12 #include "chrome/test/automation/browser_proxy.h" |
12 #include "chrome/test/automation/tab_proxy.h" | 13 #include "chrome/test/automation/tab_proxy.h" |
13 #include "chrome/test/base/ui_test_utils.h" | 14 #include "chrome/test/base/ui_test_utils.h" |
14 #include "chrome/test/ui/ui_test.h" | 15 #include "chrome/test/ui/ui_test.h" |
15 #include "content/browser/browser_thread.h" | 16 #include "content/browser/browser_thread.h" |
16 | 17 |
17 class FastShutdown : public UITest { | 18 class FastShutdown : public UITest { |
18 protected: | 19 protected: |
19 FastShutdown() | 20 FastShutdown() |
20 : db_thread_(BrowserThread::DB), | 21 : db_thread_(BrowserThread::DB), |
| 22 io_thread_(BrowserThread::IO), |
21 thread_helper_(new base::ThreadTestHelper( | 23 thread_helper_(new base::ThreadTestHelper( |
22 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))) { | 24 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))) { |
23 dom_automation_enabled_ = true; | 25 dom_automation_enabled_ = true; |
24 } | 26 } |
25 | 27 |
26 void Init() { | 28 void Init() { |
27 ASSERT_TRUE(db_thread_.Start()); | 29 ASSERT_TRUE(db_thread_.Start()); |
28 | 30 ASSERT_TRUE(io_thread_.Start()); |
29 // Cache this, so that we can still access it after the browser exits. | 31 // Cache this, so that we can still access it after the browser exits. |
30 user_data_dir_ = user_data_dir(); | 32 user_data_dir_ = user_data_dir(); |
31 } | 33 } |
32 | 34 |
33 // Looks for the given |cookie| in the cookie store. If it exists, puts the | 35 // Looks for the given |cookie| in the cookie store. If it exists, puts the |
34 // cookie's value in |cookie_value| and sets |has_cookie| to true. Sets | 36 // cookie's value in |cookie_value| and sets |has_cookie| to true. Sets |
35 // |has_cookie| to false if the |cookie| wasn't found. | 37 // |has_cookie| to false if the |cookie| wasn't found. |
36 void GetCookie(const net::CookieMonster::CanonicalCookie& cookie, | 38 void GetCookie(const net::CookieMonster::CanonicalCookie& cookie, |
37 bool* has_cookie, std::string* cookie_value) { | 39 bool* has_cookie, std::string* cookie_value) { |
38 scoped_refptr<SQLitePersistentCookieStore> cookie_store( | 40 scoped_refptr<SQLitePersistentCookieStore> cookie_store( |
39 new SQLitePersistentCookieStore( | 41 new SQLitePersistentCookieStore( |
40 user_data_dir_.AppendASCII(chrome::kInitialProfile) | 42 user_data_dir_.AppendASCII(chrome::kInitialProfile) |
41 .Append(chrome::kCookieFilename))); | 43 .Append(chrome::kCookieFilename))); |
42 std::vector<net::CookieMonster::CanonicalCookie*> cookies; | 44 std::vector<net::CookieMonster::CanonicalCookie*> cookies; |
43 ASSERT_TRUE(cookie_store->Load(&cookies)); | 45 ASSERT_TRUE(cookie_store->Load( |
| 46 base::Bind(&FastShutdown::LoadCookiesCallback, |
| 47 base::Unretained(this), |
| 48 MessageLoop::current(), |
| 49 base::Unretained(&cookies)))); |
| 50 // Will receive a QuitTask when LoadCookiesCallback is invoked. |
| 51 MessageLoop::current()->Run(); |
44 *has_cookie = false; | 52 *has_cookie = false; |
45 for (size_t i = 0; i < cookies.size(); ++i) { | 53 for (size_t i = 0; i < cookies.size(); ++i) { |
46 if (cookies[i]->IsEquivalent(cookie)) { | 54 if (cookies[i]->IsEquivalent(cookie)) { |
47 *has_cookie = true; | 55 *has_cookie = true; |
48 *cookie_value = cookies[i]->Value(); | 56 *cookie_value = cookies[i]->Value(); |
49 } | 57 } |
50 } | 58 } |
51 cookie_store = NULL; | 59 cookie_store = NULL; |
52 ASSERT_TRUE(thread_helper_->Run()); | 60 ASSERT_TRUE(thread_helper_->Run()); |
53 STLDeleteElements(&cookies); | 61 STLDeleteElements(&cookies); |
54 } | 62 } |
55 | 63 |
56 private: | 64 private: |
57 BrowserThread db_thread_; // Used by the cookie store during its clean up. | 65 void LoadCookiesCallback( |
| 66 MessageLoop* to_notify, |
| 67 std::vector<net::CookieMonster::CanonicalCookie*>* cookies, |
| 68 const std::vector<net::CookieMonster::CanonicalCookie*>& cookies_get) { |
| 69 *cookies = cookies_get; |
| 70 to_notify->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
| 71 } |
| 72 |
| 73 BrowserThread db_thread_; |
| 74 BrowserThread io_thread_; |
58 scoped_refptr<base::ThreadTestHelper> thread_helper_; | 75 scoped_refptr<base::ThreadTestHelper> thread_helper_; |
59 FilePath user_data_dir_; | 76 FilePath user_data_dir_; |
60 | 77 |
61 DISALLOW_COPY_AND_ASSIGN(FastShutdown); | 78 DISALLOW_COPY_AND_ASSIGN(FastShutdown); |
62 }; | 79 }; |
63 | 80 |
64 // This tests for a previous error where uninstalling an onbeforeunload handler | 81 // This tests for a previous error where uninstalling an onbeforeunload handler |
65 // would enable fast shutdown even if an onunload handler still existed. | 82 // would enable fast shutdown even if an onunload handler still existed. |
66 TEST_F(FastShutdown, SlowTermination) { | 83 TEST_F(FastShutdown, SlowTermination) { |
67 Init(); | 84 Init(); |
68 | 85 |
69 // Only the name, domain and path are used in IsEquivalent(), so we don't care | 86 // Only the name, domain and path are used in IsEquivalent(), so we don't care |
70 // what the other fields have. | 87 // what the other fields have. |
71 net::CookieMonster::CanonicalCookie cookie( | 88 net::CookieMonster::CanonicalCookie cookie( |
72 GURL(), // url | 89 GURL(), // url |
73 "unloaded", // name | 90 "unloaded", // name |
74 "", // value | 91 "", // value |
75 "", // domain | 92 "", // domain |
76 "/", // path | 93 "/", // path |
77 "", // mac_key | 94 "", // mac_key |
78 "", // mac_algorithm | 95 "", // mac_algorithm |
79 base::Time(), // creation | 96 base::Time(), // creation |
80 base::Time(), // expiration | 97 base::Time(), // expiration |
81 base::Time(), // last_access | 98 base::Time(), // last_access |
82 false, // secure | 99 false, // secure |
83 false, // httponly | 100 false, // httponly |
84 false); // has_expires | 101 false); // has_expires |
85 | 102 |
86 bool has_cookie = false; | |
87 std::string cookie_value; | |
88 | |
89 // Check that the cookie (to be set during unload) doesn't exist already. | |
90 GetCookie(cookie, &has_cookie, &cookie_value); | |
91 EXPECT_FALSE(has_cookie); | |
92 EXPECT_EQ("", cookie_value); | |
93 | |
94 // This page has an unload handler. | 103 // This page has an unload handler. |
95 const FilePath dir(FILE_PATH_LITERAL("fast_shutdown")); | 104 const FilePath dir(FILE_PATH_LITERAL("fast_shutdown")); |
96 const FilePath file(FILE_PATH_LITERAL("on_unloader.html")); | 105 const FilePath file(FILE_PATH_LITERAL("on_unloader.html")); |
97 | 106 |
98 NavigateToURL(ui_test_utils::GetTestUrl(dir, file)); | 107 NavigateToURL(ui_test_utils::GetTestUrl(dir, file)); |
99 | 108 |
100 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); | 109 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); |
101 | 110 |
102 // This page has a beforeunload handler. | 111 // This page has a beforeunload handler. |
103 ASSERT_TRUE(browser->GetTab(0)->ExecuteJavaScript( | 112 ASSERT_TRUE(browser->GetTab(0)->ExecuteJavaScript( |
104 "open('on_before_unloader.html')")); | 113 "open('on_before_unloader.html')")); |
105 WaitUntilTabCount(2); | 114 WaitUntilTabCount(2); |
106 | 115 |
107 // Close the tab, removing the one and only beforeunload handler. | 116 // Close the tab, removing the one and only beforeunload handler. |
108 ASSERT_TRUE(browser->GetTab(1)->Close(true)); | 117 ASSERT_TRUE(browser->GetTab(1)->Close(true)); |
109 | 118 |
110 // Close the browser. This should launch the unload handler, which sets a | 119 // Close the browser. This should launch the unload handler, which sets a |
111 // cookie that's stored to disk. | 120 // cookie that's stored to disk. |
112 QuitBrowser(); | 121 QuitBrowser(); |
113 | 122 |
| 123 bool has_cookie = false; |
| 124 std::string cookie_value; |
114 // Read the cookie and check that it has the expected value. | 125 // Read the cookie and check that it has the expected value. |
115 GetCookie(cookie, &has_cookie, &cookie_value); | 126 GetCookie(cookie, &has_cookie, &cookie_value); |
116 EXPECT_TRUE(has_cookie); | 127 EXPECT_TRUE(has_cookie); |
117 EXPECT_EQ("ohyeah", cookie_value); | 128 EXPECT_EQ("ohyeah", cookie_value); |
118 } | 129 } |
OLD | NEW |