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