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

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

Issue 10822007: Make ScriptBadgeController record when extensions run scripts on pages yet to (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 5 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/script_badge_controller_unittest.cc
diff --git a/chrome/browser/extensions/script_badge_controller_unittest.cc b/chrome/browser/extensions/script_badge_controller_unittest.cc
index 2e53cd72f0efb2b16a7a6a2c786fd17ef0f039f1..53a151f74bebd7001ab0185397c70e45252d317e 100644
--- a/chrome/browser/extensions/script_badge_controller_unittest.cc
+++ b/chrome/browser/extensions/script_badge_controller_unittest.cc
@@ -25,6 +25,7 @@
#include "content/public/browser/notification_source.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/test_browser_thread.h"
+#include "content/public/test/test_notification_tracker.h"
#include "testing/gmock/include/gmock/gmock.h"
using content::BrowserThread;
@@ -60,11 +61,25 @@ class ScriptBadgeControllerTest : public TabContentsTestHarness {
}
protected:
+ // Gets the current page ID, or -1 if there isn't one yet.
+ int32 GetPageID() {
+ content::NavigationEntry* active_entry =
+ tab_contents()->web_contents()->GetController().GetActiveEntry();
+ return active_entry ? active_entry->GetPageID() : -1;
+ }
+
// Creates a test extension and adds it to |extension_service_|.
scoped_refptr<const Extension> AddTestExtension() {
+ return AddTestExtension("");
+ }
+
+ // Creates a test extension with a specific ID and adds it to
+ // |extension_service_|.
+ scoped_refptr<const Extension> AddTestExtension(const std::string& id) {
scoped_refptr<const Extension> extension = ExtensionBuilder()
+ .SetID(id)
.SetManifest(DictionaryBuilder()
- .Set("name", "Extension with page action")
+ .Set("name", "Test extension")
.Set("version", "1.0.0")
.Set("manifest_version", 2)
.Set("permissions", ListBuilder()
@@ -85,52 +100,77 @@ class ScriptBadgeControllerTest : public TabContentsTestHarness {
content::TestBrowserThread file_thread_;
};
-struct CountingNotificationObserver : public content::NotificationObserver {
- CountingNotificationObserver() : events(0) {}
+TEST_F(ScriptBadgeControllerTest, ExecutionMakesBadgeVisible) {
+ content::TestNotificationTracker notification_tracker;
+ notification_tracker.ListenFor(
Jeffrey Yasskin 2012/07/25 22:22:39 Hey cool, that's better than my class. :)
not at google - send to devlin 2012/07/26 08:52:46 :) a lucky find. I was looking for where yours was
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
+ content::Source<Profile>(tab_contents()->profile()));
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE {
- events++;
- }
+ scoped_refptr<const Extension> extension = AddTestExtension();
- int events;
-};
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre());
-TEST_F(ScriptBadgeControllerTest, ExecutionMakesBadgeVisible) {
- content::NotificationRegistrar notification_registrar;
+ // Establish a page id.
+ NavigateAndCommit(GURL("http://www.google.com"));
+ // Initially, no script badges.
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre());
- scoped_refptr<const Extension> extension = AddTestExtension();
+ // Extension calls executeScript(), should be a script badge for that.
+ {
+ ListValue val;
+ script_badge_controller_->OnExecuteScriptFinished(extension->id(),
+ true,
+ GetPageID(),
+ "",
+ val);
+ }
- // Establish a page id.
- NavigateAndCommit(GURL("http://www.google.com"));
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre(extension->script_badge()));
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
- CountingNotificationObserver location_bar_updated;
- notification_registrar.Add(
- &location_bar_updated,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(tab_contents()->profile()));
- // Initially, no script badges.
+ // Should clear on navigate.
+ NavigateAndCommit(GURL("http://www.chromium.org"));
+
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre());
+ EXPECT_EQ(0u, notification_tracker.size());
+
+ // Extension calls executeScript() on a page that the browser doesn't
Jeffrey Yasskin 2012/07/25 22:22:39 This seems redundant with the ContentScripts test.
+ // know about yet.
+ {
+ ListValue val;
+ script_badge_controller_->OnExecuteScriptFinished(extension->id(),
+ true,
+ GetPageID() + 1,
+ "",
+ val);
+ }
+
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre());
+ EXPECT_EQ(0u, notification_tracker.size());
+
+ // On navigating to that page, should run script badges then.
+ NavigateAndCommit(GURL("http://www.google.com"));
- ListValue val;
- script_badge_controller_->OnExecuteScriptFinished(
- extension->id(), true,
- tab_contents()->web_contents()->GetController().GetActiveEntry()->
- GetPageID(),
- "",
- val);
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre(extension->script_badge()));
- EXPECT_THAT(location_bar_updated.events, testing::Gt(0));
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
};
TEST_F(ScriptBadgeControllerTest, FragmentNavigation) {
+ content::TestNotificationTracker notification_tracker;
+ notification_tracker.ListenFor(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
+ content::Source<Profile>(tab_contents()->profile()));
+
scoped_refptr<const Extension> extension = AddTestExtension();
// Establish a page id.
@@ -138,82 +178,49 @@ TEST_F(ScriptBadgeControllerTest, FragmentNavigation) {
// Run script. Should be a notification and a script badge.
{
- content::NotificationRegistrar notification_registrar;
- CountingNotificationObserver location_bar_updated;
- notification_registrar.Add(
- &location_bar_updated,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(tab_contents()->profile()));
-
ListValue val;
- script_badge_controller_->OnExecuteScriptFinished(
- extension->id(), true,
- tab_contents()->web_contents()->GetController().GetActiveEntry()->
- GetPageID(),
- "",
- val);
+ script_badge_controller_->OnExecuteScriptFinished(extension->id(),
+ true,
+ GetPageID(),
+ "",
+ val);
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre(extension->script_badge()));
- EXPECT_EQ(1, location_bar_updated.events);
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
}
// Navigate to a hash fragment. Shouldn't change.
{
- content::NotificationRegistrar notification_registrar;
- CountingNotificationObserver location_bar_updated;
- notification_registrar.Add(
- &location_bar_updated,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(tab_contents()->profile()));
-
NavigateAndCommit(GURL("http://www.google.com#hash"));
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre(extension->script_badge()));
- EXPECT_EQ(0, location_bar_updated.events);
+ EXPECT_EQ(0u, notification_tracker.size());
}
// Refreshing the page should reset the badges.
{
- content::NotificationRegistrar notification_registrar;
- CountingNotificationObserver location_bar_updated;
- notification_registrar.Add(
- &location_bar_updated,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(tab_contents()->profile()));
-
Reload();
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre());
- EXPECT_EQ(0, location_bar_updated.events);
+ EXPECT_EQ(0u, notification_tracker.size());
}
}
TEST_F(ScriptBadgeControllerTest, GetAttentionMakesBadgeVisible) {
- content::NotificationRegistrar notification_registrar;
-
- scoped_refptr<const Extension> extension =
- ExtensionBuilder()
- .SetManifest(DictionaryBuilder()
- .Set("name", "Extension")
Jeffrey Yasskin 2012/07/25 22:22:39 I'm not a fan of moving all of the extension creat
- .Set("version", "1.0.0")
- .Set("manifest_version", 2)
- .Set("permissions", ListBuilder()
- .Append("tabs")))
- .Build();
- extension_service_->AddExtension(extension);
+ content::TestNotificationTracker notification_tracker;
+ notification_tracker.ListenFor(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
+ content::Source<Profile>(tab_contents()->profile()));
+
+ scoped_refptr<const Extension> extension = AddTestExtension();
// Establish a page id.
NavigateAndCommit(GURL("http://www.google.com"));
- CountingNotificationObserver initial_badge_display;
- notification_registrar.Add(
- &initial_badge_display,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(tab_contents()->profile()));
-
// Initially, no script badges.
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre());
@@ -223,21 +230,89 @@ TEST_F(ScriptBadgeControllerTest, GetAttentionMakesBadgeVisible) {
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre(extension->script_badge()));
- EXPECT_THAT(initial_badge_display.events, testing::Gt(0));
-
- CountingNotificationObserver subsequent_get_attention_call;
- notification_registrar.Add(
- &subsequent_get_attention_call,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(tab_contents()->profile()));
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
// Getting attention a second time should have no effect.
script_badge_controller_->GetAttentionFor(extension->id());
EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
testing::ElementsAre(extension->script_badge()));
- EXPECT_EQ(0, subsequent_get_attention_call.events);
+ EXPECT_EQ(0u, notification_tracker.size());
};
+TEST_F(ScriptBadgeControllerTest, ContentScripts) {
+ content::TestNotificationTracker notification_tracker;
+ notification_tracker.ListenFor(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
+ content::Source<Profile>(tab_contents()->profile()));
+
+ scoped_refptr<const Extension> extension_a =
+ AddTestExtension("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+ scoped_refptr<const Extension> extension_b =
+ AddTestExtension("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
+ scoped_refptr<const Extension> extension_c =
+ AddTestExtension("cccccccccccccccccccccccccccccccc");
+
+ // Sometimes notifications for content scripts appear earlier than the page
+ // load has happened in the browser.
+ {
+ std::set<std::string> ids;
+ ids.insert(extension_a->id());
+
+ script_badge_controller_->OnContentScriptsExecuting(ids, 0);
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre());
+ EXPECT_EQ(0u, notification_tracker.size());
+ }
+
+ // Establish a page id.
+ NavigateAndCommit(GURL("http://www.google.com"));
+
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre(extension_a->script_badge()));
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
+
+ // Next page should clear the content-script script badge.
+ NavigateAndCommit(GURL("http://www.chromium.org"));
+
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre());
+
+ // Executing a content script on the current page should work.
+ {
+ std::set<std::string> ids;
+ ids.insert(extension_a->id());
+ ids.insert(extension_b->id());
+ script_badge_controller_->OnContentScriptsExecuting(ids, GetPageID());
+
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre(extension_a->script_badge(),
+ extension_b->script_badge()));
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
+ }
+
+ // Executing a content script on the next page should show up when that
+ // page is navigated to.
+ {
+ std::set<std::string> ids;
+ ids.insert(extension_c->id());
+ script_badge_controller_->OnContentScriptsExecuting(ids, GetPageID() + 1);
+
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre(extension_a->script_badge(),
+ extension_b->script_badge()));
+ EXPECT_EQ(0u, notification_tracker.size());
+ }
+
+ NavigateAndCommit(GURL("http://www.google.com"));
+ EXPECT_THAT(script_badge_controller_->GetCurrentActions(),
+ testing::ElementsAre(extension_c->script_badge()));
+ EXPECT_TRUE(notification_tracker.Check1AndReset(
+ chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED));
+}
+
} // namespace
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698