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_ATTRIBUTE_H_ 6#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ 7 8#include <string> 9#include <vector> 10 11#include "base/basictypes.h" 12#include "base/memory/ref_counted.h" 13#include "base/memory/scoped_ptr.h" 14#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h" 15#include "chrome/common/extensions/api/events.h" 16#include "webkit/common/resource_type.h" 17 18namespace base { 19class Value; 20} 21 22namespace net { 23class URLRequest; 24} 25 26namespace extensions { 27 28class HeaderMatcher; 29struct WebRequestData; 30 31// Base class for all condition attributes of the declarative Web Request API 32// except for condition attribute to test URLPatterns. 33class WebRequestConditionAttribute 34 : public base::RefCounted<WebRequestConditionAttribute> { 35 public: 36 enum Type { 37 CONDITION_RESOURCE_TYPE, 38 CONDITION_CONTENT_TYPE, 39 CONDITION_RESPONSE_HEADERS, 40 CONDITION_THIRD_PARTY, 41 CONDITION_REQUEST_HEADERS, 42 CONDITION_STAGES 43 }; 44 45 WebRequestConditionAttribute(); 46 47 // Factory method that creates a WebRequestConditionAttribute for the JSON 48 // dictionary {|name|: |value|} passed by the extension API. Sets |error| and 49 // returns NULL if something fails. 50 // The ownership of |value| remains at the caller. 51 static scoped_refptr<const WebRequestConditionAttribute> Create( 52 const std::string& name, 53 const base::Value* value, 54 std::string* error); 55 56 // Returns a bit vector representing extensions::RequestStage. The bit vector 57 // contains a 1 for each request stage during which the condition attribute 58 // can be tested. 59 virtual int GetStages() const = 0; 60 61 // Returns whether the condition is fulfilled for this request. 62 virtual bool IsFulfilled( 63 const WebRequestData& request_data) const = 0; 64 65 virtual Type GetType() const = 0; 66 virtual std::string GetName() const = 0; 67 68 // Compares the Type of two WebRequestConditionAttributes, needs to be 69 // overridden for parameterized types. 70 virtual bool Equals(const WebRequestConditionAttribute* other) const; 71 72 protected: 73 friend class base::RefCounted<WebRequestConditionAttribute>; 74 virtual ~WebRequestConditionAttribute(); 75 76 private: 77 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttribute); 78}; 79 80typedef std::vector<scoped_refptr<const WebRequestConditionAttribute> > 81 WebRequestConditionAttributes; 82 83// 84// The following are concrete condition attributes. 85// 86 87// Condition that checks whether a request is for a specific resource type. 88class WebRequestConditionAttributeResourceType 89 : public WebRequestConditionAttribute { 90 public: 91 // Factory method, see WebRequestConditionAttribute::Create. 92 static scoped_refptr<const WebRequestConditionAttribute> Create( 93 const std::string& instance_type, 94 const base::Value* value, 95 std::string* error, 96 bool* bad_message); 97 98 // Implementation of WebRequestConditionAttribute: 99 virtual int GetStages() const OVERRIDE; 100 virtual bool IsFulfilled( 101 const WebRequestData& request_data) const OVERRIDE; 102 virtual Type GetType() const OVERRIDE; 103 virtual std::string GetName() const OVERRIDE; 104 virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; 105 106 private: 107 explicit WebRequestConditionAttributeResourceType( 108 const std::vector<ResourceType::Type>& types); 109 virtual ~WebRequestConditionAttributeResourceType(); 110 111 const std::vector<ResourceType::Type> types_; 112 113 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeResourceType); 114}; 115 116// Condition that checks whether a response's Content-Type header has a 117// certain MIME media type. 118class WebRequestConditionAttributeContentType 119 : public WebRequestConditionAttribute { 120 public: 121 // Factory method, see WebRequestConditionAttribute::Create. 122 static scoped_refptr<const WebRequestConditionAttribute> Create( 123 const std::string& name, 124 const base::Value* value, 125 std::string* error, 126 bool* bad_message); 127 128 // Implementation of WebRequestConditionAttribute: 129 virtual int GetStages() const OVERRIDE; 130 virtual bool IsFulfilled( 131 const WebRequestData& request_data) const OVERRIDE; 132 virtual Type GetType() const OVERRIDE; 133 virtual std::string GetName() const OVERRIDE; 134 virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; 135 136 private: 137 explicit WebRequestConditionAttributeContentType( 138 const std::vector<std::string>& include_content_types, 139 bool inclusive); 140 virtual ~WebRequestConditionAttributeContentType(); 141 142 const std::vector<std::string> content_types_; 143 const bool inclusive_; 144 145 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeContentType); 146}; 147 148// Condition attribute for matching against request headers. Uses HeaderMatcher 149// to handle the actual tests, in connection with a boolean positiveness 150// flag. If that flag is set to true, then IsFulfilled() returns true iff 151// |header_matcher_| matches at least one header. Otherwise IsFulfilled() 152// returns true iff the |header_matcher_| matches no header. 153class WebRequestConditionAttributeRequestHeaders 154 : public WebRequestConditionAttribute { 155 public: 156 // Factory method, see WebRequestConditionAttribute::Create. 157 static scoped_refptr<const WebRequestConditionAttribute> Create( 158 const std::string& name, 159 const base::Value* value, 160 std::string* error, 161 bool* bad_message); 162 163 // Implementation of WebRequestConditionAttribute: 164 virtual int GetStages() const OVERRIDE; 165 virtual bool IsFulfilled( 166 const WebRequestData& request_data) const OVERRIDE; 167 virtual Type GetType() const OVERRIDE; 168 virtual std::string GetName() const OVERRIDE; 169 virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; 170 171 private: 172 WebRequestConditionAttributeRequestHeaders( 173 scoped_ptr<const HeaderMatcher> header_matcher, bool positive); 174 virtual ~WebRequestConditionAttributeRequestHeaders(); 175 176 const scoped_ptr<const HeaderMatcher> header_matcher_; 177 const bool positive_; 178 179 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeRequestHeaders); 180}; 181 182// Condition attribute for matching against response headers. Uses HeaderMatcher 183// to handle the actual tests, in connection with a boolean positiveness 184// flag. If that flag is set to true, then IsFulfilled() returns true iff 185// |header_matcher_| matches at least one header. Otherwise IsFulfilled() 186// returns true iff the |header_matcher_| matches no header. 187class WebRequestConditionAttributeResponseHeaders 188 : public WebRequestConditionAttribute { 189 public: 190 // Factory method, see WebRequestConditionAttribute::Create. 191 static scoped_refptr<const WebRequestConditionAttribute> Create( 192 const std::string& name, 193 const base::Value* value, 194 std::string* error, 195 bool* bad_message); 196 197 // Implementation of WebRequestConditionAttribute: 198 virtual int GetStages() const OVERRIDE; 199 virtual bool IsFulfilled( 200 const WebRequestData& request_data) const OVERRIDE; 201 virtual Type GetType() const OVERRIDE; 202 virtual std::string GetName() const OVERRIDE; 203 virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; 204 205 private: 206 WebRequestConditionAttributeResponseHeaders( 207 scoped_ptr<const HeaderMatcher> header_matcher, bool positive); 208 virtual ~WebRequestConditionAttributeResponseHeaders(); 209 210 const scoped_ptr<const HeaderMatcher> header_matcher_; 211 const bool positive_; 212 213 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeResponseHeaders); 214}; 215 216// This condition tests whether the request origin is third-party. 217class WebRequestConditionAttributeThirdParty 218 : public WebRequestConditionAttribute { 219 public: 220 // Factory method, see WebRequestConditionAttribute::Create. 221 static scoped_refptr<const WebRequestConditionAttribute> Create( 222 const std::string& name, 223 const base::Value* value, 224 std::string* error, 225 bool* bad_message); 226 227 // Implementation of WebRequestConditionAttribute: 228 virtual int GetStages() const OVERRIDE; 229 virtual bool IsFulfilled( 230 const WebRequestData& request_data) const OVERRIDE; 231 virtual Type GetType() const OVERRIDE; 232 virtual std::string GetName() const OVERRIDE; 233 virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; 234 235 private: 236 explicit WebRequestConditionAttributeThirdParty(bool match_third_party); 237 virtual ~WebRequestConditionAttributeThirdParty(); 238 239 const bool match_third_party_; 240 241 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeThirdParty); 242}; 243 244// This condition is used as a filter for request stages. It is true exactly in 245// stages specified on construction. 246class WebRequestConditionAttributeStages 247 : public WebRequestConditionAttribute { 248 public: 249 // Factory method, see WebRequestConditionAttribute::Create. 250 static scoped_refptr<const WebRequestConditionAttribute> Create( 251 const std::string& name, 252 const base::Value* value, 253 std::string* error, 254 bool* bad_message); 255 256 // Implementation of WebRequestConditionAttribute: 257 virtual int GetStages() const OVERRIDE; 258 virtual bool IsFulfilled( 259 const WebRequestData& request_data) const OVERRIDE; 260 virtual Type GetType() const OVERRIDE; 261 virtual std::string GetName() const OVERRIDE; 262 virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; 263 264 private: 265 explicit WebRequestConditionAttributeStages(int allowed_stages); 266 virtual ~WebRequestConditionAttributeStages(); 267 268 const int allowed_stages_; // Composition of RequestStage values. 269 270 DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeStages); 271}; 272 273} // namespace extensions 274 275#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ 276