summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/actions/object.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/webconsole/actions/object.js')
-rw-r--r--devtools/client/webconsole/actions/object.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/devtools/client/webconsole/actions/object.js b/devtools/client/webconsole/actions/object.js
new file mode 100644
index 0000000000..1fd9df0fc2
--- /dev/null
+++ b/devtools/client/webconsole/actions/object.js
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+loader.lazyServiceGetter(
+ this,
+ "clipboardHelper",
+ "@mozilla.org/widget/clipboardhelper;1",
+ "nsIClipboardHelper"
+);
+
+function storeAsGlobal(actor) {
+ return async ({ commands, hud }) => {
+ const evalString = `{ let i = 0;
+ while (this.hasOwnProperty("temp" + i) && i < 1000) {
+ i++;
+ }
+ this["temp" + i] = _self;
+ "temp" + i;
+ }`;
+
+ const res = await commands.scriptCommand.execute(evalString, {
+ selectedObjectActor: actor,
+ // Prevent any type of breakpoint when evaluating this code
+ disableBreaks: true,
+ // Ensure always overriding "$0" and "_self" console command, even if the page implements a variable with the same name.
+ preferConsoleCommandsOverLocalSymbols: true,
+ });
+
+ // Select the adhoc target in the console.
+ if (hud.toolbox) {
+ const objectFront = commands.client.getFrontByID(actor);
+ if (objectFront) {
+ const targetActorID = objectFront.targetFront?.actorID;
+ if (targetActorID) {
+ hud.toolbox.selectTarget(targetActorID);
+ }
+ }
+ }
+
+ hud.focusInput();
+ hud.setInputValue(res.result);
+ };
+}
+
+function copyMessageObject(actor, variableText) {
+ return async ({ commands }) => {
+ if (actor) {
+ // The Debugger.Object of the OA will be bound to |_self| during evaluation.
+ // See server/actors/webconsole/eval-with-debugger.js `evalWithDebugger`.
+ const res = await commands.scriptCommand.execute("copy(_self)", {
+ selectedObjectActor: actor,
+ // Prevent any type of breakpoint when evaluating this code
+ disableBreaks: true,
+ // ensure always overriding "$0" and "_self" console command, even if the page implements a variable with the same name.
+ preferConsoleCommandsOverLocalSymbols: true,
+ });
+
+ clipboardHelper.copyString(res.helperResult.value);
+ } else {
+ clipboardHelper.copyString(variableText);
+ }
+ };
+}
+
+module.exports = {
+ storeAsGlobal,
+ copyMessageObject,
+};