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

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 after remarks and track enabling syncronization. Created 3 years, 9 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 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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698