1 // Copyright (c) 2011 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 "base/macros.h"
6 #include "chrome/browser/extensions/extension_browsertest.h"
7 #include "chrome/browser/extensions/extension_toolbar_model.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/test/base/in_process_browser_test.h"
12 namespace extensions
{
14 // An InProcessBrowserTest for testing the ExtensionToolbarModel.
15 // TODO(erikkay) It's unfortunate that this needs to be an in-proc browser test.
16 // It would be nice to refactor things so that ExtensionService could run
17 // without so much of the browser in place.
18 class ExtensionToolbarModelTest
: public ExtensionBrowserTest
,
19 public ExtensionToolbarModel::Observer
{
21 virtual void SetUp() {
25 highlight_mode_count_
= 0;
27 ExtensionBrowserTest::SetUp();
30 virtual void SetUpCommandLine(CommandLine
* command_line
) OVERRIDE
{
31 ExtensionBrowserTest::SetUpCommandLine(command_line
);
32 #if defined(OS_LINUX) || defined(OS_CHROMEOS)
33 command_line
->AppendSwitchNative(
34 "vmodule", "*extension_toolbar_model*=4,*browser_actions_container*=4");
35 #endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
38 virtual void SetUpOnMainThread() OVERRIDE
{
39 model_
= ExtensionToolbarModel::Get(browser()->profile());
40 model_
->AddObserver(this);
43 virtual void CleanUpOnMainThread() OVERRIDE
{
44 model_
->RemoveObserver(this);
47 virtual void BrowserActionAdded(const Extension
* extension
,
52 virtual void BrowserActionRemoved(const Extension
* extension
) OVERRIDE
{
56 virtual void BrowserActionMoved(const Extension
* extension
,
61 virtual void HighlightModeChanged(bool is_highlighting
) OVERRIDE
{
62 // Add one if highlighting, subtract one if not.
63 highlight_mode_count_
+= is_highlighting
? 1 : -1;
66 const Extension
* ExtensionAt(int index
) {
67 const ExtensionList
& toolbar_items
= model_
->toolbar_items();
68 for (ExtensionList::const_iterator i
= toolbar_items
.begin();
69 i
< toolbar_items
.end(); ++i
) {
77 ExtensionToolbarModel
* model_
;
82 int highlight_mode_count_
;
85 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, Basic
) {
86 // Load an extension with no browser action.
87 ASSERT_TRUE(LoadExtension(test_data_dir_
.AppendASCII("api_test")
88 .AppendASCII("browser_action")
89 .AppendASCII("none")));
91 // This extension should not be in the model (has no browser action).
92 EXPECT_EQ(0, inserted_count_
);
93 EXPECT_EQ(0u, model_
->toolbar_items().size());
94 ASSERT_EQ(NULL
, ExtensionAt(0));
96 // Load an extension with a browser action.
97 ASSERT_TRUE(LoadExtension(test_data_dir_
.AppendASCII("api_test")
98 .AppendASCII("browser_action")
99 .AppendASCII("basics")));
101 // We should now find our extension in the model.
102 EXPECT_EQ(1, inserted_count_
);
103 EXPECT_EQ(1u, model_
->toolbar_items().size());
104 const Extension
* extension
= ExtensionAt(0);
105 ASSERT_TRUE(NULL
!= extension
);
106 EXPECT_STREQ("A browser action with no icon that makes the page red",
107 extension
->name().c_str());
109 // Should be a no-op, but still fires the events.
110 model_
->MoveBrowserAction(extension
, 0);
111 EXPECT_EQ(1, moved_count_
);
112 EXPECT_EQ(1u, model_
->toolbar_items().size());
113 const Extension
* extension2
= ExtensionAt(0);
114 EXPECT_EQ(extension
, extension2
);
116 UnloadExtension(extension
->id());
117 EXPECT_EQ(1, removed_count_
);
118 EXPECT_EQ(0u, model_
->toolbar_items().size());
119 EXPECT_EQ(NULL
, ExtensionAt(0));
122 #if defined(OS_MACOSX)
123 // Flaky on Mac 10.8 Blink canary bots: http://crbug.com/166580
124 #define MAYBE_ReorderAndReinsert DISABLED_ReorderAndReinsert
126 #define MAYBE_ReorderAndReinsert ReorderAndReinsert
128 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, MAYBE_ReorderAndReinsert
) {
129 // Load an extension with a browser action.
130 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
131 .AppendASCII("browser_action")
132 .AppendASCII("basics"));
133 ASSERT_TRUE(LoadExtension(extension_a_path
));
135 // First extension loaded.
136 EXPECT_EQ(1, inserted_count_
);
137 EXPECT_EQ(1u, model_
->toolbar_items().size());
138 const Extension
* extensionA
= ExtensionAt(0);
139 ASSERT_TRUE(NULL
!= extensionA
);
140 EXPECT_STREQ("A browser action with no icon that makes the page red",
141 extensionA
->name().c_str());
143 // Load another extension with a browser action.
144 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
145 .AppendASCII("browser_action")
146 .AppendASCII("popup"));
147 ASSERT_TRUE(LoadExtension(extension_b_path
));
149 // Second extension loaded.
150 EXPECT_EQ(2, inserted_count_
);
151 EXPECT_EQ(2u, model_
->toolbar_items().size());
152 const Extension
* extensionB
= ExtensionAt(1);
153 ASSERT_TRUE(NULL
!= extensionB
);
154 EXPECT_STREQ("Popup tester", extensionB
->name().c_str());
156 // Load yet another extension with a browser action.
157 base::FilePath
extension_c_path(test_data_dir_
.AppendASCII("api_test")
158 .AppendASCII("browser_action")
159 .AppendASCII("remove_popup"));
160 ASSERT_TRUE(LoadExtension(extension_c_path
));
162 // Third extension loaded.
163 EXPECT_EQ(3, inserted_count_
);
164 EXPECT_EQ(3u, model_
->toolbar_items().size());
165 const Extension
* extensionC
= ExtensionAt(2);
166 ASSERT_TRUE(NULL
!= extensionC
);
167 EXPECT_STREQ("A page action which removes a popup.",
168 extensionC
->name().c_str());
170 // Order is now A, B, C. Let's put C first.
171 model_
->MoveBrowserAction(extensionC
, 0);
172 EXPECT_EQ(1, moved_count_
);
173 EXPECT_EQ(3u, model_
->toolbar_items().size());
174 EXPECT_EQ(extensionC
, ExtensionAt(0));
175 EXPECT_EQ(extensionA
, ExtensionAt(1));
176 EXPECT_EQ(extensionB
, ExtensionAt(2));
177 EXPECT_EQ(NULL
, ExtensionAt(3));
179 // Order is now C, A, B. Let's put A last.
180 model_
->MoveBrowserAction(extensionA
, 2);
181 EXPECT_EQ(2, moved_count_
);
182 EXPECT_EQ(3u, model_
->toolbar_items().size());
183 EXPECT_EQ(extensionC
, ExtensionAt(0));
184 EXPECT_EQ(extensionB
, ExtensionAt(1));
185 EXPECT_EQ(extensionA
, ExtensionAt(2));
186 EXPECT_EQ(NULL
, ExtensionAt(3));
188 // Order is now C, B, A. Let's remove B.
189 std::string idB
= extensionB
->id();
190 UnloadExtension(idB
);
191 EXPECT_EQ(1, removed_count_
);
192 EXPECT_EQ(2u, model_
->toolbar_items().size());
193 EXPECT_EQ(extensionC
, ExtensionAt(0));
194 EXPECT_EQ(extensionA
, ExtensionAt(1));
195 EXPECT_EQ(NULL
, ExtensionAt(2));
197 // Load extension B again.
198 ASSERT_TRUE(LoadExtension(extension_b_path
));
200 // Extension B loaded again.
201 EXPECT_EQ(4, inserted_count_
);
202 EXPECT_EQ(3u, model_
->toolbar_items().size());
203 // Make sure it gets its old spot in the list. We should get the same
204 // extension again, otherwise the order has changed.
205 ASSERT_STREQ(idB
.c_str(), ExtensionAt(1)->id().c_str());
208 UnloadExtension(idB
);
209 EXPECT_EQ(2, removed_count_
);
210 EXPECT_EQ(2u, model_
->toolbar_items().size());
211 EXPECT_EQ(extensionC
, ExtensionAt(0));
212 EXPECT_EQ(extensionA
, ExtensionAt(1));
213 EXPECT_EQ(NULL
, ExtensionAt(2));
215 // Order is now C, A. Flip it.
216 model_
->MoveBrowserAction(extensionA
, 0);
217 EXPECT_EQ(3, moved_count_
);
218 EXPECT_EQ(2u, model_
->toolbar_items().size());
219 EXPECT_EQ(extensionA
, ExtensionAt(0));
220 EXPECT_EQ(extensionC
, ExtensionAt(1));
221 EXPECT_EQ(NULL
, ExtensionAt(2));
223 // Move A to the location it already occupies.
224 model_
->MoveBrowserAction(extensionA
, 0);
225 EXPECT_EQ(4, moved_count_
);
226 EXPECT_EQ(2u, model_
->toolbar_items().size());
227 EXPECT_EQ(extensionA
, ExtensionAt(0));
228 EXPECT_EQ(extensionC
, ExtensionAt(1));
229 EXPECT_EQ(NULL
, ExtensionAt(2));
231 // Order is now A, C. Remove C.
232 std::string idC
= extensionC
->id();
233 UnloadExtension(idC
);
234 EXPECT_EQ(3, removed_count_
);
235 EXPECT_EQ(1u, model_
->toolbar_items().size());
236 EXPECT_EQ(extensionA
, ExtensionAt(0));
237 EXPECT_EQ(NULL
, ExtensionAt(1));
239 // Load extension C again.
240 ASSERT_TRUE(LoadExtension(extension_c_path
));
242 // Extension C loaded again.
243 EXPECT_EQ(5, inserted_count_
);
244 EXPECT_EQ(2u, model_
->toolbar_items().size());
245 // Make sure it gets its old spot in the list (at the very end).
246 ASSERT_STREQ(idC
.c_str(), ExtensionAt(1)->id().c_str());
249 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, UnloadAndDisableMultiple
) {
250 // Load three extensions with browser action.
251 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
252 .AppendASCII("browser_action")
253 .AppendASCII("basics"));
254 ASSERT_TRUE(LoadExtension(extension_a_path
));
255 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
256 .AppendASCII("browser_action")
257 .AppendASCII("popup"));
258 ASSERT_TRUE(LoadExtension(extension_b_path
));
259 base::FilePath
extension_c_path(test_data_dir_
.AppendASCII("api_test")
260 .AppendASCII("browser_action")
261 .AppendASCII("remove_popup"));
262 ASSERT_TRUE(LoadExtension(extension_c_path
));
264 // Verify we got the three we asked for and that they are ordered as: A, B, C.
265 const Extension
* extensionA
= ExtensionAt(0);
266 const Extension
* extensionB
= ExtensionAt(1);
267 const Extension
* extensionC
= ExtensionAt(2);
268 std::string idA
= extensionA
->id();
269 std::string idB
= extensionB
->id();
270 std::string idC
= extensionC
->id();
271 EXPECT_STREQ("A browser action with no icon that makes the page red",
272 extensionA
->name().c_str());
273 EXPECT_STREQ("Popup tester", extensionB
->name().c_str());
274 EXPECT_STREQ("A page action which removes a popup.",
275 extensionC
->name().c_str());
277 // Unload B, then C, then A.
278 UnloadExtension(idB
);
279 UnloadExtension(idC
);
280 UnloadExtension(idA
);
282 // Load C, then A, then B.
283 ASSERT_TRUE(LoadExtension(extension_c_path
));
284 ASSERT_TRUE(LoadExtension(extension_a_path
));
285 ASSERT_TRUE(LoadExtension(extension_b_path
));
286 EXPECT_EQ(0, moved_count_
);
288 extensionA
= ExtensionAt(0);
289 extensionB
= ExtensionAt(1);
290 extensionC
= ExtensionAt(2);
292 // Make sure we get the order we started with (A, B, C).
293 EXPECT_STREQ(idA
.c_str(), extensionA
->id().c_str());
294 EXPECT_STREQ(idB
.c_str(), extensionB
->id().c_str());
295 EXPECT_STREQ(idC
.c_str(), extensionC
->id().c_str());
297 // Put C in the middle and A to the end.
298 model_
->MoveBrowserAction(extensionC
, 1);
299 model_
->MoveBrowserAction(extensionA
, 2);
301 // Make sure we get this order (C, B, A).
302 EXPECT_STREQ(idC
.c_str(), ExtensionAt(0)->id().c_str());
303 EXPECT_STREQ(idB
.c_str(), ExtensionAt(1)->id().c_str());
304 EXPECT_STREQ(idA
.c_str(), ExtensionAt(2)->id().c_str());
306 // Disable B, then C, then A.
307 DisableExtension(idB
);
308 DisableExtension(idC
);
309 DisableExtension(idA
);
311 // Enable C, then A, then B.
312 EnableExtension(idA
);
313 EnableExtension(idB
);
314 EnableExtension(idC
);
316 // Make sure we get the order we started with.
317 EXPECT_STREQ(idC
.c_str(), ExtensionAt(0)->id().c_str());
318 EXPECT_STREQ(idB
.c_str(), ExtensionAt(1)->id().c_str());
319 EXPECT_STREQ(idA
.c_str(), ExtensionAt(2)->id().c_str());
322 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, Uninstall
) {
323 // Load two extensions with browser action.
324 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
325 .AppendASCII("browser_action")
326 .AppendASCII("basics"));
327 ASSERT_TRUE(LoadExtension(extension_a_path
));
328 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
329 .AppendASCII("browser_action")
330 .AppendASCII("popup"));
331 ASSERT_TRUE(LoadExtension(extension_b_path
));
333 // Verify we got what we came for.
334 const Extension
* extensionA
= ExtensionAt(0);
335 const Extension
* extensionB
= ExtensionAt(1);
336 std::string idA
= extensionA
->id();
337 std::string idB
= extensionB
->id();
338 EXPECT_STREQ("A browser action with no icon that makes the page red",
339 extensionA
->name().c_str());
340 EXPECT_STREQ("Popup tester", extensionB
->name().c_str());
342 // Order is now A, B. Make B first.
343 model_
->MoveBrowserAction(extensionB
, 0);
345 // Order is now B, A. Uninstall Extension B.
346 UninstallExtension(idB
);
348 // List contains only A now. Validate that.
349 EXPECT_STREQ(idA
.c_str(), ExtensionAt(0)->id().c_str());
350 EXPECT_EQ(1u, model_
->toolbar_items().size());
352 // Load Extension B again.
353 ASSERT_TRUE(LoadExtension(extension_b_path
));
354 EXPECT_EQ(2u, model_
->toolbar_items().size());
356 // Make sure Extension B is _not_ first (should have been forgotten at
358 EXPECT_STREQ(idA
.c_str(), ExtensionAt(0)->id().c_str());
359 EXPECT_STREQ(idB
.c_str(), ExtensionAt(1)->id().c_str());
362 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, ReorderOnPrefChange
) {
363 // Load three extensions with browser action.
364 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
365 .AppendASCII("browser_action")
366 .AppendASCII("basics"));
367 ASSERT_TRUE(LoadExtension(extension_a_path
));
368 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
369 .AppendASCII("browser_action")
370 .AppendASCII("popup"));
371 ASSERT_TRUE(LoadExtension(extension_b_path
));
372 base::FilePath
extension_c_path(test_data_dir_
.AppendASCII("api_test")
373 .AppendASCII("browser_action")
374 .AppendASCII("remove_popup"));
375 ASSERT_TRUE(LoadExtension(extension_c_path
));
376 std::string id_a
= ExtensionAt(0)->id();
377 std::string id_b
= ExtensionAt(1)->id();
378 std::string id_c
= ExtensionAt(2)->id();
380 // Change value of toolbar preference.
381 ExtensionIdList new_order
;
382 new_order
.push_back(id_c
);
383 new_order
.push_back(id_b
);
384 ExtensionPrefs::Get(browser()->profile())->SetToolbarOrder(new_order
);
386 // Verify order is changed.
387 EXPECT_EQ(id_c
, ExtensionAt(0)->id());
388 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
389 EXPECT_EQ(id_a
, ExtensionAt(2)->id());
392 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, HighlightMode
) {
393 EXPECT_FALSE(model_
->HighlightExtensions(ExtensionIdList()));
394 EXPECT_EQ(0, highlight_mode_count_
);
396 // Load three extensions with browser action.
397 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
398 .AppendASCII("browser_action")
399 .AppendASCII("basics"));
400 ASSERT_TRUE(LoadExtension(extension_a_path
));
401 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
402 .AppendASCII("browser_action")
403 .AppendASCII("popup"));
404 ASSERT_TRUE(LoadExtension(extension_b_path
));
405 base::FilePath
extension_c_path(test_data_dir_
.AppendASCII("api_test")
406 .AppendASCII("browser_action")
407 .AppendASCII("remove_popup"));
408 ASSERT_TRUE(LoadExtension(extension_c_path
));
409 std::string id_a
= ExtensionAt(0)->id();
410 std::string id_b
= ExtensionAt(1)->id();
411 std::string id_c
= ExtensionAt(2)->id();
413 // Highlight one extension.
414 ExtensionIdList extension_ids
;
415 extension_ids
.push_back(id_b
);
416 model_
->HighlightExtensions(extension_ids
);
417 EXPECT_EQ(1, highlight_mode_count_
);
418 EXPECT_TRUE(model_
->is_highlighting());
420 EXPECT_EQ(1u, model_
->toolbar_items().size());
421 EXPECT_EQ(id_b
, ExtensionAt(0)->id());
423 // Stop highlighting.
424 model_
->StopHighlighting();
425 EXPECT_EQ(0, highlight_mode_count_
);
426 EXPECT_FALSE(model_
->is_highlighting());
428 // Verify that the extensions are back to normal.
429 EXPECT_EQ(3u, model_
->toolbar_items().size());
430 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
431 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
432 EXPECT_EQ(id_c
, ExtensionAt(2)->id());
434 // Call stop highlighting a second time (shouldn't be notified).
435 model_
->StopHighlighting();
436 EXPECT_EQ(0, highlight_mode_count_
);
437 EXPECT_FALSE(model_
->is_highlighting());
439 // Highlight all extensions.
440 extension_ids
.clear();
441 extension_ids
.push_back(id_a
);
442 extension_ids
.push_back(id_b
);
443 extension_ids
.push_back(id_c
);
444 model_
->HighlightExtensions(extension_ids
);
445 EXPECT_EQ(1, highlight_mode_count_
);
446 EXPECT_EQ(3u, model_
->toolbar_items().size());
447 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
448 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
449 EXPECT_EQ(id_c
, ExtensionAt(2)->id());
451 // Highlight only extension b (shrink the highlight list).
452 extension_ids
.clear();
453 extension_ids
.push_back(id_b
);
454 model_
->HighlightExtensions(extension_ids
);
455 EXPECT_EQ(2, highlight_mode_count_
);
456 EXPECT_EQ(1u, model_
->toolbar_items().size());
457 EXPECT_EQ(id_b
, ExtensionAt(0)->id());
459 // Highlight extensions a and b (grow the highlight list).
460 extension_ids
.clear();
461 extension_ids
.push_back(id_a
);
462 extension_ids
.push_back(id_b
);
463 model_
->HighlightExtensions(extension_ids
);
464 EXPECT_EQ(3, highlight_mode_count_
);
465 EXPECT_EQ(2u, model_
->toolbar_items().size());
466 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
467 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
469 // Highlight no extensions (empty the highlight list).
470 extension_ids
.clear();
471 model_
->HighlightExtensions(extension_ids
);
472 EXPECT_EQ(2, highlight_mode_count_
);
473 EXPECT_FALSE(model_
->is_highlighting());
474 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
475 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
476 EXPECT_EQ(id_c
, ExtensionAt(2)->id());
479 #if defined(OS_MACOSX)
480 // Flaky on Mac bots: http://crbug.com/358752
481 #define MAYBE_HighlightModeRemove DISABLED_HighlightModeRemove
483 #define MAYBE_HighlightModeRemove HighlightModeRemove
486 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, MAYBE_HighlightModeRemove
) {
487 // Load three extensions with browser action.
488 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
489 .AppendASCII("browser_action")
490 .AppendASCII("basics"));
491 ASSERT_TRUE(LoadExtension(extension_a_path
));
492 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
493 .AppendASCII("browser_action")
494 .AppendASCII("popup"));
495 ASSERT_TRUE(LoadExtension(extension_b_path
));
496 base::FilePath
extension_c_path(test_data_dir_
.AppendASCII("api_test")
497 .AppendASCII("browser_action")
498 .AppendASCII("remove_popup"));
499 ASSERT_TRUE(LoadExtension(extension_c_path
));
500 std::string id_a
= ExtensionAt(0)->id();
501 std::string id_b
= ExtensionAt(1)->id();
502 std::string id_c
= ExtensionAt(2)->id();
504 // Highlight two of the extensions.
505 ExtensionIdList extension_ids
;
506 extension_ids
.push_back(id_a
);
507 extension_ids
.push_back(id_b
);
508 model_
->HighlightExtensions(extension_ids
);
509 EXPECT_TRUE(model_
->is_highlighting());
510 EXPECT_EQ(1, highlight_mode_count_
);
511 EXPECT_EQ(2u, model_
->toolbar_items().size());
513 // Disable one of them - only one should remain highlighted.
514 DisableExtension(id_a
);
515 EXPECT_TRUE(model_
->is_highlighting());
516 EXPECT_EQ(1u, model_
->toolbar_items().size());
517 EXPECT_EQ(id_b
, ExtensionAt(0)->id());
519 // Uninstall the remaining highlighted extension. This should result in
520 // highlight mode exiting.
521 UninstallExtension(id_b
);
522 EXPECT_FALSE(model_
->is_highlighting());
523 EXPECT_EQ(0, highlight_mode_count_
);
524 EXPECT_EQ(1u, model_
->toolbar_items().size());
525 EXPECT_EQ(id_c
, ExtensionAt(0)->id());
527 // Test that removing an unhighlighted extension still works.
528 // Reinstall extension b, and then highlight extension c.
529 ASSERT_TRUE(LoadExtension(extension_b_path
));
530 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
531 extension_ids
.clear();
532 extension_ids
.push_back(id_c
);
533 model_
->HighlightExtensions(extension_ids
);
534 EXPECT_EQ(1, highlight_mode_count_
);
535 EXPECT_TRUE(model_
->is_highlighting());
536 EXPECT_EQ(1u, model_
->toolbar_items().size());
537 EXPECT_EQ(id_c
, ExtensionAt(0)->id());
539 // Uninstalling b should not have visible impact.
540 UninstallExtension(id_b
);
541 EXPECT_TRUE(model_
->is_highlighting());
542 EXPECT_EQ(1, highlight_mode_count_
);
543 EXPECT_EQ(1u, model_
->toolbar_items().size());
544 EXPECT_EQ(id_c
, ExtensionAt(0)->id());
546 // When we stop, only extension c should remain.
547 model_
->StopHighlighting();
548 EXPECT_FALSE(model_
->is_highlighting());
549 EXPECT_EQ(0, highlight_mode_count_
);
550 EXPECT_EQ(1u, model_
->toolbar_items().size());
551 EXPECT_EQ(id_c
, ExtensionAt(0)->id());
554 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, HighlightModeAdd
) {
555 // Load two extensions with browser action.
556 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
557 .AppendASCII("browser_action")
558 .AppendASCII("basics"));
559 ASSERT_TRUE(LoadExtension(extension_a_path
));
560 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
561 .AppendASCII("browser_action")
562 .AppendASCII("popup"));
563 ASSERT_TRUE(LoadExtension(extension_b_path
));
564 std::string id_a
= ExtensionAt(0)->id();
565 std::string id_b
= ExtensionAt(1)->id();
567 // Highlight one of the extensions.
568 ExtensionIdList extension_ids
;
569 extension_ids
.push_back(id_a
);
570 model_
->HighlightExtensions(extension_ids
);
571 EXPECT_TRUE(model_
->is_highlighting());
572 EXPECT_EQ(1u, model_
->toolbar_items().size());
573 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
575 // Adding the new extension should have no visible effect.
576 base::FilePath
extension_c_path(test_data_dir_
.AppendASCII("api_test")
577 .AppendASCII("browser_action")
578 .AppendASCII("remove_popup"));
579 const Extension
* extension_c
= LoadExtension(extension_c_path
);
580 ASSERT_TRUE(extension_c
);
581 std::string id_c
= extension_c
->id();
582 EXPECT_TRUE(model_
->is_highlighting());
583 EXPECT_EQ(1u, model_
->toolbar_items().size());
584 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
586 // When we stop highlighting, we should see the new extension show up.
587 model_
->StopHighlighting();
588 EXPECT_FALSE(model_
->is_highlighting());
589 EXPECT_EQ(3u, model_
->toolbar_items().size());
590 EXPECT_EQ(id_a
, ExtensionAt(0)->id());
591 EXPECT_EQ(id_b
, ExtensionAt(1)->id());
592 EXPECT_EQ(id_c
, ExtensionAt(2)->id());
595 // Test is flaky (see crbug.com/379170), but currently enabled to gather traces.
596 // If it fails, ping Finnur.
597 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest
, SizeAfterPrefChange
) {
598 // Load two extensions with browser action.
599 base::FilePath
extension_a_path(test_data_dir_
.AppendASCII("api_test")
600 .AppendASCII("browser_action")
601 .AppendASCII("basics"));
602 VLOG(4) << "Loading [basics]";
603 ASSERT_TRUE(LoadExtension(extension_a_path
));
604 base::FilePath
extension_b_path(test_data_dir_
.AppendASCII("api_test")
605 .AppendASCII("browser_action")
606 .AppendASCII("popup"));
607 VLOG(4) << "Loading [popup]";
608 ASSERT_TRUE(LoadExtension(extension_b_path
));
609 std::string id_a
= ExtensionAt(0)->id();
610 std::string id_b
= ExtensionAt(1)->id();
612 VLOG(4) << "GetVisibleIconCount";
614 // Should be at max size (-1).
615 EXPECT_EQ(-1, model_
->GetVisibleIconCount());
617 VLOG(4) << "OnExtensionToolbarPrefChange";
618 model_
->OnExtensionToolbarPrefChange();
620 VLOG(4) << "GetVisibleIconCount";
622 // Should still be at max size.
623 EXPECT_EQ(-1, model_
->GetVisibleIconCount());
626 } // namespace extensions