1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
7 #include "base/command_line.h"
8 #include "base/run_loop.h"
9 #include "chrome/app/chrome_command_ids.h"
10 #include "chrome/browser/sessions/session_service.h"
11 #include "chrome/browser/sessions/session_service_factory.h"
12 #include "chrome/browser/sessions/session_types.h"
13 #include "chrome/browser/sessions/persistent_tab_restore_service.h"
14 #include "chrome/browser/sessions/tab_restore_service_factory.h"
15 #include "chrome/browser/sync/glue/synced_session.h"
16 #include "chrome/browser/sync/profile_sync_service_mock.h"
17 #include "chrome/browser/sync/sessions/sessions_sync_manager.h"
18 #include "chrome/browser/ui/browser.h"
19 #include "chrome/browser/ui/browser_tabstrip.h"
20 #include "chrome/browser/ui/tabs/tab_strip_model.h"
21 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h"
22 #include "chrome/common/chrome_switches.h"
23 #include "chrome/test/base/browser_with_test_window_test.h"
24 #include "chrome/test/base/menu_model_test.h"
25 #include "chrome/test/base/testing_profile.h"
26 #include "components/sessions/serialized_navigation_entry_test_helper.h"
27 #include "content/public/browser/browser_thread.h"
28 #include "grit/generated_resources.h"
29 #include "sync/api/fake_sync_change_processor.h"
30 #include "sync/api/sync_error_factory_mock.h"
31 #include "testing/gmock/include/gmock/gmock.h"
32 #include "testing/gtest/include/gtest/gtest.h"
36 // This copies parts of MenuModelTest::Delegate and combines them with the
37 // RecentTabsSubMenuModel since RecentTabsSubMenuModel is a
38 // SimpleMenuModel::Delegate and not just derived from SimpleMenuModel.
39 class TestRecentTabsSubMenuModel
: public RecentTabsSubMenuModel
{
41 TestRecentTabsSubMenuModel(ui::AcceleratorProvider
* provider
,
43 browser_sync::OpenTabsUIDelegate
* delegate
)
44 : RecentTabsSubMenuModel(provider
, browser
, delegate
),
49 // Testing overrides to ui::SimpleMenuModel::Delegate:
50 virtual bool IsCommandIdEnabled(int command_id
) const OVERRIDE
{
51 bool val
= RecentTabsSubMenuModel::IsCommandIdEnabled(command_id
);
57 virtual void ExecuteCommand(int command_id
, int event_flags
) OVERRIDE
{
61 int execute_count() const { return execute_count_
; }
62 int enable_count() const { return enable_count_
; }
66 int mutable enable_count_
; // Mutable because IsCommandIdEnabledAt is const.
68 DISALLOW_COPY_AND_ASSIGN(TestRecentTabsSubMenuModel
);
71 class TestRecentTabsMenuModelDelegate
: public ui::MenuModelDelegate
{
73 explicit TestRecentTabsMenuModelDelegate(ui::MenuModel
* model
)
76 model_
->SetMenuModelDelegate(this);
79 virtual ~TestRecentTabsMenuModelDelegate() {
80 model_
->SetMenuModelDelegate(NULL
);
83 // ui::MenuModelDelegate implementation:
85 virtual void OnIconChanged(int index
) OVERRIDE
{
88 virtual void OnMenuStructureChanged() OVERRIDE
{
92 bool got_changes() const { return got_changes_
; }
95 ui::MenuModel
* model_
;
98 DISALLOW_COPY_AND_ASSIGN(TestRecentTabsMenuModelDelegate
);
101 class DummyRouter
: public browser_sync::LocalSessionEventRouter
{
103 virtual ~DummyRouter() {}
104 virtual void StartRoutingTo(
105 browser_sync::LocalSessionEventHandler
* handler
) OVERRIDE
{}
106 virtual void Stop() OVERRIDE
{}
111 class RecentTabsSubMenuModelTest
112 : public BrowserWithTestWindowTest
,
113 public browser_sync::SessionsSyncManager::SyncInternalApiDelegate
{
115 RecentTabsSubMenuModelTest()
116 : sync_service_(&testing_profile_
) {
117 manager_
.reset(new browser_sync::SessionsSyncManager(
120 scoped_ptr
<browser_sync::LocalSessionEventRouter
>(
121 new DummyRouter())));
122 manager_
->MergeDataAndStartSyncing(
124 syncer::SyncDataList(),
125 scoped_ptr
<syncer::SyncChangeProcessor
>(
126 new syncer::FakeSyncChangeProcessor
),
127 scoped_ptr
<syncer::SyncErrorFactory
>(
128 new syncer::SyncErrorFactoryMock
));
131 void WaitForLoadFromLastSession() {
132 content::BrowserThread::GetBlockingPool()->FlushForTesting();
133 base::RunLoop().RunUntilIdle();
134 content::BrowserThread::GetBlockingPool()->FlushForTesting();
137 static KeyedService
* GetTabRestoreService(
138 content::BrowserContext
* browser_context
) {
139 // Ownership is tranfered to the profile.
140 return new PersistentTabRestoreService(
141 Profile::FromBrowserContext(browser_context
), NULL
);
145 browser_sync::OpenTabsUIDelegate
* GetOpenTabsDelegate() {
146 return manager_
.get();
149 void RegisterRecentTabs(RecentTabsBuilderTestHelper
* helper
) {
150 helper
->ExportToSessionsSyncManager(manager_
.get());
153 virtual scoped_ptr
<browser_sync::DeviceInfo
> GetLocalDeviceInfo()
155 return scoped_ptr
<browser_sync::DeviceInfo
>(
156 new browser_sync::DeviceInfo(GetLocalSyncCacheGUID(),
160 sync_pb::SyncEnums_DeviceType_TYPE_LINUX
));
163 virtual std::string
GetLocalSyncCacheGUID() const OVERRIDE
{
164 return "RecentTabsSubMenuModelTest";
168 TestingProfile testing_profile_
;
169 testing::NiceMock
<ProfileSyncServiceMock
> sync_service_
;
171 scoped_ptr
<browser_sync::SessionsSyncManager
> manager_
;
174 // Test disabled "Recently closed" header with no foreign tabs.
175 TEST_F(RecentTabsSubMenuModelTest
, NoTabs
) {
176 TestRecentTabsSubMenuModel
model(NULL
, browser(), NULL
);
179 // Menu index Menu items
180 // ---------------------------------------------
181 // 0 Recently closed header (disabled)
183 // 2 No tabs from other Devices
185 int num_items
= model
.GetItemCount();
186 EXPECT_EQ(3, num_items
);
187 EXPECT_FALSE(model
.IsEnabledAt(0));
188 EXPECT_FALSE(model
.IsEnabledAt(2));
189 EXPECT_EQ(0, model
.enable_count());
191 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(0));
192 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(1));
193 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(2));
196 base::string16 title
;
197 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(0, &url
, &title
));
198 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(1, &url
, &title
));
199 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(2, &url
, &title
));
202 // Test enabled "Recently closed" header with no foreign tabs.
203 TEST_F(RecentTabsSubMenuModelTest
, RecentlyClosedTabsFromCurrentSession
) {
204 TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
205 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService
);
207 // Add 2 tabs and close them.
208 AddTab(browser(), GURL("http://foo/1"));
209 AddTab(browser(), GURL("http://foo/2"));
210 browser()->tab_strip_model()->CloseAllTabs();
212 TestRecentTabsSubMenuModel
model(NULL
, browser(), NULL
);
214 // Menu index Menu items
215 // --------------------------------------
216 // 0 Recently closed header
217 // 1 <tab for http://foo/2>
218 // 2 <tab for http://foo/1>
220 // 4 No tabs from other Devices
221 int num_items
= model
.GetItemCount();
222 EXPECT_EQ(5, num_items
);
223 EXPECT_FALSE(model
.IsEnabledAt(0));
224 EXPECT_TRUE(model
.IsEnabledAt(1));
225 EXPECT_TRUE(model
.IsEnabledAt(2));
226 model
.ActivatedAt(1);
227 model
.ActivatedAt(2);
228 EXPECT_FALSE(model
.IsEnabledAt(4));
229 EXPECT_EQ(2, model
.enable_count());
230 EXPECT_EQ(2, model
.execute_count());
232 EXPECT_TRUE(model
.GetLabelFontListAt(0) != NULL
);
233 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(1));
234 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(2));
235 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(3));
236 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(4));
239 base::string16 title
;
240 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(0, &url
, &title
));
241 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(1, &url
, &title
));
242 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(2, &url
, &title
));
243 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(3, &url
, &title
));
244 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(4, &url
, &title
));
247 // TODO(sail): enable this test when dynamic model is enabled in
248 // RecentTabsSubMenuModel.
249 #if defined(OS_MACOSX)
250 #define MAYBE_RecentlyClosedTabsAndWindowsFromLastSession \
251 DISABLED_RecentlyClosedTabsAndWindowsFromLastSession
253 #define MAYBE_RecentlyClosedTabsAndWindowsFromLastSession \
254 RecentlyClosedTabsAndWindowsFromLastSession
256 TEST_F(RecentTabsSubMenuModelTest
,
257 MAYBE_RecentlyClosedTabsAndWindowsFromLastSession
) {
258 TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
259 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService
);
261 // Add 2 tabs and close them.
262 AddTab(browser(), GURL("http://wnd/tab0"));
263 AddTab(browser(), GURL("http://wnd/tab1"));
264 browser()->tab_strip_model()->CloseAllTabs();
266 // Create a SessionService for the profile (profile owns the service) and add
267 // a window with a tab to this session.
268 SessionService
* session_service
= new SessionService(profile());
269 SessionServiceFactory::SetForTestProfile(profile(), session_service
);
272 session_service
->SetWindowType(
273 window_id
, Browser::TYPE_TABBED
, SessionService::TYPE_NORMAL
);
274 session_service
->SetTabWindow(window_id
, tab_id
);
275 session_service
->SetTabIndexInWindow(window_id
, tab_id
, 0);
276 session_service
->SetSelectedTabInWindow(window_id
, 0);
277 session_service
->UpdateTabNavigation(
279 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
280 "http://wnd1/tab0", "title"));
281 // Set this, otherwise previous session won't be loaded.
282 profile()->set_last_session_exited_cleanly(false);
283 // Move this session to the last so that TabRestoreService will load it as the
285 SessionServiceFactory::GetForProfile(profile())->
286 MoveCurrentSessionToLastSession();
288 // Create a new TabRestoreService so that it'll load the recently closed tabs
289 // and windows afresh.
290 TabRestoreServiceFactory::GetInstance()->SetTestingFactory(
291 profile(), RecentTabsSubMenuModelTest::GetTabRestoreService
);
292 // Let the shutdown of previous TabRestoreService run.
293 content::BrowserThread::GetBlockingPool()->FlushForTesting();
295 TestRecentTabsSubMenuModel
model(NULL
, browser(), NULL
);
296 TestRecentTabsMenuModelDelegate
delegate(&model
);
297 EXPECT_FALSE(delegate
.got_changes());
299 // Expected menu before tabs/windows from last session are loaded:
300 // Menu index Menu items
301 // ----------------------------------------------------------------
302 // 0 Recently closed header
304 // 2 No tabs from other Devices
306 int num_items
= model
.GetItemCount();
307 EXPECT_EQ(3, num_items
);
308 EXPECT_FALSE(model
.IsEnabledAt(0));
309 EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR
, model
.GetTypeAt(1));
310 EXPECT_FALSE(model
.IsEnabledAt(2));
311 EXPECT_EQ(0, model
.enable_count());
313 // Wait for tabs from last session to be loaded.
314 WaitForLoadFromLastSession();
316 // Expected menu after tabs/windows from last session are loaded:
317 // Menu index Menu items
318 // --------------------------------------------------------------
319 // 0 Recently closed header
320 // 1 <window for the tab http://wnd1/tab0>
321 // 2 <tab for http://wnd0/tab1>
322 // 3 <tab for http://wnd0/tab0>
324 // 5 No tabs from other Devices
326 EXPECT_TRUE(delegate
.got_changes());
328 num_items
= model
.GetItemCount();
329 EXPECT_EQ(6, num_items
);
330 EXPECT_FALSE(model
.IsEnabledAt(0));
331 EXPECT_TRUE(model
.IsEnabledAt(1));
332 EXPECT_TRUE(model
.IsEnabledAt(2));
333 EXPECT_TRUE(model
.IsEnabledAt(3));
334 model
.ActivatedAt(1);
335 model
.ActivatedAt(2);
336 model
.ActivatedAt(3);
337 EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR
, model
.GetTypeAt(4));
338 EXPECT_FALSE(model
.IsEnabledAt(5));
339 EXPECT_EQ(3, model
.enable_count());
340 EXPECT_EQ(3, model
.execute_count());
342 EXPECT_TRUE(model
.GetLabelFontListAt(0) != NULL
);
343 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(1));
344 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(2));
345 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(3));
346 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(4));
347 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(5));
350 base::string16 title
;
351 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(0, &url
, &title
));
352 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(1, &url
, &title
));
353 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(2, &url
, &title
));
354 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(3, &url
, &title
));
355 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(4, &url
, &title
));
356 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(5, &url
, &title
));
359 // Test disabled "Recently closed" header with multiple sessions, multiple
360 // windows, and multiple enabled tabs from other devices.
361 TEST_F(RecentTabsSubMenuModelTest
, OtherDevices
) {
362 // Tabs are populated in decreasing timestamp.
363 base::Time timestamp
= base::Time::Now();
364 const base::TimeDelta time_delta
= base::TimeDelta::FromMinutes(10);
366 RecentTabsBuilderTestHelper recent_tabs_builder
;
368 // Create 1st session : 1 window, 3 tabs
369 recent_tabs_builder
.AddSession();
370 recent_tabs_builder
.AddWindow(0);
371 for (int i
= 0; i
< 3; ++i
) {
372 timestamp
-= time_delta
;
373 recent_tabs_builder
.AddTabWithInfo(0, 0, timestamp
, base::string16());
376 // Create 2nd session : 2 windows, 1 tab in 1st window, 2 tabs in 2nd window
377 recent_tabs_builder
.AddSession();
378 recent_tabs_builder
.AddWindow(1);
379 recent_tabs_builder
.AddWindow(1);
380 timestamp
-= time_delta
;
381 recent_tabs_builder
.AddTabWithInfo(1, 0, timestamp
, base::string16());
382 timestamp
-= time_delta
;
383 recent_tabs_builder
.AddTabWithInfo(1, 1, timestamp
, base::string16());
384 timestamp
-= time_delta
;
385 recent_tabs_builder
.AddTabWithInfo(1, 1, timestamp
, base::string16());
387 RegisterRecentTabs(&recent_tabs_builder
);
389 // Verify that data is populated correctly in RecentTabsSubMenuModel.
391 // - first inserted tab is most recent and hence is top
392 // Menu index Menu items
393 // -----------------------------------------------------
394 // 0 Recently closed header (disabled)
396 // 2 <section header for 1st session>
397 // 3-5 <3 tabs of the only window of session 0>
399 // 7 <section header for 2nd session>
400 // 8 <the only tab of window 0 of session 1>
401 // 9-10 <2 tabs of window 1 of session 2>
405 TestRecentTabsSubMenuModel
model(NULL
, browser(), GetOpenTabsDelegate());
406 int num_items
= model
.GetItemCount();
407 EXPECT_EQ(13, num_items
);
408 model
.ActivatedAt(0);
409 EXPECT_FALSE(model
.IsEnabledAt(0));
410 model
.ActivatedAt(3);
411 EXPECT_TRUE(model
.IsEnabledAt(3));
412 model
.ActivatedAt(4);
413 EXPECT_TRUE(model
.IsEnabledAt(4));
414 model
.ActivatedAt(5);
415 EXPECT_TRUE(model
.IsEnabledAt(5));
416 model
.ActivatedAt(8);
417 EXPECT_TRUE(model
.IsEnabledAt(8));
418 model
.ActivatedAt(9);
419 EXPECT_TRUE(model
.IsEnabledAt(9));
420 model
.ActivatedAt(10);
421 EXPECT_TRUE(model
.IsEnabledAt(10));
422 EXPECT_TRUE(model
.IsEnabledAt(12));
423 EXPECT_EQ(7, model
.enable_count());
424 EXPECT_EQ(7, model
.execute_count());
426 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(0));
427 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(1));
428 EXPECT_TRUE(model
.GetLabelFontListAt(2) != NULL
);
429 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(3));
430 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(4));
431 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(5));
432 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(6));
433 EXPECT_TRUE(model
.GetLabelFontListAt(7) != NULL
);
434 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(8));
435 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(9));
436 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(10));
437 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(11));
438 EXPECT_EQ(NULL
, model
.GetLabelFontListAt(12));
441 base::string16 title
;
442 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(0, &url
, &title
));
443 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(1, &url
, &title
));
444 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(2, &url
, &title
));
445 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(3, &url
, &title
));
446 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(4, &url
, &title
));
447 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(5, &url
, &title
));
448 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(6, &url
, &title
));
449 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(7, &url
, &title
));
450 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(8, &url
, &title
));
451 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(9, &url
, &title
));
452 EXPECT_TRUE(model
.GetURLAndTitleForItemAtIndex(10, &url
, &title
));
453 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(11, &url
, &title
));
454 EXPECT_FALSE(model
.GetURLAndTitleForItemAtIndex(12, &url
, &title
));
457 TEST_F(RecentTabsSubMenuModelTest
, MaxSessionsAndRecency
) {
458 // Create 4 sessions : each session has 1 window with 1 tab each.
459 RecentTabsBuilderTestHelper recent_tabs_builder
;
460 for (int s
= 0; s
< 4; ++s
) {
461 recent_tabs_builder
.AddSession();
462 recent_tabs_builder
.AddWindow(s
);
463 recent_tabs_builder
.AddTab(s
, 0);
465 RegisterRecentTabs(&recent_tabs_builder
);
467 // Verify that data is populated correctly in RecentTabsSubMenuModel.
469 // - max sessions is 3, so only 3 most-recent sessions will show.
470 // Menu index Menu items
471 // ----------------------------------------------------------
472 // 0 Recently closed header (disabled)
474 // 2 <section header for 1st session>
475 // 3 <the only tab of the only window of session 3>
477 // 5 <section header for 2nd session>
478 // 6 <the only tab of the only window of session 2>
480 // 8 <section header for 3rd session>
481 // 9 <the only tab of the only window of session 1>
485 TestRecentTabsSubMenuModel
model(NULL
, browser(), GetOpenTabsDelegate());
486 int num_items
= model
.GetItemCount();
487 EXPECT_EQ(12, num_items
);
489 std::vector
<base::string16
> tab_titles
=
490 recent_tabs_builder
.GetTabTitlesSortedByRecency();
491 EXPECT_EQ(tab_titles
[0], model
.GetLabelAt(3));
492 EXPECT_EQ(tab_titles
[1], model
.GetLabelAt(6));
493 EXPECT_EQ(tab_titles
[2], model
.GetLabelAt(9));
496 TEST_F(RecentTabsSubMenuModelTest
, MaxTabsPerSessionAndRecency
) {
497 // Create a session: 2 windows with 5 tabs each.
498 RecentTabsBuilderTestHelper recent_tabs_builder
;
499 recent_tabs_builder
.AddSession();
500 for (int w
= 0; w
< 2; ++w
) {
501 recent_tabs_builder
.AddWindow(0);
502 for (int t
= 0; t
< 5; ++t
)
503 recent_tabs_builder
.AddTab(0, w
);
505 RegisterRecentTabs(&recent_tabs_builder
);
507 // Verify that data is populated correctly in RecentTabsSubMenuModel.
509 // - max tabs per session is 4, so only 4 most-recent tabs will show,
510 // independent of which window they came from.
511 // Menu index Menu items
512 // ---------------------------------------------
513 // 0 Recently closed header (disabled)
515 // 2 <section header for session>
516 // 3-6 <4 most-recent tabs of session>
520 TestRecentTabsSubMenuModel
model(NULL
, browser(), GetOpenTabsDelegate());
521 int num_items
= model
.GetItemCount();
522 EXPECT_EQ(9, num_items
);
524 std::vector
<base::string16
> tab_titles
=
525 recent_tabs_builder
.GetTabTitlesSortedByRecency();
526 for (int i
= 0; i
< 4; ++i
)
527 EXPECT_EQ(tab_titles
[i
], model
.GetLabelAt(i
+ 3));
530 TEST_F(RecentTabsSubMenuModelTest
, MaxWidth
) {
531 // Create 1 session with 1 window and 1 tab.
532 RecentTabsBuilderTestHelper recent_tabs_builder
;
533 recent_tabs_builder
.AddSession();
534 recent_tabs_builder
.AddWindow(0);
535 recent_tabs_builder
.AddTab(0, 0);
536 RegisterRecentTabs(&recent_tabs_builder
);
538 // Menu index Menu items
539 // ----------------------------------------------------------
540 // 0 Recently closed header (disabled)
542 // 2 <section header for 1st session>
543 // 3 <the only tab of the only window of session 1>
547 TestRecentTabsSubMenuModel
model(NULL
, browser(), GetOpenTabsDelegate());
548 EXPECT_EQ(6, model
.GetItemCount());
549 EXPECT_EQ(-1, model
.GetMaxWidthForItemAtIndex(0));
550 EXPECT_NE(-1, model
.GetMaxWidthForItemAtIndex(1));
551 EXPECT_NE(-1, model
.GetMaxWidthForItemAtIndex(2));
552 EXPECT_NE(-1, model
.GetMaxWidthForItemAtIndex(3));
555 TEST_F(RecentTabsSubMenuModelTest
, MaxWidthNoDevices
) {
557 // Menu index Menu items
558 // --------------------------------------------
559 // 0 Recently closed heaer (disabled)
561 // 2 No tabs from other Devices
563 TestRecentTabsSubMenuModel
model(NULL
, browser(), NULL
);
564 EXPECT_EQ(3, model
.GetItemCount());
565 EXPECT_EQ(-1, model
.GetMaxWidthForItemAtIndex(0));
566 EXPECT_NE(-1, model
.GetMaxWidthForItemAtIndex(1));
567 EXPECT_EQ(-1, model
.GetMaxWidthForItemAtIndex(2));