Chromium Code Reviews| Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| index 96e1b449c42f7bba8f6c83a668e94ee5ce40e9d5..3a92cc86105acddd44849e8f50e07cdb606aee86 100644 |
| --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| @@ -95,16 +95,59 @@ std::string WebRequestRulesRegistry::AddRulesImpl( |
| std::string WebRequestRulesRegistry::RemoveRulesImpl( |
| const std::string& extension_id, |
| const std::vector<std::string>& rule_identifiers) { |
| - return "TODO"; |
| + // URLMatcherConditionSet IDs that can be removed from URLMatcher. |
| + std::vector<URLMatcherConditionSet::ID> remove_from_url_matcher; |
| + |
| + for (std::vector<std::string>::const_iterator i = rule_identifiers.begin(); |
| + i != rule_identifiers.end(); ++i) { |
| + WebRequestRule::GlobalRuleId rule_id = make_pair(extension_id, *i); |
|
Matt Perry
2012/03/28 18:59:52
you can just use the constructor: GlobalRuleId rul
battre
2012/03/28 19:18:42
Nice, I did not know that. Thanks.
Done. (also in
|
| + |
| + // Skip unknown rules. |
| + RulesMap::iterator webrequest_rules_entry = webrequest_rules_.find(rule_id); |
| + if (webrequest_rules_entry == webrequest_rules_.end()) |
| + continue; |
| + |
| + // Remove all triggers but collect their IDs. |
| + std::vector<URLMatcherConditionSet> condition_sets; |
| + WebRequestRule* rule = webrequest_rules_entry->second.get(); |
| + rule->conditions().GetURLMatcherConditionSets(&condition_sets); |
| + for (std::vector<URLMatcherConditionSet>::iterator j = |
| + condition_sets.begin(); j != condition_sets.end(); ++j) { |
| + remove_from_url_matcher.push_back(j->id()); |
| + rule_triggers_.erase(j->id()); |
| + } |
| + |
| + // Remove reference to actual rule. |
| + webrequest_rules_.erase(webrequest_rules_entry); |
| + } |
| + |
| + // Clear URLMatcher based on condition_set_ids that are not needed any more. |
| + url_matcher_.RemoveConditionSets(remove_from_url_matcher); |
| + |
| + return ""; |
| } |
| std::string WebRequestRulesRegistry::RemoveAllRulesImpl( |
| const std::string& extension_id) { |
| - return "TODO"; |
| + // Search all identifiers of rules that belong to extension |extension_id|. |
| + std::vector<std::string> rule_identifiers; |
| + for (RulesMap::iterator i = webrequest_rules_.begin(); |
| + i != webrequest_rules_.end(); ++i) { |
| + const WebRequestRule::GlobalRuleId& global_rule_id = i->first; |
| + if (global_rule_id.first == extension_id) |
| + rule_identifiers.push_back(global_rule_id.second); |
| + } |
| + |
| + return RemoveRulesImpl(extension_id, rule_identifiers); |
| } |
| content::BrowserThread::ID WebRequestRulesRegistry::GetOwnerThread() const { |
| return content::BrowserThread::IO; |
| } |
| +bool WebRequestRulesRegistry::IsCompletelyEmpty() const { |
| + return rule_triggers_.empty() && webrequest_rules_.empty() && |
| + url_matcher_.IsCompletelyEmpty(); |
| +} |
| + |
| } // namespace extensions |