blob: d3cc6a14e9ff02aa0cbc858892bdd7f0d645d167 [file] [log] [blame]
Avi Drissman60039d42022-09-13 21:49:051// Copyright 2014 The Chromium Authors
[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"
Dave Tapuska753dd652022-03-17 20:16:0416#include "extensions/browser/extension_api_frame_id_map.h"
Manish Jethani9494d722018-01-20 00:28:4717#include "extensions/common/constants.h"
Devlin Cronin5c3c9d92021-06-14 20:51:0018#include "extensions/common/mojom/code_injection.mojom.h"
Julie Jeongeun Kim0d0ac492021-03-04 01:43:2219#include "extensions/common/mojom/css_origin.mojom-shared.h"
Julie Jeongeun Kim30f64632021-03-10 01:10:0220#include "extensions/common/mojom/host_id.mojom-forward.h"
Julie Jeongeun Kim378db14d2021-03-05 01:53:0021#include "extensions/common/mojom/run_location.mojom-shared.h"
[email protected]49d9b142013-07-19 08:50:2722#include "extensions/common/user_script.h"
[email protected]3fd3cf72012-05-14 05:51:5623
[email protected]7f3b91e2012-08-07 08:05:0324class GURL;
25
[email protected]3fd3cf72012-05-14 05:51:5626namespace content {
27class WebContents;
28}
29
30namespace extensions {
Trent Apted8f733b92018-10-04 00:54:4531
32// Contains all extensions that are executing scripts, mapped to the paths for
33// those scripts. The paths may be an empty set if the script has no path
34// associated with it (e.g. in the case of tabs.executeScript), but there will
35// still be an entry for the extension.
36using ExecutingScriptsMap = std::map<std::string, std::set<std::string>>;
37
38// Callback that ScriptExecutor uses to notify when content scripts and/or
39// tabs.executeScript calls run on a page.
40using ScriptsExecutedNotification = base::RepeatingCallback<
Lucas Furukawa Gadanie1c5dfda2018-11-29 17:57:4141 void(content::WebContents*, const ExecutingScriptsMap&, const GURL&)>;
[email protected]3fd3cf72012-05-14 05:51:5642
43// Interface for executing extension content scripts (e.g. executeScript) as
Julie Jeongeun Kim04fb76242021-03-11 04:16:2744// described by the mojom::ExecuteCodeParams IPC, and notifying the
Julie Jeongeun Kim1a604ad2021-03-18 10:27:2845// caller when responded with ExecuteCodeCallback.
[email protected]3fd3cf72012-05-14 05:51:5646class ScriptExecutor {
47 public:
Trent Apted8f733b92018-10-04 00:54:4548 explicit ScriptExecutor(content::WebContents* web_contents);
Peter Boström951cf77e2021-09-22 00:02:5949
50 ScriptExecutor(const ScriptExecutor&) = delete;
51 ScriptExecutor& operator=(const ScriptExecutor&) = delete;
52
[email protected]af78a802012-07-10 23:47:0253 ~ScriptExecutor();
[email protected]3fd3cf72012-05-14 05:51:5654
[email protected]3fd3cf72012-05-14 05:51:5655 // The scope of the script injection across the frames.
56 enum FrameScope {
Devlin Cronin5331a45e2020-11-18 21:04:3257 SPECIFIED_FRAMES,
rob52277c82016-02-07 17:28:5758 INCLUDE_SUB_FRAMES,
[email protected]3fd3cf72012-05-14 05:51:5659 };
60
[email protected]ae26b282014-05-15 16:40:1661 // Whether to insert the script in about: frames when its origin matches
62 // the extension's host permissions.
63 enum MatchAboutBlank {
64 DONT_MATCH_ABOUT_BLANK,
65 MATCH_ABOUT_BLANK,
66 };
67
[email protected]88c6f5c2013-08-28 04:08:4168 // The type of process the target is.
69 enum ProcessType {
70 DEFAULT_PROCESS,
71 WEB_VIEW_PROCESS,
72 };
73
Devlin Cronin7fdd38c2021-01-27 03:01:4974 struct FrameResult {
75 FrameResult();
76 FrameResult(FrameResult&&);
77 FrameResult& operator=(FrameResult&&);
78
Takashi Toyoshimaec7d45e2022-07-15 06:02:0279 // The ID of the frame of the injection. This is not consistent while
80 // executing content script, and the value represents the one that was set
81 // at the script injection was triggered.
Devlin Cronin7fdd38c2021-01-27 03:01:4982 int frame_id = -1;
Takashi Toyoshimaec7d45e2022-07-15 06:02:0283 // The document ID of the frame of the injection. This can be stale if the
84 // frame navigates and another document is created for the frame.
Dave Tapuska753dd652022-03-17 20:16:0485 ExtensionApiFrameIdMap::DocumentId document_id;
Devlin Cronin7fdd38c2021-01-27 03:01:4986 // The error associated with the injection, if any. Empty if the injection
87 // succeeded.
88 std::string error;
89 // The URL of the frame from the injection. Only set if the frame exists.
90 GURL url;
91 // The result value from the injection, or null if the injection failed (or
92 // had no result).
93 base::Value value;
94 // Whether the frame responded to the attempted injection (which can fail if
95 // the frame was removed or never existed). Note this doesn't necessarily
96 // mean the injection succeeded, since it could fail due to other reasons
97 // (like permissions).
98 bool frame_responded = false;
99 };
100
101 using ScriptFinishedCallback =
102 base::OnceCallback<void(std::vector<FrameResult> frame_results)>;
[email protected]3fd3cf72012-05-14 05:51:56103
Devlin Cronin5c3c9d92021-06-14 20:51:00104 // Generates an injection key based on the host ID and either the file URL, if
105 // available, or the code string. The format of the key is
106 // "<type><host_id><digest>", where <type> is one of "F" (file) and "C"
107 // (code), <host_id> is the host ID, and <digest> is an unspecified hash
108 // digest of the file URL or the code string, respectively.
109 static std::string GenerateInjectionKey(const mojom::HostID& host_id,
110 const GURL& script_url,
111 const std::string& code);
112
Julie Jeongeun Kim04fb76242021-03-11 04:16:27113 // Executes a script. The arguments match mojom::ExecuteCodeParams in
114 // frame.mojom (request_id is populated automatically).
[email protected]3fd3cf72012-05-14 05:51:56115 //
Devlin Cronin5331a45e2020-11-18 21:04:32116 // The script will be executed in the frames identified by |frame_ids| (which
117 // are extension API frame IDs). If |frame_scope| is INCLUDE_SUB_FRAMES,
118 // then the script will also be executed in all descendants of the specified
119 // frames.
rob52277c82016-02-07 17:28:57120 //
[email protected]3fd3cf72012-05-14 05:51:56121 // |callback| will always be called even if the IPC'd renderer is destroyed
122 // before a response is received (in this case the callback will be with a
123 // failure and appropriate error message).
Julie Jeongeun Kim30f64632021-03-10 01:10:02124 void ExecuteScript(const mojom::HostID& host_id,
Devlin Cronin5c3c9d92021-06-14 20:51:00125 mojom::CodeInjectionPtr injection,
[email protected]af78a802012-07-10 23:47:02126 FrameScope frame_scope,
Devlin Croninc84d0e52021-03-23 01:16:15127 const std::set<int>& frame_ids,
[email protected]ae26b282014-05-15 16:40:16128 MatchAboutBlank match_about_blank,
Julie Jeongeun Kim378db14d2021-03-05 01:53:00129 mojom::RunLocation run_at,
[email protected]88c6f5c2013-08-28 04:08:41130 ProcessType process_type,
[email protected]6f451a42014-04-10 17:12:47131 const GURL& webview_src,
Istiaque Ahmede643f562020-04-18 09:56:39132 ScriptFinishedCallback callback);
Trent Apted8f733b92018-10-04 00:54:45133
134 // Set the observer for ScriptsExecutedNotification callbacks.
135 void set_observer(ScriptsExecutedNotification observer) {
136 observer_ = std::move(observer);
137 }
[email protected]af78a802012-07-10 23:47:02138
[email protected]af78a802012-07-10 23:47:02139 private:
Keishi Hattori0e45c022021-11-27 09:25:52140 raw_ptr<content::WebContents> web_contents_;
[email protected]af78a802012-07-10 23:47:02141
Trent Apted8f733b92018-10-04 00:54:45142 ScriptsExecutedNotification observer_;
[email protected]3fd3cf72012-05-14 05:51:56143};
144
145} // namespace extensions
146
limasdfd70dc5ae2014-09-13 00:02:22147#endif // EXTENSIONS_BROWSER_SCRIPT_EXECUTOR_H_