From cd68187d3f64564dce78dddc1046cdcafd343458 Mon Sep 17 00:00:00 2001 From: David Rajchenbach-Teller Date: Wed, 4 Feb 2015 18:53:40 -0800 Subject: [PATCH] Bug 1005870 - Adding a copy() command to the console;r=robcee --- browser/devtools/webconsole/test/browser.ini | 1 + .../test/browser_console_copy_command.js | 70 +++++++++++++++++++ browser/devtools/webconsole/webconsole.js | 3 + toolkit/devtools/webconsole/utils.js | 27 +++++++ 4 files changed, 101 insertions(+) create mode 100644 browser/devtools/webconsole/test/browser_console_copy_command.js diff --git a/browser/devtools/webconsole/test/browser.ini b/browser/devtools/webconsole/test/browser.ini index 238deb1868bc..6386102c716d 100644 --- a/browser/devtools/webconsole/test/browser.ini +++ b/browser/devtools/webconsole/test/browser.ini @@ -144,6 +144,7 @@ skip-if = buildapp == 'mulet' || e10s # Bug 1042253 - webconsole e10s tests (exp [browser_console_clear_on_reload.js] [browser_console_click_focus.js] [browser_console_consolejsm_output.js] +[browser_console_copy_command.js] [browser_console_dead_objects.js] skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s [browser_console_copy_entire_message_context_menu.js] diff --git a/browser/devtools/webconsole/test/browser_console_copy_command.js b/browser/devtools/webconsole/test/browser_console_copy_command.js new file mode 100644 index 000000000000..711dfb5b55fe --- /dev/null +++ b/browser/devtools/webconsole/test/browser_console_copy_command.js @@ -0,0 +1,70 @@ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* 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/. */ + +// Tests that the `copy` console helper works as intended. + +let gWebConsole, gJSTerm; + +let TEXT = "Lorem ipsum dolor sit amet, consectetur adipisicing " + + "elit, sed do eiusmod tempor incididunt ut labore et dolore magna " + + "aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco " + + "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " + + "dolor in reprehenderit in voluptate velit esse cillum dolore eu " + + "fugiat nulla pariatur. Excepteur sint occaecat cupidatat non " + + "proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + + new Date(); + +let ID = "select-me"; + +add_task(function* init() { + yield loadTab("data:text/html;charset=utf-8," + + "" + + "
" + + "

Testing copy command

" + + "

This is some example text

" + + "

"+TEXT+"

" + + "
" + + "

" + + ""); + + gWebConsole = yield openConsole(); + gJSTerm = gWebConsole.jsterm; +}); + +add_task(function* test_copy() { + let RANDOM = Math.random(); + let string = "Text: " + RANDOM; + let obj = {a: 1, b: "foo", c: RANDOM}; + + let samples = [[RANDOM, RANDOM], + [JSON.stringify(string), string], + [obj.toSource(), JSON.stringify(obj, null, " ")], + ["$('#" + ID + "')", content.document.getElementById(ID).outerHTML] + ]; + for (let [source, reference] of samples) { + let deferredResult = promise.defer(); + + SimpleTest.waitForClipboard( + "" + reference, + () => { + let command = "copy(" + source + ")"; + info("Attempting to copy: " + source); + info("Executing command: " + command); + gJSTerm.execute(command, msg => { + is(msg, undefined, "Command success: " + command); + }); + }, + deferredResult.resolve, + deferredResult.reject); + + yield deferredResult.promise; + } +}); + +add_task(function* cleanup() { + gWebConsole = gJSTerm = null; + gBrowser.removeTab(gBrowser.selectedTab); + finishTest(); +}); diff --git a/browser/devtools/webconsole/webconsole.js b/browser/devtools/webconsole/webconsole.js index db82c7078742..3e9246d884fb 100644 --- a/browser/devtools/webconsole/webconsole.js +++ b/browser/devtools/webconsole/webconsole.js @@ -3282,6 +3282,9 @@ JSTerm.prototype = { case "help": this.hud.owner.openLink(HELP_URL); break; + case "copyValueToClipboard": + clipboardHelper.copyString(helperResult.value); + break; } } diff --git a/toolkit/devtools/webconsole/utils.js b/toolkit/devtools/webconsole/utils.js index 3dd4eb6257fd..f237330a8782 100644 --- a/toolkit/devtools/webconsole/utils.js +++ b/toolkit/devtools/webconsole/utils.js @@ -1752,6 +1752,33 @@ function JSTermHelpers(aOwner) // inert by coercing it to a String. return String(Cu.waiveXrays(aValue)); }; + + /** + * Copy the String representation of a value to the clipboard. + * + * @param any aValue + * A value you want to copy as a string. + * @return void + */ + aOwner.sandbox.copy = function JSTH_copy(aValue) + { + let payload; + try { + if (aValue instanceof Ci.nsIDOMElement) { + payload = aValue.outerHTML; + } else if (typeof aValue == "string") { + payload = aValue; + } else { + payload = JSON.stringify(aValue, null, " "); + } + } catch (ex) { + payload = "/* " + ex + " */"; + } + aOwner.helperResult = { + type: "copyValueToClipboard", + value: payload, + }; + }; } exports.JSTermHelpers = JSTermHelpers;