12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_ACTION_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_ACTION_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/ref_counted.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/declarative_user_script_master.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/declarative/declarative_rule.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Time;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Value;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BrowserContext;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContents;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class Extension;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Base class for all ContentActions of the declarative content API.
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ContentAction : public base::RefCounted<ContentAction> {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Type identifiers for concrete ContentActions.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Type {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ACTION_SHOW_PAGE_ACTION,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ACTION_REQUEST_CONTENT_SCRIPT,
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ACTION_SET_ICON,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct ApplyInfo {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::BrowserContext* browser_context;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* tab;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int priority;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentAction();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual Type GetType() const = 0;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Applies or reverts this ContentAction on a particular tab for a particular
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension.  Revert exists to keep the actions up to date as the page
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // changes.  Reapply exists to reapply changes to a new page, even if the
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // previous page also matched relevant conditions.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Apply(const std::string& extension_id,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const base::Time& extension_install_time,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     ApplyInfo* apply_info) const = 0;
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void Reapply(const std::string& extension_id,
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       const base::Time& extension_install_time,
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       ApplyInfo* apply_info) const = 0;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Revert(const std::string& extension_id,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::Time& extension_install_time,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ApplyInfo* apply_info) const = 0;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Factory method that instantiates a concrete ContentAction
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // implementation according to |json_action|, the representation of the
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ContentAction as received from the extension API.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets |error| and returns NULL in case of a semantic error that cannot
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be caught by schema validation. Sets |bad_message| and returns NULL
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in case the input is syntactically unexpected.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_refptr<ContentAction> Create(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::BrowserContext* browser_context,
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Extension* extension,
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::Value& json_action,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::string* error,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool* bad_message);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Shared procedure for resetting error state within factories.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void ResetErrorData(std::string* error, bool* bad_message) {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *error = "";
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *bad_message = false;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Shared procedure for validating JSON data.
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool Validate(const base::Value& json_action,
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       std::string* error,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       bool* bad_message,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const base::DictionaryValue** action_dict,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       std::string* instance_type);
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class base::RefCounted<ContentAction>;
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ContentAction();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Action that injects a content script.
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass RequestContentScript : public ContentAction {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct ScriptData;
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RequestContentScript(content::BrowserContext* browser_context,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const Extension* extension,
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const ScriptData& script_data);
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RequestContentScript(DeclarativeUserScriptMaster* master,
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const Extension* extension,
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const ScriptData& script_data);
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_refptr<ContentAction> Create(
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::BrowserContext* browser_context,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Extension* extension,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::DictionaryValue* dict,
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::string* error,
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool* bad_message);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_refptr<ContentAction> CreateForTest(
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DeclarativeUserScriptMaster* master,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Extension* extension,
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::Value& json_action,
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      std::string* error,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool* bad_message);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool InitScriptData(const base::DictionaryValue* dict,
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             std::string* error,
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             bool* bad_message,
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             ScriptData* script_data);
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Implementation of ContentAction:
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual Type GetType() const OVERRIDE;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Apply(const std::string& extension_id,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const base::Time& extension_install_time,
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     ApplyInfo* apply_info) const OVERRIDE;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Reapply(const std::string& extension_id,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const base::Time& extension_install_time,
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ApplyInfo* apply_info) const OVERRIDE;
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Revert(const std::string& extension_id,
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const base::Time& extension_install_time,
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      ApplyInfo* apply_info) const OVERRIDE;
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InitScript(const Extension* extension, const ScriptData& script_data);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddScript() {
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(master_);
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    master_->AddScript(script_);
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~RequestContentScript();
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void InstructRenderProcessToInject(content::WebContents* contents,
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     const std::string& extension_id) const;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserScript script_;
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DeclarativeUserScriptMaster* master_;
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(RequestContentScript);
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef DeclarativeActionSet<ContentAction> ContentActionSet;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_CONTENT_CONTENT_ACTION_H_
163