OLD | NEW |
---|---|
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 Loading... | |
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 sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(profile()->GetPrefs()); |
132 sync_prefs_.reset(new syncer::SyncPrefs(testing_profile_.GetPrefs())); | 166 |
167 mock_sync_service_ = static_cast<browser_sync::ProfileSyncServiceMock*>( | |
168 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( | |
169 profile(), BuildMockProfileSyncService)); | |
170 | |
171 EXPECT_CALL(*mock_sync_service_, AddObserver(_)) | |
172 .WillRepeatedly(Invoke(&fake_sync_service_observer_list_, | |
173 &FakeSyncServiceObserverList::AddObserver)); | |
174 EXPECT_CALL(*mock_sync_service_, RemoveObserver(_)) | |
175 .WillRepeatedly(Invoke(&fake_sync_service_observer_list_, | |
176 &FakeSyncServiceObserverList::RemoveObserver)); | |
177 | |
133 manager_.reset(new sync_sessions::SessionsSyncManager( | 178 manager_.reset(new sync_sessions::SessionsSyncManager( |
Peter Kasting
2017/03/24 19:54:02
Nit: Prefer =MakeUnique to reset(new
| |
134 sync_service_.GetSyncClient()->GetSyncSessionsClient(), | 179 mock_sync_service_->GetSyncClient()->GetSyncSessionsClient(), |
135 sync_prefs_.get(), local_device_.get(), | 180 sync_prefs_.get(), local_device_.get(), |
136 std::unique_ptr<sync_sessions::LocalSessionEventRouter>( | 181 std::unique_ptr<sync_sessions::LocalSessionEventRouter>( |
137 new DummyRouter()), | 182 new DummyRouter()), |
138 base::Closure(), base::Closure())); | 183 base::Bind(&FakeSyncServiceObserverList::NotifyForeignSessionUpdated, |
184 base::Unretained(&fake_sync_service_observer_list_)), | |
185 base::Closure())); | |
186 | |
187 DisableSync(); | |
Peter Kasting
2017/03/24 19:54:03
Is this line necessary?
sath
2017/03/27 11:29:31
Okay. I have added DisableSync() or EnabledSync()
| |
188 | |
139 manager_->MergeDataAndStartSyncing( | 189 manager_->MergeDataAndStartSyncing( |
140 syncer::SESSIONS, syncer::SyncDataList(), | 190 syncer::SESSIONS, syncer::SyncDataList(), |
141 std::unique_ptr<syncer::SyncChangeProcessor>( | 191 std::unique_ptr<syncer::SyncChangeProcessor>( |
142 new syncer::FakeSyncChangeProcessor), | 192 new syncer::FakeSyncChangeProcessor), |
143 std::unique_ptr<syncer::SyncErrorFactory>( | 193 std::unique_ptr<syncer::SyncErrorFactory>( |
144 new syncer::SyncErrorFactoryMock)); | 194 new syncer::SyncErrorFactoryMock)); |
145 } | 195 } |
146 | 196 |
197 void TearDown() override { | |
198 manager_.reset(); | |
199 sync_prefs_.reset(); | |
200 local_device_.reset(); | |
201 BrowserWithTestWindowTest::TearDown(); | |
202 } | |
203 | |
147 void WaitForLoadFromLastSession() { | 204 void WaitForLoadFromLastSession() { |
148 content::RunAllBlockingPoolTasksUntilIdle(); | 205 content::RunAllBlockingPoolTasksUntilIdle(); |
149 } | 206 } |
150 | 207 |
208 void DisableSync() { | |
209 EXPECT_CALL(*mock_sync_service_, IsSyncActive()) | |
210 .WillRepeatedly(Return(false)); | |
211 EXPECT_CALL(*mock_sync_service_, IsDataTypeControllerRunning(_)) | |
212 .WillRepeatedly(Return(false)); | |
213 EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock()) | |
214 .WillRepeatedly(Return(nullptr)); | |
215 } | |
216 | |
217 void EnableSync() { | |
218 EXPECT_CALL(*mock_sync_service_, IsSyncActive()) | |
219 .WillRepeatedly(Return(true)); | |
220 EXPECT_CALL(*mock_sync_service_, | |
221 IsDataTypeControllerRunning(syncer::SESSIONS)) | |
222 .WillRepeatedly(Return(true)); | |
223 EXPECT_CALL(*mock_sync_service_, | |
224 IsDataTypeControllerRunning(syncer::PROXY_TABS)) | |
225 .WillRepeatedly(Return(true)); | |
226 EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock()) | |
227 .WillRepeatedly(Return(manager_.get())); | |
228 } | |
229 | |
230 void NotifySyncEnabled() { | |
231 fake_sync_service_observer_list_.NotifyConfigureDone(); | |
232 } | |
233 | |
151 static std::unique_ptr<KeyedService> GetTabRestoreService( | 234 static std::unique_ptr<KeyedService> GetTabRestoreService( |
152 content::BrowserContext* browser_context) { | 235 content::BrowserContext* browser_context) { |
153 return base::MakeUnique<sessions::PersistentTabRestoreService>( | 236 return base::MakeUnique<sessions::PersistentTabRestoreService>( |
154 base::WrapUnique(new ChromeTabRestoreServiceClient( | 237 base::WrapUnique(new ChromeTabRestoreServiceClient( |
155 Profile::FromBrowserContext(browser_context))), | 238 Profile::FromBrowserContext(browser_context))), |
156 nullptr); | 239 nullptr); |
157 } | 240 } |
158 | 241 |
159 sync_sessions::OpenTabsUIDelegate* GetOpenTabsDelegate() { | |
160 return manager_.get(); | |
161 } | |
162 | |
163 void RegisterRecentTabs(RecentTabsBuilderTestHelper* helper) { | 242 void RegisterRecentTabs(RecentTabsBuilderTestHelper* helper) { |
164 helper->ExportToSessionsSyncManager(manager_.get()); | 243 helper->ExportToSessionsSyncManager(manager_.get()); |
165 } | 244 } |
166 | 245 |
167 private: | 246 private: |
168 TestingProfile testing_profile_; | 247 std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_; |
169 browser_sync::ProfileSyncServiceMock sync_service_; | |
170 std::unique_ptr<syncer::SyncPrefs> sync_prefs_; | 248 std::unique_ptr<syncer::SyncPrefs> sync_prefs_; |
249 FakeSyncServiceObserverList fake_sync_service_observer_list_; | |
250 browser_sync::ProfileSyncServiceMock* mock_sync_service_ = nullptr; | |
171 std::unique_ptr<sync_sessions::SessionsSyncManager> manager_; | 251 std::unique_ptr<sync_sessions::SessionsSyncManager> manager_; |
172 std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_; | |
173 }; | 252 }; |
174 | 253 |
175 // Test disabled "Recently closed" header with no foreign tabs. | 254 // Test disabled "Recently closed" header with no foreign tabs. |
176 TEST_F(RecentTabsSubMenuModelTest, NoTabs) { | 255 TEST_F(RecentTabsSubMenuModelTest, NoTabs) { |
177 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); | 256 TestRecentTabsSubMenuModel model(nullptr, browser()); |
178 | 257 |
179 // Expected menu: | 258 // Expected menu: |
180 // Menu index Menu items | 259 // Menu index Menu items |
181 // --------------------------------------------- | 260 // --------------------------------------------- |
182 // 0 History | 261 // 0 History |
183 // 1 <separator> | 262 // 1 <separator> |
184 // 2 Recently closed header (disabled) | 263 // 2 Recently closed header (disabled) |
185 // 3 <separator> | 264 // 3 <separator> |
186 // 4 No tabs from other Devices | 265 // 4 No tabs from other Devices |
187 | 266 |
(...skipping 21 matching lines...) Expand all Loading... | |
209 // Test enabled "Recently closed" header with no foreign tabs. | 288 // Test enabled "Recently closed" header with no foreign tabs. |
210 TEST_F(RecentTabsSubMenuModelTest, RecentlyClosedTabsFromCurrentSession) { | 289 TEST_F(RecentTabsSubMenuModelTest, RecentlyClosedTabsFromCurrentSession) { |
211 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( | 290 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( |
212 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); | 291 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); |
213 | 292 |
214 // Add 2 tabs and close them. | 293 // Add 2 tabs and close them. |
215 AddTab(browser(), GURL("http://foo/1")); | 294 AddTab(browser(), GURL("http://foo/1")); |
216 AddTab(browser(), GURL("http://foo/2")); | 295 AddTab(browser(), GURL("http://foo/2")); |
217 browser()->tab_strip_model()->CloseAllTabs(); | 296 browser()->tab_strip_model()->CloseAllTabs(); |
218 | 297 |
219 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); | 298 TestRecentTabsSubMenuModel model(nullptr, browser()); |
220 // Expected menu: | 299 // Expected menu: |
221 // Menu index Menu items | 300 // Menu index Menu items |
222 // -------------------------------------- | 301 // -------------------------------------- |
223 // 0 History | 302 // 0 History |
224 // 1 <separator> | 303 // 1 <separator> |
225 // 2 Recently closed header | 304 // 2 Recently closed header |
226 // 3 <tab for http://foo/2> | 305 // 3 <tab for http://foo/2> |
227 // 4 <tab for http://foo/1> | 306 // 4 <tab for http://foo/1> |
228 // 5 <separator> | 307 // 5 <separator> |
229 // 6 No tabs from other Devices | 308 // 6 No tabs from other Devices |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 SessionServiceFactory::GetForProfile(profile())-> | 382 SessionServiceFactory::GetForProfile(profile())-> |
304 MoveCurrentSessionToLastSession(); | 383 MoveCurrentSessionToLastSession(); |
305 | 384 |
306 // Create a new TabRestoreService so that it'll load the recently closed tabs | 385 // Create a new TabRestoreService so that it'll load the recently closed tabs |
307 // and windows afresh. | 386 // and windows afresh. |
308 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( | 387 TabRestoreServiceFactory::GetInstance()->SetTestingFactory( |
309 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); | 388 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService); |
310 // Let the shutdown of previous TabRestoreService run. | 389 // Let the shutdown of previous TabRestoreService run. |
311 content::RunAllBlockingPoolTasksUntilIdle(); | 390 content::RunAllBlockingPoolTasksUntilIdle(); |
312 | 391 |
313 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); | 392 TestRecentTabsSubMenuModel model(nullptr, browser()); |
314 TestRecentTabsMenuModelDelegate delegate(&model); | 393 TestRecentTabsMenuModelDelegate delegate(&model); |
315 EXPECT_FALSE(delegate.got_changes()); | 394 EXPECT_FALSE(delegate.got_changes()); |
316 | 395 |
317 // Expected menu before tabs/windows from last session are loaded: | 396 // Expected menu before tabs/windows from last session are loaded: |
318 // Menu index Menu items | 397 // Menu index Menu items |
319 // ---------------------------------------------------------------- | 398 // ---------------------------------------------------------------- |
320 // 0 History | 399 // 0 History |
321 // 1 <separator> | 400 // 1 <separator> |
322 // 2 Recently closed header | 401 // 2 Recently closed header |
323 // 3 <separator> | 402 // 3 <separator> |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(3, &url, &title)); | 464 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(3, &url, &title)); |
386 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); | 465 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); |
387 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); | 466 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); |
388 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); | 467 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); |
389 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(7, &url, &title)); | 468 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(7, &url, &title)); |
390 } | 469 } |
391 | 470 |
392 // Test disabled "Recently closed" header with multiple sessions, multiple | 471 // Test disabled "Recently closed" header with multiple sessions, multiple |
393 // windows, and multiple enabled tabs from other devices. | 472 // windows, and multiple enabled tabs from other devices. |
394 TEST_F(RecentTabsSubMenuModelTest, OtherDevices) { | 473 TEST_F(RecentTabsSubMenuModelTest, OtherDevices) { |
474 EnableSync(); | |
475 | |
395 // Tabs are populated in decreasing timestamp. | 476 // Tabs are populated in decreasing timestamp. |
396 base::Time timestamp = base::Time::Now(); | 477 base::Time timestamp = base::Time::Now(); |
397 const base::TimeDelta time_delta = base::TimeDelta::FromMinutes(10); | 478 const base::TimeDelta time_delta = base::TimeDelta::FromMinutes(10); |
398 | 479 |
399 RecentTabsBuilderTestHelper recent_tabs_builder; | 480 RecentTabsBuilderTestHelper recent_tabs_builder; |
400 | 481 |
401 // Create 1st session : 1 window, 3 tabs | 482 // Create 1st session : 1 window, 3 tabs |
402 recent_tabs_builder.AddSession(); | 483 recent_tabs_builder.AddSession(); |
403 recent_tabs_builder.AddWindow(0); | 484 recent_tabs_builder.AddWindow(0); |
404 for (int i = 0; i < 3; ++i) { | 485 for (int i = 0; i < 3; ++i) { |
(...skipping 23 matching lines...) Expand all Loading... | |
428 // 1 <separator> | 509 // 1 <separator> |
429 // 2 Recently closed header (disabled) | 510 // 2 Recently closed header (disabled) |
430 // 3 <separator> | 511 // 3 <separator> |
431 // 4 <section header for 1st session> | 512 // 4 <section header for 1st session> |
432 // 5-7 <3 tabs of the only window of session 0> | 513 // 5-7 <3 tabs of the only window of session 0> |
433 // 8 <separator> | 514 // 8 <separator> |
434 // 9 <section header for 2nd session> | 515 // 9 <section header for 2nd session> |
435 // 10 <the only tab of window 0 of session 1> | 516 // 10 <the only tab of window 0 of session 1> |
436 // 11-12 <2 tabs of window 1 of session 2> | 517 // 11-12 <2 tabs of window 1 of session 2> |
437 | 518 |
438 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); | 519 TestRecentTabsSubMenuModel model(nullptr, browser()); |
439 int num_items = model.GetItemCount(); | 520 int num_items = model.GetItemCount(); |
440 EXPECT_EQ(13, num_items); | 521 EXPECT_EQ(13, num_items); |
441 model.ActivatedAt(0); | 522 model.ActivatedAt(0); |
442 EXPECT_TRUE(model.IsEnabledAt(0)); | 523 EXPECT_TRUE(model.IsEnabledAt(0)); |
443 model.ActivatedAt(1); | 524 model.ActivatedAt(1); |
444 EXPECT_TRUE(model.IsEnabledAt(1)); | 525 EXPECT_TRUE(model.IsEnabledAt(1)); |
445 model.ActivatedAt(2); | 526 model.ActivatedAt(2); |
446 EXPECT_FALSE(model.IsEnabledAt(2)); | 527 EXPECT_FALSE(model.IsEnabledAt(2)); |
447 model.ActivatedAt(3); | 528 model.ActivatedAt(3); |
448 EXPECT_TRUE(model.IsEnabledAt(3)); | 529 EXPECT_TRUE(model.IsEnabledAt(3)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
486 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); | 567 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); |
487 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); | 568 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); |
488 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(7, &url, &title)); | 569 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(7, &url, &title)); |
489 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(8, &url, &title)); | 570 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(8, &url, &title)); |
490 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(9, &url, &title)); | 571 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(9, &url, &title)); |
491 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(10, &url, &title)); | 572 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(10, &url, &title)); |
492 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(11, &url, &title)); | 573 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(11, &url, &title)); |
493 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(12, &url, &title)); | 574 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(12, &url, &title)); |
494 } | 575 } |
495 | 576 |
496 // Per http://crbug.com/603744, MaxSessionsAndRecenty fails intermittently on | 577 // Mac doesn't support the dynamic menu. |
497 // windows, linux and mac. | 578 #if defined(OS_MACOSX) |
498 #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) | 579 #define MAYBE_OtherDevicesDynamicUpdate DISABLED_OtherDevicesDynamicUpdate |
499 #define MAYBE_MaxSessionsAndRecency DISABLED_MaxSessionsAndRecency | |
500 #else | 580 #else |
501 #define MAYBE_MaxSessionsAndRecency MaxSessionsAndRecency | 581 #define MAYBE_OtherDevicesDynamicUpdate OtherDevicesDynamicUpdate |
502 #endif | 582 #endif |
503 TEST_F(RecentTabsSubMenuModelTest, MAYBE_MaxSessionsAndRecency) { | 583 TEST_F(RecentTabsSubMenuModelTest, OtherDevicesDynamicUpdate) { |
584 // Create menu with disabled syncronization. | |
Peter Kasting
2017/03/24 19:54:02
Nit: synchronization
| |
585 DisableSync(); | |
586 | |
587 // Before creating menu fill foreign sessions. | |
588 base::Time update_timestamp = | |
589 base::Time::Now() - base::TimeDelta::FromMinutes(10); | |
590 | |
591 RecentTabsBuilderTestHelper recent_tabs_builder; | |
592 | |
593 // Create one session with one window and one tab. | |
594 recent_tabs_builder.AddSession(); | |
595 recent_tabs_builder.AddWindow(0); | |
596 recent_tabs_builder.AddTabWithInfo(0, 0, update_timestamp, base::string16()); | |
597 | |
598 RegisterRecentTabs(&recent_tabs_builder); | |
599 | |
600 // Verify that data is populated correctly in RecentTabsSubMenuModel. | |
601 // Expected menu: | |
602 // Menu index Menu items | |
603 // ----------------------------------------------------- | |
604 // 0 History | |
605 // 1 <separator> | |
606 // 2 Recently closed header (disabled) | |
607 // 3 <separator> | |
608 // 4 No tabs from other Devices | |
609 | |
610 TestRecentTabsSubMenuModel model(nullptr, browser()); | |
611 EXPECT_EQ(5, model.GetItemCount()); | |
612 model.ActivatedAt(4); | |
613 EXPECT_FALSE(model.IsEnabledAt(4)); | |
614 | |
615 EXPECT_EQ(0, model.enable_count()); | |
616 EXPECT_EQ(1, model.execute_count()); | |
617 | |
618 EXPECT_EQ(nullptr, model.GetLabelFontListAt(4)); | |
619 | |
620 std::string url; | |
621 base::string16 title; | |
622 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); | |
623 | |
624 // Enable syncronization and notify menu that syncronization was enabled. | |
625 int previous_enable_count = model.enable_count(); | |
626 int previous_execute_count = model.execute_count(); | |
627 | |
628 EnableSync(); | |
629 NotifySyncEnabled(); | |
630 | |
631 // Verify that data is populated correctly in RecentTabsSubMenuModel. | |
632 // Expected menu: | |
633 // Menu index Menu items | |
634 // ----------------------------------------------------- | |
635 // 0 History | |
636 // 1 <separator> | |
637 // 2 Recently closed header (disabled) | |
638 // 3 <separator> | |
639 // 4 <section header for 1st session> | |
640 // 5 <tab of the only window of session 0> | |
641 | |
642 EXPECT_EQ(6, model.GetItemCount()); | |
643 model.ActivatedAt(4); | |
644 EXPECT_FALSE(model.IsEnabledAt(4)); | |
645 model.ActivatedAt(5); | |
646 EXPECT_TRUE(model.IsEnabledAt(5)); | |
647 | |
648 EXPECT_EQ(previous_enable_count + 1, model.enable_count()); | |
649 EXPECT_EQ(previous_execute_count + 2, model.execute_count()); | |
650 | |
651 EXPECT_NE(nullptr, model.GetLabelFontListAt(4)); | |
652 EXPECT_EQ(nullptr, model.GetLabelFontListAt(5)); | |
653 | |
654 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); | |
655 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); | |
656 | |
657 // Make changes dynamically. | |
658 previous_enable_count = model.enable_count(); | |
659 previous_execute_count = model.execute_count(); | |
660 | |
661 update_timestamp = base::Time::Now() - base::TimeDelta::FromMinutes(5); | |
662 | |
663 // Add tab to the only window. | |
664 recent_tabs_builder.AddTabWithInfo(0, 0, update_timestamp, base::string16()); | |
665 | |
666 RegisterRecentTabs(&recent_tabs_builder); | |
667 | |
668 // Verify that data is populated correctly in RecentTabsSubMenuModel. | |
669 // Expected menu: | |
670 // Menu index Menu items | |
671 // ----------------------------------------------------- | |
672 // 0 History | |
673 // 1 <separator> | |
674 // 2 Recently closed header (disabled) | |
675 // 3 <separator> | |
676 // 4 <section header for 1st session> | |
677 // 5 <new added tab of the only window of session 0> | |
678 // 6 <tab of the only window of session 0> | |
679 | |
680 EXPECT_EQ(7, model.GetItemCount()); | |
681 model.ActivatedAt(4); | |
682 EXPECT_FALSE(model.IsEnabledAt(4)); | |
683 model.ActivatedAt(5); | |
684 EXPECT_TRUE(model.IsEnabledAt(5)); | |
685 model.ActivatedAt(6); | |
686 EXPECT_TRUE(model.IsEnabledAt(6)); | |
687 | |
688 EXPECT_EQ(previous_enable_count + 2, model.enable_count()); | |
689 EXPECT_EQ(previous_execute_count + 3, model.execute_count()); | |
690 | |
691 EXPECT_NE(nullptr, model.GetLabelFontListAt(4)); | |
692 EXPECT_EQ(nullptr, model.GetLabelFontListAt(5)); | |
693 EXPECT_EQ(nullptr, model.GetLabelFontListAt(6)); | |
694 | |
695 EXPECT_FALSE(model.GetURLAndTitleForItemAtIndex(4, &url, &title)); | |
696 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(5, &url, &title)); | |
697 EXPECT_TRUE(model.GetURLAndTitleForItemAtIndex(6, &url, &title)); | |
698 } | |
699 | |
700 TEST_F(RecentTabsSubMenuModelTest, MaxSessionsAndRecency) { | |
701 EnableSync(); | |
702 | |
504 // Create 4 sessions : each session has 1 window with 1 tab each. | 703 // Create 4 sessions : each session has 1 window with 1 tab each. |
505 RecentTabsBuilderTestHelper recent_tabs_builder; | 704 RecentTabsBuilderTestHelper recent_tabs_builder; |
506 for (int s = 0; s < 4; ++s) { | 705 for (int s = 0; s < 4; ++s) { |
507 recent_tabs_builder.AddSession(); | 706 recent_tabs_builder.AddSession(); |
508 recent_tabs_builder.AddWindow(s); | 707 recent_tabs_builder.AddWindow(s); |
509 recent_tabs_builder.AddTab(s, 0); | 708 recent_tabs_builder.AddTab(s, 0); |
510 } | 709 } |
511 RegisterRecentTabs(&recent_tabs_builder); | 710 RegisterRecentTabs(&recent_tabs_builder); |
512 | 711 |
513 // Verify that data is populated correctly in RecentTabsSubMenuModel. | 712 // Verify that data is populated correctly in RecentTabsSubMenuModel. |
514 // Expected menu: | 713 // Expected menu: |
515 // - max sessions is 3, so only 3 most-recent sessions will show. | 714 // - max sessions is 3, so only 3 most-recent sessions will show. |
516 // Menu index Menu items | 715 // Menu index Menu items |
517 // ---------------------------------------------------------- | 716 // ---------------------------------------------------------- |
518 // 0 History | 717 // 0 History |
519 // 1 <separator> | 718 // 1 <separator> |
520 // 2 Recently closed header (disabled) | 719 // 2 Recently closed header (disabled) |
521 // 3 <separator> | 720 // 3 <separator> |
522 // 4 <section header for 1st session> | 721 // 4 <section header for 1st session> |
523 // 5 <the only tab of the only window of session 3> | 722 // 5 <the only tab of the only window of session 3> |
524 // 6 <separator> | 723 // 6 <separator> |
525 // 7 <section header for 2nd session> | 724 // 7 <section header for 2nd session> |
526 // 8 <the only tab of the only window of session 2> | 725 // 8 <the only tab of the only window of session 2> |
527 // 9 <separator> | 726 // 9 <separator> |
528 // 10 <section header for 3rd session> | 727 // 10 <section header for 3rd session> |
529 // 11 <the only tab of the only window of session 1> | 728 // 11 <the only tab of the only window of session 1> |
530 | 729 |
531 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); | 730 TestRecentTabsSubMenuModel model(nullptr, browser()); |
532 int num_items = model.GetItemCount(); | 731 int num_items = model.GetItemCount(); |
533 EXPECT_EQ(12, num_items); | 732 EXPECT_EQ(12, num_items); |
534 | 733 |
535 std::vector<base::string16> tab_titles = | 734 std::vector<base::string16> tab_titles = |
536 recent_tabs_builder.GetTabTitlesSortedByRecency(); | 735 recent_tabs_builder.GetTabTitlesSortedByRecency(); |
537 EXPECT_EQ(tab_titles[0], model.GetLabelAt(5)); | 736 EXPECT_EQ(tab_titles[0], model.GetLabelAt(5)); |
538 EXPECT_EQ(tab_titles[1], model.GetLabelAt(8)); | 737 EXPECT_EQ(tab_titles[1], model.GetLabelAt(8)); |
539 EXPECT_EQ(tab_titles[2], model.GetLabelAt(11)); | 738 EXPECT_EQ(tab_titles[2], model.GetLabelAt(11)); |
540 } | 739 } |
541 | 740 |
542 TEST_F(RecentTabsSubMenuModelTest, MaxTabsPerSessionAndRecency) { | 741 TEST_F(RecentTabsSubMenuModelTest, MaxTabsPerSessionAndRecency) { |
742 EnableSync(); | |
743 | |
543 // Create a session: 2 windows with 5 tabs each. | 744 // Create a session: 2 windows with 5 tabs each. |
544 RecentTabsBuilderTestHelper recent_tabs_builder; | 745 RecentTabsBuilderTestHelper recent_tabs_builder; |
545 recent_tabs_builder.AddSession(); | 746 recent_tabs_builder.AddSession(); |
546 for (int w = 0; w < 2; ++w) { | 747 for (int w = 0; w < 2; ++w) { |
547 recent_tabs_builder.AddWindow(0); | 748 recent_tabs_builder.AddWindow(0); |
548 for (int t = 0; t < 5; ++t) | 749 for (int t = 0; t < 5; ++t) |
549 recent_tabs_builder.AddTab(0, w); | 750 recent_tabs_builder.AddTab(0, w); |
550 } | 751 } |
551 RegisterRecentTabs(&recent_tabs_builder); | 752 RegisterRecentTabs(&recent_tabs_builder); |
552 | 753 |
553 // Verify that data is populated correctly in RecentTabsSubMenuModel. | 754 // Verify that data is populated correctly in RecentTabsSubMenuModel. |
554 // Expected menu: | 755 // Expected menu: |
555 // - max tabs per session is 4, so only 4 most-recent tabs will show, | 756 // - max tabs per session is 4, so only 4 most-recent tabs will show, |
556 // independent of which window they came from. | 757 // independent of which window they came from. |
557 // Menu index Menu items | 758 // Menu index Menu items |
558 // --------------------------------------------- | 759 // --------------------------------------------- |
559 // 0 History | 760 // 0 History |
560 // 1 <separator> | 761 // 1 <separator> |
561 // 2 Recently closed header (disabled) | 762 // 2 Recently closed header (disabled) |
562 // 3 <separator> | 763 // 3 <separator> |
563 // 4 <section header for session> | 764 // 4 <section header for session> |
564 // 5-8 <4 most-recent tabs of session> | 765 // 5-8 <4 most-recent tabs of session> |
565 | 766 |
566 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); | 767 TestRecentTabsSubMenuModel model(nullptr, browser()); |
567 int num_items = model.GetItemCount(); | 768 int num_items = model.GetItemCount(); |
568 EXPECT_EQ(9, num_items); | 769 EXPECT_EQ(9, num_items); |
569 | 770 |
570 std::vector<base::string16> tab_titles = | 771 std::vector<base::string16> tab_titles = |
571 recent_tabs_builder.GetTabTitlesSortedByRecency(); | 772 recent_tabs_builder.GetTabTitlesSortedByRecency(); |
572 for (int i = 0; i < 4; ++i) | 773 for (int i = 0; i < 4; ++i) |
573 EXPECT_EQ(tab_titles[i], model.GetLabelAt(i + 5)); | 774 EXPECT_EQ(tab_titles[i], model.GetLabelAt(i + 5)); |
574 } | 775 } |
575 | 776 |
576 TEST_F(RecentTabsSubMenuModelTest, MaxWidth) { | 777 TEST_F(RecentTabsSubMenuModelTest, MaxWidth) { |
778 EnableSync(); | |
779 | |
577 // Create 1 session with 1 window and 1 tab. | 780 // Create 1 session with 1 window and 1 tab. |
578 RecentTabsBuilderTestHelper recent_tabs_builder; | 781 RecentTabsBuilderTestHelper recent_tabs_builder; |
579 recent_tabs_builder.AddSession(); | 782 recent_tabs_builder.AddSession(); |
580 recent_tabs_builder.AddWindow(0); | 783 recent_tabs_builder.AddWindow(0); |
581 recent_tabs_builder.AddTab(0, 0); | 784 recent_tabs_builder.AddTab(0, 0); |
582 RegisterRecentTabs(&recent_tabs_builder); | 785 RegisterRecentTabs(&recent_tabs_builder); |
583 | 786 |
584 // Menu index Menu items | 787 // Menu index Menu items |
585 // ---------------------------------------------------------- | 788 // ---------------------------------------------------------- |
586 // 0 History | 789 // 0 History |
587 // 1 <separator> | 790 // 1 <separator> |
588 // 2 Recently closed header (disabled) | 791 // 2 Recently closed header (disabled) |
589 // 3 <separator> | 792 // 3 <separator> |
590 // 4 <section header for 1st session> | 793 // 4 <section header for 1st session> |
591 // 5 <the only tab of the only window of session 1> | 794 // 5 <the only tab of the only window of session 1> |
592 | 795 |
593 TestRecentTabsSubMenuModel model(NULL, browser(), GetOpenTabsDelegate()); | 796 TestRecentTabsSubMenuModel model(nullptr, browser()); |
594 EXPECT_EQ(6, model.GetItemCount()); | 797 EXPECT_EQ(6, model.GetItemCount()); |
595 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2)); | 798 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2)); |
596 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3)); | 799 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3)); |
597 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(4)); | 800 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(4)); |
598 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(5)); | 801 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(5)); |
599 } | 802 } |
600 | 803 |
601 TEST_F(RecentTabsSubMenuModelTest, MaxWidthNoDevices) { | 804 TEST_F(RecentTabsSubMenuModelTest, MaxWidthNoDevices) { |
602 // Expected menu: | 805 // Expected menu: |
603 // Menu index Menu items | 806 // Menu index Menu items |
604 // -------------------------------------------- | 807 // -------------------------------------------- |
605 // 0 History | 808 // 0 History |
606 // 1 <separator> | 809 // 1 <separator> |
607 // 2 Recently closed heaer (disabled) | 810 // 2 Recently closed heaer (disabled) |
608 // 3 <separator> | 811 // 3 <separator> |
609 // 4 No tabs from other Devices | 812 // 4 No tabs from other Devices |
610 | 813 |
611 TestRecentTabsSubMenuModel model(NULL, browser(), NULL); | 814 TestRecentTabsSubMenuModel model(nullptr, browser()); |
612 EXPECT_EQ(5, model.GetItemCount()); | 815 EXPECT_EQ(5, model.GetItemCount()); |
613 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2)); | 816 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(2)); |
614 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3)); | 817 EXPECT_NE(-1, model.GetMaxWidthForItemAtIndex(3)); |
615 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(4)); | 818 EXPECT_EQ(-1, model.GetMaxWidthForItemAtIndex(4)); |
616 } | 819 } |
OLD | NEW |