Home | History | Annotate | Download | only in declarative_webrequest
      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 EXTENSIONS_BROWSER_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_ACTION_H_
      6 #define EXTENSIONS_BROWSER_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_ACTION_H_
      7 
      8 #include <list>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/linked_ptr.h"
     14 #include "base/memory/ref_counted.h"
     15 #include "extensions/browser/api/declarative/declarative_rule.h"
     16 #include "extensions/browser/api/declarative_webrequest/request_stage.h"
     17 #include "extensions/browser/api/web_request/web_request_api_helpers.h"
     18 #include "extensions/common/api/events.h"
     19 #include "url/gurl.h"
     20 
     21 class WebRequestPermission;
     22 
     23 namespace base {
     24 class DictionaryValue;
     25 class Time;
     26 class Value;
     27 }
     28 
     29 namespace extension_web_request_api_helpers {
     30 struct EventResponseDelta;
     31 }
     32 
     33 namespace extensions {
     34 class Extension;
     35 class InfoMap;
     36 struct WebRequestData;
     37 }
     38 
     39 namespace net {
     40 class URLRequest;
     41 }
     42 
     43 namespace re2 {
     44 class RE2;
     45 }
     46 
     47 namespace extensions {
     48 
     49 typedef linked_ptr<extension_web_request_api_helpers::EventResponseDelta>
     50     LinkedPtrEventResponseDelta;
     51 
     52 // Base class for all WebRequestActions of the declarative Web Request API.
     53 class WebRequestAction : public base::RefCounted<WebRequestAction> {
     54  public:
     55   // Type identifiers for concrete WebRequestActions. If you add a new type,
     56   // also update the unittest WebRequestActionTest.GetName, and add a
     57   // WebRequestActionWithThreadsTest.Permission* unittest.
     58   enum Type {
     59     ACTION_CANCEL_REQUEST,
     60     ACTION_REDIRECT_REQUEST,
     61     ACTION_REDIRECT_TO_TRANSPARENT_IMAGE,
     62     ACTION_REDIRECT_TO_EMPTY_DOCUMENT,
     63     ACTION_REDIRECT_BY_REGEX_DOCUMENT,
     64     ACTION_SET_REQUEST_HEADER,
     65     ACTION_REMOVE_REQUEST_HEADER,
     66     ACTION_ADD_RESPONSE_HEADER,
     67     ACTION_REMOVE_RESPONSE_HEADER,
     68     ACTION_IGNORE_RULES,
     69     ACTION_MODIFY_REQUEST_COOKIE,
     70     ACTION_MODIFY_RESPONSE_COOKIE,
     71     ACTION_SEND_MESSAGE_TO_EXTENSION,
     72   };
     73 
     74   // Strategies for checking host permissions.
     75   enum HostPermissionsStrategy {
     76     STRATEGY_NONE,     // Do not check host permissions.
     77     STRATEGY_DEFAULT,  // Check for host permissions for all URLs
     78                        // before creating the delta.
     79     STRATEGY_HOST,     // Check that host permissions match the URL
     80                        // of the request.
     81   };
     82 
     83   // Information necessary to decide how to apply a WebRequestAction
     84   // inside a matching rule.
     85   struct ApplyInfo {
     86     const InfoMap* extension_info_map;
     87     const WebRequestData& request_data;
     88     bool crosses_incognito;
     89     // Modified by each applied action:
     90     std::list<LinkedPtrEventResponseDelta>* deltas;
     91     std::set<std::string>* ignored_tags;
     92   };
     93 
     94   int stages() const {
     95     return stages_;
     96   }
     97 
     98   Type type() const {
     99     return type_;
    100   }
    101 
    102   // Compares the Type of two WebRequestActions, needs to be overridden for
    103   // parameterized types.
    104   virtual bool Equals(const WebRequestAction* other) const;
    105 
    106   // Return the JavaScript type name corresponding to type(). If there are
    107   // more names, they are returned separated by a colon.
    108   virtual std::string GetName() const = 0;
    109 
    110   int minimum_priority() const {
    111     return minimum_priority_;
    112   }
    113 
    114   HostPermissionsStrategy host_permissions_strategy() const {
    115     return host_permissions_strategy_;
    116   }
    117 
    118   // Returns whether the specified extension has permission to execute this
    119   // action on |request|. Checks the host permission if the host permissions
    120   // strategy is STRATEGY_DEFAULT.
    121   // |extension_info_map| may only be NULL for during testing, in which case
    122   // host permissions are ignored. |crosses_incognito| specifies
    123   // whether the request comes from a different profile than |extension_id|
    124   // but was processed because the extension is in spanning mode.
    125   virtual bool HasPermission(const InfoMap* extension_info_map,
    126                              const std::string& extension_id,
    127                              const net::URLRequest* request,
    128                              bool crosses_incognito) const;
    129 
    130   // Factory method that instantiates a concrete WebRequestAction
    131   // implementation according to |json_action|, the representation of the
    132   // WebRequestAction as received from the extension API.
    133   // Sets |error| and returns NULL in case of a semantic error that cannot
    134   // be caught by schema validation. Sets |bad_message| and returns NULL
    135   // in case the input is syntactically unexpected.
    136   static scoped_refptr<const WebRequestAction> Create(
    137       content::BrowserContext* browser_context,
    138       const Extension* extension,
    139       const base::Value& json_action,
    140       std::string* error,
    141       bool* bad_message);
    142 
    143   // Returns a description of the modification to the request caused by
    144   // this action.
    145   virtual LinkedPtrEventResponseDelta CreateDelta(
    146       const WebRequestData& request_data,
    147       const std::string& extension_id,
    148       const base::Time& extension_install_time) const = 0;
    149 
    150   // Applies this action to a request, recording the results into
    151   // apply_info.deltas.
    152   void Apply(const std::string& extension_id,
    153              base::Time extension_install_time,
    154              ApplyInfo* apply_info) const;
    155 
    156  protected:
    157   friend class base::RefCounted<WebRequestAction>;
    158   virtual ~WebRequestAction();
    159   WebRequestAction(int stages,
    160                    Type type,
    161                    int minimum_priority,
    162                    HostPermissionsStrategy strategy);
    163 
    164  private:
    165   // A bit vector representing a set of extensions::RequestStage during which
    166   // the condition can be tested.
    167   const int stages_;
    168 
    169   const Type type_;
    170 
    171   // The minimum priority of rules that may be evaluated after the rule
    172   // containing this action.
    173   const int minimum_priority_;
    174 
    175   // Defaults to STRATEGY_DEFAULT.
    176   const HostPermissionsStrategy host_permissions_strategy_;
    177 };
    178 
    179 typedef DeclarativeActionSet<WebRequestAction> WebRequestActionSet;
    180 
    181 //
    182 // The following are concrete actions.
    183 //
    184 
    185 // Action that instructs to cancel a network request.
    186 class WebRequestCancelAction : public WebRequestAction {
    187  public:
    188   WebRequestCancelAction();
    189 
    190   // Implementation of WebRequestAction:
    191   virtual std::string GetName() const OVERRIDE;
    192   virtual LinkedPtrEventResponseDelta CreateDelta(
    193       const WebRequestData& request_data,
    194       const std::string& extension_id,
    195       const base::Time& extension_install_time) const OVERRIDE;
    196 
    197  private:
    198   virtual ~WebRequestCancelAction();
    199   DISALLOW_COPY_AND_ASSIGN(WebRequestCancelAction);
    200 };
    201 
    202 // Action that instructs to redirect a network request.
    203 class WebRequestRedirectAction : public WebRequestAction {
    204  public:
    205   explicit WebRequestRedirectAction(const GURL& redirect_url);
    206 
    207   // Implementation of WebRequestAction:
    208   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    209   virtual std::string GetName() const OVERRIDE;
    210   virtual LinkedPtrEventResponseDelta CreateDelta(
    211       const WebRequestData& request_data,
    212       const std::string& extension_id,
    213       const base::Time& extension_install_time) const OVERRIDE;
    214 
    215  private:
    216   virtual ~WebRequestRedirectAction();
    217 
    218   GURL redirect_url_;  // Target to which the request shall be redirected.
    219 
    220   DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectAction);
    221 };
    222 
    223 // Action that instructs to redirect a network request to a transparent image.
    224 class WebRequestRedirectToTransparentImageAction : public WebRequestAction {
    225  public:
    226   WebRequestRedirectToTransparentImageAction();
    227 
    228   // Implementation of WebRequestAction:
    229   virtual std::string GetName() const OVERRIDE;
    230   virtual LinkedPtrEventResponseDelta CreateDelta(
    231       const WebRequestData& request_data,
    232       const std::string& extension_id,
    233       const base::Time& extension_install_time) const OVERRIDE;
    234 
    235  private:
    236   virtual ~WebRequestRedirectToTransparentImageAction();
    237   DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectToTransparentImageAction);
    238 };
    239 
    240 
    241 // Action that instructs to redirect a network request to an empty document.
    242 class WebRequestRedirectToEmptyDocumentAction : public WebRequestAction {
    243  public:
    244   WebRequestRedirectToEmptyDocumentAction();
    245 
    246   // Implementation of WebRequestAction:
    247   virtual std::string GetName() const OVERRIDE;
    248   virtual LinkedPtrEventResponseDelta CreateDelta(
    249       const WebRequestData& request_data,
    250       const std::string& extension_id,
    251       const base::Time& extension_install_time) const OVERRIDE;
    252 
    253  private:
    254   virtual ~WebRequestRedirectToEmptyDocumentAction();
    255   DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectToEmptyDocumentAction);
    256 };
    257 
    258 // Action that instructs to redirect a network request.
    259 class WebRequestRedirectByRegExAction : public WebRequestAction {
    260  public:
    261   // The |to_pattern| has to be passed in RE2 syntax with the exception that
    262   // capture groups are referenced in Perl style ($1, $2, ...).
    263   explicit WebRequestRedirectByRegExAction(scoped_ptr<re2::RE2> from_pattern,
    264                                            const std::string& to_pattern);
    265 
    266   // Conversion of capture group styles between Perl style ($1, $2, ...) and
    267   // RE2 (\1, \2, ...).
    268   static std::string PerlToRe2Style(const std::string& perl);
    269 
    270   // Implementation of WebRequestAction:
    271   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    272   virtual std::string GetName() const OVERRIDE;
    273   virtual LinkedPtrEventResponseDelta CreateDelta(
    274       const WebRequestData& request_data,
    275       const std::string& extension_id,
    276       const base::Time& extension_install_time) const OVERRIDE;
    277 
    278  private:
    279   virtual ~WebRequestRedirectByRegExAction();
    280 
    281   scoped_ptr<re2::RE2> from_pattern_;
    282   std::string to_pattern_;
    283 
    284   DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectByRegExAction);
    285 };
    286 
    287 // Action that instructs to set a request header.
    288 class WebRequestSetRequestHeaderAction : public WebRequestAction {
    289  public:
    290   WebRequestSetRequestHeaderAction(const std::string& name,
    291                                    const std::string& value);
    292 
    293   // Implementation of WebRequestAction:
    294   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    295   virtual std::string GetName() const OVERRIDE;
    296   virtual LinkedPtrEventResponseDelta CreateDelta(
    297       const WebRequestData& request_data,
    298       const std::string& extension_id,
    299       const base::Time& extension_install_time) const OVERRIDE;
    300 
    301  private:
    302   virtual ~WebRequestSetRequestHeaderAction();
    303 
    304   std::string name_;
    305   std::string value_;
    306   DISALLOW_COPY_AND_ASSIGN(WebRequestSetRequestHeaderAction);
    307 };
    308 
    309 // Action that instructs to remove a request header.
    310 class WebRequestRemoveRequestHeaderAction : public WebRequestAction {
    311  public:
    312   explicit WebRequestRemoveRequestHeaderAction(const std::string& name);
    313 
    314   // Implementation of WebRequestAction:
    315   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    316   virtual std::string GetName() const OVERRIDE;
    317   virtual LinkedPtrEventResponseDelta CreateDelta(
    318       const WebRequestData& request_data,
    319       const std::string& extension_id,
    320       const base::Time& extension_install_time) const OVERRIDE;
    321 
    322  private:
    323   virtual ~WebRequestRemoveRequestHeaderAction();
    324 
    325   std::string name_;
    326   DISALLOW_COPY_AND_ASSIGN(WebRequestRemoveRequestHeaderAction);
    327 };
    328 
    329 // Action that instructs to add a response header.
    330 class WebRequestAddResponseHeaderAction : public WebRequestAction {
    331  public:
    332   WebRequestAddResponseHeaderAction(const std::string& name,
    333                                     const std::string& value);
    334 
    335   // Implementation of WebRequestAction:
    336   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    337   virtual std::string GetName() const OVERRIDE;
    338   virtual LinkedPtrEventResponseDelta CreateDelta(
    339       const WebRequestData& request_data,
    340       const std::string& extension_id,
    341       const base::Time& extension_install_time) const OVERRIDE;
    342 
    343  private:
    344   virtual ~WebRequestAddResponseHeaderAction();
    345 
    346   std::string name_;
    347   std::string value_;
    348   DISALLOW_COPY_AND_ASSIGN(WebRequestAddResponseHeaderAction);
    349 };
    350 
    351 // Action that instructs to remove a response header.
    352 class WebRequestRemoveResponseHeaderAction : public WebRequestAction {
    353  public:
    354   explicit WebRequestRemoveResponseHeaderAction(const std::string& name,
    355                                                 const std::string& value,
    356                                                 bool has_value);
    357 
    358   // Implementation of WebRequestAction:
    359   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    360   virtual std::string GetName() const OVERRIDE;
    361   virtual LinkedPtrEventResponseDelta CreateDelta(
    362       const WebRequestData& request_data,
    363       const std::string& extension_id,
    364       const base::Time& extension_install_time) const OVERRIDE;
    365 
    366  private:
    367   virtual ~WebRequestRemoveResponseHeaderAction();
    368 
    369   std::string name_;
    370   std::string value_;
    371   bool has_value_;
    372   DISALLOW_COPY_AND_ASSIGN(WebRequestRemoveResponseHeaderAction);
    373 };
    374 
    375 // Action that instructs to ignore rules below a certain priority.
    376 class WebRequestIgnoreRulesAction : public WebRequestAction {
    377  public:
    378   explicit WebRequestIgnoreRulesAction(int minimum_priority,
    379                                        const std::string& ignore_tag);
    380 
    381   // Implementation of WebRequestAction:
    382   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    383   virtual std::string GetName() const OVERRIDE;
    384   virtual LinkedPtrEventResponseDelta CreateDelta(
    385       const WebRequestData& request_data,
    386       const std::string& extension_id,
    387       const base::Time& extension_install_time) const OVERRIDE;
    388   const std::string& ignore_tag() const { return ignore_tag_; }
    389 
    390  private:
    391   virtual ~WebRequestIgnoreRulesAction();
    392 
    393   // Rules are ignored if they have a tag matching |ignore_tag_| and
    394   // |ignore_tag_| is non-empty.
    395   std::string ignore_tag_;
    396   DISALLOW_COPY_AND_ASSIGN(WebRequestIgnoreRulesAction);
    397 };
    398 
    399 // Action that instructs to modify (add, edit, remove) a request cookie.
    400 class WebRequestRequestCookieAction : public WebRequestAction {
    401  public:
    402   typedef extension_web_request_api_helpers::RequestCookieModification
    403       RequestCookieModification;
    404 
    405   explicit WebRequestRequestCookieAction(
    406       linked_ptr<RequestCookieModification> request_cookie_modification);
    407 
    408   // Implementation of WebRequestAction:
    409   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    410   virtual std::string GetName() const OVERRIDE;
    411   virtual LinkedPtrEventResponseDelta CreateDelta(
    412       const WebRequestData& request_data,
    413       const std::string& extension_id,
    414       const base::Time& extension_install_time) const OVERRIDE;
    415 
    416  private:
    417   virtual ~WebRequestRequestCookieAction();
    418 
    419   linked_ptr<RequestCookieModification> request_cookie_modification_;
    420   DISALLOW_COPY_AND_ASSIGN(WebRequestRequestCookieAction);
    421 };
    422 
    423 // Action that instructs to modify (add, edit, remove) a response cookie.
    424 class WebRequestResponseCookieAction : public WebRequestAction {
    425  public:
    426   typedef extension_web_request_api_helpers::ResponseCookieModification
    427       ResponseCookieModification;
    428 
    429   explicit WebRequestResponseCookieAction(
    430       linked_ptr<ResponseCookieModification> response_cookie_modification);
    431 
    432   // Implementation of WebRequestAction:
    433   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    434   virtual std::string GetName() const OVERRIDE;
    435   virtual LinkedPtrEventResponseDelta CreateDelta(
    436       const WebRequestData& request_data,
    437       const std::string& extension_id,
    438       const base::Time& extension_install_time) const OVERRIDE;
    439 
    440  private:
    441   virtual ~WebRequestResponseCookieAction();
    442 
    443   linked_ptr<ResponseCookieModification> response_cookie_modification_;
    444   DISALLOW_COPY_AND_ASSIGN(WebRequestResponseCookieAction);
    445 };
    446 
    447 // Action that triggers the chrome.declarativeWebRequest.onMessage event in
    448 // the background/event/... pages of the extension.
    449 class WebRequestSendMessageToExtensionAction : public WebRequestAction {
    450  public:
    451   explicit WebRequestSendMessageToExtensionAction(const std::string& message);
    452 
    453   // Implementation of WebRequestAction:
    454   virtual bool Equals(const WebRequestAction* other) const OVERRIDE;
    455   virtual std::string GetName() const OVERRIDE;
    456   virtual LinkedPtrEventResponseDelta CreateDelta(
    457       const WebRequestData& request_data,
    458       const std::string& extension_id,
    459       const base::Time& extension_install_time) const OVERRIDE;
    460 
    461  private:
    462   virtual ~WebRequestSendMessageToExtensionAction();
    463 
    464   std::string message_;
    465   DISALLOW_COPY_AND_ASSIGN(WebRequestSendMessageToExtensionAction);
    466 };
    467 
    468 }  // namespace extensions
    469 
    470 #endif  // EXTENSIONS_BROWSER_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_ACTION_H_
    471