• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_H_
7 
8 #include <map>
9 #include <set>
10 #include <string>
11 #include <vector>
12 
13 #include "base/basictypes.h"
14 #include "base/memory/linked_ptr.h"
15 #include "chrome/browser/extensions/api/declarative/declarative_rule.h"
16 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h"
17 #include "components/url_matcher/url_matcher.h"
18 #include "net/http/http_response_headers.h"
19 
20 namespace extensions {
21 
22 // Container for information about a URLRequest to determine which
23 // rules apply to the request.
24 struct WebRequestData {
25   WebRequestData(net::URLRequest* request, RequestStage stage);
26   WebRequestData(
27       net::URLRequest* request,
28       RequestStage stage,
29       const net::HttpResponseHeaders* original_response_headers);
30   ~WebRequestData();
31 
32   // The network request that is currently being processed.
33   net::URLRequest* request;
34   // The stage (progress) of the network request.
35   RequestStage stage;
36   // Additional information about requests that is not
37   // available in all request stages.
38   const net::HttpResponseHeaders* original_response_headers;
39 };
40 
41 // Adds information about URL matches to WebRequestData.
42 struct WebRequestDataWithMatchIds {
43   explicit WebRequestDataWithMatchIds(const WebRequestData* request_data);
44   ~WebRequestDataWithMatchIds();
45 
46   const WebRequestData* data;
47   std::set<url_matcher::URLMatcherConditionSet::ID> url_match_ids;
48   std::set<url_matcher::URLMatcherConditionSet::ID> first_party_url_match_ids;
49 };
50 
51 // Representation of a condition in the Declarative WebRequest API. A condition
52 // consists of several attributes. Each of these attributes needs to be
53 // fulfilled in order for the condition to be fulfilled.
54 //
55 // We distinguish between two types of conditions:
56 // - URL Matcher conditions are conditions that test the URL of a request.
57 //   These are treated separately because we use a URLMatcher to efficiently
58 //   test many of these conditions in parallel by using some advanced
59 //   data structures. The URLMatcher tells us if all URL Matcher conditions
60 //   are fulfilled for a WebRequestCondition.
61 // - All other conditions are represented as WebRequestConditionAttributes.
62 //   These conditions are probed linearly (only if the URL Matcher found a hit).
63 //
64 // TODO(battre) Consider making the URLMatcher an owner of the
65 // URLMatcherConditionSet and only pass a pointer to URLMatcherConditionSet
66 // in url_matcher_condition_set(). This saves some copying in
67 // WebRequestConditionSet::GetURLMatcherConditionSets.
68 class WebRequestCondition {
69  public:
70   typedef WebRequestDataWithMatchIds MatchData;
71 
72   WebRequestCondition(
73       scoped_refptr<url_matcher::URLMatcherConditionSet> url_matcher_conditions,
74       scoped_refptr<url_matcher::URLMatcherConditionSet>
75           first_party_url_matcher_conditions,
76       const WebRequestConditionAttributes& condition_attributes);
77   ~WebRequestCondition();
78 
79   // Factory method that instantiates a WebRequestCondition according to
80   // the description |condition| passed by the extension API.
81   static scoped_ptr<WebRequestCondition> Create(
82       const Extension* extension,
83       url_matcher::URLMatcherConditionFactory* url_matcher_condition_factory,
84       const base::Value& condition,
85       std::string* error);
86 
87   // Returns whether the request matches this condition.
88   bool IsFulfilled(const MatchData& request_data) const;
89 
90   // If this condition has url attributes, appends them to |condition_sets|.
91   void GetURLMatcherConditionSets(
92       url_matcher::URLMatcherConditionSet::Vector* condition_sets) const;
93 
94   // Returns a bit vector representing extensions::RequestStage. The bit vector
95   // contains a 1 for each request stage during which the condition can be
96   // tested.
stages()97   int stages() const { return applicable_request_stages_; }
98 
99  private:
100   // URL attributes of this condition.
101   scoped_refptr<url_matcher::URLMatcherConditionSet> url_matcher_conditions_;
102   scoped_refptr<url_matcher::URLMatcherConditionSet>
103       first_party_url_matcher_conditions_;
104 
105   // All non-UrlFilter attributes of this condition.
106   WebRequestConditionAttributes condition_attributes_;
107 
108   // Bit vector indicating all RequestStage during which all
109   // |condition_attributes_| can be evaluated.
110   int applicable_request_stages_;
111 
112   DISALLOW_COPY_AND_ASSIGN(WebRequestCondition);
113 };
114 
115 typedef DeclarativeConditionSet<WebRequestCondition> WebRequestConditionSet;
116 
117 }  // namespace extensions
118 
119 #endif  // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_H_
120