Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / extension_toolbar_model_browsertest.cc
index 6936213..a34b89e 100644 (file)
@@ -2,13 +2,14 @@
 // 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.
@@ -21,6 +22,7 @@ class ExtensionToolbarModelTest : public ExtensionBrowserTest,
     inserted_count_ = 0;
     removed_count_ = 0;
     moved_count_ = 0;
+    highlight_mode_count_ = 0;
 
     ExtensionBrowserTest::SetUp();
   }
@@ -30,7 +32,7 @@ class ExtensionToolbarModelTest : public ExtensionBrowserTest,
     model_->AddObserver(this);
   }
 
-  virtual void CleanUpOnMainThread() OVERRIDE {
+  virtual void TearDownOnMainThread() OVERRIDE {
     model_->RemoveObserver(this);
   }
 
@@ -48,9 +50,14 @@ class ExtensionToolbarModelTest : public ExtensionBrowserTest,
     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();
@@ -64,6 +71,7 @@ class ExtensionToolbarModelTest : public ExtensionBrowserTest,
   int inserted_count_;
   int removed_count_;
   int moved_count_;
+  int highlight_mode_count_;
 };
 
 IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, Basic) {
@@ -362,14 +370,242 @@ IN_PROC_BROWSER_TEST_F(ExtensionToolbarModelTest, ReorderOnPrefChange) {
   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