| 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 | 
|---|