listener_tracker_unittest.cc 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "extensions/renderer/bindings/listener_tracker.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/values.h"
  8. #include "extensions/common/mojom/event_dispatcher.mojom.h"
  9. #include "extensions/renderer/bindings/api_binding_test_util.h"
  10. #include "testing/gmock/include/gmock/gmock.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace extensions {
  13. namespace {
  14. constexpr char kEvent1[] = "Event1";
  15. constexpr char kEvent2[] = "Event2";
  16. constexpr char kOwner1[] = "Owner1";
  17. constexpr char kOwner2[] = "Owner2";
  18. constexpr int kRoutingId = 0;
  19. } // namespace
  20. TEST(ListenerTrackerTest, UnfilteredListeners) {
  21. ListenerTracker tracker;
  22. // Add two listeners for the same event with the same owner. Only the
  23. // first added should return true.
  24. EXPECT_TRUE(tracker.AddUnfilteredListener(kOwner1, kEvent1));
  25. EXPECT_FALSE(tracker.AddUnfilteredListener(kOwner1, kEvent1));
  26. EXPECT_TRUE(tracker.AddUnfilteredListener(kOwner1, kEvent2));
  27. EXPECT_TRUE(tracker.AddUnfilteredListener(kOwner2, kEvent1));
  28. EXPECT_FALSE(tracker.RemoveUnfilteredListener(kOwner1, kEvent1));
  29. EXPECT_TRUE(tracker.RemoveUnfilteredListener(kOwner1, kEvent1));
  30. EXPECT_TRUE(tracker.RemoveUnfilteredListener(kOwner1, kEvent2));
  31. EXPECT_TRUE(tracker.RemoveUnfilteredListener(kOwner2, kEvent1));
  32. }
  33. TEST(ListenerTrackerTest, FilteredListenersWithMultipleFilters) {
  34. std::unique_ptr<base::DictionaryValue> filter1 =
  35. DeprecatedDictionaryValueFromString(
  36. R"({"url": [{"hostSuffix": "example.com"}]})");
  37. std::unique_ptr<base::DictionaryValue> filter2 =
  38. DeprecatedDictionaryValueFromString(
  39. R"({"url": [{"hostSuffix": "google.com"}]})");
  40. ListenerTracker tracker;
  41. auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
  42. kOwner1, kEvent1,
  43. base::DictionaryValue::From(
  44. base::Value::ToUniquePtrValue(filter1->Clone())),
  45. kRoutingId);
  46. EXPECT_TRUE(was_first_of_kind);
  47. EXPECT_NE(-1, filter_id1);
  48. int filter_id2 = -1;
  49. std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
  50. kOwner1, kEvent1,
  51. base::DictionaryValue::From(
  52. base::Value::ToUniquePtrValue(filter1->Clone())),
  53. kRoutingId);
  54. EXPECT_FALSE(was_first_of_kind);
  55. EXPECT_NE(-1, filter_id2);
  56. EXPECT_NE(filter_id1, filter_id2);
  57. int filter_id3 = -1;
  58. std::tie(was_first_of_kind, filter_id3) = tracker.AddFilteredListener(
  59. kOwner1, kEvent1,
  60. base::DictionaryValue::From(
  61. base::Value::ToUniquePtrValue(filter2->Clone())),
  62. kRoutingId);
  63. EXPECT_TRUE(was_first_of_kind);
  64. EXPECT_NE(-1, filter_id3);
  65. auto [was_last_of_kind, removed_filter] =
  66. tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id1);
  67. EXPECT_FALSE(was_last_of_kind);
  68. ASSERT_TRUE(removed_filter);
  69. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter1));
  70. std::tie(was_last_of_kind, removed_filter) =
  71. tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id2);
  72. EXPECT_TRUE(was_last_of_kind);
  73. ASSERT_TRUE(removed_filter);
  74. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter1));
  75. std::tie(was_last_of_kind, removed_filter) =
  76. tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id3);
  77. EXPECT_TRUE(was_last_of_kind);
  78. ASSERT_TRUE(removed_filter);
  79. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter2));
  80. }
  81. TEST(ListenerTrackerTest, FilteredListenersWithMultipleOwners) {
  82. std::unique_ptr<base::DictionaryValue> filter =
  83. DeprecatedDictionaryValueFromString(
  84. R"({"url": [{"hostSuffix": "example.com"}]})");
  85. ListenerTracker tracker;
  86. auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
  87. kOwner1, kEvent1,
  88. base::DictionaryValue::From(
  89. base::Value::ToUniquePtrValue(filter->Clone())),
  90. kRoutingId);
  91. EXPECT_TRUE(was_first_of_kind);
  92. EXPECT_NE(-1, filter_id1);
  93. int filter_id2 = -1;
  94. std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
  95. kOwner2, kEvent1,
  96. base::DictionaryValue::From(
  97. base::Value::ToUniquePtrValue(filter->Clone())),
  98. kRoutingId);
  99. EXPECT_TRUE(was_first_of_kind);
  100. EXPECT_NE(-1, filter_id2);
  101. EXPECT_NE(filter_id1, filter_id2);
  102. auto [was_last_of_kind, removed_filter] =
  103. tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id1);
  104. EXPECT_TRUE(was_last_of_kind);
  105. ASSERT_TRUE(removed_filter);
  106. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
  107. std::tie(was_last_of_kind, removed_filter) =
  108. tracker.RemoveFilteredListener(kOwner2, kEvent1, filter_id2);
  109. EXPECT_TRUE(was_last_of_kind);
  110. ASSERT_TRUE(removed_filter);
  111. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
  112. }
  113. TEST(ListenerTrackerTest, FilteredListenersWithMultipleEvents) {
  114. std::unique_ptr<base::DictionaryValue> filter =
  115. DeprecatedDictionaryValueFromString(
  116. R"({"url": [{"hostSuffix": "example.com"}]})");
  117. ListenerTracker tracker;
  118. auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
  119. kOwner1, kEvent1,
  120. base::DictionaryValue::From(
  121. base::Value::ToUniquePtrValue(filter->Clone())),
  122. kRoutingId);
  123. EXPECT_TRUE(was_first_of_kind);
  124. EXPECT_NE(-1, filter_id1);
  125. int filter_id2 = -1;
  126. std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
  127. kOwner1, kEvent2,
  128. base::DictionaryValue::From(
  129. base::Value::ToUniquePtrValue(filter->Clone())),
  130. kRoutingId);
  131. EXPECT_TRUE(was_first_of_kind);
  132. EXPECT_NE(-1, filter_id2);
  133. EXPECT_NE(filter_id1, filter_id2);
  134. auto [was_last_of_kind, removed_filter] =
  135. tracker.RemoveFilteredListener(kOwner1, kEvent1, filter_id1);
  136. EXPECT_TRUE(was_last_of_kind);
  137. ASSERT_TRUE(removed_filter);
  138. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
  139. std::tie(was_last_of_kind, removed_filter) =
  140. tracker.RemoveFilteredListener(kOwner1, kEvent2, filter_id2);
  141. EXPECT_TRUE(was_last_of_kind);
  142. ASSERT_TRUE(removed_filter);
  143. EXPECT_EQ(ValueToString(*removed_filter), ValueToString(*filter));
  144. }
  145. TEST(ListenerTrackerTest, InvalidFilteredListener) {
  146. ListenerTracker tracker;
  147. std::unique_ptr<base::DictionaryValue> filter =
  148. DeprecatedDictionaryValueFromString(R"({"url": ["Not a dictionary"]})");
  149. auto [was_first_of_kind, filter_id] = tracker.AddFilteredListener(
  150. kOwner1, kEvent1, std::move(filter), kRoutingId);
  151. EXPECT_EQ(-1, filter_id);
  152. EXPECT_FALSE(was_first_of_kind);
  153. }
  154. TEST(ListenerTrackerTest, GetMatchingFilters) {
  155. std::unique_ptr<base::DictionaryValue> filter1 =
  156. DeprecatedDictionaryValueFromString(
  157. R"({"url": [{"hostSuffix": "example.com"}]})");
  158. std::unique_ptr<base::DictionaryValue> filter2 =
  159. DeprecatedDictionaryValueFromString(
  160. R"({"url": [{"hostContains": "google"}]})");
  161. std::unique_ptr<base::DictionaryValue> filter3 =
  162. DeprecatedDictionaryValueFromString(
  163. R"({"url": [{"hostContains": "example"}]})");
  164. ListenerTracker tracker;
  165. auto [was_first_of_kind, filter_id1] = tracker.AddFilteredListener(
  166. kOwner1, kEvent1,
  167. base::DictionaryValue::From(
  168. base::Value::ToUniquePtrValue(filter1->Clone())),
  169. kRoutingId);
  170. EXPECT_NE(-1, filter_id1);
  171. int filter_id2 = -1;
  172. std::tie(was_first_of_kind, filter_id2) = tracker.AddFilteredListener(
  173. kOwner1, kEvent1,
  174. base::DictionaryValue::From(
  175. base::Value::ToUniquePtrValue(filter2->Clone())),
  176. kRoutingId);
  177. EXPECT_NE(-1, filter_id2);
  178. int filter_id3 = -1;
  179. std::tie(was_first_of_kind, filter_id3) = tracker.AddFilteredListener(
  180. kOwner2, kEvent1,
  181. base::DictionaryValue::From(
  182. base::Value::ToUniquePtrValue(filter3->Clone())),
  183. kRoutingId);
  184. EXPECT_NE(-1, filter_id3);
  185. mojom::EventFilteringInfoPtr filtering_info =
  186. mojom::EventFilteringInfo::New();
  187. filtering_info->url = GURL("https://example.com/foo");
  188. std::set<int> matching_filters = tracker.GetMatchingFilteredListeners(
  189. kEvent1, std::move(filtering_info), kRoutingId);
  190. EXPECT_THAT(matching_filters,
  191. testing::UnorderedElementsAre(filter_id1, filter_id3));
  192. }
  193. } // namespace extensions