diff options
Diffstat (limited to 'devtools/shared/platform/content')
-rw-r--r-- | devtools/shared/platform/content/.eslintrc.js | 12 | ||||
-rw-r--r-- | devtools/shared/platform/content/clipboard.js | 34 | ||||
-rw-r--r-- | devtools/shared/platform/content/moz.build | 16 | ||||
-rw-r--r-- | devtools/shared/platform/content/stack.js | 49 | ||||
-rw-r--r-- | devtools/shared/platform/content/test/.eslintrc.js | 6 | ||||
-rw-r--r-- | devtools/shared/platform/content/test/mochitest.ini | 5 | ||||
-rw-r--r-- | devtools/shared/platform/content/test/test_clipboard.html | 53 | ||||
-rw-r--r-- | devtools/shared/platform/content/test/test_stack.js | 48 | ||||
-rw-r--r-- | devtools/shared/platform/content/test/xpcshell.ini | 7 |
9 files changed, 230 insertions, 0 deletions
diff --git a/devtools/shared/platform/content/.eslintrc.js b/devtools/shared/platform/content/.eslintrc.js new file mode 100644 index 000000000..515fe0261 --- /dev/null +++ b/devtools/shared/platform/content/.eslintrc.js @@ -0,0 +1,12 @@ +"use strict"; + +module.exports = { + // Extend from the devtools eslintrc. + "extends": "../../../.eslintrc.js", + + "rules": { + /* eslint-disable max-len */ + // All code in this directory must be content-clean. + "mozilla/reject-some-requires": ["error", "^(chrome|chrome:.*|resource:.*|devtools/server/.*|.*\\.jsm|devtools/shared/platform/(chome|content)/.*)$"], + }, +}; diff --git a/devtools/shared/platform/content/clipboard.js b/devtools/shared/platform/content/clipboard.js new file mode 100644 index 000000000..b43b996c2 --- /dev/null +++ b/devtools/shared/platform/content/clipboard.js @@ -0,0 +1,34 @@ +/* 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/. */ + +// Helpers for clipboard handling. + +/* globals document */ + +"use strict"; + +function copyString(string) { + let doCopy = function (e) { + e.clipboardData.setData("text/plain", string); + e.preventDefault(); + }; + + document.addEventListener("copy", doCopy); + document.execCommand("copy", false, null); + document.removeEventListener("copy", doCopy); +} + +function getCurrentFlavors() { + // See bug 1295692. + return []; +} + +function getData() { + // See bug 1295692. + return null; +} + +exports.copyString = copyString; +exports.getCurrentFlavors = getCurrentFlavors; +exports.getData = getData; diff --git a/devtools/shared/platform/content/moz.build b/devtools/shared/platform/content/moz.build new file mode 100644 index 000000000..b62205eb8 --- /dev/null +++ b/devtools/shared/platform/content/moz.build @@ -0,0 +1,16 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# 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/. + +DevToolsModules( + 'clipboard.js', + 'stack.js', +) + +XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini'] + +MOCHITEST_MANIFESTS += [ + 'test/mochitest.ini', +] diff --git a/devtools/shared/platform/content/stack.js b/devtools/shared/platform/content/stack.js new file mode 100644 index 000000000..87c7c4111 --- /dev/null +++ b/devtools/shared/platform/content/stack.js @@ -0,0 +1,49 @@ +/* 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/. */ + +// A few wrappers for stack-manipulation. This version of the module +// is used in content code. Note that this particular copy of the +// file can only be loaded via require(), because Cu.import doesn't +// exist in the content case. So, we don't need the code to handle +// both require and import here. + +"use strict"; + +/** + * Looks like Cu.callFunctionWithAsyncStack, but just calls the callee. + */ +function callFunctionWithAsyncStack(callee, stack, id) { + return callee(); +} + +/** + * Return a description of the Nth caller, suitable for logging. + * + * @param {Number} n the caller to describe + * @return {String} a description of the nth caller. + */ +function describeNthCaller(n) { + if (isWorker) { + return ""; + } + + let stack = new Error().stack.split("\n"); + // Add one here to skip this function. + return stack[n + 1]; +} + +/** + * Return a stack object that can be serialized and, when + * deserialized, passed to callFunctionWithAsyncStack. + */ +function getStack() { + // There's no reason for this to do anything fancy, since it's only + // used to pass back into callFunctionWithAsyncStack, which we can't + // implement. + return null; +} + +exports.callFunctionWithAsyncStack = callFunctionWithAsyncStack; +exports.describeNthCaller = describeNthCaller; +exports.getStack = getStack; diff --git a/devtools/shared/platform/content/test/.eslintrc.js b/devtools/shared/platform/content/test/.eslintrc.js new file mode 100644 index 000000000..59adf410a --- /dev/null +++ b/devtools/shared/platform/content/test/.eslintrc.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + // Extend from the common devtools xpcshell eslintrc config. + "extends": "../../../../.eslintrc.xpcshell.js" +}; diff --git a/devtools/shared/platform/content/test/mochitest.ini b/devtools/shared/platform/content/test/mochitest.ini new file mode 100644 index 000000000..f62cada6b --- /dev/null +++ b/devtools/shared/platform/content/test/mochitest.ini @@ -0,0 +1,5 @@ +[DEFAULT] +support-files = + +[test_clipboard.html] +subsuite = clipboard diff --git a/devtools/shared/platform/content/test/test_clipboard.html b/devtools/shared/platform/content/test/test_clipboard.html new file mode 100644 index 000000000..ccf5e6ccf --- /dev/null +++ b/devtools/shared/platform/content/test/test_clipboard.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=1290230 +--> +<head> + <title>Test for Bug 1290230 - clipboard helpers</title> + <script type="text/javascript" src="/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" + href="chrome://mochikit/content/tests/SimpleTest/test.css"> + <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script> + +<script type="application/javascript;version=1.8"> +"use strict"; +var exports = {} +</script> + + <script type="application/javascript;version=1.8" + src="resource://devtools/shared/platform/content/clipboard.js"></script> + +</head> +<body onload="do_tests()"> +<script type="application/javascript;version=1.8"> +"use strict"; + +const RESULT = "lark bunting"; + +function doCopy(e) { + console.log(e.isTrusted); + copyString(RESULT); +} + +function do_tests() { + let elt = document.querySelector("#key"); + elt.addEventListener("keydown", doCopy); + + // Set the clipboard to something other than what we expect. + SpecialPowers.clipboardCopyString("snowy owl"); + + elt.focus(); + synthesizeKey("x", {}); + + is(SpecialPowers.getClipboardData("text/unicode"), RESULT, "clipboard copying worked"); + + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +</script> +<div id="key" tabindex="-1">Type Here</div> +</body> diff --git a/devtools/shared/platform/content/test/test_stack.js b/devtools/shared/platform/content/test/test_stack.js new file mode 100644 index 000000000..4dbb66541 --- /dev/null +++ b/devtools/shared/platform/content/test/test_stack.js @@ -0,0 +1,48 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// There isn't really very much about the content stack.js that we can +// test, but we'll do what we can. + +"use strict"; + +var Cu = Components.utils; +const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); + +// Make sure to explicitly require the content version of this module. +// We have to use the ".." trick due to the way the loader remaps +// devtools/shared/platform. +const { + callFunctionWithAsyncStack, + getStack, + describeNthCaller +} = require("devtools/shared/platform/../content/stack"); + +function f3() { + return describeNthCaller(2); +} + +function f2() { + return f3(); +} + +function f1() { + return f2(); +} + +function run_test() { + let value = 7; + + const changeValue = () => { + value = 9; + }; + + callFunctionWithAsyncStack(changeValue, getStack(), "test_stack"); + equal(value, 9, "callFunctionWithAsyncStack worked"); + + let stack = getStack(); + equal(JSON.parse(JSON.stringify(stack)), stack, "stack is serializable"); + + let desc = f1(); + ok(desc.includes("f1"), "stack description includes f1"); +} diff --git a/devtools/shared/platform/content/test/xpcshell.ini b/devtools/shared/platform/content/test/xpcshell.ini new file mode 100644 index 000000000..fa475165a --- /dev/null +++ b/devtools/shared/platform/content/test/xpcshell.ini @@ -0,0 +1,7 @@ +[DEFAULT] +tags = devtools +head = +tail = +firefox-appdir = browser + +[test_stack.js] |