blob: fbe37767d3704068804dbf44b07306130818495e [file] [log] [blame]
[email protected]16a4206f2014-08-15 09:44:431// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]3fd3cf72012-05-14 05:51:562// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
limasdfd70dc5ae2014-09-13 00:02:225#ifndef EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_
6#define EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_
[email protected]3fd3cf72012-05-14 05:51:567
Trent Apted8f733b92018-10-04 00:54:458#include <map>
9#include <set>
10#include <string>
Devlin Cronin5331a45e2020-11-18 21:04:3211#include <vector>
Trent Apted8f733b92018-10-04 00:54:4512
13#include "base/callback.h"
Manish Jethani9494d722018-01-20 00:28:4714#include "base/optional.h"
15#include "extensions/common/constants.h"
[email protected]49d9b142013-07-19 08:50:2716#include "extensions/common/user_script.h"
[email protected]3fd3cf72012-05-14 05:51:5617
[email protected]7f3b91e2012-08-07 08:05:0318class GURL;
[email protected]ac02ac52014-05-20 01:11:2619struct ExtensionMsg_ExecuteCode_Params;
[email protected]7f3b91e2012-08-07 08:05:0320
[email protected]cab8cd982012-07-20 20:57:0321namespace base {
22class ListValue;
23} // namespace base
24
[email protected]3fd3cf72012-05-14 05:51:5625namespace content {
26class WebContents;
27}
28
29namespace extensions {
Trent Apted8f733b92018-10-04 00:54:4530
31// Contains all extensions that are executing scripts, mapped to the paths for
32// those scripts. The paths may be an empty set if the script has no path
33// associated with it (e.g. in the case of tabs.executeScript), but there will
34// still be an entry for the extension.
35using ExecutingScriptsMap = std::map<std::string, std::set<std::string>>;
36
37// Callback that ScriptExecutor uses to notify when content scripts and/or
38// tabs.executeScript calls run on a page.
39using ScriptsExecutedNotification = base::RepeatingCallback<
Lucas Furukawa Gadanie1c5dfda2018-11-29 17:57:4140 void(content::WebContents*, const ExecutingScriptsMap&, const GURL&)>;
[email protected]3fd3cf72012-05-14 05:51:5641
42// Interface for executing extension content scripts (e.g. executeScript) as
43// described by the ExtensionMsg_ExecuteCode_Params IPC, and notifying the
44// caller when responded with ExtensionHostMsg_ExecuteCodeFinished.
45class ScriptExecutor {
46 public:
Trent Apted8f733b92018-10-04 00:54:4547 explicit ScriptExecutor(content::WebContents* web_contents);
[email protected]af78a802012-07-10 23:47:0248 ~ScriptExecutor();
[email protected]3fd3cf72012-05-14 05:51:5649
[email protected]3fd3cf72012-05-14 05:51:5650 // The scope of the script injection across the frames.
51 enum FrameScope {
Devlin Cronin5331a45e2020-11-18 21:04:3252 SPECIFIED_FRAMES,
rob52277c82016-02-07 17:28:5753 INCLUDE_SUB_FRAMES,
[email protected]3fd3cf72012-05-14 05:51:5654 };
55
[email protected]ae26b282014-05-15 16:40:1656 // Whether to insert the script in about: frames when its origin matches
57 // the extension's host permissions.
58 enum MatchAboutBlank {
59 DONT_MATCH_ABOUT_BLANK,
60 MATCH_ABOUT_BLANK,
61 };
62
[email protected]88c6f5c2013-08-28 04:08:4163 // The type of process the target is.
64 enum ProcessType {
65 DEFAULT_PROCESS,
66 WEB_VIEW_PROCESS,
67 };
68
69 // The type of result the caller is interested in.
70 enum ResultType {
71 NO_RESULT,
72 JSON_SERIALIZED_RESULT,
73 };
74
[email protected]0f8bf4f2014-07-02 19:26:5375 // Callback from ExecuteScript. The arguments are (error, on_url, result).
76 // Success is implied by an empty error.
Istiaque Ahmede643f562020-04-18 09:56:3977 using ScriptFinishedCallback = base::OnceCallback<
78 void(const std::string&, const GURL&, const base::ListValue&)>;
[email protected]3fd3cf72012-05-14 05:51:5679
80 // Executes a script. The arguments match ExtensionMsg_ExecuteCode_Params in
81 // extension_messages.h (request_id is populated automatically).
82 //
Devlin Cronin5331a45e2020-11-18 21:04:3283 // The script will be executed in the frames identified by |frame_ids| (which
84 // are extension API frame IDs). If |frame_scope| is INCLUDE_SUB_FRAMES,
85 // then the script will also be executed in all descendants of the specified
86 // frames.
rob52277c82016-02-07 17:28:5787 //
[email protected]3fd3cf72012-05-14 05:51:5688 // |callback| will always be called even if the IPC'd renderer is destroyed
89 // before a response is received (in this case the callback will be with a
90 // failure and appropriate error message).
hanxi79f7a572015-03-09 20:46:5991 void ExecuteScript(const HostID& host_id,
Antonio Gomesa4e391a2020-10-01 13:42:3492 UserScript::ActionType action_type,
[email protected]af78a802012-07-10 23:47:0293 const std::string& code,
94 FrameScope frame_scope,
Devlin Cronin5331a45e2020-11-18 21:04:3295 const std::vector<int>& frame_ids,
[email protected]ae26b282014-05-15 16:40:1696 MatchAboutBlank match_about_blank,
[email protected]af78a802012-07-10 23:47:0297 UserScript::RunLocation run_at,
[email protected]88c6f5c2013-08-28 04:08:4198 ProcessType process_type,
[email protected]6f451a42014-04-10 17:12:4799 const GURL& webview_src,
Devlin Cronind52ea54ea2019-12-20 17:59:02100 const GURL& script_url,
[email protected]0df49432014-03-04 01:02:50101 bool user_gesture,
Manish Jethani9494d722018-01-20 00:28:47102 base::Optional<CSSOrigin> css_origin,
[email protected]88c6f5c2013-08-28 04:08:41103 ResultType result_type,
Istiaque Ahmede643f562020-04-18 09:56:39104 ScriptFinishedCallback callback);
Trent Apted8f733b92018-10-04 00:54:45105
106 // Set the observer for ScriptsExecutedNotification callbacks.
107 void set_observer(ScriptsExecutedNotification observer) {
108 observer_ = std::move(observer);
109 }
[email protected]af78a802012-07-10 23:47:02110
[email protected]af78a802012-07-10 23:47:02111 private:
112 // The next value to use for request_id in ExtensionMsg_ExecuteCode_Params.
Trent Apted8f733b92018-10-04 00:54:45113 int next_request_id_ = 0;
[email protected]af78a802012-07-10 23:47:02114
[email protected]af78a802012-07-10 23:47:02115 content::WebContents* web_contents_;
116
Trent Apted8f733b92018-10-04 00:54:45117 ScriptsExecutedNotification observer_;
118
119 DISALLOW_COPY_AND_ASSIGN(ScriptExecutor);
[email protected]3fd3cf72012-05-14 05:51:56120};
121
122} // namespace extensions
123
limasdfd70dc5ae2014-09-13 00:02:22124#endif // EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_