172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/browser_action_test_util.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browsertest.h"
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/browser_actions_container.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/extensions/extension_action.h"
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/extensions/extension_resource.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserActionsContainerTest : public ExtensionBrowserTest {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BrowserActionsContainerTest() : browser_(NULL) {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BrowserActionsContainerTest() {}
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual Browser* CreateBrowser(Profile* profile) {
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    browser_ = InProcessBrowserTest::CreateBrowser(profile);
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    browser_actions_bar_.reset(new BrowserActionTestUtil(browser_));
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return browser_;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Browser* browser() { return browser_; }
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserActionTestUtil* browser_actions_bar() {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return browser_actions_bar_.get();
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure extension with index |extension_index| has an icon.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EnsureExtensionHasIcon(int extension_index) {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!browser_actions_bar_->HasIcon(extension_index)) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // The icon is loaded asynchronously and a notification is then sent to
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // observers. So we wait on it.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser_actions_bar_->WaitForBrowserActionUpdated(extension_index);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(browser_actions_bar()->HasIcon(extension_index));
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<BrowserActionTestUtil> browser_actions_bar_;
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Browser* browser_;  // Weak.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test the basic functionality.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Basic) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserActionsContainer::disable_animations_during_testing_ = true;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load an extension with no browser action.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("browser_action")
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("none")));
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This extension should not be in the model (has no browser action).
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions());
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load an extension with a browser action.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("browser_action")
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("basics")));
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions());
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureExtensionHasIcon(0);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unload the extension.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string id = browser_actions_bar()->GetExtensionId(0);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UnloadExtension(id);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions());
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(mpcomplete): http://code.google.com/p/chromium/issues/detail?id=38992
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, Visibility) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserActionsContainer::disable_animations_during_testing_ = true;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  base::TimeTicks start_time = base::TimeTicks::Now();
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load extension A (contains browser action).
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("browser_action")
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("basics")));
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions());
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureExtensionHasIcon(0);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string idA = browser_actions_bar()->GetExtensionId(0);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Load extension A done  : "
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load extension B (contains browser action).
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("browser_action")
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("add_popup")));
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureExtensionHasIcon(0);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string idB = browser_actions_bar()->GetExtensionId(1);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Load extension B done  : "
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NE(idA, idB);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load extension C (contains browser action).
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("browser_action")
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          .AppendASCII("remove_popup")));
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureExtensionHasIcon(2);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string idC = browser_actions_bar()->GetExtensionId(2);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Load extension C done  : "
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Change container to show only one action, rest in overflow: A, [B, C].
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_actions_bar()->SetIconVisibilityCount(1);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Icon visibility count 1: "
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disable extension A (should disappear). State becomes: B [C].
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DisableExtension(idA);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0));
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Disable extension A    : "
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable A again. A should get its spot in the same location and the bar
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should not grow (chevron is showing). For details: http://crbug.com/35349.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // State becomes: A, [B, C].
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnableExtension(idA);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Enable extension A     : "
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disable C (in overflow). State becomes: A, [B].
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DisableExtension(idC);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Disable extension C    : "
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable C again. State becomes: A, [B, C].
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnableExtension(idC);
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(0));
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Enable extension C     : "
166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now we have 3 extensions. Make sure they are all visible. State: A, B, C.
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_actions_bar()->SetIconVisibilityCount(3);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Checkpoint             : "
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disable extension A (should disappear). State becomes: B, C.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DisableExtension(idA);
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0));
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Disable extension A    : "
184201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
185201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disable extension B (should disappear). State becomes: C.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DisableExtension(idB);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions());
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idC, browser_actions_bar()->GetExtensionId(0));
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Disable extension B    : "
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable B (makes B and C showing now). State becomes: B, C.
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnableExtension(idB);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->NumberOfBrowserActions());
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idB, browser_actions_bar()->GetExtensionId(0));
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Enable extension B     : "
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable A (makes A, B and C showing now). State becomes: B, C, A.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnableExtension(idA);
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(idA, browser_actions_bar()->GetExtensionId(2));
212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
213201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Test complete          : "
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << (base::TimeTicks::Now() - start_time).InMilliseconds()
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            << " ms" << std::flush;
216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, ForceHide) {
219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BrowserActionsContainer::disable_animations_during_testing_ = true;
220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
221201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Load extension A (contains browser action).
222201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                          .AppendASCII("browser_action")
224201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                          .AppendASCII("basics")));
225201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions());
226201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EnsureExtensionHasIcon(0);
227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
228201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string idA = browser_actions_bar()->GetExtensionId(0);
229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
230201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Force hide this browser action.
23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = browser()->profile()->GetExtensionService();
232201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  service->SetBrowserActionVisibility(service->GetExtensionById(idA, false),
233201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                      false);
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(0, browser_actions_bar()->VisibleBrowserActions());
235201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ReloadExtension(idA);
237201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
238201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The browser action should become visible again.
239201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(1, browser_actions_bar()->VisibleBrowserActions());
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
242731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserActionsContainerTest, TestCrash57536) {
243201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Test starting\n" << std::flush;
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = browser()->profile()->GetExtensionService();
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const size_t size_before = service->extensions()->size();
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Loading extension\n" << std::flush;
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Load extension A (contains browser action).
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("api_test")
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                          .AppendASCII("browser_action")
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                          .AppendASCII("crash_57536")));
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension = service->extensions()->at(size_before);
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Creating bitmap\n" << std::flush;
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Create and cache and empty bitmap.
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SkBitmap bitmap;
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bitmap.setConfig(SkBitmap::kARGB_8888_Config,
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                    Extension::kBrowserActionIconMaxSize,
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                    Extension::kBrowserActionIconMaxSize);
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bitmap.allocPixels();
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
266201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Set as cached image\n" << std::flush;
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gfx::Size size(Extension::kBrowserActionIconMaxSize,
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                 Extension::kBrowserActionIconMaxSize);
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  extension->SetCachedImage(
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      extension->GetResource(extension->browser_action()->default_icon_path()),
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      bitmap,
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      size);
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Disabling extension\n" << std::flush;
276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DisableExtension(extension->id());
277201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Enabling extension\n" << std::flush;
278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EnableExtension(extension->id());
279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LOG(INFO) << "Test ending\n" << std::flush;
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
281