// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/macros.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_toolbar_model.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
-using extensions::Extension;
+namespace extensions {
// An InProcessBrowserTest for testing the ExtensionToolbarModel.
// TODO(erikkay) It's unfortunate that this needs to be an in-proc browser test.
inserted_count_ = 0;
removed_count_ = 0;
moved_count_ = 0;
+ highlight_mode_count_ = 0;
ExtensionBrowserTest::SetUp();
}
model_->AddObserver(this);
}
- virtual void CleanUpOnMainThread() OVERRIDE {
+ virtual void TearDownOnMainThread() OVERRIDE {
model_->RemoveObserver(this);
}
moved_count_++;
}
+ virtual void HighlightModeChanged(bool is_highlighting) OVERRIDE {
+ // Add one if highlighting, subtract one if not.
+ highlight_mode_count_ += is_highlighting ? 1 : -1;
+ }
+
const Extension* ExtensionAt(int index) {
- const extensions::ExtensionList& toolbar_items = model_->toolbar_items();
- for (extensions::ExtensionList::const_iterator i = toolbar_items.begin();
+ const ExtensionList& toolbar_items = model_->toolbar_items();
+ for (ExtensionList::const_iterator i = toolbar_items.begin();
i < toolbar_items.end(); ++i) {
if (index-- == 0)
return i->get();
int inserted_count_;
int removed_count_;
int moved_count_;
+ int highlight_mode_count_;
};
IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, Basic) {
std::string id_c = ExtensionAt(2)->id();
// Change value of toolbar preference.
- extensions::ExtensionIdList new_order;
+ ExtensionIdList new_order;
new_order.push_back(id_c);
new_order.push_back(id_b);
- extensions::ExtensionPrefs::Get(browser()->profile())->SetToolbarOrder(
- new_order);
+ ExtensionPrefs::Get(browser()->profile())->SetToolbarOrder(new_order);
// Verify order is changed.
EXPECT_EQ(id_c, ExtensionAt(0)->id());
EXPECT_EQ(id_b, ExtensionAt(1)->id());
EXPECT_EQ(id_a, ExtensionAt(2)->id());
}
+
+IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, HighlightMode) {
+ EXPECT_FALSE(model_->HighlightExtensions(ExtensionIdList()));
+ EXPECT_EQ(0, highlight_mode_count_);
+
+ // Load three extensions with browser action.
+ base::FilePath extension_a_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("basics"));
+ ASSERT_TRUE(LoadExtension(extension_a_path));
+ base::FilePath extension_b_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("popup"));
+ ASSERT_TRUE(LoadExtension(extension_b_path));
+ base::FilePath extension_c_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("remove_popup"));
+ ASSERT_TRUE(LoadExtension(extension_c_path));
+ std::string id_a = ExtensionAt(0)->id();
+ std::string id_b = ExtensionAt(1)->id();
+ std::string id_c = ExtensionAt(2)->id();
+
+ // Highlight one extension.
+ ExtensionIdList extension_ids;
+ extension_ids.push_back(id_b);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_EQ(1, highlight_mode_count_);
+ EXPECT_TRUE(model_->is_highlighting());
+
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_b, ExtensionAt(0)->id());
+
+ // Stop highlighting.
+ model_->StopHighlighting();
+ EXPECT_EQ(0, highlight_mode_count_);
+ EXPECT_FALSE(model_->is_highlighting());
+
+ // Verify that the extensions are back to normal.
+ EXPECT_EQ(3u, model_->toolbar_items().size());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+ EXPECT_EQ(id_b, ExtensionAt(1)->id());
+ EXPECT_EQ(id_c, ExtensionAt(2)->id());
+
+ // Call stop highlighting a second time (shouldn't be notified).
+ model_->StopHighlighting();
+ EXPECT_EQ(0, highlight_mode_count_);
+ EXPECT_FALSE(model_->is_highlighting());
+
+ // Highlight all extensions.
+ extension_ids.clear();
+ extension_ids.push_back(id_a);
+ extension_ids.push_back(id_b);
+ extension_ids.push_back(id_c);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_EQ(1, highlight_mode_count_);
+ EXPECT_EQ(3u, model_->toolbar_items().size());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+ EXPECT_EQ(id_b, ExtensionAt(1)->id());
+ EXPECT_EQ(id_c, ExtensionAt(2)->id());
+
+ // Highlight only extension b (shrink the highlight list).
+ extension_ids.clear();
+ extension_ids.push_back(id_b);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_EQ(2, highlight_mode_count_);
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_b, ExtensionAt(0)->id());
+
+ // Highlight extensions a and b (grow the highlight list).
+ extension_ids.clear();
+ extension_ids.push_back(id_a);
+ extension_ids.push_back(id_b);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_EQ(3, highlight_mode_count_);
+ EXPECT_EQ(2u, model_->toolbar_items().size());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+ EXPECT_EQ(id_b, ExtensionAt(1)->id());
+
+ // Highlight no extensions (empty the highlight list).
+ extension_ids.clear();
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_EQ(2, highlight_mode_count_);
+ EXPECT_FALSE(model_->is_highlighting());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+ EXPECT_EQ(id_b, ExtensionAt(1)->id());
+ EXPECT_EQ(id_c, ExtensionAt(2)->id());
+}
+
+#if defined(OS_MACOSX)
+// Flaky on Mac bots: http://crbug.com/358752
+#define MAYBE_HighlightModeRemove DISABLED_HighlightModeRemove
+#else
+#define MAYBE_HighlightModeRemove HighlightModeRemove
+#endif
+
+IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, MAYBE_HighlightModeRemove) {
+ // Load three extensions with browser action.
+ base::FilePath extension_a_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("basics"));
+ ASSERT_TRUE(LoadExtension(extension_a_path));
+ base::FilePath extension_b_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("popup"));
+ ASSERT_TRUE(LoadExtension(extension_b_path));
+ base::FilePath extension_c_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("remove_popup"));
+ ASSERT_TRUE(LoadExtension(extension_c_path));
+ std::string id_a = ExtensionAt(0)->id();
+ std::string id_b = ExtensionAt(1)->id();
+ std::string id_c = ExtensionAt(2)->id();
+
+ // Highlight two of the extensions.
+ ExtensionIdList extension_ids;
+ extension_ids.push_back(id_a);
+ extension_ids.push_back(id_b);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_TRUE(model_->is_highlighting());
+ EXPECT_EQ(1, highlight_mode_count_);
+ EXPECT_EQ(2u, model_->toolbar_items().size());
+
+ // Disable one of them - only one should remain highlighted.
+ DisableExtension(id_a);
+ EXPECT_TRUE(model_->is_highlighting());
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_b, ExtensionAt(0)->id());
+
+ // Uninstall the remaining highlighted extension. This should result in
+ // highlight mode exiting.
+ UninstallExtension(id_b);
+ EXPECT_FALSE(model_->is_highlighting());
+ EXPECT_EQ(0, highlight_mode_count_);
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_c, ExtensionAt(0)->id());
+
+ // Test that removing an unhighlighted extension still works.
+ // Reinstall extension b, and then highlight extension c.
+ ASSERT_TRUE(LoadExtension(extension_b_path));
+ EXPECT_EQ(id_b, ExtensionAt(1)->id());
+ extension_ids.clear();
+ extension_ids.push_back(id_c);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_EQ(1, highlight_mode_count_);
+ EXPECT_TRUE(model_->is_highlighting());
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_c, ExtensionAt(0)->id());
+
+ // Uninstalling b should not have visible impact.
+ UninstallExtension(id_b);
+ EXPECT_TRUE(model_->is_highlighting());
+ EXPECT_EQ(1, highlight_mode_count_);
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_c, ExtensionAt(0)->id());
+
+ // When we stop, only extension c should remain.
+ model_->StopHighlighting();
+ EXPECT_FALSE(model_->is_highlighting());
+ EXPECT_EQ(0, highlight_mode_count_);
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_c, ExtensionAt(0)->id());
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, HighlightModeAdd) {
+ // Load two extensions with browser action.
+ base::FilePath extension_a_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("basics"));
+ ASSERT_TRUE(LoadExtension(extension_a_path));
+ base::FilePath extension_b_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("popup"));
+ ASSERT_TRUE(LoadExtension(extension_b_path));
+ std::string id_a = ExtensionAt(0)->id();
+ std::string id_b = ExtensionAt(1)->id();
+
+ // Highlight one of the extensions.
+ ExtensionIdList extension_ids;
+ extension_ids.push_back(id_a);
+ model_->HighlightExtensions(extension_ids);
+ EXPECT_TRUE(model_->is_highlighting());
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+
+ // Adding the new extension should have no visible effect.
+ base::FilePath extension_c_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("remove_popup"));
+ const Extension* extension_c = LoadExtension(extension_c_path);
+ ASSERT_TRUE(extension_c);
+ std::string id_c = extension_c->id();
+ EXPECT_TRUE(model_->is_highlighting());
+ EXPECT_EQ(1u, model_->toolbar_items().size());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+
+ // When we stop highlighting, we should see the new extension show up.
+ model_->StopHighlighting();
+ EXPECT_FALSE(model_->is_highlighting());
+ EXPECT_EQ(3u, model_->toolbar_items().size());
+ EXPECT_EQ(id_a, ExtensionAt(0)->id());
+ EXPECT_EQ(id_b, ExtensionAt(1)->id());
+ EXPECT_EQ(id_c, ExtensionAt(2)->id());
+}
+
+// Test is flaky (see crbug.com/379170), but currently enabled to gather traces.
+// If it fails, ping Finnur.
+IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, SizeAfterPrefChange) {
+ // Load two extensions with browser action.
+ base::FilePath extension_a_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("basics"));
+ ASSERT_TRUE(LoadExtension(extension_a_path));
+ base::FilePath extension_b_path(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("popup"));
+ ASSERT_TRUE(LoadExtension(extension_b_path));
+ std::string id_a = ExtensionAt(0)->id();
+ std::string id_b = ExtensionAt(1)->id();
+
+ // Should be at max size (-1).
+ EXPECT_EQ(-1, model_->GetVisibleIconCount());
+
+ model_->OnExtensionToolbarPrefChange();
+
+ // Should still be at max size.
+ EXPECT_EQ(-1, model_->GetVisibleIconCount());
+}
+
+} // namespace extensions