| // 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. |
| |
| #ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ |
| #define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h" |
| #include "chrome/common/extensions/api/events.h" |
| #include "webkit/common/resource_type.h" |
| |
| namespace base { |
| class Value; |
| } |
| |
| namespace net { |
| class URLRequest; |
| } |
| |
| namespace extensions { |
| |
| class HeaderMatcher; |
| struct WebRequestData; |
| |
| // Base class for all condition attributes of the declarative Web Request API |
| // except for condition attribute to test URLPatterns. |
| class WebRequestConditionAttribute |
| : public base::RefCounted<WebRequestConditionAttribute> { |
| public: |
| enum Type { |
| CONDITION_RESOURCE_TYPE, |
| CONDITION_CONTENT_TYPE, |
| CONDITION_RESPONSE_HEADERS, |
| CONDITION_THIRD_PARTY, |
| CONDITION_REQUEST_HEADERS, |
| CONDITION_STAGES |
| }; |
| |
| WebRequestConditionAttribute(); |
| |
| // Factory method that creates a WebRequestConditionAttribute for the JSON |
| // dictionary {|name|: |value|} passed by the extension API. Sets |error| and |
| // returns NULL if something fails. |
| // The ownership of |value| remains at the caller. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& name, |
| const base::Value* value, |
| std::string* error); |
| |
| // Returns a bit vector representing extensions::RequestStage. The bit vector |
| // contains a 1 for each request stage during which the condition attribute |
| // can be tested. |
| virtual int GetStages() const = 0; |
| |
| // Returns whether the condition is fulfilled for this request. |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const = 0; |
| |
| virtual Type GetType() const = 0; |
| virtual std::string GetName() const = 0; |
| |
| // Compares the Type of two WebRequestConditionAttributes, needs to be |
| // overridden for parameterized types. |
| virtual bool Equals(const WebRequestConditionAttribute* other) const; |
| |
| protected: |
| friend class base::RefCounted<WebRequestConditionAttribute>; |
| virtual ~WebRequestConditionAttribute(); |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttribute); |
| }; |
| |
| typedef std::vector<scoped_refptr<const WebRequestConditionAttribute> > |
| WebRequestConditionAttributes; |
| |
| // |
| // The following are concrete condition attributes. |
| // |
| |
| // Condition that checks whether a request is for a specific resource type. |
| class WebRequestConditionAttributeResourceType |
| : public WebRequestConditionAttribute { |
| public: |
| // Factory method, see WebRequestConditionAttribute::Create. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& instance_type, |
| const base::Value* value, |
| std::string* error, |
| bool* bad_message); |
| |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| virtual std::string GetName() const OVERRIDE; |
| virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; |
| |
| private: |
| explicit WebRequestConditionAttributeResourceType( |
| const std::vector<ResourceType::Type>& types); |
| virtual ~WebRequestConditionAttributeResourceType(); |
| |
| const std::vector<ResourceType::Type> types_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeResourceType); |
| }; |
| |
| // Condition that checks whether a response's Content-Type header has a |
| // certain MIME media type. |
| class WebRequestConditionAttributeContentType |
| : public WebRequestConditionAttribute { |
| public: |
| // Factory method, see WebRequestConditionAttribute::Create. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& name, |
| const base::Value* value, |
| std::string* error, |
| bool* bad_message); |
| |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| virtual std::string GetName() const OVERRIDE; |
| virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; |
| |
| private: |
| explicit WebRequestConditionAttributeContentType( |
| const std::vector<std::string>& include_content_types, |
| bool inclusive); |
| virtual ~WebRequestConditionAttributeContentType(); |
| |
| const std::vector<std::string> content_types_; |
| const bool inclusive_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeContentType); |
| }; |
| |
| // Condition attribute for matching against request headers. Uses HeaderMatcher |
| // to handle the actual tests, in connection with a boolean positiveness |
| // flag. If that flag is set to true, then IsFulfilled() returns true iff |
| // |header_matcher_| matches at least one header. Otherwise IsFulfilled() |
| // returns true iff the |header_matcher_| matches no header. |
| class WebRequestConditionAttributeRequestHeaders |
| : public WebRequestConditionAttribute { |
| public: |
| // Factory method, see WebRequestConditionAttribute::Create. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& name, |
| const base::Value* value, |
| std::string* error, |
| bool* bad_message); |
| |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| virtual std::string GetName() const OVERRIDE; |
| virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; |
| |
| private: |
| WebRequestConditionAttributeRequestHeaders( |
| scoped_ptr<const HeaderMatcher> header_matcher, bool positive); |
| virtual ~WebRequestConditionAttributeRequestHeaders(); |
| |
| const scoped_ptr<const HeaderMatcher> header_matcher_; |
| const bool positive_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeRequestHeaders); |
| }; |
| |
| // Condition attribute for matching against response headers. Uses HeaderMatcher |
| // to handle the actual tests, in connection with a boolean positiveness |
| // flag. If that flag is set to true, then IsFulfilled() returns true iff |
| // |header_matcher_| matches at least one header. Otherwise IsFulfilled() |
| // returns true iff the |header_matcher_| matches no header. |
| class WebRequestConditionAttributeResponseHeaders |
| : public WebRequestConditionAttribute { |
| public: |
| // Factory method, see WebRequestConditionAttribute::Create. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& name, |
| const base::Value* value, |
| std::string* error, |
| bool* bad_message); |
| |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| virtual std::string GetName() const OVERRIDE; |
| virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; |
| |
| private: |
| WebRequestConditionAttributeResponseHeaders( |
| scoped_ptr<const HeaderMatcher> header_matcher, bool positive); |
| virtual ~WebRequestConditionAttributeResponseHeaders(); |
| |
| const scoped_ptr<const HeaderMatcher> header_matcher_; |
| const bool positive_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeResponseHeaders); |
| }; |
| |
| // This condition tests whether the request origin is third-party. |
| class WebRequestConditionAttributeThirdParty |
| : public WebRequestConditionAttribute { |
| public: |
| // Factory method, see WebRequestConditionAttribute::Create. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& name, |
| const base::Value* value, |
| std::string* error, |
| bool* bad_message); |
| |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| virtual std::string GetName() const OVERRIDE; |
| virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; |
| |
| private: |
| explicit WebRequestConditionAttributeThirdParty(bool match_third_party); |
| virtual ~WebRequestConditionAttributeThirdParty(); |
| |
| const bool match_third_party_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeThirdParty); |
| }; |
| |
| // This condition is used as a filter for request stages. It is true exactly in |
| // stages specified on construction. |
| class WebRequestConditionAttributeStages |
| : public WebRequestConditionAttribute { |
| public: |
| // Factory method, see WebRequestConditionAttribute::Create. |
| static scoped_refptr<const WebRequestConditionAttribute> Create( |
| const std::string& name, |
| const base::Value* value, |
| std::string* error, |
| bool* bad_message); |
| |
| // Implementation of WebRequestConditionAttribute: |
| virtual int GetStages() const OVERRIDE; |
| virtual bool IsFulfilled( |
| const WebRequestData& request_data) const OVERRIDE; |
| virtual Type GetType() const OVERRIDE; |
| virtual std::string GetName() const OVERRIDE; |
| virtual bool Equals(const WebRequestConditionAttribute* other) const OVERRIDE; |
| |
| private: |
| explicit WebRequestConditionAttributeStages(int allowed_stages); |
| virtual ~WebRequestConditionAttributeStages(); |
| |
| const int allowed_stages_; // Composition of RequestStage values. |
| |
| DISALLOW_COPY_AND_ASSIGN(WebRequestConditionAttributeStages); |
| }; |
| |
| } // namespace extensions |
| |
| #endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_CONDITION_ATTRIBUTE_H_ |