Index: chrome/browser/extensions/event_listener_map_unittest.cc |
diff --git a/chrome/browser/extensions/event_listener_map_unittest.cc b/chrome/browser/extensions/event_listener_map_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf35d671a7908506cf7fd573567e4c1353707828 |
--- /dev/null |
+++ b/chrome/browser/extensions/event_listener_map_unittest.cc |
@@ -0,0 +1,299 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+#include "chrome/browser/extensions/event_listener_map.h" |
+#include "chrome/browser/extensions/extension_event_router.h" |
+#include "content/public/test/mock_render_process_host.h" |
+#include "content/public/test/test_browser_context.h" |
+ |
+namespace { |
+ |
+const char kExt1Id[] = "extension_1"; |
+const char kExt2Id[] = "extension_2"; |
+const char kEvent1Name[] = "event1"; |
+const char kEvent2Name[] = "event2"; |
+ |
+class EmptyDelegate : public EventListenerMap::Delegate { |
+ virtual void OnListenerAdded(const EventListener* listener) OVERRIDE {}; |
+ virtual void OnListenerRemoved(const EventListener* listener) OVERRIDE {}; |
+}; |
+ |
+class EventListenerMapUnittest : public testing::Test { |
+ public: |
+ EventListenerMapUnittest() |
+ : delegate_(new EmptyDelegate), |
+ listeners_(new EventListenerMap(delegate_.get())), |
+ browser_context_(new content::TestBrowserContext), |
+ process_(new content::MockRenderProcessHost(browser_context_.get())) { |
+ } |
+ |
+ scoped_ptr<DictionaryValue> CreateHostSuffixFilter( |
+ const std::string& suffix) { |
+ scoped_ptr<DictionaryValue> filter(new DictionaryValue); |
+ scoped_ptr<ListValue> filter_list(new ListValue); |
+ scoped_ptr<DictionaryValue> filter_dict(new DictionaryValue); |
+ |
+ filter_dict->Set("hostSuffix", new StringValue(suffix)); |
+ |
+ filter_list->Append(filter_dict.release()); |
+ filter->Set("url", filter_list.release()); |
+ return filter.Pass(); |
+ } |
+ |
+ scoped_ptr<ExtensionEvent> CreateNamedEvent(const std::string& event_name) { |
+ return CreateEvent(event_name, GURL()); |
+ } |
+ |
+ scoped_ptr<ExtensionEvent> CreateEvent(const std::string& event_name, |
+ const GURL& url) { |
+ EventFilteringInfo info; |
+ info.SetURL(url); |
+ scoped_ptr<ExtensionEvent> result(new ExtensionEvent(event_name, "", GURL(), |
+ NULL, "", ExtensionEventRouter::USER_GESTURE_UNKNOWN, info)); |
+ return result.Pass(); |
+ } |
+ |
+ protected: |
+ scoped_ptr<EventListenerMap::Delegate> delegate_; |
+ scoped_ptr<EventListenerMap> listeners_; |
+ scoped_ptr<content::TestBrowserContext> browser_context_; |
+ scoped_ptr<content::MockRenderProcessHost> process_; |
+}; |
+ |
+TEST_F(EventListenerMapUnittest, UnfilteredEventsGoToAllListeners) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, scoped_ptr<DictionaryValue>()))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, FilteredEventsGoToAllMatchingListeners) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, scoped_ptr<DictionaryValue>( |
+ new DictionaryValue)))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(2u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, FilteredEventsOnlyGoToMatchingListeners) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("yahoo.com")))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, LazyAndUnlazyListenersGetReturned) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, process_.get(), |
+ CreateHostSuffixFilter("google.com")))); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(2u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, TestRemovingByProcess) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, process_.get(), |
+ CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, TestRemovingByListener) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, process_.get(), |
+ CreateHostSuffixFilter("google.com")))); |
+ |
+ scoped_ptr<EventListener> listener(new EventListener(kEvent1Name, kExt1Id, |
+ process_.get(), CreateHostSuffixFilter("google.com"))); |
+ listeners_->RemoveListener(listener.get()); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, TestLazyDoubleAddIsUndoneByRemove) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ scoped_ptr<EventListener> listener(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com"))); |
+ listeners_->RemoveListener(listener.get()); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(0u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, HostSuffixFilterEquality) { |
+ scoped_ptr<DictionaryValue> filter1(CreateHostSuffixFilter("google.com")); |
+ scoped_ptr<DictionaryValue> filter2(CreateHostSuffixFilter("google.com")); |
+ ASSERT_TRUE(filter1->Equals(filter2.get())); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, RemoveLazyListenersForExtension) { |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent1Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ listeners_->AddListener(scoped_ptr<EventListener>(new EventListener( |
+ kEvent2Name, kExt1Id, NULL, CreateHostSuffixFilter("google.com")))); |
+ |
+ listeners_->RemoveLazyListenersForExtension(kExt1Id); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateNamedEvent(kEvent1Name)); |
+ event->info.SetURL(GURL("http://www.google.com")); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(0u, targets.size()); |
+ |
+ event->event_name = kEvent2Name; |
+ targets = listeners_->GetEventListeners(*event); |
+ ASSERT_EQ(0u, targets.size()); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, AddExistingFilteredListener) { |
+ bool first_new = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, NULL, |
+ CreateHostSuffixFilter("google.com")))); |
+ bool second_new = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, NULL, |
+ CreateHostSuffixFilter("google.com")))); |
+ |
+ ASSERT_TRUE(first_new); |
+ ASSERT_FALSE(second_new); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, AddExistingUnfilteredListener) { |
+ bool first_add = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, NULL, |
+ scoped_ptr<DictionaryValue>()))); |
+ bool second_add = listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, NULL, |
+ scoped_ptr<DictionaryValue>()))); |
+ |
+ scoped_ptr<EventListener> listener( |
+ new EventListener(kEvent1Name, kExt1Id, NULL, |
+ scoped_ptr<DictionaryValue>())); |
+ bool first_remove = listeners_->RemoveListener(listener.get()); |
+ bool second_remove = listeners_->RemoveListener(listener.get()); |
+ |
+ ASSERT_TRUE(first_add); |
+ ASSERT_FALSE(second_add); |
+ ASSERT_TRUE(first_remove); |
+ ASSERT_FALSE(second_remove); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, RemovingRouters) { |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, process_.get(), |
+ scoped_ptr<DictionaryValue>()))); |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ ASSERT_FALSE(listeners_->HasListenerForEvent(kEvent1Name)); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, HasListenerForEvent) { |
+ ASSERT_FALSE(listeners_->HasListenerForEvent(kEvent1Name)); |
+ |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, process_.get(), |
+ scoped_ptr<DictionaryValue>()))); |
+ |
+ ASSERT_FALSE(listeners_->HasListenerForEvent(kEvent2Name)); |
+ ASSERT_TRUE(listeners_->HasListenerForEvent(kEvent1Name)); |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ ASSERT_FALSE(listeners_->HasListenerForEvent(kEvent1Name)); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, HasListenerForExtension) { |
+ ASSERT_FALSE(listeners_->HasListenerForExtension(kExt1Id, kEvent1Name)); |
+ |
+ // Non-lazy listener. |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, process_.get(), |
+ scoped_ptr<DictionaryValue>()))); |
+ // Lazy listener. |
+ listeners_->AddListener(scoped_ptr<EventListener>( |
+ new EventListener(kEvent1Name, kExt1Id, NULL, |
+ scoped_ptr<DictionaryValue>()))); |
+ |
+ ASSERT_FALSE(listeners_->HasListenerForExtension(kExt1Id, kEvent2Name)); |
+ ASSERT_TRUE(listeners_->HasListenerForExtension(kExt1Id, kEvent1Name)); |
+ ASSERT_FALSE(listeners_->HasListenerForExtension(kExt2Id, kEvent1Name)); |
+ listeners_->RemoveListenersForProcess(process_.get()); |
+ ASSERT_TRUE(listeners_->HasListenerForExtension(kExt1Id, kEvent1Name)); |
+ listeners_->RemoveLazyListenersForExtension(kExt1Id); |
+ ASSERT_FALSE(listeners_->HasListenerForExtension(kExt1Id, kEvent1Name)); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, AddLazyListenersFromPreferences) { |
+ scoped_ptr<DictionaryValue> filter1(CreateHostSuffixFilter("google.com")); |
+ scoped_ptr<DictionaryValue> filter2(CreateHostSuffixFilter("yahoo.com")); |
+ |
+ DictionaryValue filtered_listeners; |
+ ListValue* filter_list = new ListValue(); |
+ filtered_listeners.Set(kEvent1Name, filter_list); |
+ |
+ filter_list->Append(filter1.release()); |
+ filter_list->Append(filter2.release()); |
+ |
+ listeners_->LoadFilteredLazyListeners(kExt1Id, filtered_listeners); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateEvent(kEvent1Name, |
+ GURL("http://www.google.com"))); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(1u, targets.size()); |
+ scoped_ptr<EventListener> listener(new EventListener(kEvent1Name, kExt1Id, |
+ NULL, CreateHostSuffixFilter("google.com"))); |
+ ASSERT_TRUE((*targets.begin())->Equals(listener.get())); |
+} |
+ |
+TEST_F(EventListenerMapUnittest, CorruptedExtensionPrefsShouldntCrash) { |
+ scoped_ptr<DictionaryValue> filter1(CreateHostSuffixFilter("google.com")); |
+ |
+ DictionaryValue filtered_listeners; |
+ // kEvent1Name should be associated with a list, not a dictionary. |
+ filtered_listeners.Set(kEvent1Name, filter1.release()); |
+ |
+ listeners_->LoadFilteredLazyListeners(kExt1Id, filtered_listeners); |
+ |
+ scoped_ptr<ExtensionEvent> event(CreateEvent(kEvent1Name, |
+ GURL("http://www.google.com"))); |
+ std::set<const EventListener*> targets(listeners_->GetEventListeners(*event)); |
+ ASSERT_EQ(0u, targets.size()); |
+} |
+ |
+} // namespace |