1 // Copyright 2014 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_SCRIPT_EXECUTOR_H_ 6 #define EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_ 7 8 #include "base/callback_forward.h" 9 #include "base/observer_list.h" 10 #include "extensions/common/user_script.h" 11 12 class GURL; 13 struct ExtensionMsg_ExecuteCode_Params; 14 15 namespace base { 16 class ListValue; 17 } // namespace base 18 19 namespace content { 20 class WebContents; 21 } 22 23 namespace extensions { 24 class ScriptExecutionObserver; 25 26 // Interface for executing extension content scripts (e.g. executeScript) as 27 // described by the ExtensionMsg_ExecuteCode_Params IPC, and notifying the 28 // caller when responded with ExtensionHostMsg_ExecuteCodeFinished. 29 class ScriptExecutor { 30 public: 31 ScriptExecutor( 32 content::WebContents* web_contents, 33 // |script_observers| is assumed to be owned by |this|'s owner, and in 34 // such a way that |this| is destroyed first. 35 ObserverList<ScriptExecutionObserver>* script_observers); 36 37 ~ScriptExecutor(); 38 39 // The type of script being injected. 40 enum ScriptType { 41 JAVASCRIPT, 42 CSS, 43 }; 44 45 // The scope of the script injection across the frames. 46 enum FrameScope { 47 TOP_FRAME, 48 ALL_FRAMES, 49 }; 50 51 // Whether to insert the script in about: frames when its origin matches 52 // the extension's host permissions. 53 enum MatchAboutBlank { 54 DONT_MATCH_ABOUT_BLANK, 55 MATCH_ABOUT_BLANK, 56 }; 57 58 // The type of world to inject into (main world, or its own isolated world). 59 enum WorldType { 60 MAIN_WORLD, 61 ISOLATED_WORLD, 62 }; 63 64 // The type of process the target is. 65 enum ProcessType { 66 DEFAULT_PROCESS, 67 WEB_VIEW_PROCESS, 68 }; 69 70 // The type of result the caller is interested in. 71 enum ResultType { 72 NO_RESULT, 73 JSON_SERIALIZED_RESULT, 74 }; 75 76 // Callback from ExecuteScript. The arguments are (error, on_url, result). 77 // Success is implied by an empty error. 78 typedef base::Callback< 79 void(const std::string&, const GURL&, const base::ListValue&)> 80 ExecuteScriptCallback; 81 82 // Executes a script. The arguments match ExtensionMsg_ExecuteCode_Params in 83 // extension_messages.h (request_id is populated automatically). 84 // 85 // |callback| will always be called even if the IPC'd renderer is destroyed 86 // before a response is received (in this case the callback will be with a 87 // failure and appropriate error message). 88 void ExecuteScript(const std::string& extension_id, 89 ScriptType script_type, 90 const std::string& code, 91 FrameScope frame_scope, 92 MatchAboutBlank match_about_blank, 93 UserScript::RunLocation run_at, 94 WorldType world_type, 95 ProcessType process_type, 96 const GURL& webview_src, 97 const GURL& file_url, 98 bool user_gesture, 99 ResultType result_type, 100 const ExecuteScriptCallback& callback); 101 102 private: 103 // The next value to use for request_id in ExtensionMsg_ExecuteCode_Params. 104 int next_request_id_; 105 106 content::WebContents* web_contents_; 107 108 ObserverList<ScriptExecutionObserver>* script_observers_; 109 }; 110 111 } // namespace extensions 112 113 #endif // EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_ 114