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