123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- // Copyright 2018 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 "extensions/renderer/bindings/listener_tracker.h"
- #include <memory>
- #include <utility>
- #include "base/values.h"
- #include "extensions/common/mojom/event_dispatcher.mojom.h"
- #include "extensions/renderer/bindings/api_binding_test_util.h"
- #include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace extensions {
- namespace {
- constexpr char kEvent1[] = "Event1";
- constexpr char kEvent2[] = "Event2";
- constexpr char kOwner1[] = "Owner1";
- constexpr char kOwner2[] = "Owner2";
- constexpr int kRoutingId = 0;
- } // namespace
- TEST(ListenerTrackerTest, UnfilteredListeners) {
- ListenerTracker tracker;
- // Add two listeners for the same event with the same owner. Only the
- // first added should return true.
- EXPECT_TRUE(tracker.AddUnfilteredListener(kOwner1, kEvent1));
- EXPECT_FALSE(tracker.AddUnfilteredListener(kOwner1, kEvent1));
- EXPECT_TRUE(tracker.AddUnfilteredListener(kOwner1, kEvent2));
- EXPECT_TRUE(tracker.AddUnfilteredListener(kOwner2, kEvent1));
- EXPECT_FALSE(tracker.RemoveUnfilteredListener(kOwner1, kEvent1));
- EXPECT_TRUE(tracker.RemoveUnfilteredListener(kOwner1, kEvent1));
- EXPECT_TRUE(tracker.RemoveUnfilteredListener(kOwner1, kEvent2));
- EXPECT_TRUE(tracker.RemoveUnfilteredListener(kOwner2, kEvent1));
- }
- TEST(ListenerTrackerTest, FilteredListenersWithMultipleFilters) {
- std::unique_ptr<base::DictionaryValue> filter1 =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostSuffix": "example.com"}]})");
- std::unique_ptr<base::DictionaryValue> filter2 =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostSuffix": "google.com"}]})");
- ListenerTracker tracker;
- auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter1->Clone())),
- kRoutingId);
- EXPECT_TRUE(was_first_of_kind);
- EXPECT_NE(-1, filter_id1);
- int filter_id2 = -1;
- std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter1->Clone())),
- kRoutingId);
- EXPECT_FALSE(was_first_of_kind);
- EXPECT_NE(-1, filter_id2);
- EXPECT_NE(filter_id1, filter_id2);
- int filter_id3 = -1;
- std::tie(was_first_of_kind, filter_id3) = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter2->Clone())),
- kRoutingId);
- EXPECT_TRUE(was_first_of_kind);
- EXPECT_NE(-1, filter_id3);
- auto [was_last_of_kind, removed_filter] =
- tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id1);
- EXPECT_FALSE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter1));
- std::tie(was_last_of_kind, removed_filter) =
- tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id2);
- EXPECT_TRUE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter1));
- std::tie(was_last_of_kind, removed_filter) =
- tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id3);
- EXPECT_TRUE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter2));
- }
- TEST(ListenerTrackerTest, FilteredListenersWithMultipleOwners) {
- std::unique_ptr<base::DictionaryValue> filter =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostSuffix": "example.com"}]})");
- ListenerTracker tracker;
- auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter->Clone())),
- kRoutingId);
- EXPECT_TRUE(was_first_of_kind);
- EXPECT_NE(-1, filter_id1);
- int filter_id2 = -1;
- std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
- kOwner2, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter->Clone())),
- kRoutingId);
- EXPECT_TRUE(was_first_of_kind);
- EXPECT_NE(-1, filter_id2);
- EXPECT_NE(filter_id1, filter_id2);
- auto [was_last_of_kind, removed_filter] =
- tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id1);
- EXPECT_TRUE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
- std::tie(was_last_of_kind, removed_filter) =
- tracker.RemoveFilteredListener(kOwner2, kEvent1, filter_id2);
- EXPECT_TRUE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
- }
- TEST(ListenerTrackerTest, FilteredListenersWithMultipleEvents) {
- std::unique_ptr<base::DictionaryValue> filter =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostSuffix": "example.com"}]})");
- ListenerTracker tracker;
- auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter->Clone())),
- kRoutingId);
- EXPECT_TRUE(was_first_of_kind);
- EXPECT_NE(-1, filter_id1);
- int filter_id2 = -1;
- std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
- kOwner1, kEvent2,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter->Clone())),
- kRoutingId);
- EXPECT_TRUE(was_first_of_kind);
- EXPECT_NE(-1, filter_id2);
- EXPECT_NE(filter_id1, filter_id2);
- auto [was_last_of_kind, removed_filter] =
- tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id1);
- EXPECT_TRUE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
- std::tie(was_last_of_kind, removed_filter) =
- tracker.RemoveFilteredListener(kOwner1, kEvent2, filter_id2);
- EXPECT_TRUE(was_last_of_kind);
- ASSERT_TRUE(removed_filter);
- EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
- }
- TEST(ListenerTrackerTest, InvalidFilteredListener) {
- ListenerTracker tracker;
- std::unique_ptr<base::DictionaryValue> filter =
- DeprecatedDictionaryValueFromString(R"({"url": ["Not a dictionary"]})");
- auto [was_first_of_kind, filter_id] = tracker.AddFilteredListener(
- kOwner1, kEvent1, std::move(filter), kRoutingId);
- EXPECT_EQ(-1, filter_id);
- EXPECT_FALSE(was_first_of_kind);
- }
- TEST(ListenerTrackerTest, GetMatchingFilters) {
- std::unique_ptr<base::DictionaryValue> filter1 =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostSuffix": "example.com"}]})");
- std::unique_ptr<base::DictionaryValue> filter2 =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostContains": "google"}]})");
- std::unique_ptr<base::DictionaryValue> filter3 =
- DeprecatedDictionaryValueFromString(
- R"({"url": [{"hostContains": "example"}]})");
- ListenerTracker tracker;
- auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter1->Clone())),
- kRoutingId);
- EXPECT_NE(-1, filter_id1);
- int filter_id2 = -1;
- std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
- kOwner1, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter2->Clone())),
- kRoutingId);
- EXPECT_NE(-1, filter_id2);
- int filter_id3 = -1;
- std::tie(was_first_of_kind, filter_id3) = tracker.AddFilteredListener(
- kOwner2, kEvent1,
- base::DictionaryValue::From(
- base::Value::ToUniquePtrValue(filter3->Clone())),
- kRoutingId);
- EXPECT_NE(-1, filter_id3);
- mojom::EventFilteringInfoPtr filtering_info =
- mojom::EventFilteringInfo::New();
- filtering_info->url = GURL("https://example.com/foo");
- std::set<int> matching_filters = tracker.GetMatchingFilteredListeners(
- kEvent1, std::move(filtering_info), kRoutingId);
- EXPECT_THAT(matching_filters,
- testing::UnorderedElementsAre(filter_id1, filter_id3));
- }
- } // namespace extensions
|