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

Unified Diff: chrome/browser/extensions/location_bar_controller_unittest.cc

Issue 527963003: Uncouple ActiveScriptController from LocationBarController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/location_bar_controller_unittest.cc
diff --git a/chrome/browser/extensions/location_bar_controller_unittest.cc b/chrome/browser/extensions/location_bar_controller_unittest.cc
index 9f2a6c878bed055e09e94cb136b2b7f20b290daa..b2e1b89601450e2caf44b636b297dbcf1d8cb2aa 100644
--- a/chrome/browser/extensions/location_bar_controller_unittest.cc
+++ b/chrome/browser/extensions/location_bar_controller_unittest.cc
@@ -7,16 +7,20 @@
#include "base/command_line.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
+#include "chrome/browser/extensions/active_script_controller.h"
#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/location_bar_controller.h"
#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
+#include "components/crx_file/id_util.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
+#include "extensions/common/feature_switch.h"
#include "extensions/common/value_builder.h"
#if defined(OS_CHROMEOS)
@@ -31,6 +35,9 @@ namespace {
class LocationBarControllerUnitTest : public ChromeRenderViewHostTestHarness {
protected:
virtual void SetUp() OVERRIDE {
+ active_script_override_.reset(new FeatureSwitch::ScopedOverride(
+ FeatureSwitch::scripts_require_action(), true));
+
ChromeRenderViewHostTestHarness::SetUp();
#if defined OS_CHROMEOS
test_user_manager_.reset(new chromeos::ScopedTestUserManager());
@@ -57,6 +64,25 @@ class LocationBarControllerUnitTest : public ChromeRenderViewHostTestHarness {
return SessionTabHelper::IdForTab(web_contents());
}
+ const Extension* AddExtension(bool has_page_actions,
+ const std::string& name) {
+ DictionaryBuilder manifest;
+ manifest.Set("name", name)
+ .Set("version", "1.0.0")
+ .Set("manifest_version", 2)
+ .Set("permissions", ListBuilder().Append("tabs"));
+ if (has_page_actions) {
+ manifest.Set("page_action", DictionaryBuilder()
+ .Set("default_title", "Hello"));
+ }
+ scoped_refptr<const Extension> extension =
+ ExtensionBuilder().SetManifest(manifest.Pass())
+ .SetID(crx_file::id_util::GenerateId(name))
+ .Build();
+ extension_service_->AddExtension(extension.get());
+ return extension;
+ }
+
ExtensionService* extension_service_;
private:
@@ -65,30 +91,73 @@ class LocationBarControllerUnitTest : public ChromeRenderViewHostTestHarness {
chromeos::ScopedTestCrosSettings test_cros_settings_;
scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_;
#endif
+
+ // Since we also test that we show page actions for pending script requests,
+ // we need to enable that feature.
+ scoped_ptr<FeatureSwitch::ScopedOverride> active_script_override_;
};
+// Test that the location bar gets the proper current actions.
+TEST_F(LocationBarControllerUnitTest, LocationBarDisplaysPageActions) {
+ // Load up two extensions, one with a page action and one without.
+ const Extension* page_action = AddExtension(true, "page_actions");
+ const Extension* no_action = AddExtension(false, "no_actions");
+
+ TabHelper* tab_helper = TabHelper::FromWebContents(web_contents());
+ ASSERT_TRUE(tab_helper);
+ LocationBarController* controller = tab_helper->location_bar_controller();
+ ASSERT_TRUE(controller);
+
+ // There should only be one action - the action for the extension with a
+ // page action.
+ std::vector<ExtensionAction*> current_actions =
+ controller->GetCurrentActions();
+ ASSERT_EQ(1u, current_actions.size());
+ EXPECT_EQ(page_action->id(), current_actions[0]->extension_id());
+
+ // If we request a script injection, then the location bar controller should
+ // also show a page action for that extension.
+ ActiveScriptController* active_script_controller =
+ ActiveScriptController::GetForWebContents(web_contents());
+ ASSERT_TRUE(active_script_controller);
+ active_script_controller->RequestScriptInjectionForTesting(no_action,
+ base::Closure());
+ current_actions = controller->GetCurrentActions();
+ ASSERT_EQ(2u, current_actions.size());
+ // Check that each extension is present in the vector.
+ EXPECT_TRUE(current_actions[0]->extension_id() == no_action->id() ||
+ current_actions[1]->extension_id() == no_action->id());
+ EXPECT_TRUE(current_actions[0]->extension_id() == page_action->id() ||
+ current_actions[1]->extension_id() == page_action->id());
+
+ // If we request a script injection for an extension that already has a
+ // page action, only one action should be visible.
+ active_script_controller->RequestScriptInjectionForTesting(page_action,
+ base::Closure());
+ current_actions = controller->GetCurrentActions();
+ ASSERT_EQ(2u, current_actions.size());
+ EXPECT_TRUE(current_actions[0]->extension_id() == no_action->id() ||
+ current_actions[1]->extension_id() == no_action->id());
+ EXPECT_TRUE(current_actions[0]->extension_id() == page_action->id() ||
+ current_actions[1]->extension_id() == page_action->id());
+
+ // Navigating away means that only page actions are shown again.
+ NavigateAndCommit(GURL("http://google.com"));
+ current_actions = controller->GetCurrentActions();
+ ASSERT_EQ(1u, current_actions.size());
+ EXPECT_EQ(page_action->id(), current_actions[0]->extension_id());
+}
+
// Test that navigating clears all state in a page action.
TEST_F(LocationBarControllerUnitTest, NavigationClearsState) {
- scoped_refptr<const Extension> extension =
- ExtensionBuilder()
- .SetManifest(DictionaryBuilder()
- .Set("name", "Extension with page action")
- .Set("version", "1.0.0")
- .Set("manifest_version", 2)
- .Set("permissions", ListBuilder()
- .Append("tabs"))
- .Set("page_action", DictionaryBuilder()
- .Set("default_title", "Hello")))
- .Build();
- extension_service_->AddExtension(extension.get());
+ const Extension* extension = AddExtension(true, "page_actions");
NavigateAndCommit(GURL("http://www.google.com"));
ExtensionAction& page_action =
- *ExtensionActionManager::Get(profile())->GetPageAction(*extension.get());
+ *ExtensionActionManager::Get(profile())->GetPageAction(*extension);
page_action.SetTitle(tab_id(), "Goodbye");
- page_action.SetPopupUrl(
- tab_id(), extension->GetResourceURL("popup.html"));
+ page_action.SetPopupUrl(tab_id(), extension->GetResourceURL("popup.html"));
EXPECT_EQ("Goodbye", page_action.GetTitle(tab_id()));
EXPECT_EQ(extension->GetResourceURL("popup.html"),
@@ -106,12 +175,7 @@ TEST_F(LocationBarControllerUnitTest, NavigationClearsState) {
EXPECT_EQ("Hello", page_action.GetTitle(tab_id()));
EXPECT_EQ(GURL(), page_action.GetPopupUrl(tab_id()));
-};
-
-// TODO(devlin): We should really have more tests for this.
-// NavigationClearsState doesn't test at all that the LocationBarController
-// actually *returns* the proper PageActions in GetCurrentActions. Do we do
-// this elsewhere?
+}
} // namespace
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698