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