Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1226)

Side by Side Diff: chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc

Issue 2768633003: Dynamic updating recent menu for tabs from other devices. (Closed)
Patch Set: Fixes compilation and test on Mac. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/toolbar/recent_tabs_sub_menu_model.h" 5 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/strings/utf_string_conversions.h"
15 #include "build/build_config.h" 16 #include "build/build_config.h"
16 #include "chrome/app/chrome_command_ids.h" 17 #include "chrome/app/chrome_command_ids.h"
17 #include "chrome/browser/sessions/chrome_tab_restore_service_client.h" 18 #include "chrome/browser/sessions/chrome_tab_restore_service_client.h"
18 #include "chrome/browser/sessions/session_service.h" 19 #include "chrome/browser/sessions/session_service.h"
19 #include "chrome/browser/sessions/session_service_factory.h" 20 #include "chrome/browser/sessions/session_service_factory.h"
20 #include "chrome/browser/sessions/tab_restore_service_factory.h" 21 #include "chrome/browser/sessions/tab_restore_service_factory.h"
22 #include "chrome/browser/sync/profile_sync_service_factory.h"
21 #include "chrome/browser/sync/profile_sync_test_util.h" 23 #include "chrome/browser/sync/profile_sync_test_util.h"
22 #include "chrome/browser/ui/browser.h" 24 #include "chrome/browser/ui/browser.h"
23 #include "chrome/browser/ui/browser_tabstrip.h" 25 #include "chrome/browser/ui/browser_tabstrip.h"
24 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h" 26 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h"
25 #include "chrome/browser/ui/tabs/tab_strip_model.h" 27 #include "chrome/browser/ui/tabs/tab_strip_model.h"
26 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h" 28 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h"
27 #include "chrome/common/chrome_switches.h" 29 #include "chrome/common/chrome_switches.h"
28 #include "chrome/test/base/browser_with_test_window_test.h" 30 #include "chrome/test/base/browser_with_test_window_test.h"
29 #include "chrome/test/base/menu_model_test.h" 31 #include "chrome/test/base/menu_model_test.h"
30 #include "chrome/test/base/testing_profile.h" 32 #include "chrome/test/base/testing_profile.h"
31 #include "components/browser_sync/profile_sync_service_mock.h" 33 #include "components/browser_sync/profile_sync_service_mock.h"
32 #include "components/sessions/core/persistent_tab_restore_service.h" 34 #include "components/sessions/core/persistent_tab_restore_service.h"
33 #include "components/sessions/core/serialized_navigation_entry_test_helper.h" 35 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
34 #include "components/sessions/core/session_types.h" 36 #include "components/sessions/core/session_types.h"
35 #include "components/sync/base/sync_prefs.h" 37 #include "components/sync/base/sync_prefs.h"
36 #include "components/sync/device_info/local_device_info_provider_mock.h" 38 #include "components/sync/device_info/local_device_info_provider_mock.h"
37 #include "components/sync/driver/sync_client.h" 39 #include "components/sync/driver/sync_client.h"
38 #include "components/sync/model/fake_sync_change_processor.h" 40 #include "components/sync/model/fake_sync_change_processor.h"
39 #include "components/sync/model/sync_error_factory_mock.h" 41 #include "components/sync/model/sync_error_factory_mock.h"
40 #include "components/sync_sessions/sessions_sync_manager.h" 42 #include "components/sync_sessions/sessions_sync_manager.h"
41 #include "components/sync_sessions/synced_session.h" 43 #include "components/sync_sessions/synced_session.h"
42 #include "content/public/browser/browser_thread.h" 44 #include "content/public/browser/browser_thread.h"
43 #include "content/public/test/test_utils.h" 45 #include "content/public/test/test_utils.h"
44 #include "testing/gmock/include/gmock/gmock.h" 46 #include "testing/gmock/include/gmock/gmock.h"
45 #include "testing/gtest/include/gtest/gtest.h" 47 #include "testing/gtest/include/gtest/gtest.h"
46 48
49 using testing::_;
50 using testing::Invoke;
51 using testing::Return;
52
47 namespace { 53 namespace {
48 54
49 // This copies parts of MenuModelTest::Delegate and combines them with the 55 // This copies parts of MenuModelTest::Delegate and combines them with the
50 // RecentTabsSubMenuModel since RecentTabsSubMenuModel is a 56 // RecentTabsSubMenuModel since RecentTabsSubMenuModel is a
51 // SimpleMenuModel::Delegate and not just derived from SimpleMenuModel. 57 // SimpleMenuModel::Delegate and not just derived from SimpleMenuModel.
52 class TestRecentTabsSubMenuModel : public RecentTabsSubMenuModel { 58 class TestRecentTabsSubMenuModel : public RecentTabsSubMenuModel {
53 public: 59 public:
54 TestRecentTabsSubMenuModel(ui::AcceleratorProvider* provider, 60 TestRecentTabsSubMenuModel(ui::AcceleratorProvider* provider,
55 Browser* browser, 61 Browser* browser)
56 sync_sessions::OpenTabsUIDelegate* delegate) 62 : RecentTabsSubMenuModel(provider, browser),
57 : RecentTabsSubMenuModel(provider, browser, delegate),
58 execute_count_(0), 63 execute_count_(0),
59 enable_count_(0) {} 64 enable_count_(0) {}
60 65
61 // Testing overrides to ui::SimpleMenuModel::Delegate: 66 // Testing overrides to ui::SimpleMenuModel::Delegate:
62 bool IsCommandIdEnabled(int command_id) const override { 67 bool IsCommandIdEnabled(int command_id) const override {
63 bool val = RecentTabsSubMenuModel::IsCommandIdEnabled(command_id); 68 bool val = RecentTabsSubMenuModel::IsCommandIdEnabled(command_id);
64 if (val) 69 if (val)
65 ++enable_count_; 70 ++enable_count_;
66 return val; 71 return val;
67 } 72 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 }; 113 };
109 114
110 class DummyRouter : public sync_sessions::LocalSessionEventRouter { 115 class DummyRouter : public sync_sessions::LocalSessionEventRouter {
111 public: 116 public:
112 ~DummyRouter() override {} 117 ~DummyRouter() override {}
113 void StartRoutingTo( 118 void StartRoutingTo(
114 sync_sessions::LocalSessionEventHandler* handler) override {} 119 sync_sessions::LocalSessionEventHandler* handler) override {}
115 void Stop() override {} 120 void Stop() override {}
116 }; 121 };
117 122
123 class FakeSyncServiceObserverList {
124 public:
125 FakeSyncServiceObserverList() {}
126 ~FakeSyncServiceObserverList() {}
127
128 void AddObserver(syncer::SyncServiceObserver* observer) {
129 observers_.AddObserver(observer);
130 }
131
132 void RemoveObserver(syncer::SyncServiceObserver* observer) {
133 observers_.RemoveObserver(observer);
134 }
135
136 void NotifyConfigureDone() {
137 for (auto& observer : observers_)
138 observer.OnSyncConfigurationCompleted(nullptr);
139 }
140
141 void NotifyForeignSessionUpdated() {
142 for (auto& observer : observers_)
143 observer.OnForeignSessionUpdated(nullptr);
144 }
145
146 private:
147 base::ObserverList<syncer::SyncServiceObserver, true> observers_;
148
149 DISALLOW_COPY_AND_ASSIGN(FakeSyncServiceObserverList);
150 };
151
118 } // namespace 152 } // namespace
119 153
120 class RecentTabsSubMenuModelTest 154 class RecentTabsSubMenuModelTest
121 : public BrowserWithTestWindowTest { 155 : public BrowserWithTestWindowTest {
122 public: 156 public:
123 RecentTabsSubMenuModelTest() 157 RecentTabsSubMenuModelTest() {}
124 : sync_service_(CreateProfileSyncServiceParamsForTest(&testing_profile_)), 158
125 local_device_(new syncer::LocalDeviceInfoProviderMock( 159 void SetUp() override {
126 "RecentTabsSubMenuModelTest", 160 BrowserWithTestWindowTest::SetUp();
127 "Test Machine", 161
128 "Chromium 10k", 162 local_device_ = base::MakeUnique<syncer::LocalDeviceInfoProviderMock>(
129 "Chrome 10k", 163 "RecentTabsSubMenuModelTest", "Test Machine", "Chromium 10k",
130 sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 164 "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id");
131 "device_id")), 165
132 dummy_router_(base::MakeUnique<DummyRouter>()), 166 sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(profile()->GetPrefs());
133 sync_prefs_( 167
134 base::MakeUnique<syncer::SyncPrefs>(testing_profile_.GetPrefs())), 168 mock_sync_service_ = static_cast<browser_sync::ProfileSyncServiceMock*>(
135 manager_(base::MakeUnique<sync_sessions::SessionsSyncManager>( 169 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
136 sync_service_.GetSyncClient()->GetSyncSessionsClient(), 170 profile(), BuildMockProfileSyncService));
137 sync_prefs_.get(), 171
138 local_device_.get(), 172 EXPECT_CALL(*mock_sync_service_, AddObserver(_))
139 dummy_router_.get(), 173 .WillRepeatedly(Invoke(&fake_sync_service_observer_list_,
140 base::Closure(), 174 &FakeSyncServiceObserverList::AddObserver));
141 base::Closure())) { 175 EXPECT_CALL(*mock_sync_service_, RemoveObserver(_))
176 .WillRepeatedly(Invoke(&fake_sync_service_observer_list_,
177 &FakeSyncServiceObserverList::RemoveObserver));
178
179 manager_ = base::MakeUnique<sync_sessions::SessionsSyncManager>(
180 mock_sync_service_->GetSyncClient()->GetSyncSessionsClient(),
181 sync_prefs_.get(), local_device_.get(), &dummy_router_,
182 base::Bind(&FakeSyncServiceObserverList::NotifyForeignSessionUpdated,
183 base::Unretained(&fake_sync_service_observer_list_)),
184 base::Closure());
185
142 manager_->MergeDataAndStartSyncing( 186 manager_->MergeDataAndStartSyncing(
143 syncer::SESSIONS, syncer::SyncDataList(), 187 syncer::SESSIONS, syncer::SyncDataList(),
144 std::unique_ptr<syncer::SyncChangeProcessor>( 188 std::unique_ptr<syncer::SyncChangeProcessor>(
145 new syncer::FakeSyncChangeProcessor), 189 new syncer::FakeSyncChangeProcessor),
146 std::unique_ptr<syncer::SyncErrorFactory>( 190 std::unique_ptr<syncer::SyncErrorFactory>(
147 new syncer::SyncErrorFactoryMock)); 191 new syncer::SyncErrorFactoryMock));
148 } 192 }
149 193
194 void TearDown() override {
195 manager_.reset();
196 sync_prefs_.reset();
197 local_device_.reset();
198 BrowserWithTestWindowTest::TearDown();
199 }
200
150 void WaitForLoadFromLastSession() { 201 void WaitForLoadFromLastSession() {
151 content::RunAllBlockingPoolTasksUntilIdle(); 202 content::RunAllBlockingPoolTasksUntilIdle();
152 } 203 }
153 204
205 void DisableSync() {
206 EXPECT_CALL(*mock_sync_service_, IsSyncActive())
207 .WillRepeatedly(Return(false));
208 EXPECT_CALL(*mock_sync_service_, IsDataTypeControllerRunning(_))
209 .WillRepeatedly(Return(false));
210 EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock())
211 .WillRepeatedly(Return(nullptr));
212 }
213
214 void EnableSync() {
215 EXPECT_CALL(*mock_sync_service_, IsSyncActive())
216 .WillRepeatedly(Return(true));
217 EXPECT_CALL(*mock_sync_service_,
218 IsDataTypeControllerRunning(syncer::SESSIONS))
219 .WillRepeatedly(Return(true));
220 EXPECT_CALL(*mock_sync_service_,
221 IsDataTypeControllerRunning(syncer::PROXY_TABS))
222 .WillRepeatedly(Return(true));
223 EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock())
224 .WillRepeatedly(Return(manager_.get()));
225 }
226
227 void NotifySyncEnabled() {
228 fake_sync_service_observer_list_.NotifyConfigureDone();
229 }
230
154 static std::unique_ptr<KeyedService> GetTabRestoreService( 231 static std::unique_ptr<KeyedService> GetTabRestoreService(
155 content::BrowserContext* browser_context) { 232 content::BrowserContext* browser_context) {
156 return base::MakeUnique<sessions::PersistentTabRestoreService>( 233 return base::MakeUnique<sessions::PersistentTabRestoreService>(
157 base::WrapUnique(new ChromeTabRestoreServiceClient( 234 base::WrapUnique(new ChromeTabRestoreServiceClient(
158 Profile::FromBrowserContext(browser_context))), 235 Profile::FromBrowserContext(browser_context))),
159 nullptr); 236 nullptr);
160 } 237 }
161 238
162 sync_sessions::OpenTabsUIDelegate* GetOpenTabsDelegate() {
163 return manager_.get();
164 }
165
166 void RegisterRecentTabs(RecentTabsBuilderTestHelper* helper) { 239 void RegisterRecentTabs(RecentTabsBuilderTestHelper* helper) {
167 helper->ExportToSessionsSyncManager(manager_.get()); 240 helper->ExportToSessionsSyncManager(manager_.get());
168 } 241 }
169 242
170 private: 243 private:
171 TestingProfile testing_profile_;
172 browser_sync::ProfileSyncServiceMock sync_service_;
173 std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_; 244 std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_;
174 std::unique_ptr<DummyRouter> dummy_router_; 245 DummyRouter dummy_router_;
175 std::unique_ptr<syncer::SyncPrefs> sync_prefs_; 246 std::unique_ptr<syncer::SyncPrefs> sync_prefs_;
247 FakeSyncServiceObserverList fake_sync_service_observer_list_;
248 browser_sync::ProfileSyncServiceMock* mock_sync_service_ = nullptr;
176 std::unique_ptr<sync_sessions::SessionsSyncManager> manager_; 249 std::unique_ptr<sync_sessions::SessionsSyncManager> manager_;
177 }; 250 };
178 251
179 // Test disabled "Recently closed" header with no foreign tabs. 252 // Test disabled "Recently closed" header with no foreign tabs.
180 TEST_F(RecentTabsSubMenuModelTest, NoTabs) { 253 TEST_F(RecentTabsSubMenuModelTest, NoTabs) {
181 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); 254 DisableSync();
255
256 TestRecentTabsSubMenuModel model(nullptr, browser());
182 257
183 // Expected menu: 258 // Expected menu:
184 // Menu index Menu items 259 // Menu index Menu items
185 // --------------------------------------------- 260 // ---------------------------------------------
186 // 0 History 261 // 0 History
187 // 1 <separator> 262 // 1 <separator>
188 // 2 Recently closed header (disabled) 263 // 2 Recently closed header (disabled)
189 // 3 <separator> 264 // 3 <separator>
190 // 4 No tabs from other Devices 265 // 4 No tabs from other Devices
191 266
(...skipping 13 matching lines...) Expand all
205 base::string16 title; 280 base::string16 title;
206 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(0, &url, &title)); 281 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(0, &url, &title));
207 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(1, &url, &title)); 282 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(1, &url, &title));
208 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(2, &url, &title)); 283 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(2, &url, &title));
209 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(3, &url, &title)); 284 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(3, &url, &title));
210 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); 285 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title));
211 } 286 }
212 287
213 // Test enabled "Recently closed" header with no foreign tabs. 288 // Test enabled "Recently closed" header with no foreign tabs.
214 TEST_F(RecentTabsSubMenuModelTest, RecentlyClosedTabsFromCurrentSession) { 289 TEST_F(RecentTabsSubMenuModelTest, RecentlyClosedTabsFromCurrentSession) {
290 DisableSync();
291
215 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( 292 TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
216 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); 293 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService);
217 294
218 // Add 2 tabs and close them. 295 // Add 2 tabs and close them.
219 AddTab(browser(), GURL("http://foo/1")); 296 AddTab(browser(), GURL("http://foo/1"));
220 AddTab(browser(), GURL("http://foo/2")); 297 AddTab(browser(), GURL("http://foo/2"));
221 browser()->tab_strip_model()->CloseAllTabs(); 298 browser()->tab_strip_model()->CloseAllTabs();
222 299
223 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); 300 TestRecentTabsSubMenuModel model(nullptr, browser());
224 // Expected menu: 301 // Expected menu:
225 // Menu index Menu items 302 // Menu index Menu items
226 // -------------------------------------- 303 // --------------------------------------
227 // 0 History 304 // 0 History
228 // 1 <separator> 305 // 1 <separator>
229 // 2 Recently closed header 306 // 2 Recently closed header
230 // 3 <tab for http://foo/2> 307 // 3 <tab for http://foo/2>
231 // 4 <tab for http://foo/1> 308 // 4 <tab for http://foo/1>
232 // 5 <separator> 309 // 5 <separator>
233 // 6 No tabs from other Devices 310 // 6 No tabs from other Devices
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 // RecentTabsSubMenuModel. 345 // RecentTabsSubMenuModel.
269 #if defined(OS_MACOSX) 346 #if defined(OS_MACOSX)
270 #define MAYBE_RecentlyClosedTabsAndWindowsFromLastSession \ 347 #define MAYBE_RecentlyClosedTabsAndWindowsFromLastSession \
271 DISABLED_RecentlyClosedTabsAndWindowsFromLastSession 348 DISABLED_RecentlyClosedTabsAndWindowsFromLastSession
272 #else 349 #else
273 #define MAYBE_RecentlyClosedTabsAndWindowsFromLastSession \ 350 #define MAYBE_RecentlyClosedTabsAndWindowsFromLastSession \
274 RecentlyClosedTabsAndWindowsFromLastSession 351 RecentlyClosedTabsAndWindowsFromLastSession
275 #endif 352 #endif
276 TEST_F(RecentTabsSubMenuModelTest, 353 TEST_F(RecentTabsSubMenuModelTest,
277 MAYBE_RecentlyClosedTabsAndWindowsFromLastSession) { 354 MAYBE_RecentlyClosedTabsAndWindowsFromLastSession) {
355 DisableSync();
356
278 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( 357 TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
279 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); 358 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService);
280 359
281 // Add 2 tabs and close them. 360 // Add 2 tabs and close them.
282 AddTab(browser(), GURL("http://wnd/tab0")); 361 AddTab(browser(), GURL("http://wnd/tab0"));
283 AddTab(browser(), GURL("http://wnd/tab1")); 362 AddTab(browser(), GURL("http://wnd/tab1"));
284 browser()->tab_strip_model()->CloseAllTabs(); 363 browser()->tab_strip_model()->CloseAllTabs();
285 364
286 // Create a SessionService for the profile (profile owns the service) and add 365 // Create a SessionService for the profile (profile owns the service) and add
287 // a window with a tab to this session. 366 // a window with a tab to this session.
(...skipping 19 matching lines...) Expand all
307 SessionServiceFactory::GetForProfile(profile())-> 386 SessionServiceFactory::GetForProfile(profile())->
308 MoveCurrentSessionToLastSession(); 387 MoveCurrentSessionToLastSession();
309 388
310 // Create a new TabRestoreService so that it'll load the recently closed tabs 389 // Create a new TabRestoreService so that it'll load the recently closed tabs
311 // and windows afresh. 390 // and windows afresh.
312 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( 391 TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
313 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); 392 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService);
314 // Let the shutdown of previous TabRestoreService run. 393 // Let the shutdown of previous TabRestoreService run.
315 content::RunAllBlockingPoolTasksUntilIdle(); 394 content::RunAllBlockingPoolTasksUntilIdle();
316 395
317 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); 396 TestRecentTabsSubMenuModel model(nullptr, browser());
318 TestRecentTabsMenuModelDelegate delegate(&model); 397 TestRecentTabsMenuModelDelegate delegate(&model);
319 EXPECT_FALSE(delegate.got_changes()); 398 EXPECT_FALSE(delegate.got_changes());
320 399
321 // Expected menu before tabs/windows from last session are loaded: 400 // Expected menu before tabs/windows from last session are loaded:
322 // Menu index Menu items 401 // Menu index Menu items
323 // ---------------------------------------------------------------- 402 // ----------------------------------------------------------------
324 // 0 History 403 // 0 History
325 // 1 <separator> 404 // 1 <separator>
326 // 2 Recently closed header 405 // 2 Recently closed header
327 // 3 <separator> 406 // 3 <separator>
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(3, &url, &title)); 468 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(3, &url, &title));
390 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); 469 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(4, &url, &title));
391 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); 470 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title));
392 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); 471 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(6, &url, &title));
393 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(7, &url, &title)); 472 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(7, &url, &title));
394 } 473 }
395 474
396 // Test disabled "Recently closed" header with multiple sessions, multiple 475 // Test disabled "Recently closed" header with multiple sessions, multiple
397 // windows, and multiple enabled tabs from other devices. 476 // windows, and multiple enabled tabs from other devices.
398 TEST_F(RecentTabsSubMenuModelTest, OtherDevices) { 477 TEST_F(RecentTabsSubMenuModelTest, OtherDevices) {
478 EnableSync();
479
399 // Tabs are populated in decreasing timestamp. 480 // Tabs are populated in decreasing timestamp.
400 base::Time timestamp = base::Time::Now(); 481 base::Time timestamp = base::Time::Now();
401 const base::TimeDelta time_delta = base::TimeDelta::FromMinutes(10); 482 const base::TimeDelta time_delta = base::TimeDelta::FromMinutes(10);
402 483
403 RecentTabsBuilderTestHelper recent_tabs_builder; 484 RecentTabsBuilderTestHelper recent_tabs_builder;
404 485
405 // Create 1st session : 1 window, 3 tabs 486 // Create 1st session : 1 window, 3 tabs
406 recent_tabs_builder.AddSession(); 487 recent_tabs_builder.AddSession();
407 recent_tabs_builder.AddWindow(0); 488 recent_tabs_builder.AddWindow(0);
408 for (int i = 0; i < 3; ++i) { 489 for (int i = 0; i < 3; ++i) {
(...skipping 23 matching lines...) Expand all
432 // 1 <separator> 513 // 1 <separator>
433 // 2 Recently closed header (disabled) 514 // 2 Recently closed header (disabled)
434 // 3 <separator> 515 // 3 <separator>
435 // 4 <section header for 1st session> 516 // 4 <section header for 1st session>
436 // 5-7 <3 tabs of the only window of session 0> 517 // 5-7 <3 tabs of the only window of session 0>
437 // 8 <separator> 518 // 8 <separator>
438 // 9 <section header for 2nd session> 519 // 9 <section header for 2nd session>
439 // 10 <the only tab of window 0 of session 1> 520 // 10 <the only tab of window 0 of session 1>
440 // 11-12 <2 tabs of window 1 of session 2> 521 // 11-12 <2 tabs of window 1 of session 2>
441 522
442 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); 523 TestRecentTabsSubMenuModel model(nullptr, browser());
443 int num_items = model.GetItemCount(); 524 int num_items = model.GetItemCount();
444 EXPECT_EQ(13, num_items); 525 EXPECT_EQ(13, num_items);
445 model.ActivatedAt(0); 526 model.ActivatedAt(0);
446 EXPECT_TRUE(model.IsEnabledAt(0)); 527 EXPECT_TRUE(model.IsEnabledAt(0));
447 model.ActivatedAt(1); 528 model.ActivatedAt(1);
448 EXPECT_TRUE(model.IsEnabledAt(1)); 529 EXPECT_TRUE(model.IsEnabledAt(1));
449 model.ActivatedAt(2); 530 model.ActivatedAt(2);
450 EXPECT_FALSE(model.IsEnabledAt(2)); 531 EXPECT_FALSE(model.IsEnabledAt(2));
451 model.ActivatedAt(3); 532 model.ActivatedAt(3);
452 EXPECT_TRUE(model.IsEnabledAt(3)); 533 EXPECT_TRUE(model.IsEnabledAt(3));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); 571 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title));
491 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); 572 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(6, &url, &title));
492 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(7, &url, &title)); 573 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(7, &url, &title));
493 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(8, &url, &title)); 574 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(8, &url, &title));
494 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(9, &url, &title)); 575 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(9, &url, &title));
495 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(10, &url, &title)); 576 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(10, &url, &title));
496 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(11, &url, &title)); 577 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(11, &url, &title));
497 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(12, &url, &title)); 578 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(12, &url, &title));
498 } 579 }
499 580
500 // Per http://crbug.com/603744, MaxSessionsAndRecenty fails intermittently on 581 // Mac doesn't support the dynamic menu.
501 // windows, linux and mac. 582 #if defined(OS_MACOSX)
502 #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) 583 #define MAYBE_OtherDevicesDynamicUpdate DISABLED_OtherDevicesDynamicUpdate
503 #define MAYBE_MaxSessionsAndRecency DISABLED_MaxSessionsAndRecency
504 #else 584 #else
505 #define MAYBE_MaxSessionsAndRecency MaxSessionsAndRecency 585 #define MAYBE_OtherDevicesDynamicUpdate OtherDevicesDynamicUpdate
506 #endif 586 #endif
507 TEST_F(RecentTabsSubMenuModelTest, MAYBE_MaxSessionsAndRecency) { 587 TEST_F(RecentTabsSubMenuModelTest, MAYBE_OtherDevicesDynamicUpdate) {
588 // Create menu with disabled synchronization.
589 DisableSync();
590
591 // Before creating menu fill foreign sessions.
592 base::Time update_timestamp =
593 base::Time::Now() - base::TimeDelta::FromMinutes(10);
594
595 RecentTabsBuilderTestHelper recent_tabs_builder;
596
597 // Create one session with one window and one tab.
598 recent_tabs_builder.AddSession();
599 recent_tabs_builder.AddWindow(0);
600 recent_tabs_builder.AddTabWithInfo(0, 0, update_timestamp, base::string16());
601
602 RegisterRecentTabs(&recent_tabs_builder);
603
604 // Verify that data is populated correctly in RecentTabsSubMenuModel.
605 // Expected menu:
606 // Menu index Menu items
607 // -----------------------------------------------------
608 // 0 History
609 // 1 <separator>
610 // 2 Recently closed header (disabled)
611 // 3 <separator>
612 // 4 No tabs from other Devices
613
614 TestRecentTabsSubMenuModel model(nullptr, browser());
615 EXPECT_EQ(5, model.GetItemCount());
616 model.ActivatedAt(4);
617 EXPECT_FALSE(model.IsEnabledAt(4));
618
619 EXPECT_EQ(0, model.enable_count());
620 EXPECT_EQ(1, model.execute_count());
621
622 EXPECT_EQ(nullptr, model.GetLabelFontListAt(4));
623
624 std::string url;
625 base::string16 title;
626 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title));
627
628 // Enable synchronization and notify menu that synchronization was enabled.
629 int previous_enable_count = model.enable_count();
630 int previous_execute_count = model.execute_count();
631
632 EnableSync();
633 NotifySyncEnabled();
634
635 // Verify that data is populated correctly in RecentTabsSubMenuModel.
636 // Expected menu:
637 // Menu index Menu items
638 // -----------------------------------------------------
639 // 0 History
640 // 1 <separator>
641 // 2 Recently closed header (disabled)
642 // 3 <separator>
643 // 4 <section header for 1st session>
644 // 5 <tab of the only window of session 0>
645
646 EXPECT_EQ(6, model.GetItemCount());
647 model.ActivatedAt(4);
648 EXPECT_FALSE(model.IsEnabledAt(4));
649 model.ActivatedAt(5);
650 EXPECT_TRUE(model.IsEnabledAt(5));
651
652 EXPECT_EQ(previous_enable_count + 1, model.enable_count());
653 EXPECT_EQ(previous_execute_count + 2, model.execute_count());
654
655 EXPECT_NE(nullptr, model.GetLabelFontListAt(4));
656 EXPECT_EQ(nullptr, model.GetLabelFontListAt(5));
657
658 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title));
659 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title));
660
661 // Make changes dynamically.
662 previous_enable_count = model.enable_count();
663 previous_execute_count = model.execute_count();
664
665 update_timestamp = base::Time::Now() - base::TimeDelta::FromMinutes(5);
666
667 // Add tab to the only window.
668 recent_tabs_builder.AddTabWithInfo(0, 0, update_timestamp, base::string16());
669
670 RegisterRecentTabs(&recent_tabs_builder);
671
672 // Verify that data is populated correctly in RecentTabsSubMenuModel.
673 // Expected menu:
674 // Menu index Menu items
675 // -----------------------------------------------------
676 // 0 History
677 // 1 <separator>
678 // 2 Recently closed header (disabled)
679 // 3 <separator>
680 // 4 <section header for 1st session>
681 // 5 <new added tab of the only window of session 0>
682 // 6 <tab of the only window of session 0>
683
684 EXPECT_EQ(7, model.GetItemCount());
685 model.ActivatedAt(4);
686 EXPECT_FALSE(model.IsEnabledAt(4));
687 model.ActivatedAt(5);
688 EXPECT_TRUE(model.IsEnabledAt(5));
689 model.ActivatedAt(6);
690 EXPECT_TRUE(model.IsEnabledAt(6));
691
692 EXPECT_EQ(previous_enable_count + 2, model.enable_count());
693 EXPECT_EQ(previous_execute_count + 3, model.execute_count());
694
695 EXPECT_NE(nullptr, model.GetLabelFontListAt(4));
696 EXPECT_EQ(nullptr, model.GetLabelFontListAt(5));
697 EXPECT_EQ(nullptr, model.GetLabelFontListAt(6));
698
699 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title));
700 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title));
701 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(6, &url, &title));
702 }
703
704 TEST_F(RecentTabsSubMenuModelTest, MaxSessionsAndRecency) {
705 EnableSync();
706
508 // Create 4 sessions : each session has 1 window with 1 tab each. 707 // Create 4 sessions : each session has 1 window with 1 tab each.
509 RecentTabsBuilderTestHelper recent_tabs_builder; 708 RecentTabsBuilderTestHelper recent_tabs_builder;
510 for (int s = 0; s < 4; ++s) { 709 for (int s = 0; s < 4; ++s) {
511 recent_tabs_builder.AddSession(); 710 recent_tabs_builder.AddSession();
512 recent_tabs_builder.AddWindow(s); 711 recent_tabs_builder.AddWindow(s);
513 recent_tabs_builder.AddTab(s, 0); 712 recent_tabs_builder.AddTab(s, 0);
514 } 713 }
515 RegisterRecentTabs(&recent_tabs_builder); 714 RegisterRecentTabs(&recent_tabs_builder);
516 715
517 // Verify that data is populated correctly in RecentTabsSubMenuModel. 716 // Verify that data is populated correctly in RecentTabsSubMenuModel.
518 // Expected menu: 717 // Expected menu:
519 // - max sessions is 3, so only 3 most-recent sessions will show. 718 // - max sessions is 3, so only 3 most-recent sessions will show.
520 // Menu index Menu items 719 // Menu index Menu items
521 // ---------------------------------------------------------- 720 // ----------------------------------------------------------
522 // 0 History 721 // 0 History
523 // 1 <separator> 722 // 1 <separator>
524 // 2 Recently closed header (disabled) 723 // 2 Recently closed header (disabled)
525 // 3 <separator> 724 // 3 <separator>
526 // 4 <section header for 1st session> 725 // 4 <section header for 1st session>
527 // 5 <the only tab of the only window of session 3> 726 // 5 <the only tab of the only window of session 3>
528 // 6 <separator> 727 // 6 <separator>
529 // 7 <section header for 2nd session> 728 // 7 <section header for 2nd session>
530 // 8 <the only tab of the only window of session 2> 729 // 8 <the only tab of the only window of session 2>
531 // 9 <separator> 730 // 9 <separator>
532 // 10 <section header for 3rd session> 731 // 10 <section header for 3rd session>
533 // 11 <the only tab of the only window of session 1> 732 // 11 <the only tab of the only window of session 1>
534 733
535 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); 734 TestRecentTabsSubMenuModel model(nullptr, browser());
536 int num_items = model.GetItemCount(); 735 int num_items = model.GetItemCount();
537 EXPECT_EQ(12, num_items); 736 EXPECT_EQ(12, num_items);
538 737
539 std::vector<base::string16> tab_titles = 738 std::vector<base::string16> tab_titles =
540 recent_tabs_builder.GetTabTitlesSortedByRecency(); 739 recent_tabs_builder.GetTabTitlesSortedByRecency();
541 EXPECT_EQ(tab_titles[0], model.GetLabelAt(5)); 740 EXPECT_EQ(tab_titles[0], model.GetLabelAt(5));
542 EXPECT_EQ(tab_titles[1], model.GetLabelAt(8)); 741 EXPECT_EQ(tab_titles[1], model.GetLabelAt(8));
543 EXPECT_EQ(tab_titles[2], model.GetLabelAt(11)); 742 EXPECT_EQ(tab_titles[2], model.GetLabelAt(11));
544 } 743 }
545 744
546 TEST_F(RecentTabsSubMenuModelTest, MaxTabsPerSessionAndRecency) { 745 TEST_F(RecentTabsSubMenuModelTest, MaxTabsPerSessionAndRecency) {
746 EnableSync();
747
547 // Create a session: 2 windows with 5 tabs each. 748 // Create a session: 2 windows with 5 tabs each.
548 RecentTabsBuilderTestHelper recent_tabs_builder; 749 RecentTabsBuilderTestHelper recent_tabs_builder;
549 recent_tabs_builder.AddSession(); 750 recent_tabs_builder.AddSession();
550 for (int w = 0; w < 2; ++w) { 751 for (int w = 0; w < 2; ++w) {
551 recent_tabs_builder.AddWindow(0); 752 recent_tabs_builder.AddWindow(0);
552 for (int t = 0; t < 5; ++t) 753 for (int t = 0; t < 5; ++t)
553 recent_tabs_builder.AddTab(0, w); 754 recent_tabs_builder.AddTab(0, w);
554 } 755 }
555 RegisterRecentTabs(&recent_tabs_builder); 756 RegisterRecentTabs(&recent_tabs_builder);
556 757
557 // Verify that data is populated correctly in RecentTabsSubMenuModel. 758 // Verify that data is populated correctly in RecentTabsSubMenuModel.
558 // Expected menu: 759 // Expected menu:
559 // - max tabs per session is 4, so only 4 most-recent tabs will show, 760 // - max tabs per session is 4, so only 4 most-recent tabs will show,
560 // independent of which window they came from. 761 // independent of which window they came from.
561 // Menu index Menu items 762 // Menu index Menu items
562 // --------------------------------------------- 763 // ---------------------------------------------
563 // 0 History 764 // 0 History
564 // 1 <separator> 765 // 1 <separator>
565 // 2 Recently closed header (disabled) 766 // 2 Recently closed header (disabled)
566 // 3 <separator> 767 // 3 <separator>
567 // 4 <section header for session> 768 // 4 <section header for session>
568 // 5-8 <4 most-recent tabs of session> 769 // 5-8 <4 most-recent tabs of session>
569 770
570 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); 771 TestRecentTabsSubMenuModel model(nullptr, browser());
571 int num_items = model.GetItemCount(); 772 int num_items = model.GetItemCount();
572 EXPECT_EQ(9, num_items); 773 EXPECT_EQ(9, num_items);
573 774
574 std::vector<base::string16> tab_titles = 775 std::vector<base::string16> tab_titles =
575 recent_tabs_builder.GetTabTitlesSortedByRecency(); 776 recent_tabs_builder.GetTabTitlesSortedByRecency();
576 for (int i = 0; i < 4; ++i) 777 for (int i = 0; i < 4; ++i)
577 EXPECT_EQ(tab_titles[i], model.GetLabelAt(i + 5)); 778 EXPECT_EQ(tab_titles[i], model.GetLabelAt(i + 5));
578 } 779 }
579 780
580 TEST_F(RecentTabsSubMenuModelTest, MaxWidth) { 781 TEST_F(RecentTabsSubMenuModelTest, MaxWidth) {
782 EnableSync();
783
581 // Create 1 session with 1 window and 1 tab. 784 // Create 1 session with 1 window and 1 tab.
582 RecentTabsBuilderTestHelper recent_tabs_builder; 785 RecentTabsBuilderTestHelper recent_tabs_builder;
583 recent_tabs_builder.AddSession(); 786 recent_tabs_builder.AddSession();
584 recent_tabs_builder.AddWindow(0); 787 recent_tabs_builder.AddWindow(0);
585 recent_tabs_builder.AddTab(0, 0); 788 recent_tabs_builder.AddTab(0, 0);
586 RegisterRecentTabs(&recent_tabs_builder); 789 RegisterRecentTabs(&recent_tabs_builder);
587 790
588 // Menu index Menu items 791 // Menu index Menu items
589 // ---------------------------------------------------------- 792 // ----------------------------------------------------------
590 // 0 History 793 // 0 History
591 // 1 <separator> 794 // 1 <separator>
592 // 2 Recently closed header (disabled) 795 // 2 Recently closed header (disabled)
593 // 3 <separator> 796 // 3 <separator>
594 // 4 <section header for 1st session> 797 // 4 <section header for 1st session>
595 // 5 <the only tab of the only window of session 1> 798 // 5 <the only tab of the only window of session 1>
596 799
597 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); 800 TestRecentTabsSubMenuModel model(nullptr, browser());
598 EXPECT_EQ(6, model.GetItemCount()); 801 EXPECT_EQ(6, model.GetItemCount());
599 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2)); 802 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2));
600 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3)); 803 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3));
601 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(4)); 804 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(4));
602 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(5)); 805 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(5));
603 } 806 }
604 807
605 TEST_F(RecentTabsSubMenuModelTest, MaxWidthNoDevices) { 808 TEST_F(RecentTabsSubMenuModelTest, MaxWidthNoDevices) {
809 DisableSync();
810
606 // Expected menu: 811 // Expected menu:
607 // Menu index Menu items 812 // Menu index Menu items
608 // -------------------------------------------- 813 // --------------------------------------------
609 // 0 History 814 // 0 History
610 // 1 <separator> 815 // 1 <separator>
611 // 2 Recently closed heaer (disabled) 816 // 2 Recently closed heaer (disabled)
612 // 3 <separator> 817 // 3 <separator>
613 // 4 No tabs from other Devices 818 // 4 No tabs from other Devices
614 819
615 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); 820 TestRecentTabsSubMenuModel model(nullptr, browser());
616 EXPECT_EQ(5, model.GetItemCount()); 821 EXPECT_EQ(5, model.GetItemCount());
617 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2)); 822 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2));
618 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3)); 823 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3));
619 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(4)); 824 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(4));
620 } 825 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc ('k') | components/browser_sync/profile_sync_service_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698