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

Side by Side Diff: chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm

Issue 2768633003: Dynamic updating recent menu for tabs from other devices. (Closed)
Patch Set: Fixes compilation and test on Mac. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
5 #include "base/command_line.h" 6 #include "base/command_line.h"
6 #include "base/mac/scoped_nsobject.h" 7 #include "base/mac/scoped_nsobject.h"
7 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/ptr_util.h"
8 #include "base/run_loop.h" 10 #include "base/run_loop.h"
9 #include "base/strings/sys_string_conversions.h" 11 #include "base/strings/sys_string_conversions.h"
10 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/app/chrome_command_ids.h" 13 #include "chrome/app/chrome_command_ids.h"
12 #include "chrome/browser/sync/profile_sync_service_factory.h" 14 #include "chrome/browser/sync/profile_sync_service_factory.h"
15 #include "chrome/browser/sync/profile_sync_test_util.h"
13 #include "chrome/browser/ui/browser_list.h" 16 #include "chrome/browser/ui/browser_list.h"
14 #include "chrome/browser/ui/browser_list_observer.h" 17 #include "chrome/browser/ui/browser_list_observer.h"
15 #import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h"
16 #include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" 18 #include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h"
17 #include "chrome/browser/ui/cocoa/test/run_loop_testing.h" 19 #include "chrome/browser/ui/cocoa/test/run_loop_testing.h"
18 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" 20 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
19 #import "chrome/browser/ui/cocoa/view_resizer_pong.h" 21 #import "chrome/browser/ui/cocoa/view_resizer_pong.h"
20 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h" 22 #include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h"
21 #include "chrome/browser/ui/toolbar/app_menu_model.h" 23 #include "chrome/browser/ui/toolbar/app_menu_model.h"
22 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h" 24 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h"
23 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h" 25 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
24 #include "chrome/common/chrome_switches.h" 26 #include "chrome/common/chrome_switches.h"
25 #include "chrome/grit/generated_resources.h" 27 #include "chrome/grit/generated_resources.h"
26 #include "chrome/grit/theme_resources.h" 28 #include "chrome/grit/theme_resources.h"
27 #include "chrome/test/base/testing_profile.h" 29 #include "chrome/test/base/testing_profile.h"
28 #include "components/browser_sync/profile_sync_service.h" 30 #include "components/browser_sync/profile_sync_service.h"
31 #include "components/browser_sync/profile_sync_service_mock.h"
29 #include "components/sync/base/sync_prefs.h" 32 #include "components/sync/base/sync_prefs.h"
30 #include "components/sync/device_info/local_device_info_provider_mock.h" 33 #include "components/sync/device_info/local_device_info_provider_mock.h"
31 #include "components/sync/driver/sync_client.h" 34 #include "components/sync/driver/sync_client.h"
32 #include "components/sync/model/fake_sync_change_processor.h" 35 #include "components/sync/model/fake_sync_change_processor.h"
33 #include "components/sync/model/sync_error_factory_mock.h" 36 #include "components/sync/model/sync_error_factory_mock.h"
34 #include "components/sync_sessions/fake_sync_sessions_client.h" 37 #include "components/sync_sessions/fake_sync_sessions_client.h"
35 #include "components/sync_sessions/sessions_sync_manager.h" 38 #include "components/sync_sessions/sessions_sync_manager.h"
36 #include "testing/gmock/include/gmock/gmock.h" 39 #include "testing/gmock/include/gmock/gmock.h"
37 #include "testing/gtest/include/gtest/gtest.h" 40 #include "testing/gtest/include/gtest/gtest.h"
38 #include "testing/gtest_mac.h" 41 #include "testing/gtest_mac.h"
39 #include "testing/platform_test.h" 42 #include "testing/platform_test.h"
40 #include "ui/base/l10n/l10n_util.h" 43 #include "ui/base/l10n/l10n_util.h"
41 #include "ui/base/resource/resource_bundle.h" 44 #include "ui/base/resource/resource_bundle.h"
42 45
46 using testing::_;
47 using testing::Invoke;
48 using testing::Return;
49
43 namespace { 50 namespace {
44 51
45 class MockAppMenuModel : public AppMenuModel { 52 class MockAppMenuModel : public AppMenuModel {
46 public: 53 public:
47 MockAppMenuModel() : AppMenuModel() {} 54 MockAppMenuModel() : AppMenuModel() {}
48 ~MockAppMenuModel() {} 55 ~MockAppMenuModel() {}
49 MOCK_METHOD2(ExecuteCommand, void(int command_id, int event_flags)); 56 MOCK_METHOD2(ExecuteCommand, void(int command_id, int event_flags));
50 }; 57 };
51 58
52 class DummyRouter : public sync_sessions::LocalSessionEventRouter { 59 class DummyRouter : public sync_sessions::LocalSessionEventRouter {
53 public: 60 public:
54 ~DummyRouter() override {} 61 ~DummyRouter() override {}
55 void StartRoutingTo( 62 void StartRoutingTo(
56 sync_sessions::LocalSessionEventHandler* handler) override {} 63 sync_sessions::LocalSessionEventHandler* handler) override {}
57 void Stop() override {} 64 void Stop() override {}
58 }; 65 };
59 66
60 class AppMenuControllerTest : public CocoaProfileTest { 67 class AppMenuControllerTest : public CocoaProfileTest {
61 public: 68 public:
62 AppMenuControllerTest() 69 AppMenuControllerTest() {
63 : local_device_(new syncer::LocalDeviceInfoProviderMock( 70 TestingProfile::TestingFactories factories;
64 "AppMenuControllerTest", 71 factories.push_back(std::make_pair(ProfileSyncServiceFactory::GetInstance(),
65 "Test Machine", 72 BuildMockProfileSyncService));
66 "Chromium 10k", 73 AddTestingFactories(factories);
67 "Chrome 10k", 74 }
68 sync_pb::SyncEnums_DeviceType_TYPE_LINUX,
69 "device_id")) {}
70 75
71 void SetUp() override { 76 void SetUp() override {
72 CocoaProfileTest::SetUp(); 77 CocoaProfileTest::SetUp();
73 ASSERT_TRUE(browser()); 78 ASSERT_TRUE(browser());
74 79
80 local_device_ = base::MakeUnique<syncer::LocalDeviceInfoProviderMock>(
81 "AppMenuControllerTest", "Test Machine", "Chromium 10k", "Chrome 10k",
82 sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id");
83
75 controller_.reset([[AppMenuController alloc] initWithBrowser:browser()]); 84 controller_.reset([[AppMenuController alloc] initWithBrowser:browser()]);
76 fake_model_.reset(new MockAppMenuModel);
77 85
78 sync_prefs_.reset(new syncer::SyncPrefs(profile()->GetPrefs())); 86 fake_model_ = base::MakeUnique<MockAppMenuModel>();
79 dummy_router_.reset(new DummyRouter()); 87
80 manager_.reset(new sync_sessions::SessionsSyncManager( 88 sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(profile()->GetPrefs());
89
90 mock_sync_service_ = static_cast<browser_sync::ProfileSyncServiceMock*>(
91 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile()));
92
93 manager_ = base::MakeUnique<sync_sessions::SessionsSyncManager>(
81 ProfileSyncServiceFactory::GetForProfile(profile()) 94 ProfileSyncServiceFactory::GetForProfile(profile())
82 ->GetSyncClient() 95 ->GetSyncClient()
83 ->GetSyncSessionsClient(), 96 ->GetSyncSessionsClient(),
84 sync_prefs_.get(), local_device_.get(), dummy_router_.get(), 97 sync_prefs_.get(), local_device_.get(), &dummy_router_, base::Closure(),
85 base::Closure(), base::Closure())); 98 base::Closure());
99
86 manager_->MergeDataAndStartSyncing( 100 manager_->MergeDataAndStartSyncing(
87 syncer::SESSIONS, syncer::SyncDataList(), 101 syncer::SESSIONS, syncer::SyncDataList(),
88 std::unique_ptr<syncer::SyncChangeProcessor>( 102 std::unique_ptr<syncer::SyncChangeProcessor>(
89 new syncer::FakeSyncChangeProcessor), 103 new syncer::FakeSyncChangeProcessor),
90 std::unique_ptr<syncer::SyncErrorFactory>( 104 std::unique_ptr<syncer::SyncErrorFactory>(
91 new syncer::SyncErrorFactoryMock)); 105 new syncer::SyncErrorFactoryMock));
92 } 106 }
93 107
94 void RegisterRecentTabs(RecentTabsBuilderTestHelper* helper) { 108 void RegisterRecentTabs(RecentTabsBuilderTestHelper* helper) {
95 helper->ExportToSessionsSyncManager(manager_.get()); 109 helper->ExportToSessionsSyncManager(manager_.get());
96 } 110 }
97 111
98 sync_sessions::OpenTabsUIDelegate* GetOpenTabsDelegate() {
99 return manager_.get();
100 }
101
102 void TearDown() override { 112 void TearDown() override {
103 fake_model_.reset(); 113 fake_model_.reset();
104 controller_.reset(); 114 controller_.reset();
105 manager_.reset(); 115 manager_.reset();
116 sync_prefs_.reset();
117 local_device_.reset();
106 CocoaProfileTest::TearDown(); 118 CocoaProfileTest::TearDown();
107 } 119 }
108 120
121 void EnableSync() {
122 EXPECT_CALL(*mock_sync_service_, IsSyncActive())
123 .WillRepeatedly(Return(true));
124 EXPECT_CALL(*mock_sync_service_,
125 IsDataTypeControllerRunning(syncer::SESSIONS))
126 .WillRepeatedly(Return(true));
127 EXPECT_CALL(*mock_sync_service_,
128 IsDataTypeControllerRunning(syncer::PROXY_TABS))
129 .WillRepeatedly(Return(true));
130 EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock())
131 .WillRepeatedly(Return(manager_.get()));
132 }
133
109 AppMenuController* controller() { 134 AppMenuController* controller() {
110 return controller_.get(); 135 return controller_.get();
111 } 136 }
112 137
113 base::scoped_nsobject<AppMenuController> controller_; 138 base::scoped_nsobject<AppMenuController> controller_;
114 139
115 std::unique_ptr<MockAppMenuModel> fake_model_; 140 std::unique_ptr<MockAppMenuModel> fake_model_;
116 141
117 private: 142 private:
143 std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_;
144 DummyRouter dummy_router_;
118 std::unique_ptr<syncer::SyncPrefs> sync_prefs_; 145 std::unique_ptr<syncer::SyncPrefs> sync_prefs_;
119 std::unique_ptr<DummyRouter> dummy_router_; 146 browser_sync::ProfileSyncServiceMock* mock_sync_service_ = nullptr;
120 std::unique_ptr<sync_sessions::SessionsSyncManager> manager_; 147 std::unique_ptr<sync_sessions::SessionsSyncManager> manager_;
121 std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_;
122 }; 148 };
123 149
124 TEST_F(AppMenuControllerTest, Initialized) { 150 TEST_F(AppMenuControllerTest, Initialized) {
125 EXPECT_TRUE([controller() menu]); 151 EXPECT_TRUE([controller() menu]);
126 EXPECT_GE([[controller() menu] numberOfItems], 5); 152 EXPECT_GE([[controller() menu] numberOfItems], 5);
127 } 153 }
128 154
129 TEST_F(AppMenuControllerTest, DispatchSimple) { 155 TEST_F(AppMenuControllerTest, DispatchSimple) {
130 base::scoped_nsobject<NSButton> button([[NSButton alloc] init]); 156 base::scoped_nsobject<NSButton> button([[NSButton alloc] init]);
131 [button setTag:IDC_ZOOM_PLUS]; 157 [button setTag:IDC_ZOOM_PLUS];
132 158
133 // Set fake model to test dispatching. 159 // Set fake model to test dispatching.
134 EXPECT_CALL(*fake_model_, ExecuteCommand(IDC_ZOOM_PLUS, 0)); 160 EXPECT_CALL(*fake_model_, ExecuteCommand(IDC_ZOOM_PLUS, 0));
135 [controller() setModel:fake_model_.get()]; 161 [controller() setModel:fake_model_.get()];
136 162
137 [controller() dispatchAppMenuCommand:button.get()]; 163 [controller() dispatchAppMenuCommand:button.get()];
138 chrome::testing::NSRunLoopRunAllPending(); 164 chrome::testing::NSRunLoopRunAllPending();
139 } 165 }
140 166
141 TEST_F(AppMenuControllerTest, RecentTabsFavIcon) { 167 TEST_F(AppMenuControllerTest, RecentTabsFavIcon) {
168 EnableSync();
169
142 RecentTabsBuilderTestHelper recent_tabs_builder; 170 RecentTabsBuilderTestHelper recent_tabs_builder;
143 recent_tabs_builder.AddSession(); 171 recent_tabs_builder.AddSession();
144 recent_tabs_builder.AddWindow(0); 172 recent_tabs_builder.AddWindow(0);
145 recent_tabs_builder.AddTab(0, 0); 173 recent_tabs_builder.AddTab(0, 0);
146 RegisterRecentTabs(&recent_tabs_builder); 174 RegisterRecentTabs(&recent_tabs_builder);
147 175
148 RecentTabsSubMenuModel recent_tabs_sub_menu_model( 176 RecentTabsSubMenuModel recent_tabs_sub_menu_model(nullptr, browser());
149 NULL, browser(), GetOpenTabsDelegate());
150 fake_model_->AddSubMenuWithStringId( 177 fake_model_->AddSubMenuWithStringId(
151 IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU, 178 IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU,
152 &recent_tabs_sub_menu_model); 179 &recent_tabs_sub_menu_model);
153 180
154 [controller() setModel:fake_model_.get()]; 181 [controller() setModel:fake_model_.get()];
155 NSMenu* menu = [controller() menu]; 182 NSMenu* menu = [controller() menu];
156 [controller() updateRecentTabsSubmenu]; 183 [controller() updateRecentTabsSubmenu];
157 184
158 NSString* title = l10n_util::GetNSStringWithFixup(IDS_RECENT_TABS_MENU); 185 NSString* title = l10n_util::GetNSStringWithFixup(IDS_RECENT_TABS_MENU);
159 NSMenu* recent_tabs_menu = [[menu itemWithTitle:title] submenu]; 186 NSMenu* recent_tabs_menu = [[menu itemWithTitle:title] submenu];
160 EXPECT_TRUE(recent_tabs_menu); 187 EXPECT_TRUE(recent_tabs_menu);
161 EXPECT_EQ(6, [recent_tabs_menu numberOfItems]); 188 EXPECT_EQ(6, [recent_tabs_menu numberOfItems]);
162 189
163 // Send a icon changed event and verify that the icon is updated. 190 // Send a icon changed event and verify that the icon is updated.
164 gfx::Image icon(ResourceBundle::GetSharedInstance().GetNativeImageNamed( 191 gfx::Image icon(ResourceBundle::GetSharedInstance().GetNativeImageNamed(
165 IDR_BOOKMARKS_FAVICON)); 192 IDR_BOOKMARKS_FAVICON));
166 recent_tabs_sub_menu_model.SetIcon(3, icon); 193 recent_tabs_sub_menu_model.SetIcon(3, icon);
167 EXPECT_NSNE(icon.ToNSImage(), [[recent_tabs_menu itemAtIndex:3] image]); 194 EXPECT_NSNE(icon.ToNSImage(), [[recent_tabs_menu itemAtIndex:3] image]);
168 recent_tabs_sub_menu_model.GetMenuModelDelegate()->OnIconChanged(3); 195 recent_tabs_sub_menu_model.GetMenuModelDelegate()->OnIconChanged(3);
169 EXPECT_TRUE([[recent_tabs_menu itemAtIndex:3] image]); 196 EXPECT_TRUE([[recent_tabs_menu itemAtIndex:3] image]);
170 EXPECT_NSEQ(icon.ToNSImage(), [[recent_tabs_menu itemAtIndex:3] image]); 197 EXPECT_NSEQ(icon.ToNSImage(), [[recent_tabs_menu itemAtIndex:3] image]);
171 198
172 controller_.reset(); 199 controller_.reset();
173 fake_model_.reset(); 200 fake_model_.reset();
174 } 201 }
175 202
176 TEST_F(AppMenuControllerTest, RecentTabsElideTitle) { 203 TEST_F(AppMenuControllerTest, RecentTabsElideTitle) {
204 EnableSync();
205
177 // Add 1 session with 1 window and 2 tabs. 206 // Add 1 session with 1 window and 2 tabs.
178 RecentTabsBuilderTestHelper recent_tabs_builder; 207 RecentTabsBuilderTestHelper recent_tabs_builder;
179 recent_tabs_builder.AddSession(); 208 recent_tabs_builder.AddSession();
180 recent_tabs_builder.AddWindow(0); 209 recent_tabs_builder.AddWindow(0);
181 base::string16 tab1_short_title = base::ASCIIToUTF16("Short"); 210 base::string16 tab1_short_title = base::ASCIIToUTF16("Short");
182 recent_tabs_builder.AddTabWithInfo(0, 0, base::Time::Now(), tab1_short_title); 211 recent_tabs_builder.AddTabWithInfo(0, 0, base::Time::Now(), tab1_short_title);
183 base::string16 tab2_long_title = base::ASCIIToUTF16( 212 base::string16 tab2_long_title = base::ASCIIToUTF16(
184 "Very very very very very very very very very very very very long"); 213 "Very very very very very very very very very very very very long");
185 recent_tabs_builder.AddTabWithInfo(0, 0, 214 recent_tabs_builder.AddTabWithInfo(0, 0,
186 base::Time::Now() - base::TimeDelta::FromMinutes(10), tab2_long_title); 215 base::Time::Now() - base::TimeDelta::FromMinutes(10), tab2_long_title);
187 RegisterRecentTabs(&recent_tabs_builder); 216 RegisterRecentTabs(&recent_tabs_builder);
188 217
189 RecentTabsSubMenuModel recent_tabs_sub_menu_model( 218 RecentTabsSubMenuModel recent_tabs_sub_menu_model(nullptr, browser());
190 NULL, browser(), GetOpenTabsDelegate());
191 fake_model_->AddSubMenuWithStringId( 219 fake_model_->AddSubMenuWithStringId(
192 IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU, 220 IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU,
193 &recent_tabs_sub_menu_model); 221 &recent_tabs_sub_menu_model);
194 222
195 [controller() setModel:fake_model_.get()]; 223 [controller() setModel:fake_model_.get()];
196 NSMenu* menu = [controller() menu]; 224 NSMenu* menu = [controller() menu];
197 [controller() updateRecentTabsSubmenu]; 225 [controller() updateRecentTabsSubmenu];
198 226
199 NSString* title = l10n_util::GetNSStringWithFixup(IDS_RECENT_TABS_MENU); 227 NSString* title = l10n_util::GetNSStringWithFixup(IDS_RECENT_TABS_MENU);
200 NSMenu* recent_tabs_menu = [[menu itemWithTitle:title] submenu]; 228 NSMenu* recent_tabs_menu = [[menu itemWithTitle:title] submenu];
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 BrowserRemovedObserver observer; 290 BrowserRemovedObserver observer;
263 // This is normally called by ToolbarController, but since |controller_| is 291 // This is normally called by ToolbarController, but since |controller_| is
264 // not owned by one, call it here. 292 // not owned by one, call it here.
265 [controller_ browserWillBeDestroyed]; 293 [controller_ browserWillBeDestroyed];
266 CloseBrowserWindow(); 294 CloseBrowserWindow();
267 observer.WaitUntilBrowserRemoved(); 295 observer.WaitUntilBrowserRemoved();
268 // |controller_| is released in TearDown(). 296 // |controller_| is released in TearDown().
269 } 297 }
270 298
271 } // namespace 299 } // namespace
OLDNEW
« no previous file with comments | « chrome/browser/ui/browser_tabrestore_browsertest.cc ('k') | chrome/browser/ui/toolbar/app_menu_model.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698