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

Unified Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc

Issue 566823003: Move declarative_webrequest: action, rules_registry (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing another weird re-base error. Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index 66b3fca46f40f302e5f0f2083f86408c2058c3b5..0000000000000000000000000000000000000000
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-// 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.
-
-#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h"
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/stl_util.h"
-#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
-#include "chrome/browser/extensions/api/web_request/web_request_permissions.h"
-#include "extensions/browser/api/declarative_webrequest/webrequest_condition.h"
-#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
-#include "extensions/browser/extension_system.h"
-#include "extensions/common/error_utils.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/permissions/permissions_data.h"
-#include "net/url_request/url_request.h"
-
-using url_matcher::URLMatcherConditionSet;
-
-namespace {
-
-const char kActionCannotBeExecuted[] = "The action '*' can never be executed "
- "because there are is no time in the request life-cycle during which the "
- "conditions can be checked and the action can possibly be executed.";
-
-const char kAllURLsPermissionNeeded[] =
- "To execute the action '*', you need to request host permission for all "
- "hosts.";
-
-} // namespace
-
-namespace extensions {
-
-WebRequestRulesRegistry::WebRequestRulesRegistry(
- content::BrowserContext* browser_context,
- RulesCacheDelegate* cache_delegate,
- const WebViewKey& webview_key)
- : RulesRegistry(browser_context,
- declarative_webrequest_constants::kOnRequest,
- content::BrowserThread::IO,
- cache_delegate,
- webview_key),
- browser_context_(browser_context) {
- if (browser_context_)
- extension_info_map_ = ExtensionSystem::Get(browser_context_)->info_map();
-}
-
-std::set<const WebRequestRule*> WebRequestRulesRegistry::GetMatches(
- const WebRequestData& request_data_without_ids) const {
- RuleSet result;
-
- WebRequestDataWithMatchIds request_data(&request_data_without_ids);
- request_data.url_match_ids = url_matcher_.MatchURL(
- request_data.data->request->url());
- request_data.first_party_url_match_ids = url_matcher_.MatchURL(
- request_data.data->request->first_party_for_cookies());
-
- // 1st phase -- add all rules with some conditions without UrlFilter
- // attributes.
- for (RuleSet::const_iterator it = rules_with_untriggered_conditions_.begin();
- it != rules_with_untriggered_conditions_.end(); ++it) {
- if ((*it)->conditions().IsFulfilled(-1, request_data))
- result.insert(*it);
- }
-
- // 2nd phase -- add all rules with some conditions triggered by URL matches.
- AddTriggeredRules(request_data.url_match_ids, request_data, &result);
- AddTriggeredRules(request_data.first_party_url_match_ids,
- request_data, &result);
-
- return result;
-}
-
-std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas(
- const InfoMap* extension_info_map,
- const WebRequestData& request_data,
- bool crosses_incognito) {
- if (webrequest_rules_.empty())
- return std::list<LinkedPtrEventResponseDelta>();
-
- std::set<const WebRequestRule*> matches = GetMatches(request_data);
-
- // Sort all matching rules by their priority so that they can be processed
- // in decreasing order.
- typedef std::pair<WebRequestRule::Priority, WebRequestRule::GlobalRuleId>
- PriorityRuleIdPair;
- std::vector<PriorityRuleIdPair> ordered_matches;
- ordered_matches.reserve(matches.size());
- for (std::set<const WebRequestRule*>::iterator i = matches.begin();
- i != matches.end(); ++i) {
- ordered_matches.push_back(make_pair((*i)->priority(), (*i)->id()));
- }
- // Sort from rbegin to rend in order to get descending priority order.
- std::sort(ordered_matches.rbegin(), ordered_matches.rend());
-
- // Build a map that maps each extension id to the minimum required priority
- // for rules of that extension. Initially, this priority is -infinite and
- // will be increased when the rules are processed and raise the bar via
- // WebRequestIgnoreRulesActions.
- typedef std::string ExtensionId;
- typedef std::map<ExtensionId, WebRequestRule::Priority> MinPriorities;
- typedef std::map<ExtensionId, std::set<std::string> > IgnoreTags;
- MinPriorities min_priorities;
- IgnoreTags ignore_tags;
- for (std::vector<PriorityRuleIdPair>::iterator i = ordered_matches.begin();
- i != ordered_matches.end(); ++i) {
- const WebRequestRule::GlobalRuleId& rule_id = i->second;
- const ExtensionId& extension_id = rule_id.first;
- min_priorities[extension_id] = std::numeric_limits<int>::min();
- }
-
- // Create deltas until we have passed the minimum priority.
- std::list<LinkedPtrEventResponseDelta> result;
- for (std::vector<PriorityRuleIdPair>::iterator i = ordered_matches.begin();
- i != ordered_matches.end(); ++i) {
- const WebRequestRule::Priority priority_of_rule = i->first;
- const WebRequestRule::GlobalRuleId& rule_id = i->second;
- const ExtensionId& extension_id = rule_id.first;
- const WebRequestRule* rule =
- webrequest_rules_[rule_id.first][rule_id.second].get();
- CHECK(rule);
-
- // Skip rule if a previous rule of this extension instructed to ignore
- // all rules with a lower priority than min_priorities[extension_id].
- int current_min_priority = min_priorities[extension_id];
- if (priority_of_rule < current_min_priority)
- continue;
-
- if (!rule->tags().empty() && !ignore_tags[extension_id].empty()) {
- bool ignore_rule = false;
- const WebRequestRule::Tags& tags = rule->tags();
- for (WebRequestRule::Tags::const_iterator i = tags.begin();
- !ignore_rule && i != tags.end();
- ++i) {
- ignore_rule |= ContainsKey(ignore_tags[extension_id], *i);
- }
- if (ignore_rule)
- continue;
- }
-
- std::list<LinkedPtrEventResponseDelta> rule_result;
- WebRequestAction::ApplyInfo apply_info = {
- extension_info_map, request_data, crosses_incognito, &rule_result,
- &ignore_tags[extension_id]
- };
- rule->Apply(&apply_info);
- result.splice(result.begin(), rule_result);
-
- min_priorities[extension_id] = std::max(current_min_priority,
- rule->GetMinimumPriority());
- }
- return result;
-}
-
-std::string WebRequestRulesRegistry::AddRulesImpl(
- const std::string& extension_id,
- const std::vector<linked_ptr<RulesRegistry::Rule> >& rules) {
- typedef std::pair<WebRequestRule::RuleId, linked_ptr<WebRequestRule> >
- IdRulePair;
- typedef std::vector<IdRulePair> RulesVector;
-
- base::Time extension_installation_time =
- GetExtensionInstallationTime(extension_id);
-
- std::string error;
- RulesVector new_webrequest_rules;
- new_webrequest_rules.reserve(rules.size());
- const Extension* extension =
- extension_info_map_->extensions().GetByID(extension_id);
- RulesMap& registered_rules = webrequest_rules_[extension_id];
-
- for (std::vector<linked_ptr<RulesRegistry::Rule> >::const_iterator rule =
- rules.begin(); rule != rules.end(); ++rule) {
- const WebRequestRule::RuleId& rule_id(*(*rule)->id);
- DCHECK(registered_rules.find(rule_id) == registered_rules.end());
-
- scoped_ptr<WebRequestRule> webrequest_rule(WebRequestRule::Create(
- url_matcher_.condition_factory(),
- browser_context(), extension, extension_installation_time, *rule,
- base::Bind(&Checker, base::Unretained(extension)),
- &error));
- if (!error.empty()) {
- // We don't return here, because we want to clear temporary
- // condition sets in the url_matcher_.
- break;
- }
-
- new_webrequest_rules.push_back(
- IdRulePair(rule_id, make_linked_ptr(webrequest_rule.release())));
- }
-
- if (!error.empty()) {
- // Clean up temporary condition sets created during rule creation.
- url_matcher_.ClearUnusedConditionSets();
- return error;
- }
-
- // Wohoo, everything worked fine.
- registered_rules.insert(new_webrequest_rules.begin(),
- new_webrequest_rules.end());
-
- // Create the triggers.
- for (RulesVector::const_iterator i = new_webrequest_rules.begin();
- i != new_webrequest_rules.end(); ++i) {
- URLMatcherConditionSet::Vector url_condition_sets;
- const WebRequestConditionSet& conditions = i->second->conditions();
- conditions.GetURLMatcherConditionSets(&url_condition_sets);
- for (URLMatcherConditionSet::Vector::iterator j =
- url_condition_sets.begin(); j != url_condition_sets.end(); ++j) {
- rule_triggers_[(*j)->id()] = i->second.get();
- }
- }
-
- // Register url patterns in |url_matcher_| and
- // |rules_with_untriggered_conditions_|.
- URLMatcherConditionSet::Vector all_new_condition_sets;
- for (RulesVector::const_iterator i = new_webrequest_rules.begin();
- i != new_webrequest_rules.end(); ++i) {
- i->second->conditions().GetURLMatcherConditionSets(&all_new_condition_sets);
- if (i->second->conditions().HasConditionsWithoutUrls())
- rules_with_untriggered_conditions_.insert(i->second.get());
- }
- url_matcher_.AddConditionSets(all_new_condition_sets);
-
- ClearCacheOnNavigation();
-
- if (browser_context_ && !registered_rules.empty()) {
- content::BrowserThread::PostTask(
- content::BrowserThread::UI, FROM_HERE,
- base::Bind(&extension_web_request_api_helpers::NotifyWebRequestAPIUsed,
- browser_context_, make_scoped_refptr(extension)));
- }
-
- return std::string();
-}
-
-std::string WebRequestRulesRegistry::RemoveRulesImpl(
- const std::string& extension_id,
- const std::vector<std::string>& rule_identifiers) {
- // URLMatcherConditionSet IDs that can be removed from URLMatcher.
- std::vector<URLMatcherConditionSet::ID> remove_from_url_matcher;
- RulesMap& registered_rules = webrequest_rules_[extension_id];
-
- for (std::vector<std::string>::const_iterator i = rule_identifiers.begin();
- i != rule_identifiers.end(); ++i) {
- // Skip unknown rules.
- RulesMap::iterator webrequest_rules_entry = registered_rules.find(*i);
- if (webrequest_rules_entry == registered_rules.end())
- continue;
-
- // Remove all triggers but collect their IDs.
- CleanUpAfterRule(webrequest_rules_entry->second.get(),
- &remove_from_url_matcher);
-
- // Removes the owning references to (and thus deletes) the rule.
- registered_rules.erase(webrequest_rules_entry);
- }
- if (registered_rules.empty())
- webrequest_rules_.erase(extension_id);
-
- // Clear URLMatcher based on condition_set_ids that are not needed any more.
- url_matcher_.RemoveConditionSets(remove_from_url_matcher);
-
- ClearCacheOnNavigation();
-
- return std::string();
-}
-
-std::string WebRequestRulesRegistry::RemoveAllRulesImpl(
- const std::string& extension_id) {
- // First we get out all URLMatcherConditionSets and remove the rule references
- // from |rules_with_untriggered_conditions_|.
- std::vector<URLMatcherConditionSet::ID> remove_from_url_matcher;
- for (RulesMap::const_iterator it = webrequest_rules_[extension_id].begin();
- it != webrequest_rules_[extension_id].end();
- ++it) {
- CleanUpAfterRule(it->second.get(), &remove_from_url_matcher);
- }
- url_matcher_.RemoveConditionSets(remove_from_url_matcher);
-
- webrequest_rules_.erase(extension_id);
- ClearCacheOnNavigation();
- return std::string();
-}
-
-void WebRequestRulesRegistry::CleanUpAfterRule(
- const WebRequestRule* rule,
- std::vector<URLMatcherConditionSet::ID>* remove_from_url_matcher) {
- URLMatcherConditionSet::Vector condition_sets;
- rule->conditions().GetURLMatcherConditionSets(&condition_sets);
- for (URLMatcherConditionSet::Vector::iterator j = condition_sets.begin();
- j != condition_sets.end();
- ++j) {
- remove_from_url_matcher->push_back((*j)->id());
- rule_triggers_.erase((*j)->id());
- }
- rules_with_untriggered_conditions_.erase(rule);
-}
-
-bool WebRequestRulesRegistry::IsEmpty() const {
- // Easy first.
- if (!rule_triggers_.empty() && url_matcher_.IsEmpty())
- return false;
-
- // Now all the registered rules for each extensions.
- for (std::map<WebRequestRule::ExtensionId, RulesMap>::const_iterator it =
- webrequest_rules_.begin();
- it != webrequest_rules_.end();
- ++it) {
- if (!it->second.empty())
- return false;
- }
- return true;
-}
-
-WebRequestRulesRegistry::~WebRequestRulesRegistry() {}
-
-base::Time WebRequestRulesRegistry::GetExtensionInstallationTime(
- const std::string& extension_id) const {
- return extension_info_map_->GetInstallTime(extension_id);
-}
-
-void WebRequestRulesRegistry::ClearCacheOnNavigation() {
- extension_web_request_api_helpers::ClearCacheOnNavigation();
-}
-
-// static
-bool WebRequestRulesRegistry::Checker(const Extension* extension,
- const WebRequestConditionSet* conditions,
- const WebRequestActionSet* actions,
- std::string* error) {
- return (StageChecker(conditions, actions, error) &&
- HostPermissionsChecker(extension, actions, error));
-}
-
-// static
-bool WebRequestRulesRegistry::HostPermissionsChecker(
- const Extension* extension,
- const WebRequestActionSet* actions,
- std::string* error) {
- if (extension->permissions_data()->HasEffectiveAccessToAllHosts())
- return true;
-
- // Without the permission for all URLs, actions with the STRATEGY_DEFAULT
- // should not be registered, they would never be able to execute.
- for (WebRequestActionSet::Actions::const_iterator action_iter =
- actions->actions().begin();
- action_iter != actions->actions().end();
- ++action_iter) {
- if ((*action_iter)->host_permissions_strategy() ==
- WebRequestAction::STRATEGY_DEFAULT) {
- *error = ErrorUtils::FormatErrorMessage(kAllURLsPermissionNeeded,
- (*action_iter)->GetName());
- return false;
- }
- }
- return true;
-}
-
-// static
-bool WebRequestRulesRegistry::StageChecker(
- const WebRequestConditionSet* conditions,
- const WebRequestActionSet* actions,
- std::string* error) {
- // Actions and conditions can be checked and executed in specific stages
- // of each web request. A rule is inconsistent if there is an action that
- // can only be triggered in stages in which no condition can be evaluated.
-
- // In which stages there are conditions to evaluate.
- int condition_stages = 0;
- for (WebRequestConditionSet::Conditions::const_iterator condition_iter =
- conditions->conditions().begin();
- condition_iter != conditions->conditions().end();
- ++condition_iter) {
- condition_stages |= (*condition_iter)->stages();
- }
-
- for (WebRequestActionSet::Actions::const_iterator action_iter =
- actions->actions().begin();
- action_iter != actions->actions().end();
- ++action_iter) {
- // Test the intersection of bit masks, this is intentionally & and not &&.
- if ((*action_iter)->stages() & condition_stages)
- continue;
- // We only get here if no matching condition was found.
- *error = ErrorUtils::FormatErrorMessage(kActionCannotBeExecuted,
- (*action_iter)->GetName());
- return false;
- }
- return true;
-}
-void WebRequestRulesRegistry::AddTriggeredRules(
- const URLMatches& url_matches,
- const WebRequestCondition::MatchData& request_data,
- RuleSet* result) const {
- for (URLMatches::const_iterator url_match = url_matches.begin();
- url_match != url_matches.end(); ++url_match) {
- RuleTriggers::const_iterator rule_trigger = rule_triggers_.find(*url_match);
- CHECK(rule_trigger != rule_triggers_.end());
- if (!ContainsKey(*result, rule_trigger->second) &&
- rule_trigger->second->conditions().IsFulfilled(*url_match,
- request_data))
- result->insert(rule_trigger->second);
- }
-}
-
-} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698