• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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