blob: 12fe8fc9d6c74870327237499a0bdae12fc8d406 [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"
Keishi Hattori0e45c022021-11-27 09:25:5214#include "base/memory/raw_ptr.h"
Lei Zhang7c1d96f2021-04-30 09:04:3615#include "base/values.h"
Manish Jethani9494d722018-01-20 00:28:4716#include "extensions/common/constants.h"
Devlin Cronin5c3c9d92021-06-14 20:51:0017#include "extensions/common/mojom/code_injection.mojom.h"
Julie Jeongeun Kim0d0ac492021-03-04 01:43:2218#include "extensions/common/mojom/css_origin.mojom-shared.h"
Julie Jeongeun Kim30f64632021-03-10 01:10:0219#include "extensions/common/mojom/host_id.mojom-forward.h"
Julie Jeongeun Kim378db14d2021-03-05 01:53:0020#include "extensions/common/mojom/run_location.mojom-shared.h"
[email protected]49d9b142013-07-19 08:50:2721#include "extensions/common/user_script.h"
[email protected]3fd3cf72012-05-14 05:51:5622
[email protected]7f3b91e2012-08-07 08:05:0323class GURL;
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
Julie Jeongeun Kim04fb76242021-03-11 04:16:2743// described by the mojom::ExecuteCodeParams IPC, and notifying the
Julie Jeongeun Kim1a604ad2021-03-18 10:27:2844// caller when responded with ExecuteCodeCallback.
[email protected]3fd3cf72012-05-14 05:51:5645class ScriptExecutor {
46 public:
Trent Apted8f733b92018-10-04 00:54:4547 explicit ScriptExecutor(content::WebContents* web_contents);
Peter Boström951cf77e2021-09-22 00:02:5948
49 ScriptExecutor(const ScriptExecutor&) = delete;
50 ScriptExecutor& operator=(const ScriptExecutor&) = delete;
51
[email protected]af78a802012-07-10 23:47:0252 ~ScriptExecutor();
[email protected]3fd3cf72012-05-14 05:51:5653
[email protected]3fd3cf72012-05-14 05:51:5654 // The scope of the script injection across the frames.
55 enum FrameScope {
Devlin Cronin5331a45e2020-11-18 21:04:3256 SPECIFIED_FRAMES,
rob52277c82016-02-07 17:28:5757 INCLUDE_SUB_FRAMES,
[email protected]3fd3cf72012-05-14 05:51:5658 };
59
[email protected]ae26b282014-05-15 16:40:1660 // Whether to insert the script in about: frames when its origin matches
61 // the extension's host permissions.
62 enum MatchAboutBlank {
63 DONT_MATCH_ABOUT_BLANK,
64 MATCH_ABOUT_BLANK,
65 };
66
[email protected]88c6f5c2013-08-28 04:08:4167 // The type of process the target is.
68 enum ProcessType {
69 DEFAULT_PROCESS,
70 WEB_VIEW_PROCESS,
71 };
72
Devlin Cronin7fdd38c2021-01-27 03:01:4973 struct FrameResult {
74 FrameResult();
75 FrameResult(FrameResult&&);
76 FrameResult& operator=(FrameResult&&);
77
78 // The ID of the frame of the injection.
79 int frame_id = -1;
80 // The error associated with the injection, if any. Empty if the injection
81 // succeeded.
82 std::string error;
83 // The URL of the frame from the injection. Only set if the frame exists.
84 GURL url;
85 // The result value from the injection, or null if the injection failed (or
86 // had no result).
87 base::Value value;
88 // Whether the frame responded to the attempted injection (which can fail if
89 // the frame was removed or never existed). Note this doesn't necessarily
90 // mean the injection succeeded, since it could fail due to other reasons
91 // (like permissions).
92 bool frame_responded = false;
93 };
94
95 using ScriptFinishedCallback =
96 base::OnceCallback<void(std::vector<FrameResult> frame_results)>;
[email protected]3fd3cf72012-05-14 05:51:5697
Devlin Cronin5c3c9d92021-06-14 20:51:0098 // Generates an injection key based on the host ID and either the file URL, if
99 // available, or the code string. The format of the key is
100 // "<type><host_id><digest>", where <type> is one of "F" (file) and "C"
101 // (code), <host_id> is the host ID, and <digest> is an unspecified hash
102 // digest of the file URL or the code string, respectively.
103 static std::string GenerateInjectionKey(const mojom::HostID& host_id,
104 const GURL& script_url,
105 const std::string& code);
106
Julie Jeongeun Kim04fb76242021-03-11 04:16:27107 // Executes a script. The arguments match mojom::ExecuteCodeParams in
108 // frame.mojom (request_id is populated automatically).
[email protected]3fd3cf72012-05-14 05:51:56109 //
Devlin Cronin5331a45e2020-11-18 21:04:32110 // The script will be executed in the frames identified by |frame_ids| (which
111 // are extension API frame IDs). If |frame_scope| is INCLUDE_SUB_FRAMES,
112 // then the script will also be executed in all descendants of the specified
113 // frames.
rob52277c82016-02-07 17:28:57114 //
[email protected]3fd3cf72012-05-14 05:51:56115 // |callback| will always be called even if the IPC'd renderer is destroyed
116 // before a response is received (in this case the callback will be with a
117 // failure and appropriate error message).
Julie Jeongeun Kim30f64632021-03-10 01:10:02118 void ExecuteScript(const mojom::HostID& host_id,
Devlin Cronin5c3c9d92021-06-14 20:51:00119 mojom::CodeInjectionPtr injection,
[email protected]af78a802012-07-10 23:47:02120 FrameScope frame_scope,
Devlin Croninc84d0e52021-03-23 01:16:15121 const std::set<int>& frame_ids,
[email protected]ae26b282014-05-15 16:40:16122 MatchAboutBlank match_about_blank,
Julie Jeongeun Kim378db14d2021-03-05 01:53:00123 mojom::RunLocation run_at,
[email protected]88c6f5c2013-08-28 04:08:41124 ProcessType process_type,
[email protected]6f451a42014-04-10 17:12:47125 const GURL& webview_src,
Istiaque Ahmede643f562020-04-18 09:56:39126 ScriptFinishedCallback callback);
Trent Apted8f733b92018-10-04 00:54:45127
128 // Set the observer for ScriptsExecutedNotification callbacks.
129 void set_observer(ScriptsExecutedNotification observer) {
130 observer_ = std::move(observer);
131 }
[email protected]af78a802012-07-10 23:47:02132
[email protected]af78a802012-07-10 23:47:02133 private:
Keishi Hattori0e45c022021-11-27 09:25:52134 raw_ptr<content::WebContents> web_contents_;
[email protected]af78a802012-07-10 23:47:02135
Trent Apted8f733b92018-10-04 00:54:45136 ScriptsExecutedNotification observer_;
[email protected]3fd3cf72012-05-14 05:51:56137};
138
139} // namespace extensions
140
limasdfd70dc5ae2014-09-13 00:02:22141#endif // EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_