forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent_filter.h
129 lines (100 loc) · 4.66 KB
/
event_filter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// 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.
#ifndef EXTENSIONS_COMMON_EVENT_FILTER_H_
#define EXTENSIONS_COMMON_EVENT_FILTER_H_
#include <map>
#include <set>
#include "base/memory/linked_ptr.h"
#include "components/url_matcher/url_matcher.h"
#include "extensions/common/event_filtering_info.h"
#include "extensions/common/event_matcher.h"
namespace extensions {
// Matches incoming events against a collection of EventMatchers. Each added
// EventMatcher is given an id which is returned by MatchEvent() when it is
// passed a matching event.
class EventFilter {
public:
typedef int MatcherID;
EventFilter();
~EventFilter();
// Adds an event matcher that will be used in calls to MatchEvent(). Returns
// the id of the matcher, or -1 if there was an error.
MatcherID AddEventMatcher(const std::string& event_name,
scoped_ptr<EventMatcher> matcher);
// Retrieve the EventMatcher with the given id.
EventMatcher* GetEventMatcher(MatcherID id);
// Retrieve the name of the event that the EventMatcher specified by |id| is
// referring to.
const std::string& GetEventName(MatcherID id);
// Removes an event matcher, returning the name of the event that it was for.
std::string RemoveEventMatcher(MatcherID id);
// Match an event named |event_name| with filtering info |event_info| against
// our set of event matchers. Returns a set of ids that correspond to the
// event matchers that matched the event.
// TODO(koz): Add a std::string* parameter for retrieving error messages.
std::set<MatcherID> MatchEvent(const std::string& event_name,
const EventFilteringInfo& event_info,
int routing_id);
int GetMatcherCountForEvent(const std::string& event_name);
// For testing.
bool IsURLMatcherEmpty() const {
return url_matcher_.IsEmpty();
}
private:
class EventMatcherEntry {
public:
// Adds |condition_sets| to |url_matcher| on construction and removes them
// again on destruction. |condition_sets| should be the
// URLMatcherConditionSets that match the URL constraints specified by
// |event_matcher|.
EventMatcherEntry(
scoped_ptr<EventMatcher> event_matcher,
url_matcher::URLMatcher* url_matcher,
const url_matcher::URLMatcherConditionSet::Vector& condition_sets);
~EventMatcherEntry();
// Prevents the removal of condition sets when this class is destroyed. We
// call this in EventFilter's destructor so that we don't do the costly
// removal of condition sets when the URLMatcher is going to be destroyed
// and clean them up anyway.
void DontRemoveConditionSetsInDestructor();
EventMatcher* event_matcher() {
return event_matcher_.get();
}
private:
scoped_ptr<EventMatcher> event_matcher_;
// The id sets in url_matcher_ that this EventMatcher owns.
std::vector<url_matcher::URLMatcherConditionSet::ID> condition_set_ids_;
url_matcher::URLMatcher* url_matcher_;
DISALLOW_COPY_AND_ASSIGN(EventMatcherEntry);
};
// Maps from a matcher id to an event matcher entry.
typedef std::map<MatcherID, linked_ptr<EventMatcherEntry> > EventMatcherMap;
// Maps from event name to the map of matchers that are registered for it.
typedef std::map<std::string, EventMatcherMap> EventMatcherMultiMap;
// Adds the list of URL filters in |matcher| to the URL matcher, having
// matches for those URLs map to |id|.
bool CreateConditionSets(
MatcherID id,
EventMatcher* matcher,
url_matcher::URLMatcherConditionSet::Vector* condition_sets);
bool AddDictionaryAsConditionSet(
base::DictionaryValue* url_filter,
url_matcher::URLMatcherConditionSet::Vector* condition_sets);
url_matcher::URLMatcher url_matcher_;
EventMatcherMultiMap event_matchers_;
// The next id to assign to an EventMatcher.
MatcherID next_id_;
// The next id to assign to a condition set passed to URLMatcher.
url_matcher::URLMatcherConditionSet::ID next_condition_set_id_;
// Maps condition set ids, which URLMatcher operates in, to event matcher
// ids, which the interface to this class operates in. As each EventFilter
// can specify many condition sets this is a many to one relationship.
std::map<url_matcher::URLMatcherConditionSet::ID, MatcherID>
condition_set_id_to_event_matcher_id_;
// Maps from event matcher ids to the name of the event they match on.
std::map<MatcherID, std::string> id_to_event_name_;
DISALLOW_COPY_AND_ASSIGN(EventFilter);
};
} // namespace extensions
#endif // EXTENSIONS_COMMON_EVENT_FILTER_H_