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

Side by Side Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc

Issue 9820003: Implementation of beginning of Declarative Web Request API backend (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments Created 8 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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
5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h"
6
7 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion.h"
8 #include "net/url_request/url_request.h"
9
10 namespace extensions {
11
12 WebRequestRulesRegistry::WebRequestRulesRegistry() {}
13
14 WebRequestRulesRegistry::~WebRequestRulesRegistry() {}
15
16 std::set<WebRequestRule::GlobalRuleId>
17 WebRequestRulesRegistry::GetMatches(net::URLRequest* request) {
18 std::set<WebRequestRule::GlobalRuleId> result;
19
20 // Figure out for which rules the URL match conditions were fulfilled.
21 typedef std::set<URLMatcherConditionSet::ID> URLMatches;
22 URLMatches url_matches = url_matcher_.MatchURL(request->url());
23
24 // Then we need to check for each of these, whether the other
25 // WebRequestConditionAttributes are also fulfilled.
26 for (URLMatches::iterator url_match = url_matches.begin();
27 url_match != url_matches.end(); ++url_match) {
28 RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match);
29 CHECK(rule_trigger != rule_triggers_.end());
30
31 WebRequestRule* rule = rule_trigger->second;
32 if (rule->conditions_collection().IsFulfilled(*url_match, request))
33 result.insert(rule->id());
34 }
35
36 return result;
37 }
38
39 std::string WebRequestRulesRegistry::AddRulesImpl(
40 const std::string& extension_id,
41 const std::vector<linked_ptr<RulesRegistry::Rule> >& rules) {
42 std::string error;
43 RulesMap new_webrequest_rules;
44
45 for (std::vector<linked_ptr<RulesRegistry::Rule> >::const_iterator rule =
46 rules.begin(); rule != rules.end(); ++rule) {
47 WebRequestRule::GlobalRuleId rule_id(extension_id, *(*rule)->id);
48 DCHECK(webrequest_rules_.find(rule_id) == webrequest_rules_.end());
49
50 scoped_ptr<WebRequestRule> webrequest_rule(
51 WebRequestRule::Create(url_matcher_.condition_factory(), extension_id,
52 *rule, &error));
53 if (!error.empty()) {
54 // We don't return here, because we want to clear temporary
55 // condition sets in the url_matcher_.
56 break;
57 }
58
59 new_webrequest_rules.insert(
60 make_pair(rule_id, make_linked_ptr(webrequest_rule.release())));
61 }
62
63 if (!error.empty()) {
64 // Clean up temporary condition sets created during rule creation.
65 url_matcher_.ClearUnusedConditionSets();
66 return error;
67 }
68
69 // Wohoo, everything worked fine.
70 webrequest_rules_.insert(new_webrequest_rules.begin(),
71 new_webrequest_rules.end());
72
73 // Create the triggers.
74 for (RulesMap::iterator i = new_webrequest_rules.begin();
75 i != new_webrequest_rules.end(); ++i) {
76 std::vector<URLMatcherConditionSet> condition_sets;
77 const WebRequestConditionCollection& conditions_collection =
78 i->second->conditions_collection();
79 conditions_collection.AppendURLMatcherConditionSets(&condition_sets);
80 for (std::vector<URLMatcherConditionSet>::iterator j =
81 condition_sets.begin(); j != condition_sets.end(); ++j) {
82 rule_triggers_.insert(std::make_pair(j->id(), i->second.get()));
83 }
84 }
85
86 // Register url patterns in url_matcher_.
87 std::vector<URLMatcherConditionSet> all_new_condition_sets;
88 for (RulesMap::iterator i = new_webrequest_rules.begin();
89 i != new_webrequest_rules.end(); ++i) {
90 i->second->conditions_collection().AppendURLMatcherConditionSets(
91 &all_new_condition_sets);
92 }
93 url_matcher_.AddConditionSets(all_new_condition_sets);
94
95 return "";
96 }
97
98 std::string WebRequestRulesRegistry::RemoveRulesImpl(
99 const std::string& extension_id,
100 const std::vector<std::string>& rule_identifiers) {
101 return "TODO";
102 }
103
104 std::string WebRequestRulesRegistry::RemoveAllRulesImpl(
105 const std::string& extension_id) {
106 return "TODO";
107 }
108
109 content::BrowserThread::ID WebRequestRulesRegistry::GetOwnerThread() const {
110 return content::BrowserThread::IO;
111 }
112
113 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698