| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/ui/tabs/tab_strip_model.h" | 5 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
| 15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "chrome/browser/defaults.h" | 17 #include "chrome/browser/defaults.h" |
| 18 #include "chrome/browser/extensions/tab_helper.h" | 18 #include "chrome/browser/extensions/tab_helper.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/browser/ui/browser.h" | 20 #include "chrome/browser/ui/browser.h" |
| 21 #include "chrome/browser/ui/browser_tabstrip.h" | 21 #include "chrome/browser/ui/browser_tabstrip.h" |
| 22 #include "chrome/browser/ui/tabs/tab_discard_state.h" |
| 22 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" | 23 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" |
| 23 #include "chrome/browser/ui/tabs/tab_strip_model_order_controller.h" | 24 #include "chrome/browser/ui/tabs/tab_strip_model_order_controller.h" |
| 24 #include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" | 25 #include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" |
| 25 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" | 26 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" |
| 26 #include "chrome/common/url_constants.h" | 27 #include "chrome/common/url_constants.h" |
| 27 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 28 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 28 #include "chrome/test/base/testing_profile.h" | 29 #include "chrome/test/base/testing_profile.h" |
| 29 #include "components/web_modal/web_contents_modal_dialog_manager.h" | 30 #include "components/web_modal/web_contents_modal_dialog_manager.h" |
| 30 #include "content/public/browser/navigation_controller.h" | 31 #include "content/public/browser/navigation_controller.h" |
| 31 #include "content/public/browser/navigation_entry.h" | 32 #include "content/public/browser/navigation_entry.h" |
| (...skipping 2102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2134 tabstrip.AppendWebContents(contents2, true); | 2135 tabstrip.AppendWebContents(contents2, true); |
| 2135 | 2136 |
| 2136 // Start watching for events after the appends to avoid observing state | 2137 // Start watching for events after the appends to avoid observing state |
| 2137 // transitions that aren't relevant to this test. | 2138 // transitions that aren't relevant to this test. |
| 2138 MockTabStripModelObserver tabstrip_observer(&tabstrip); | 2139 MockTabStripModelObserver tabstrip_observer(&tabstrip); |
| 2139 tabstrip.AddObserver(&tabstrip_observer); | 2140 tabstrip.AddObserver(&tabstrip_observer); |
| 2140 | 2141 |
| 2141 // Discard one of the tabs. | 2142 // Discard one of the tabs. |
| 2142 WebContents* null_contents1 = tabstrip.DiscardWebContentsAt(0); | 2143 WebContents* null_contents1 = tabstrip.DiscardWebContentsAt(0); |
| 2143 ASSERT_EQ(2, tabstrip.count()); | 2144 ASSERT_EQ(2, tabstrip.count()); |
| 2144 EXPECT_TRUE(tabstrip.IsTabDiscarded(0)); | 2145 EXPECT_TRUE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(0))); |
| 2145 EXPECT_FALSE(tabstrip.IsTabDiscarded(1)); | 2146 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2146 ASSERT_EQ(null_contents1, tabstrip.GetWebContentsAt(0)); | 2147 ASSERT_EQ(null_contents1, tabstrip.GetWebContentsAt(0)); |
| 2147 ASSERT_EQ(contents2, tabstrip.GetWebContentsAt(1)); | 2148 ASSERT_EQ(contents2, tabstrip.GetWebContentsAt(1)); |
| 2148 ASSERT_EQ(1, tabstrip_observer.GetStateCount()); | 2149 ASSERT_EQ(1, tabstrip_observer.GetStateCount()); |
| 2149 State state1(null_contents1, 0, MockTabStripModelObserver::REPLACED); | 2150 State state1(null_contents1, 0, MockTabStripModelObserver::REPLACED); |
| 2150 state1.src_contents = contents1; | 2151 state1.src_contents = contents1; |
| 2151 EXPECT_TRUE(tabstrip_observer.StateEquals(0, state1)); | 2152 EXPECT_TRUE(tabstrip_observer.StateEquals(0, state1)); |
| 2152 tabstrip_observer.ClearStates(); | 2153 tabstrip_observer.ClearStates(); |
| 2153 | 2154 |
| 2154 // Discard the same tab again. | 2155 // Discard the same tab again. |
| 2155 WebContents* null_contents2 = tabstrip.DiscardWebContentsAt(0); | 2156 WebContents* null_contents2 = tabstrip.DiscardWebContentsAt(0); |
| 2156 ASSERT_EQ(2, tabstrip.count()); | 2157 ASSERT_EQ(2, tabstrip.count()); |
| 2157 EXPECT_TRUE(tabstrip.IsTabDiscarded(0)); | 2158 EXPECT_TRUE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(0))); |
| 2158 EXPECT_FALSE(tabstrip.IsTabDiscarded(1)); | 2159 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2159 ASSERT_EQ(null_contents2, tabstrip.GetWebContentsAt(0)); | 2160 ASSERT_EQ(null_contents2, tabstrip.GetWebContentsAt(0)); |
| 2160 ASSERT_EQ(contents2, tabstrip.GetWebContentsAt(1)); | 2161 ASSERT_EQ(contents2, tabstrip.GetWebContentsAt(1)); |
| 2161 ASSERT_EQ(1, tabstrip_observer.GetStateCount()); | 2162 ASSERT_EQ(1, tabstrip_observer.GetStateCount()); |
| 2162 State state2(null_contents2, 0, MockTabStripModelObserver::REPLACED); | 2163 State state2(null_contents2, 0, MockTabStripModelObserver::REPLACED); |
| 2163 state2.src_contents = null_contents1; | 2164 state2.src_contents = null_contents1; |
| 2164 EXPECT_TRUE(tabstrip_observer.StateEquals(0, state2)); | 2165 EXPECT_TRUE(tabstrip_observer.StateEquals(0, state2)); |
| 2165 tabstrip_observer.ClearStates(); | 2166 tabstrip_observer.ClearStates(); |
| 2166 | 2167 |
| 2167 // Activating the tab should clear its discard state. | 2168 // Activating the tab should clear its discard state. |
| 2168 tabstrip.ActivateTabAt(0, true /* user_gesture */); | 2169 tabstrip.ActivateTabAt(0, true /* user_gesture */); |
| 2169 ASSERT_EQ(2, tabstrip.count()); | 2170 ASSERT_EQ(2, tabstrip.count()); |
| 2170 EXPECT_FALSE(tabstrip.IsTabDiscarded(0)); | 2171 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(0))); |
| 2171 EXPECT_FALSE(tabstrip.IsTabDiscarded(1)); | 2172 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2172 | 2173 |
| 2173 // Don't discard active tab. | 2174 // Don't discard active tab. |
| 2174 tabstrip.DiscardWebContentsAt(0); | 2175 tabstrip.DiscardWebContentsAt(0); |
| 2175 ASSERT_EQ(2, tabstrip.count()); | 2176 ASSERT_EQ(2, tabstrip.count()); |
| 2176 EXPECT_FALSE(tabstrip.IsTabDiscarded(0)); | 2177 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(0))); |
| 2177 EXPECT_FALSE(tabstrip.IsTabDiscarded(1)); | 2178 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2178 | 2179 |
| 2179 tabstrip.CloseAllTabs(); | 2180 tabstrip.CloseAllTabs(); |
| 2180 } | 2181 } |
| 2181 | 2182 |
| 2182 // Makes sure that reloading a discarded tab without activating it unmarks the | 2183 // Makes sure that reloading a discarded tab without activating it unmarks the |
| 2183 // tab as discarded so it won't reload on activation. | 2184 // tab as discarded so it won't reload on activation. |
| 2184 TEST_F(TabStripModelTest, ReloadDiscardedTabContextMenu) { | 2185 TEST_F(TabStripModelTest, ReloadDiscardedTabContextMenu) { |
| 2185 TabStripDummyDelegate delegate; | 2186 TabStripDummyDelegate delegate; |
| 2186 TabStripModel tabstrip(&delegate, profile()); | 2187 TabStripModel tabstrip(&delegate, profile()); |
| 2187 | 2188 |
| 2188 // Create 2 tabs because the active tab cannot be discarded. | 2189 // Create 2 tabs because the active tab cannot be discarded. |
| 2189 tabstrip.AppendWebContents(CreateWebContents(), true); | 2190 tabstrip.AppendWebContents(CreateWebContents(), true); |
| 2190 content::WebContents* test_contents = | 2191 content::WebContents* test_contents = |
| 2191 WebContentsTester::CreateTestWebContents(browser_context(), nullptr); | 2192 WebContentsTester::CreateTestWebContents(browser_context(), nullptr); |
| 2192 tabstrip.AppendWebContents(test_contents, false); // Opened in background. | 2193 tabstrip.AppendWebContents(test_contents, false); // Opened in background. |
| 2193 | 2194 |
| 2194 // Navigate to a web page. This is necessary to set a current entry in memory | 2195 // Navigate to a web page. This is necessary to set a current entry in memory |
| 2195 // so the reload can happen. | 2196 // so the reload can happen. |
| 2196 WebContentsTester::For(test_contents) | 2197 WebContentsTester::For(test_contents) |
| 2197 ->NavigateAndCommit(GURL("chrome://newtab")); | 2198 ->NavigateAndCommit(GURL("chrome://newtab")); |
| 2198 EXPECT_FALSE(tabstrip.IsTabDiscarded(1)); | 2199 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2199 | 2200 |
| 2200 tabstrip.DiscardWebContentsAt(1); | 2201 tabstrip.DiscardWebContentsAt(1); |
| 2201 EXPECT_TRUE(tabstrip.IsTabDiscarded(1)); | 2202 EXPECT_TRUE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2202 | 2203 |
| 2203 tabstrip.GetWebContentsAt(1)->GetController().Reload(false); | 2204 tabstrip.GetWebContentsAt(1)->GetController().Reload(false); |
| 2204 EXPECT_FALSE(tabstrip.IsTabDiscarded(1)); | 2205 EXPECT_FALSE(TabDiscardState::IsDiscarded(tabstrip.GetWebContentsAt(1))); |
| 2205 | 2206 |
| 2206 tabstrip.CloseAllTabs(); | 2207 tabstrip.CloseAllTabs(); |
| 2207 } | 2208 } |
| 2208 | 2209 |
| 2209 // Makes sure that the last active time property is saved even though the tab is | 2210 // Makes sure that the last active time property is saved even though the tab is |
| 2210 // discarded. | 2211 // discarded. |
| 2211 TEST_F(TabStripModelTest, DiscardedTabKeepsLastActiveTime) { | 2212 TEST_F(TabStripModelTest, DiscardedTabKeepsLastActiveTime) { |
| 2212 TabStripDummyDelegate delegate; | 2213 TabStripDummyDelegate delegate; |
| 2213 TabStripModel tabstrip(&delegate, profile()); | 2214 TabStripModel tabstrip(&delegate, profile()); |
| 2214 | 2215 |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2627 WebContents* page_d_contents = CreateWebContents(); | 2628 WebContents* page_d_contents = CreateWebContents(); |
| 2628 strip.AddWebContents(page_c_contents, -1, ui::PAGE_TRANSITION_LINK, | 2629 strip.AddWebContents(page_c_contents, -1, ui::PAGE_TRANSITION_LINK, |
| 2629 TabStripModel::ADD_NONE); | 2630 TabStripModel::ADD_NONE); |
| 2630 strip.AddWebContents(page_d_contents, -1, ui::PAGE_TRANSITION_LINK, | 2631 strip.AddWebContents(page_d_contents, -1, ui::PAGE_TRANSITION_LINK, |
| 2631 TabStripModel::ADD_NONE); | 2632 TabStripModel::ADD_NONE); |
| 2632 | 2633 |
| 2633 EXPECT_EQ(2, strip.GetIndexOfWebContents(page_c_contents)); | 2634 EXPECT_EQ(2, strip.GetIndexOfWebContents(page_c_contents)); |
| 2634 EXPECT_EQ(3, strip.GetIndexOfWebContents(page_d_contents)); | 2635 EXPECT_EQ(3, strip.GetIndexOfWebContents(page_d_contents)); |
| 2635 strip.CloseAllTabs(); | 2636 strip.CloseAllTabs(); |
| 2636 } | 2637 } |
| OLD | NEW |