From 1b032e857a9aa36d4ab6e836bd2b45222bc09e79 Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 13 Feb 2019 07:54:47 +0000 Subject: [PATCH 01/79] Bug 1519455 - Fix browser_service_workers_push.js for sw-e10s refactor;r=daisuke Differential Revision: https://phabricator.services.mozilla.com/D19466 --HG-- extra : moz-landing-system : lando --- .../aboutdebugging/test/browser_service_workers_push.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/devtools/client/aboutdebugging/test/browser_service_workers_push.js b/devtools/client/aboutdebugging/test/browser_service_workers_push.js index 4a63900be390..66b1a7a91e34 100644 --- a/devtools/client/aboutdebugging/test/browser_service_workers_push.js +++ b/devtools/client/aboutdebugging/test/browser_service_workers_push.js @@ -46,6 +46,11 @@ add_task(async function() { await waitForServiceWorkerActivation(SERVICE_WORKER, document); + info("Wait until the service worker is running"); + const container = await waitUntilServiceWorkerContainer(SERVICE_WORKER, document); + await waitUntil( + () => container.querySelector(".target-status").textContent === "Running", 100); + // Retrieve the Push button for the worker. const names = [...document.querySelectorAll("#service-workers .target-name")]; const name = names.filter(element => element.textContent === SERVICE_WORKER)[0]; From 60c129086476beea95ac9f004dac08238b5e5938 Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Tue, 12 Feb 2019 18:20:40 +0000 Subject: [PATCH 02/79] Bug 1525654 - Move version compatibility check to dedicated module and add unit-tests;r=ochameau Differential Revision: https://phabricator.services.mozilla.com/D18934 --HG-- extra : moz-landing-system : lando --- .../client/shared/remote-debugging/moz.build | 5 + .../remote-debugging/test/unit/.eslintrc.js | 6 + .../test/unit/test_version_checker.js | 110 +++++++++++++ .../test/unit/xpcshell-head.js | 8 + .../remote-debugging/test/unit/xpcshell.ini | 7 + .../remote-debugging/version-checker.js | 147 ++++++++++++++++++ devtools/client/webide/content/webide.js | 11 +- devtools/shared/client/debugger-client.js | 87 ----------- 8 files changed, 291 insertions(+), 90 deletions(-) create mode 100644 devtools/client/shared/remote-debugging/test/unit/.eslintrc.js create mode 100644 devtools/client/shared/remote-debugging/test/unit/test_version_checker.js create mode 100644 devtools/client/shared/remote-debugging/test/unit/xpcshell-head.js create mode 100644 devtools/client/shared/remote-debugging/test/unit/xpcshell.ini create mode 100644 devtools/client/shared/remote-debugging/version-checker.js diff --git a/devtools/client/shared/remote-debugging/moz.build b/devtools/client/shared/remote-debugging/moz.build index 9b07501b074b..dc61c6082f71 100644 --- a/devtools/client/shared/remote-debugging/moz.build +++ b/devtools/client/shared/remote-debugging/moz.build @@ -6,7 +6,12 @@ DevToolsModules( 'remote-client-manager.js', + 'version-checker.js', ) +XPCSHELL_TESTS_MANIFESTS += [ + 'test/unit/xpcshell.ini' +] + with Files('**'): BUG_COMPONENT = ('DevTools', 'about:debugging') \ No newline at end of file diff --git a/devtools/client/shared/remote-debugging/test/unit/.eslintrc.js b/devtools/client/shared/remote-debugging/test/unit/.eslintrc.js new file mode 100644 index 000000000000..54a9a6361b5c --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/unit/.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/client/shared/remote-debugging/test/unit/test_version_checker.js b/devtools/client/shared/remote-debugging/test/unit/test_version_checker.js new file mode 100644 index 000000000000..ca99f1e70d0a --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/unit/test_version_checker.js @@ -0,0 +1,110 @@ +/* global equal */ + +"use strict"; + +const { + _compareVersionCompatibility, + checkVersionCompatibility, + COMPATIBILITY_STATUS, +} = require("devtools/client/shared/remote-debugging/version-checker"); + +const TEST_DATA = [ + { + description: "same build date and same version number", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version in range (-1)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "59.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version in range (-2)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "58.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version in range (-2 Nightly)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "58.0a1", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same build date and older version out of range (-3)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "57.0", + expected: COMPATIBILITY_STATUS.TOO_OLD, + }, + { + description: "same build date and newer version out of range (+1)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190131000000", + runtimeVersion: "61.0", + expected: COMPATIBILITY_STATUS.TOO_RECENT, + }, + { + description: "same major version and build date in range (-10 days)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190121000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same major version and build date in range (+2 days)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190202000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.COMPATIBLE, + }, + { + description: "same major version and build date out of range (+8 days)", + localBuildId: "20190131000000", + localVersion: "60.0", + runtimeBuildId: "20190208000000", + runtimeVersion: "60.0", + expected: COMPATIBILITY_STATUS.TOO_RECENT, + }, +]; + +add_task(async function testVersionChecker() { + for (const testData of TEST_DATA) { + const localDescription = { + appbuildid: testData.localBuildId, + platformversion: testData.localVersion, + }; + + const runtimeDescription = { + appbuildid: testData.runtimeBuildId, + platformversion: testData.runtimeVersion, + }; + + const report = _compareVersionCompatibility(localDescription, runtimeDescription); + equal(report.status, testData.expected, + "Expected status for test: " + testData.description); + } +}); + +add_task(async function testVersionCheckWithVeryOldClient() { + // Use an empty object as debugger client, calling any method on it will fail. + const emptyClient = {}; + const report = await checkVersionCompatibility(emptyClient); + equal(report.status, COMPATIBILITY_STATUS.TOO_OLD, + "Report status too old if debugger client is not implementing expected interface"); +}); diff --git a/devtools/client/shared/remote-debugging/test/unit/xpcshell-head.js b/devtools/client/shared/remote-debugging/test/unit/xpcshell-head.js new file mode 100644 index 000000000000..93a0b0881fbe --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/unit/xpcshell-head.js @@ -0,0 +1,8 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* eslint no-unused-vars: [2, {"vars": "local"}] */ + +const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm"); diff --git a/devtools/client/shared/remote-debugging/test/unit/xpcshell.ini b/devtools/client/shared/remote-debugging/test/unit/xpcshell.ini new file mode 100644 index 000000000000..a5aaef147534 --- /dev/null +++ b/devtools/client/shared/remote-debugging/test/unit/xpcshell.ini @@ -0,0 +1,7 @@ +[DEFAULT] +tags = devtools +head = xpcshell-head.js +firefox-appdir = browser +skip-if = toolkit == 'android' + +[test_version_checker.js] diff --git a/devtools/client/shared/remote-debugging/version-checker.js b/devtools/client/shared/remote-debugging/version-checker.js new file mode 100644 index 000000000000..4d606cac3330 --- /dev/null +++ b/devtools/client/shared/remote-debugging/version-checker.js @@ -0,0 +1,147 @@ +/* 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"; + +const Services = require("Services"); +const {AppConstants} = require("resource://gre/modules/AppConstants.jsm"); + +const MS_PER_DAY = 1000 * 60 * 60 * 24; + +const COMPATIBILITY_STATUS = { + COMPATIBLE: "compatible", + TOO_OLD: "too-old", + TOO_RECENT: "too-recent", +}; +exports.COMPATIBILITY_STATUS = COMPATIBILITY_STATUS; + +function getDateFromBuildID(buildID) { + // Build IDs are a timestamp in the yyyyMMddHHmmss format. + // Extract the year, month and day information. + const fields = buildID.match(/(\d{4})(\d{2})(\d{2})/); + // Date expects 0 - 11 for months + const month = Number.parseInt(fields[2], 10) - 1; + return new Date(fields[1], month, fields[3]); +} + +function getMajorVersion(platformVersion) { + // Retrieve the major platform version, i.e. if we are on Firefox 64.0a1, it will be 64. + return Number.parseInt(platformVersion.match(/\d+/)[0], 10); +} + +/** + * Compute the minimum and maximum supported version for remote debugging for the provided + * version of Firefox. Backward compatibility policy for devtools supports at most 2 + * versions older than the current version. + * + * @param {String} localVersion + * The version of the local Firefox instance, eg "67.0" + * @return {Object} + * - minVersion {String} the minimum supported version, eg "65.0a1" + * - maxVersion {String} the first unsupported version, eg "68.0a1" + */ +function computeMinMaxVersion(localVersion) { + // Retrieve the major platform version, i.e. if we are on Firefox 64.0a1, it will be 64. + const localMajorVersion = getMajorVersion(localVersion); + + return { + // Define the minimum officially supported version of Firefox when connecting to a + // remote runtime. (Use ".0a1" to support the very first nightly version) + // This matches the release channel's version when we are on nightly, + // or 2 versions before when we are on other channels. + minVersion: (localMajorVersion - 2) + ".0a1", + // The maximum version is the first excluded from the support range. That's why we + // increase the current version by 1 and use ".0a1" to point to the first Nightly. + // We do not support forward compatibility at all. + maxVersion: (localMajorVersion + 1) + ".0a1", + }; +} + +/** + * Tells if the remote device is using a supported version of Firefox. + * + * @param {DebuggerClient} debuggerClient + * DebuggerClient instance connected to the target remote Firefox. + * @return Object with the following attributes: + * * String status, one of COMPATIBILITY_STATUS + * COMPATIBLE if the runtime is compatible, + * TOO_RECENT if the runtime uses a too recent version, + * TOO_OLD if the runtime uses a too old version. + * * String minVersion + * The minimum supported version. + * * String runtimeVersion + * The remote runtime version. + * * String localID + * Build ID of local runtime. A date with like this: YYYYMMDD. + * * String deviceID + * Build ID of remote runtime. A date with like this: YYYYMMDD. + */ +async function checkVersionCompatibility(debuggerClient) { + const localDescription = { + appbuildid: Services.appinfo.appBuildID, + platformversion: AppConstants.MOZ_APP_VERSION, + }; + + try { + const deviceFront = await debuggerClient.mainRoot.getFront("device"); + const description = await deviceFront.getDescription(); + return _compareVersionCompatibility(localDescription, description); + } catch (e) { + // If we failed to retrieve the device description, assume we are trying to connect to + // a really old version of Firefox. + const localVersion = localDescription.platformversion; + const { minVersion } = computeMinMaxVersion(localVersion); + return { + minVersion, + runtimeVersion: "<55", + status: COMPATIBILITY_STATUS.TOO_OLD, + }; + } +} +exports.checkVersionCompatibility = checkVersionCompatibility; + +function _compareVersionCompatibility(localDescription, deviceDescription) { + const runtimeID = deviceDescription.appbuildid.substr(0, 8); + const localID = localDescription.appbuildid.substr(0, 8); + + const runtimeDate = getDateFromBuildID(runtimeID); + const localDate = getDateFromBuildID(localID); + + const runtimeVersion = deviceDescription.platformversion; + const localVersion = localDescription.platformversion; + + const { minVersion, maxVersion } = computeMinMaxVersion(localVersion); + const isTooOld = Services.vc.compare(runtimeVersion, minVersion) < 0; + const isTooRecent = Services.vc.compare(runtimeVersion, maxVersion) >= 0; + + const runtimeMajorVersion = getMajorVersion(runtimeVersion); + const localMajorVersion = getMajorVersion(localVersion); + const isSameMajorVersion = runtimeMajorVersion === localMajorVersion; + + let status; + if (isTooOld) { + status = COMPATIBILITY_STATUS.TOO_OLD; + } else if (isTooRecent) { + status = COMPATIBILITY_STATUS.TOO_RECENT; + } else if (isSameMajorVersion && runtimeDate - localDate > 7 * MS_PER_DAY) { + // If both local and remote runtimes have the same major version, compare build dates. + // This check is useful for Gecko developers as we might introduce breaking changes + // within a Nightly cycle. + // Still allow devices to be newer by up to a week. This accommodates those with local + // device builds, since their devices will almost always be newer than the client. + status = COMPATIBILITY_STATUS.TOO_RECENT; + } else { + status = COMPATIBILITY_STATUS.COMPATIBLE; + } + + return { + localID, + minVersion, + runtimeID, + runtimeVersion, + status, + }; +} +// Exported for tests. +exports._compareVersionCompatibility = _compareVersionCompatibility; diff --git a/devtools/client/webide/content/webide.js b/devtools/client/webide/content/webide.js index 27e92c2b8866..8e0b96d66970 100644 --- a/devtools/client/webide/content/webide.js +++ b/devtools/client/webide/content/webide.js @@ -20,6 +20,10 @@ const {getJSON} = require("devtools/client/shared/getjson"); const Telemetry = require("devtools/client/shared/telemetry"); const {RuntimeScanners} = require("devtools/client/webide/modules/runtimes"); const {openContentLink} = require("devtools/client/shared/link"); +const { + checkVersionCompatibility, + COMPATIBILITY_STATUS, +} = require("devtools/client/shared/remote-debugging/version-checker"); loader.lazyRequireGetter(this, "adbAddon", "devtools/shared/adb/adb-addon", true); @@ -737,12 +741,13 @@ var UI = { async checkRuntimeVersion() { if (AppManager.connected) { const { client } = AppManager.connection; - const report = await client.checkRuntimeVersion(); - if (report.incompatible == "too-recent") { + const report = await checkVersionCompatibility(client); + + if (report.status == COMPATIBILITY_STATUS.TOO_RECENT) { this.reportError("error_runtimeVersionTooRecent", report.runtimeID, report.localID); } - if (report.incompatible == "too-old") { + if (report.status == COMPATIBILITY_STATUS.TOO_OLD) { this.reportError("error_runtimeVersionTooOld", report.runtimeVersion, report.minVersion); } diff --git a/devtools/shared/client/debugger-client.js b/devtools/shared/client/debugger-client.js index 182719515cdb..999b6da8f700 100644 --- a/devtools/shared/client/debugger-client.js +++ b/devtools/shared/client/debugger-client.js @@ -4,9 +4,7 @@ "use strict"; -const Services = require("Services"); const promise = require("devtools/shared/deprecated-sync-thenables"); -const {AppConstants} = require("resource://gre/modules/AppConstants.jsm"); const DevToolsUtils = require("devtools/shared/DevToolsUtils"); const { getStack, callFunctionWithAsyncStack } = require("devtools/shared/platform/stack"); @@ -29,17 +27,6 @@ loader.lazyRequireGetter(this, "ObjectClient", "devtools/shared/client/object-cl loader.lazyRequireGetter(this, "Pool", "devtools/shared/protocol", true); loader.lazyRequireGetter(this, "Front", "devtools/shared/protocol", true); -// Retrieve the major platform version, i.e. if we are on Firefox 64.0a1, it will be 64. -const PLATFORM_MAJOR_VERSION = AppConstants.MOZ_APP_VERSION.match(/\d+/)[0]; - -// Define the minimum officially supported version of Firefox when connecting to a remote -// runtime. (Use ".0a1" to support the very first nightly version) -// This matches the release channel's version when we are on nightly, -// or 2 versions before when we are on other channels. -const MIN_SUPPORTED_PLATFORM_VERSION = (PLATFORM_MAJOR_VERSION - 2) + ".0a1"; - -const MS_PER_DAY = 86400000; - /** * Creates a client for the remote debugging protocol server. This client * provides the means to communicate with the server and exchange the messages @@ -201,80 +188,6 @@ DebuggerClient.prototype = { return deferred.promise; }, - /** - * Tells if the remote device is using a supported version of Firefox. - * - * @return Object with the following attributes: - * * String incompatible - * null if the runtime is compatible, - * "too-recent" if the runtime uses a too recent version, - * "too-old" if the runtime uses a too old version. - * * String minVersion - * The minimum supported version. - * * String runtimeVersion - * The remote runtime version. - * * String localID - * Build ID of local runtime. A date with like this: YYYYMMDD. - * * String deviceID - * Build ID of remote runtime. A date with like this: YYYYMMDD. - */ - async checkRuntimeVersion() { - const localID = Services.appinfo.appBuildID.substr(0, 8); - - let deviceFront; - try { - deviceFront = await this.mainRoot.getFront("device"); - } catch (e) { - // On 7 * MS_PER_DAY) { - incompatible = "too-recent"; - } - - // 2) Check for too old Firefox on device - const platformversion = desc.platformversion; - if (Services.vc.compare(platformversion, MIN_SUPPORTED_PLATFORM_VERSION) < 0) { - incompatible = "too-old"; - } - - return { - incompatible, - minVersion: MIN_SUPPORTED_PLATFORM_VERSION, - runtimeVersion: platformversion, - localID, - runtimeID, - }; - }, - /** * Shut down communication with the debugging server. * From f56506f96645780eb8ca6a8db757c37023cde747 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Wed, 13 Feb 2019 08:42:47 +0000 Subject: [PATCH 03/79] Bug 1527515 - Enable building BinAST on win32 and android nightlies. r=Yoric Differential Revision: https://phabricator.services.mozilla.com/D19608 --HG-- extra : moz-landing-system : lando --- js/moz.configure | 8 +++----- .../meta/binast/domain-restrict-included.https.html.ini | 2 +- .../web-platform/mozilla/meta/binast/large.https.html.ini | 2 +- .../web-platform/mozilla/meta/binast/small.https.html.ini | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/js/moz.configure b/js/moz.configure index 48a73cad20bf..cd26f93e8d96 100644 --- a/js/moz.configure +++ b/js/moz.configure @@ -488,11 +488,9 @@ set_define('ENABLE_PIPELINE_OPERATOR', enable_pipeline_operator) # Experimental support for BinAST # ============================================================== -@depends(target, milestone) -def enable_build_binast(target, milestone): - # For reasons unknown at this time, BinAST causes timeouts on win32 - # and failures on Android. - if milestone.is_nightly and not (target.kernel == 'WINNT' and target.cpu == 'x86') and not (target.os == 'Android'): +@depends(milestone) +def enable_build_binast(milestone): + if milestone.is_nightly: return True set_define('JS_BUILD_BINAST', enable_build_binast) diff --git a/testing/web-platform/mozilla/meta/binast/domain-restrict-included.https.html.ini b/testing/web-platform/mozilla/meta/binast/domain-restrict-included.https.html.ini index 1545dfe1a311..f8a0a216fd3b 100644 --- a/testing/web-platform/mozilla/meta/binast/domain-restrict-included.https.html.ini +++ b/testing/web-platform/mozilla/meta/binast/domain-restrict-included.https.html.ini @@ -3,5 +3,5 @@ dom.script_loader.binast_encoding.domain.restrict.list:web-platform.test] [Check we can load BinAST if the host is included in the list] expected: - if release_or_beta or (os == "android") or ((os == "win") and (processor == "x86")): FAIL + if release_or_beta: FAIL diff --git a/testing/web-platform/mozilla/meta/binast/large.https.html.ini b/testing/web-platform/mozilla/meta/binast/large.https.html.ini index 91e737c7a3c1..26a3c05ba592 100644 --- a/testing/web-platform/mozilla/meta/binast/large.https.html.ini +++ b/testing/web-platform/mozilla/meta/binast/large.https.html.ini @@ -2,5 +2,5 @@ prefs: [dom.script_loader.binast_encoding.domain.restrict:false] [Check we can load BinAST over HTTPS] expected: - if release_or_beta or (os == "android") or ((os == "win") and (processor == "x86")): FAIL + if release_or_beta: FAIL diff --git a/testing/web-platform/mozilla/meta/binast/small.https.html.ini b/testing/web-platform/mozilla/meta/binast/small.https.html.ini index 87c46000a426..f17a41d3cabd 100644 --- a/testing/web-platform/mozilla/meta/binast/small.https.html.ini +++ b/testing/web-platform/mozilla/meta/binast/small.https.html.ini @@ -2,5 +2,5 @@ prefs: [dom.script_loader.binast_encoding.domain.restrict:false] [Check we can load BinAST over HTTPS] expected: - if release_or_beta or (os == "android") or ((os == "win") and (processor == "x86")): FAIL + if release_or_beta: FAIL From 0fc02b55a8bed6c55e9580cc503e745be0791ea7 Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Fri, 8 Feb 2019 20:05:34 +0000 Subject: [PATCH 04/79] Bug 1523454 - Expose isParentInterceptEnabled in nsIServiceWorkerManager;r=asuth Feel free to cancel the review if you already have a patch or if you wanted another approach. Mostly wrote this patch to make sure the DevTools patch on top of it would work. Differential Revision: https://phabricator.services.mozilla.com/D19159 --HG-- extra : moz-landing-system : lando --- dom/interfaces/base/nsIServiceWorkerManager.idl | 2 ++ dom/serviceworkers/ServiceWorkerManager.cpp | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/dom/interfaces/base/nsIServiceWorkerManager.idl b/dom/interfaces/base/nsIServiceWorkerManager.idl index 3e3e28749ca3..40edff1cf582 100644 --- a/dom/interfaces/base/nsIServiceWorkerManager.idl +++ b/dom/interfaces/base/nsIServiceWorkerManager.idl @@ -180,6 +180,8 @@ interface nsIServiceWorkerManager : nsISupports void addListener(in nsIServiceWorkerManagerListener aListener); void removeListener(in nsIServiceWorkerManagerListener aListener); + + bool isParentInterceptEnabled(); }; %{ C++ diff --git a/dom/serviceworkers/ServiceWorkerManager.cpp b/dom/serviceworkers/ServiceWorkerManager.cpp index 358eaf3eb99c..89985591ae48 100644 --- a/dom/serviceworkers/ServiceWorkerManager.cpp +++ b/dom/serviceworkers/ServiceWorkerManager.cpp @@ -3010,5 +3010,12 @@ void ServiceWorkerManager::MaybeSendUnregister(nsIPrincipal* aPrincipal, NS_ConvertUTF8toUTF16(aScope)); } +NS_IMETHODIMP +ServiceWorkerManager::IsParentInterceptEnabled(bool* aIsEnabled) { + MOZ_ASSERT(NS_IsMainThread()); + *aIsEnabled = ServiceWorkerParentInterceptEnabled(); + return NS_OK; +} + } // namespace dom } // namespace mozilla From 8182c02ad6668f756be065af6c3085be8dd67f3c Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 13 Feb 2019 09:02:03 +0000 Subject: [PATCH 05/79] Bug 1523454 - Fix service worker active status for sw refactor;r=daisuke Depends on D19159 This will fix the test browser_aboutdebugging_serviceworker_status.js when running with dom.serviceWorkers.parent_intercept=true (`./mach test browser_aboutdebugging_serviceworker_status.js --setpref dom.serviceWorkers.parent_intercept=true`) Differential Revision: https://phabricator.services.mozilla.com/D18365 --HG-- extra : moz-landing-system : lando --- .../resources/service-workers/controlled-sw.html | 2 +- .../actors/worker/service-worker-registration.js | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html b/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html index aa388a14f653..98d3bffd9575 100644 --- a/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html +++ b/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html @@ -2,7 +2,7 @@ - Service worker push test + Service worker controlled + + + `; + +const SCRIPT = "window.parent.postMessage('script-loaded', '*');"; + +function handleRequest(request, response) +{ + // avoid confusing cache behaviors + response.setHeader("Cache-Control", "no-cache", false); + + let queryString = request.queryString; + + if (queryString === "load-frame") { + response.setHeader("Content-Security-Policy", "script-src 'nonce-123456789'", false); + response.setHeader("Content-Type", "text/html", false); + response.write(TEST_FRAME); + return; + } + + if (queryString === "redir-script") { + response.setStatusLine("1.1", 302, "Found"); + response.setHeader("Location", "file_nonce_snapshot.sjs?load-script", false); + return; + } + + if (queryString === "load-script") { + response.setHeader("Content-Type", "application/javascript", false); + response.write(SCRIPT); + return; + } + + // we should never get here but just in case return something unexpected + response.write("do'h"); +} diff --git a/dom/security/test/csp/mochitest.ini b/dom/security/test/csp/mochitest.ini index 3c3b6696050f..12efa09e4526 100644 --- a/dom/security/test/csp/mochitest.ini +++ b/dom/security/test/csp/mochitest.ini @@ -368,3 +368,6 @@ support-files = worker_helper.js main_csp_worker.html main_csp_worker.html^headers^ +[test_nonce_snapshot.html] +support-files = + file_nonce_snapshot.sjs diff --git a/dom/security/test/csp/test_nonce_snapshot.html b/dom/security/test/csp/test_nonce_snapshot.html new file mode 100644 index 000000000000..7e94e6df1cb2 --- /dev/null +++ b/dom/security/test/csp/test_nonce_snapshot.html @@ -0,0 +1,35 @@ + + + + + Bug 1509738 - Snapshot nonce at load start time + + + + + + + + + From 7859700e5db964adab89b4e5292f2ae056290abe Mon Sep 17 00:00:00 2001 From: Christoph Kerschbaumer Date: Wed, 13 Feb 2019 13:46:50 +0100 Subject: [PATCH 17/79] Bug 1509738 - CSP snapshot nonce at load start time. r=baku --HG-- extra : rebase_source : b532f519b79a3bc14ece0c0ee829edd400149e48 extra : amend_source : d4b8fba240a9d28437ee436b94313fd1602426c4 extra : histedit_source : 6af35eb388f6c23d80d8412533fec02abe2d4cff --- .../security/nsIContentSecurityPolicy.idl | 3 +- dom/script/ScriptLoader.cpp | 21 ++++++++++++ dom/security/nsCSPContext.cpp | 15 ++------- dom/security/nsCSPService.cpp | 26 +++++++-------- dom/security/test/unit/test_csp_reports.js | 10 +++--- ipc/glue/BackgroundUtils.cpp | 7 ++-- layout/style/Loader.cpp | 33 +++++++++++++++++++ netwerk/base/LoadInfo.cpp | 18 +++++++++- netwerk/base/LoadInfo.h | 5 ++- netwerk/base/nsILoadInfo.idl | 8 +++++ netwerk/ipc/NeckoChannelParams.ipdlh | 1 + 11 files changed, 112 insertions(+), 35 deletions(-) diff --git a/dom/interfaces/security/nsIContentSecurityPolicy.idl b/dom/interfaces/security/nsIContentSecurityPolicy.idl index c1f2716bb75b..5b736aee86f0 100644 --- a/dom/interfaces/security/nsIContentSecurityPolicy.idl +++ b/dom/interfaces/security/nsIContentSecurityPolicy.idl @@ -302,7 +302,8 @@ interface nsIContentSecurityPolicy : nsISerializable in nsISupports aContext, in ACString aMimeTypeGuess, in nsIURI aOriginalURIIfRedirect, - in bool aSendViolationReports); + in bool aSendViolationReports, + in AString aNonce); %{ C++ // nsIObserver topic to fire when the policy encounters a violation. diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index cef10861776d..96f24b7eaa9d 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -311,6 +311,16 @@ nsresult ScriptLoader::CheckContentPolicy(Document* aDocument, requestingNode, nsILoadInfo::SEC_ONLY_FOR_EXPLICIT_CONTENTSEC_CHECK, contentPolicyType); + // snapshot the nonce at load start time for performing CSP checks + if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_SCRIPT) { + nsCOMPtr element = do_QueryInterface(aContext); + if (element && element->IsHTMLElement()) { + nsAutoString cspNonce; + element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); + secCheckLoadInfo->SetCspNonce(cspNonce); + } + } + int16_t shouldLoad = nsIContentPolicy::ACCEPT; nsresult rv = NS_CheckContentLoadPolicy( aRequest->mURI, secCheckLoadInfo, NS_LossyConvertUTF16toASCII(aType), @@ -1252,6 +1262,17 @@ nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) { NS_ENSURE_SUCCESS(rv, rv); + // snapshot the nonce at load start time for performing CSP checks + if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_SCRIPT) { + nsCOMPtr element = do_QueryInterface(context); + if (element && element->IsHTMLElement()) { + nsAutoString cspNonce; + element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); + nsCOMPtr loadInfo = channel->GetLoadInfo(); + loadInfo->SetCspNonce(cspNonce); + } + } + // To avoid decoding issues, the build-id is part of the JSBytecodeMimeType // constant. aRequest->mCacheInfo = nullptr; diff --git a/dom/security/nsCSPContext.cpp b/dom/security/nsCSPContext.cpp index d954801a8a1b..e16e4e86bf8b 100644 --- a/dom/security/nsCSPContext.cpp +++ b/dom/security/nsCSPContext.cpp @@ -121,7 +121,8 @@ nsCSPContext::ShouldLoad(nsContentPolicyType aContentType, nsISupports* aRequestContext, const nsACString& aMimeTypeGuess, nsIURI* aOriginalURIIfRedirect, - bool aSendViolationReports, int16_t* outDecision) { + bool aSendViolationReports, const nsAString& aNonce, + int16_t* outDecision) { if (CSPCONTEXTLOGENABLED()) { CSPCONTEXTLOG(("nsCSPContext::ShouldLoad, aContentLocation: %s", aContentLocation->GetSpecOrDefault().get())); @@ -155,18 +156,8 @@ nsCSPContext::ShouldLoad(nsContentPolicyType aContentType, return NS_OK; } - nsAutoString nonce; bool parserCreated = false; if (!isPreload) { - if (aContentType == nsIContentPolicy::TYPE_SCRIPT || - aContentType == nsIContentPolicy::TYPE_STYLESHEET) { - nsCOMPtr element = do_QueryInterface(aRequestContext); - if (element && element->IsHTMLElement()) { - // XXXbz What about SVG elements that can have nonce? - element->GetAttribute(NS_LITERAL_STRING("nonce"), nonce); - } - } - nsCOMPtr script = do_QueryInterface(aRequestContext); if (script && script->GetParserCreated() != mozilla::dom::NOT_FROM_PARSER) { parserCreated = true; @@ -177,7 +168,7 @@ nsCSPContext::ShouldLoad(nsContentPolicyType aContentType, permitsInternal(dir, nullptr, // aTriggeringElement aCSPEventListener, aContentLocation, - aOriginalURIIfRedirect, nonce, isPreload, + aOriginalURIIfRedirect, aNonce, isPreload, false, // allow fallback to default-src aSendViolationReports, true, // send blocked URI in violation reports diff --git a/dom/security/nsCSPService.cpp b/dom/security/nsCSPService.cpp index 82b4678c488d..c40dda86ed15 100644 --- a/dom/security/nsCSPService.cpp +++ b/dom/security/nsCSPService.cpp @@ -172,6 +172,10 @@ CSPService::ShouldLoad(nsIURI *aContentLocation, nsILoadInfo *aLoadInfo, return NS_OK; } + nsAutoString cspNonce; + rv = aLoadInfo->GetCspNonce(cspNonce); + NS_ENSURE_SUCCESS(rv, rv); + // 1) Apply speculate CSP for preloads bool isPreload = nsContentUtils::IsPreloadType(contentType); @@ -186,7 +190,7 @@ CSPService::ShouldLoad(nsIURI *aContentLocation, nsILoadInfo *aLoadInfo, contentType, cspEventListener, aContentLocation, requestOrigin, requestContext, aMimeTypeGuess, nullptr, // no redirect, aOriginal URL is null. - aLoadInfo->GetSendCSPViolationEvents(), aDecision); + aLoadInfo->GetSendCSPViolationEvents(), cspNonce, aDecision); NS_ENSURE_SUCCESS(rv, rv); // if the preload policy already denied the load, then there @@ -207,7 +211,8 @@ CSPService::ShouldLoad(nsIURI *aContentLocation, nsILoadInfo *aLoadInfo, rv = csp->ShouldLoad(contentType, cspEventListener, aContentLocation, requestOrigin, requestContext, aMimeTypeGuess, nullptr, // no redirect, aOriginal URL is null. - aLoadInfo->GetSendCSPViolationEvents(), aDecision); + aLoadInfo->GetSendCSPViolationEvents(), cspNonce, + aDecision); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; @@ -251,17 +256,6 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, nsIAsyncVerifyRedirectCallback *callback) { net::nsAsyncRedirectAutoCallback autoCallback(callback); - if (XRE_IsE10sParentProcess()) { - nsCOMPtr parentChannel; - NS_QueryNotificationCallbacks(oldChannel, parentChannel); - if (parentChannel) { - // This is an IPC'd channel. Don't check it here, because we won't have - // access to the request context; we'll check them in the content - // process instead. Bug 1509738 covers fixing this. - return NS_OK; - } - } - nsCOMPtr newUri; nsresult rv = newChannel->GetURI(getter_AddRefs(newUri)); NS_ENSURE_SUCCESS(rv, rv); @@ -303,6 +297,10 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, return rv; } + nsAutoString cspNonce; + rv = loadInfo->GetCspNonce(cspNonce); + NS_ENSURE_SUCCESS(rv, rv); + bool isPreload = nsContentUtils::IsPreloadType(policyType); /* On redirect, if the content policy is a preload type, rejecting the preload @@ -330,6 +328,7 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, EmptyCString(), // ACString - MIME guess originalUri, // Original nsIURI true, // aSendViolationReports + cspNonce, // nonce &aDecision); // if the preload policy already denied the load, then there @@ -356,6 +355,7 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, EmptyCString(), // ACString - MIME guess originalUri, // Original nsIURI true, // aSendViolationReports + cspNonce, // nonce &aDecision); } diff --git a/dom/security/test/unit/test_csp_reports.js b/dom/security/test/unit/test_csp_reports.js index af90899bd690..d5ecd210af6c 100644 --- a/dom/security/test/unit/test_csp_reports.js +++ b/dom/security/test/unit/test_csp_reports.js @@ -153,7 +153,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SCRIPT, null, // nsICSPEventListener NetUtil.newURI("http://blocked.test/foo.js"), - null, null, null, null, true); + null, null, null, null, true, null); }); // test that inline script violations cause a report in report-only policy @@ -206,7 +206,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_IMAGE, null, // nsICSPEventListener NetUtil.newURI("data:image/png;base64," + base64data), - null, null, null, null, true); + null, null, null, null, true, null); }); // test that only the uri's scheme is reported for globally unique identifiers @@ -216,7 +216,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SUBDOCUMENT, null, // nsICSPEventListener NetUtil.newURI("intent://mymaps.com/maps?um=1&ie=UTF-8&fb=1&sll"), - null, null, null, null, true); + null, null, null, null, true, null); }); // test fragment removal @@ -227,7 +227,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SCRIPT, null, // nsICSPEventListener NetUtil.newURI(selfSpec + "#bar"), - null, null, null, null, true); + null, null, null, null, true, null); }); // test scheme of ftp: @@ -237,6 +237,6 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SCRIPT, null, // nsICSPEventListener NetUtil.newURI("ftp://blocked.test/profile.png"), - null, null, null, null, true); + null, null, null, null, true, null); }); } diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index c5331e7eefc1..9c7ed8a07ae9 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -457,6 +457,9 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo, ipcController = controller.ref().ToIPC(); } + nsAutoString cspNonce; + Unused << NS_WARN_IF(NS_FAILED(aLoadInfo->GetCspNonce(cspNonce))); + *aOptionalLoadInfoArgs = LoadInfoArgs( loadingPrincipalInfo, triggeringPrincipalInfo, principalToInheritInfo, sandboxedLoadingPrincipalInfo, topLevelPrincipalInfo, @@ -484,7 +487,7 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo, aLoadInfo->GetIsPreflight(), aLoadInfo->GetLoadTriggeredFromExternal(), aLoadInfo->GetServiceWorkerTaintingSynthesized(), aLoadInfo->GetDocumentHasUserInteracted(), - aLoadInfo->GetDocumentHasLoaded(), + aLoadInfo->GetDocumentHasLoaded(), cspNonce, aLoadInfo->GetIsFromProcessingFrameAttributes()); return NS_OK; @@ -640,7 +643,7 @@ nsresult LoadInfoArgsToLoadInfo( loadInfoArgs.isPreflight(), loadInfoArgs.loadTriggeredFromExternal(), loadInfoArgs.serviceWorkerTaintingSynthesized(), loadInfoArgs.documentHasUserInteracted(), - loadInfoArgs.documentHasLoaded()); + loadInfoArgs.documentHasLoaded(), loadInfoArgs.cspNonce()); if (loadInfoArgs.isFromProcessingFrameAttributes()) { loadInfo->SetIsFromProcessingFrameAttributes(); diff --git a/layout/style/Loader.cpp b/layout/style/Loader.cpp index 41e04cf7b1ba..1272dbd48ca9 100644 --- a/layout/style/Loader.cpp +++ b/layout/style/Loader.cpp @@ -858,6 +858,16 @@ nsresult Loader::CheckContentPolicy(nsIPrincipal* aLoadingPrincipal, aLoadingPrincipal, aTriggeringPrincipal, aRequestingNode, nsILoadInfo::SEC_ONLY_FOR_EXPLICIT_CONTENTSEC_CHECK, contentPolicyType); + // snapshot the nonce at load start time for performing CSP checks + if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET) { + nsCOMPtr element = do_QueryInterface(aRequestingNode); + if (element && element->IsHTMLElement()) { + nsAutoString cspNonce; + element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); + secCheckLoadInfo->SetCspNonce(cspNonce); + } + } + int16_t shouldLoad = nsIContentPolicy::ACCEPT; nsresult rv = NS_CheckContentLoadPolicy( aTargetURI, secCheckLoadInfo, NS_LITERAL_CSTRING("text/css"), &shouldLoad, @@ -1310,6 +1320,18 @@ nsresult Loader::LoadSheet(SheetLoadData* aLoadData, return rv; } + // snapshot the nonce at load start time for performing CSP checks + if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET) { + nsCOMPtr element = + do_QueryInterface(aLoadData->mRequestingNode); + if (element && element->IsHTMLElement()) { + nsAutoString cspNonce; + element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); + nsCOMPtr loadInfo = channel->GetLoadInfo(); + loadInfo->SetCspNonce(cspNonce); + } + } + nsCOMPtr stream; rv = channel->Open(getter_AddRefs(stream)); @@ -1438,6 +1460,17 @@ nsresult Loader::LoadSheet(SheetLoadData* aLoadData, return rv; } + // snapshot the nonce at load start time for performing CSP checks + if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET) { + nsCOMPtr element = do_QueryInterface(aLoadData->mRequestingNode); + if (element && element->IsHTMLElement()) { + nsAutoString cspNonce; + element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); + nsCOMPtr loadInfo = channel->GetLoadInfo(); + loadInfo->SetCspNonce(cspNonce); + } + } + if (!aLoadData->ShouldDefer()) { nsCOMPtr cos(do_QueryInterface(channel)); if (cos) { diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp index 0cc4f3e33964..a35b8ce525b7 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp @@ -478,6 +478,7 @@ LoadInfo::LoadInfo(const LoadInfo& rhs) mServiceWorkerTaintingSynthesized(false), mDocumentHasUserInteracted(rhs.mDocumentHasUserInteracted), mDocumentHasLoaded(rhs.mDocumentHasLoaded), + mCspNonce(rhs.mCspNonce), mIsFromProcessingFrameAttributes(rhs.mIsFromProcessingFrameAttributes) {} LoadInfo::LoadInfo( @@ -510,7 +511,7 @@ LoadInfo::LoadInfo( const nsTArray& aCorsUnsafeHeaders, bool aForcePreflight, bool aIsPreflight, bool aLoadTriggeredFromExternal, bool aServiceWorkerTaintingSynthesized, bool aDocumentHasUserInteracted, - bool aDocumentHasLoaded) + bool aDocumentHasLoaded, const nsAString& aCspNonce) : mLoadingPrincipal(aLoadingPrincipal), mTriggeringPrincipal(aTriggeringPrincipal), mPrincipalToInherit(aPrincipalToInherit), @@ -556,6 +557,7 @@ LoadInfo::LoadInfo( mServiceWorkerTaintingSynthesized(aServiceWorkerTaintingSynthesized), mDocumentHasUserInteracted(aDocumentHasUserInteracted), mDocumentHasLoaded(aDocumentHasLoaded), + mCspNonce(aCspNonce), mIsFromProcessingFrameAttributes(false) { // Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal MOZ_ASSERT(mLoadingPrincipal || @@ -1254,6 +1256,20 @@ LoadInfo::SetDocumentHasLoaded(bool aDocumentHasLoaded) { return NS_OK; } +NS_IMETHODIMP +LoadInfo::GetCspNonce(nsAString& aCspNonce) { + aCspNonce = mCspNonce; + return NS_OK; +} + +NS_IMETHODIMP +LoadInfo::SetCspNonce(const nsAString& aCspNonce) { + MOZ_ASSERT(!mInitialSecurityCheckDone, + "setting the nonce is only allowed before any sec checks"); + mCspNonce = aCspNonce; + return NS_OK; +} + NS_IMETHODIMP LoadInfo::GetIsTopLevelLoad(bool* aResult) { *aResult = mFrameOuterWindowID ? mFrameOuterWindowID == mOuterWindowID diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h index 0698cc86a559..851602553ebe 100644 --- a/netwerk/base/LoadInfo.h +++ b/netwerk/base/LoadInfo.h @@ -12,6 +12,7 @@ #include "nsIPrincipal.h" #include "nsIWeakReferenceUtils.h" // for nsWeakPtr #include "nsIURI.h" +#include "nsString.h" #include "nsTArray.h" #include "mozilla/BasePrincipal.h" @@ -121,7 +122,8 @@ class LoadInfo final : public nsILoadInfo { const nsTArray& aUnsafeHeaders, bool aForcePreflight, bool aIsPreflight, bool aLoadTriggeredFromExternal, bool aServiceWorkerTaintingSynthesized, - bool aDocumentHasUserInteracted, bool aDocumentHasLoaded); + bool aDocumentHasUserInteracted, bool aDocumentHasLoaded, + const nsAString& aCspNonce); LoadInfo(const LoadInfo& rhs); NS_IMETHOD GetRedirects(JSContext* aCx, @@ -198,6 +200,7 @@ class LoadInfo final : public nsILoadInfo { bool mServiceWorkerTaintingSynthesized; bool mDocumentHasUserInteracted; bool mDocumentHasLoaded; + nsString mCspNonce; // Is true if this load was triggered by processing the attributes of the // browsing context container. diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl index 92d99bd4d513..6a8ba66c1a47 100644 --- a/netwerk/base/nsILoadInfo.idl +++ b/netwerk/base/nsILoadInfo.idl @@ -1047,6 +1047,14 @@ interface nsILoadInfo : nsISupports */ [infallible] attribute boolean documentHasLoaded; + /** + * A snapshot of the nonce at load start time which is used for CSP + * checks and only set for: + * * TYPE_SCRIPT and + * * TYPE_STYLESHEET + */ + attribute AString cspNonce; + /** * The object in charged to receive CSP violation events. It can be null. * This attribute will be merged into the CSP object eventually. diff --git a/netwerk/ipc/NeckoChannelParams.ipdlh b/netwerk/ipc/NeckoChannelParams.ipdlh index ee8d38fb4ed1..267f9ea22aaa 100644 --- a/netwerk/ipc/NeckoChannelParams.ipdlh +++ b/netwerk/ipc/NeckoChannelParams.ipdlh @@ -109,6 +109,7 @@ struct LoadInfoArgs bool serviceWorkerTaintingSynthesized; bool documentHasUserInteracted; bool documentHasLoaded; + nsString cspNonce; bool isFromProcessingFrameAttributes; }; From ba57aee6c706ca04251af438226f1c4ba56b5ec2 Mon Sep 17 00:00:00 2001 From: Noemi Erli Date: Wed, 13 Feb 2019 10:42:53 +0000 Subject: [PATCH 18/79] Bug 1526265 - Disable payment-is-showing.https.html on Android !debug for frequent failures. r=jmaher Differential Revision: https://phabricator.services.mozilla.com/D19642 --HG-- extra : moz-landing-system : lando --- .../meta/payment-request/payment-is-showing.https.html.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testing/web-platform/meta/payment-request/payment-is-showing.https.html.ini b/testing/web-platform/meta/payment-request/payment-is-showing.https.html.ini index e78218eb8848..ec322235460a 100644 --- a/testing/web-platform/meta/payment-request/payment-is-showing.https.html.ini +++ b/testing/web-platform/meta/payment-request/payment-is-showing.https.html.ini @@ -1,4 +1,6 @@ [payment-is-showing.https.html] + disabled: + if (os == "android" and not debug): https://bugzilla.mozilla.org/show_bug.cgi?id=1526265 expected: if debug and not e10s and (os == "linux"): OK TIMEOUT From 25a38fd119c1d7de75c594e74d4b71f57843e6e7 Mon Sep 17 00:00:00 2001 From: Yura Zenevich Date: Wed, 13 Feb 2019 13:08:14 +0000 Subject: [PATCH 19/79] Bug 1424159 - make virtualized tree nodes tabbable similar to how the inspector markup tree works. r=nchevobbe MozReview-Commit-ID: LfSppQgpI0O Differential Revision: https://phabricator.services.mozilla.com/D18591 --HG-- extra : moz-landing-system : lando --- .../client/accessibility/accessibility.css | 31 ++- .../accessibility/components/Accessible.js | 39 +-- devtools/client/shared/components/List.js | 22 +- .../shared/components/VirtualizedTree.js | 170 ++++++++++-- .../components/test/mochitest/chrome.ini | 1 + .../test/mochitest/test_tree_12.html | 112 -------- .../test/mochitest/test_tree_14.html | 245 ++++++++++++++++++ devtools/client/shared/events.js | 22 ++ devtools/client/shared/moz.build | 1 + 9 files changed, 462 insertions(+), 181 deletions(-) create mode 100644 devtools/client/shared/components/test/mochitest/test_tree_14.html create mode 100644 devtools/client/shared/events.js diff --git a/devtools/client/accessibility/accessibility.css b/devtools/client/accessibility/accessibility.css index 3b3ee897ced4..42f9fe08a840 100644 --- a/devtools/client/accessibility/accessibility.css +++ b/devtools/client/accessibility/accessibility.css @@ -383,22 +383,31 @@ body { background-color: var(--theme-selection-background-hover); } -.accessible .tree:focus .node.focused { +.accessible .tree:focus .node.focused, +.accessible .tree .tree-node-active .node.focused { background-color: var(--theme-selection-background); } -.accessible .tree:focus .node.focused * { +.accessible .tree:focus .node.focused *, +.accessible .tree .tree-node-active .node.focused * { color: var(--theme-selection-color); } -.accessible .tree:focus .node.focused .open-inspector { +.accessible .tree:focus .node.focused .open-inspector, +.accessible .tree .tree-node-active .node.focused .open-inspector { background-color: var(--grey-30); } -.accessible .tree:focus .node.focused:hover .open-inspector { +.accessible .tree:focus .node.focused:hover .open-inspector, +.accessible .tree .tree-node-active .node.focused:hover .open-inspector { background-color: var(--theme-selection-color); } +.accessible .tree .tree-node-active .node.focused .open-inspector:focus, +.accessible .tree .tree-node-active .node.focused:hover .open-inspector:focus { + background-color: var(--grey-40); +} + .accessible .tree .arrow { flex-shrink: 0; } @@ -425,20 +434,28 @@ body { margin-inline-start: 5px; } -.accessible .tree:focus .node.focused .objectBox-accessible .accessible-role { +.accessible .tree:focus .node.focused .objectBox-accessible .accessible-role, +.accessible .tree .tree-node-active .node.focused .objectBox-accessible .accessible-role { background-color: var(--accessible-role-active-background-color); border-color: var(--accessible-role-active-border-color); color: var(--theme-selection-color); } -.accessible .tree:focus .node.focused .open-accessibility-inspector { +.accessible .tree:focus .node.focused .open-accessibility-inspector, +.accessible .tree .tree-node-active .node.focused .open-accessibility-inspector { background-color: var(--grey-30); } -.accessible .tree:focus .node.focused:hover .open-accessibility-inspector { +.accessible .tree:focus .node.focused:hover .open-accessibility-inspector, +.accessible .tree .tree-node-active .node.focused:hover .open-accessibility-inspector { background-color: var(--theme-selection-color); } +.accessible .tree .tree-node-active .node.focused .open-accessibility-inspector:focus, +.accessible .tree .tree-node-active .node.focused:hover .open-accessibility-inspector:focus { + background-color: var(--grey-40); +} + .accessible .tree .objectBox-accessible, .accessible .tree .objectBox-node { width: 100%; diff --git a/devtools/client/accessibility/components/Accessible.js b/devtools/client/accessibility/components/Accessible.js index 4dd090c40c98..b6f5d843d134 100644 --- a/devtools/client/accessibility/components/Accessible.js +++ b/devtools/client/accessibility/components/Accessible.js @@ -93,6 +93,7 @@ class Accessible extends Component { this.state = { expanded: new Set(), + active: null, focused: null, }; @@ -230,7 +231,7 @@ class Accessible extends Component { if (props) { props.refs.tree.blur(); } - await this.setState({ focused: null }); + await this.setState({ active: null, focused: null }); window.emit(EVENTS.NEW_ACCESSIBLE_FRONT_INSPECTED); } @@ -300,7 +301,7 @@ class Accessible extends Component { } render() { - const { expanded, focused } = this.state; + const { expanded, active, focused } = this.state; const { items, parents, accessible, labelledby } = this.props; if (accessible) { @@ -320,17 +321,15 @@ class Accessible extends Component { this.setState({ focused: item.path }); } }, - onActivate: ({ contents }) => { - if (isNode(contents)) { - this.selectNode(this.props.DOMNode, "accessibility-keyboard"); - } else if (isAccessible(contents)) { - const target = findAccessibleTarget(this.props.relations, contents.actor); - if (target) { - this.selectAccessible(target); - } + onActivate: item => { + if (item == null) { + this.setState({ active: null }); + } else if (this.state.active !== item.path) { + this.setState({ active: item.path }); } }, - focused: findFocused(focused, items), + focused: findByPath(focused, items), + active: findByPath(active, items), renderItem: this.renderItem, labelledby, }); @@ -362,17 +361,21 @@ const findAccessibleTarget = (relations, actorID) => { }; /** - * Find currently focused item. - * @param {String} focused Key of the currently focused item. - * @param {Array} items Accessibility properties array. - * @return {Object?} Possibly found focused item. + * Find an item based on a given path. + * @param {String} path + * Key of the item to be looked up. + * @param {Array} items + * Accessibility properties array. + * @return {Object?} + * Possibly found item. */ -const findFocused = (focused, items) => { +const findByPath = (path, items) => { for (const item of items) { - if (item.path === focused) { + if (item.path === path) { return item; } - const found = findFocused(focused, item.children); + + const found = findByPath(path, item.children); if (found) { return found; } diff --git a/devtools/client/shared/components/List.js b/devtools/client/shared/components/List.js index 78c62f08e88c..39794b920a23 100644 --- a/devtools/client/shared/components/List.js +++ b/devtools/client/shared/components/List.js @@ -14,6 +14,7 @@ const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const { ul, li, div } = require("devtools/client/shared/vendor/react-dom-factories"); const { scrollIntoView } = require("devtools/client/shared/scroll"); +const { preventDefaultAndStopPropagation } = require("devtools/client/shared/events"); loader.lazyRequireGetter(this, "focusableSelector", "devtools/client/shared/focus", true); @@ -182,8 +183,6 @@ class List extends Component { this._setCurrentItem = this._setCurrentItem.bind(this); this._preventArrowKeyScrolling = this._preventArrowKeyScrolling.bind(this); - this._preventDefaultAndStopPropagation = - this._preventDefaultAndStopPropagation.bind(this); this._onKeyDown = this._onKeyDown.bind(this); } @@ -201,24 +200,11 @@ class List extends Component { case "ArrowDown": case "ArrowLeft": case "ArrowRight": - this._preventDefaultAndStopPropagation(e); + preventDefaultAndStopPropagation(e); break; } } - _preventDefaultAndStopPropagation(e) { - e.preventDefault(); - e.stopPropagation(); - if (e.nativeEvent) { - if (e.nativeEvent.preventDefault) { - e.nativeEvent.preventDefault(); - } - if (e.nativeEvent.stopPropagation) { - e.nativeEvent.stopPropagation(); - } - } - } - /** * Sets the passed in item to be the current item. * @@ -293,7 +279,7 @@ class List extends Component { // On space or enter make current list item active. This means keyboard focus // handling is passed on to the component within the list item. if (document.activeElement === this.listRef.current) { - this._preventDefaultAndStopPropagation(e); + preventDefaultAndStopPropagation(e); if (active !== current) { this.setState({ active: current }); } @@ -303,7 +289,7 @@ class List extends Component { case "Escape": // If current list item is active, make it inactive and let keyboard focusing be // handled normally. - this._preventDefaultAndStopPropagation(e); + preventDefaultAndStopPropagation(e); if (active != null) { this.setState({ active: null }); } diff --git a/devtools/client/shared/components/VirtualizedTree.js b/devtools/client/shared/components/VirtualizedTree.js index 148c45b4862b..6106d6531d18 100644 --- a/devtools/client/shared/components/VirtualizedTree.js +++ b/devtools/client/shared/components/VirtualizedTree.js @@ -8,6 +8,9 @@ const { Component, createFactory } = require("devtools/client/shared/vendor/reac const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const dom = require("devtools/client/shared/vendor/react-dom-factories"); const { scrollIntoView } = require("devtools/client/shared/scroll"); +const { preventDefaultAndStopPropagation } = require("devtools/client/shared/events"); + +loader.lazyRequireGetter(this, "focusableSelector", "devtools/client/shared/focus", true); const AUTO_EXPAND_DEPTH = 0; const NUMBER_OF_OFFSCREEN_ITEMS = 1; @@ -196,6 +199,9 @@ class Tree extends Component { // Handle when a new item is focused. onFocus: PropTypes.func, + // The currently active (keyboard) item, if any such item exists. + active: PropTypes.any, + // Handle when item is activated with a keyboard (using Space or Enter) onActivate: PropTypes.func, @@ -255,7 +261,6 @@ class Tree extends Component { this._focusParentNode = oncePerAnimationFrame(this._focusParentNode).bind(this); this._focusFirstNode = oncePerAnimationFrame(this._focusFirstNode).bind(this); this._focusLastNode = oncePerAnimationFrame(this._focusLastNode).bind(this); - this._activateNode = oncePerAnimationFrame(this._activateNode).bind(this); this._autoExpand = this._autoExpand.bind(this); this._preventArrowKeyScrolling = this._preventArrowKeyScrolling.bind(this); @@ -264,7 +269,7 @@ class Tree extends Component { this._dfs = this._dfs.bind(this); this._dfsFromRoots = this._dfsFromRoots.bind(this); this._focus = this._focus.bind(this); - this._onBlur = this._onBlur.bind(this); + this._activate = this._activate.bind(this); this._onKeyDown = this._onKeyDown.bind(this); } @@ -329,16 +334,8 @@ class Tree extends Component { case "ArrowDown": case "ArrowLeft": case "ArrowRight": - e.preventDefault(); - e.stopPropagation(); - if (e.nativeEvent) { - if (e.nativeEvent.preventDefault) { - e.nativeEvent.preventDefault(); - } - if (e.nativeEvent.stopPropagation) { - e.nativeEvent.stopPropagation(); - } - } + preventDefaultAndStopPropagation(e); + break; } } @@ -440,11 +437,24 @@ class Tree extends Component { }); } + if (this.props.active != null) { + this._activate(null); + if (this.refs.tree !== this.activeElement) { + this.refs.tree.focus(); + } + } + if (this.props.onFocus) { this.props.onFocus(item); } } + _activate(item) { + if (this.props.onActivate) { + this.props.onActivate(item); + } + } + /** * Update state height and tree's scrollTop if necessary. */ @@ -459,13 +469,6 @@ class Tree extends Component { this._updateHeight(); } - /** - * Sets the state to have no focused item. - */ - _onBlur() { - this._focus(0, undefined); - } - /** * Fired on a scroll within the tree's container, updates * the stored position of the view port to handle virtual view rendering. @@ -533,15 +536,31 @@ class Tree extends Component { case "Enter": case " ": - this._activateNode(); + // On space or enter make focused tree node active. This means keyboard focus + // handling is passed on to the tree node itself. + if (this.refs.tree === this.activeElement) { + preventDefaultAndStopPropagation(e); + if (this.props.active !== this.props.focused) { + this._activate(this.props.focused); + } + } + break; + + case "Escape": + preventDefaultAndStopPropagation(e); + if (this.props.active != null) { + this._activate(null); + } + + if (this.refs.tree !== this.activeElement) { + this.refs.tree.focus(); + } break; } } - _activateNode() { - if (this.props.onActivate) { - this.props.onActivate(this.props.focused); - } + get activeElement() { + return this.refs.tree.ownerDocument.activeElement; } _focusFirstNode() { @@ -640,7 +659,7 @@ class Tree extends Component { // the top and bottom of the page are filled with the `NUMBER_OF_OFFSCREEN_ITEMS` // previous and next items respectively, which helps the user to see fewer empty // gaps when scrolling quickly. - const { itemHeight, focused } = this.props; + const { itemHeight, active, focused } = this.props; const { scroll, height } = this.state; const begin = Math.max(((scroll / itemHeight) | 0) - NUMBER_OF_OFFSCREEN_ITEMS, 0); const end = Math.ceil((scroll + height) / itemHeight) + NUMBER_OF_OFFSCREEN_ITEMS; @@ -667,7 +686,10 @@ class Tree extends Component { const { item, depth } = toRender[i]; const key = this.props.getKey(item); nodes.push(TreeNode({ - key, + // We make a key unique depending on whether the tree node is in active or + // inactive state to make sure that it is actually replaced and the tabbable + // state is reset. + key: `${key}-${active === item ? "active" : "inactive"}`, index, first, last, @@ -676,6 +698,7 @@ class Tree extends Component { id: key, renderItem: this.props.renderItem, focused: focused === item, + active: active === item, expanded: this.props.isExpanded(item), hasChildren: !!this.props.getChildren(item).length, onExpand: this._onExpand, @@ -718,6 +741,14 @@ class Tree extends Component { // interarction. this._focus(begin, toRender[0].item); }, + onBlur: e => { + if (active != null) { + const { relatedTarget } = e; + if (!this.refs.tree.contains(relatedTarget)) { + this._activate(null); + } + } + }, onClick: () => { // Focus should always remain on the tree container itself. this.refs.tree.focus(); @@ -759,6 +790,8 @@ class ArrowExpanderClass extends Component { render() { const attrs = { className: "arrow theme-twisty", + // To collapse/expand the tree rows use left/right arrow keys. + tabIndex: "-1", onClick: this.props.expanded ? () => this.props.onCollapse(this.props.item) : e => this.props.onExpand(this.props.item, e.altKey), @@ -783,6 +816,7 @@ class TreeNodeClass extends Component { return { id: PropTypes.any.isRequired, focused: PropTypes.bool.isRequired, + active: PropTypes.boool.isRequired, item: PropTypes.any.isRequired, expanded: PropTypes.bool.isRequired, hasChildren: PropTypes.bool.isRequired, @@ -797,6 +831,85 @@ class TreeNodeClass extends Component { }; } + constructor(props) { + super(props); + + this._onKeyDown = this._onKeyDown.bind(this); + } + + componentDidMount() { + // Make sure that none of the focusable elements inside the tree node container are + // tabbable if the tree node is not active. If the tree node is active and focus is + // outside its container, focus on the first focusable element inside. + const elms = this.getFocusableElements(); + if (elms.length === 0) { + return; + } + + if (!this.props.active) { + elms.forEach(elm => elm.setAttribute("tabindex", "-1")); + return; + } + + if (!elms.includes(this.refs.treenode.ownerDocument.activeElement)) { + elms[0].focus(); + } + } + + /** + * Get a list of all elements that are focusable with a keyboard inside the tree node. + */ + getFocusableElements() { + return Array.from(this.refs.treenode.querySelectorAll(focusableSelector)); + } + + /** + * Wrap and move keyboard focus to first/last focusable element inside the tree node to + * prevent the focus from escaping the tree node boundaries. + * element). + * + * @param {DOMNode} current currently focused element + * @param {Boolean} back direction + * @return {Boolean} true there is a newly focused element. + */ + _wrapMoveFocus(current, back) { + const elms = this.getFocusableElements(); + let next; + + if (elms.length === 0) { + return false; + } + + if (back) { + if (elms.indexOf(current) === 0) { + next = elms[elms.length - 1]; + next.focus(); + } + } else if (elms.indexOf(current) === elms.length - 1) { + next = elms[0]; + next.focus(); + } + + return !!next; + } + + _onKeyDown(e) { + const { target, key, shiftKey } = e; + + if (key !== "Tab") { + return; + } + + const focusMoved = this._wrapMoveFocus(target, shiftKey); + if (focusMoved) { + // Focus was moved to the begining/end of the list, so we need to prevent the + // default focus change that would happen here. + e.preventDefault(); + } + + e.stopPropagation(); + } + render() { const arrow = ArrowExpander({ item: this.props.item, @@ -816,6 +929,9 @@ class TreeNodeClass extends Component { if (this.props.last) { classList.push("tree-node-last"); } + if (this.props.active) { + classList.push("tree-node-active"); + } let ariaExpanded; if (this.props.hasChildren) { @@ -830,8 +946,10 @@ class TreeNodeClass extends Component { id: this.props.id, className: classList.join(" "), role: "treeitem", + ref: "treenode", "aria-level": this.props.depth + 1, onClick: this.props.onClick, + onKeyDownCapture: this.props.active && this._onKeyDown, "aria-expanded": ariaExpanded, "data-expanded": this.props.expanded ? "" : undefined, "data-depth": this.props.depth, diff --git a/devtools/client/shared/components/test/mochitest/chrome.ini b/devtools/client/shared/components/test/mochitest/chrome.ini index 171ea7a61173..9ebbd34e8f39 100644 --- a/devtools/client/shared/components/test/mochitest/chrome.ini +++ b/devtools/client/shared/components/test/mochitest/chrome.ini @@ -35,3 +35,4 @@ support-files = [test_tree_11.html] [test_tree_12.html] [test_tree_13.html] +[test_tree_14.html] diff --git a/devtools/client/shared/components/test/mochitest/test_tree_12.html b/devtools/client/shared/components/test/mochitest/test_tree_12.html index 34980843b92a..f8b334bd8b19 100644 --- a/devtools/client/shared/components/test/mochitest/test_tree_12.html +++ b/devtools/client/shared/components/test/mochitest/test_tree_12.html @@ -38,12 +38,6 @@ window.onload = async function () { return ReactDOM.render(Tree(treeProps), window.document.body); } - const checker = Symbol(); - let isActivated; - const mockFn = activated => { - isActivated = activated; - }; - const tree = renderTree(); TEST_TREE.expanded = new Set("ABCDEFGHIJKLMNO".split("")); @@ -140,112 +134,6 @@ window.onload = async function () { "-N:false", "--O:true", ], "After the End key again, O should still be focused."); - - // Test Enter key ---------------------------------------------------------- - - info("Press Enter to activate node, when onActivate is not passed."); - isActivated = checker; - renderTree({ focused: "L" }); - Simulate.keyDown(document.querySelector(".tree"), { key: "Enter" }); - await forceRender(tree); - - isRenderedTree(document.body.textContent, [ - "A:false", - "-B:false", - "--E:false", - "---K:false", - "---L:true", - "--F:false", - "--G:false", - "-C:false", - "--H:false", - "--I:false", - "-D:false", - "--J:false", - "M:false", - "-N:false", - "--O:false", - ], "After the Enter, L should be focused and the tree remained unchanged."); - ok(isActivated === checker, - "Since onActivate was not specified, 'isActivated' should not be set."); - - info("Press Enter to activate node, when onActivate is passed."); - isActivated = checker; - renderTree({ focused: "L", onActivate: mockFn }); - Simulate.keyDown(document.querySelector(".tree"), { key: "Enter" }); - await forceRender(tree); - - isRenderedTree(document.body.textContent, [ - "A:false", - "-B:false", - "--E:false", - "---K:false", - "---L:true", - "--F:false", - "--G:false", - "-C:false", - "--H:false", - "--I:false", - "-D:false", - "--J:false", - "M:false", - "-N:false", - "--O:false", - ], "After the Enter, L should be focused and the tree remained unchanged."); - is(isActivated, "L", "onActivate function was called with the right node."); - - // Test Space key ---------------------------------------------------------- - - info("Press Space to activate node, when onActivate is not passed."); - isActivated = checker; - renderTree({ focused: "K" }); - Simulate.keyDown(document.querySelector(".tree"), { key: " " }); - await forceRender(tree); - - isRenderedTree(document.body.textContent, [ - "A:false", - "-B:false", - "--E:false", - "---K:true", - "---L:false", - "--F:false", - "--G:false", - "-C:false", - "--H:false", - "--I:false", - "-D:false", - "--J:false", - "M:false", - "-N:false", - "--O:false", - ], "After the Space, K should be focused and the tree remained unchanged."); - ok(isActivated === checker, - "Since onActivate was not specified, 'isActivated' should not be set."); - - info("Press Space to activate node, when onActivate is passed."); - isActivated = checker; - renderTree({ focused: "K", onActivate: mockFn }); - Simulate.keyDown(document.querySelector(".tree"), { key: " " }); - await forceRender(tree); - - isRenderedTree(document.body.textContent, [ - "A:false", - "-B:false", - "--E:false", - "---K:true", - "---L:false", - "--F:false", - "--G:false", - "-C:false", - "--H:false", - "--I:false", - "-D:false", - "--J:false", - "M:false", - "-N:false", - "--O:false", - ], "After the Space, K should be focused and the tree remained unchanged."); - is(isActivated, "K", "onActivate function was called with the right node."); } catch (e) { ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e)); } finally { diff --git a/devtools/client/shared/components/test/mochitest/test_tree_14.html b/devtools/client/shared/components/test/mochitest/test_tree_14.html new file mode 100644 index 000000000000..a9f9a2678117 --- /dev/null +++ b/devtools/client/shared/components/test/mochitest/test_tree_14.html @@ -0,0 +1,245 @@ + + + + + + + Tree component keyboard test + + + + + +
+
+
+
+ + diff --git a/devtools/client/shared/events.js b/devtools/client/shared/events.js new file mode 100644 index 000000000000..ae590293601a --- /dev/null +++ b/devtools/client/shared/events.js @@ -0,0 +1,22 @@ +/* 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"; + +/** + * Prevent event default behaviour and stop its propagation. + * @param {Object} event + * Event or react synthetic event. + */ +exports.preventDefaultAndStopPropagation = function(event) { + event.preventDefault(); + event.stopPropagation(); + if (event.nativeEvent) { + if (event.nativeEvent.preventDefault) { + event.nativeEvent.preventDefault(); + } + if (event.nativeEvent.stopPropagation) { + event.nativeEvent.stopPropagation(); + } + } +}; diff --git a/devtools/client/shared/moz.build b/devtools/client/shared/moz.build index 45f2c651d3da..4a0cfa74aacf 100644 --- a/devtools/client/shared/moz.build +++ b/devtools/client/shared/moz.build @@ -30,6 +30,7 @@ DevToolsModules( 'devices.js', 'DOMHelpers.jsm', 'enum.js', + 'events.js', 'file-saver.js', 'focus.js', 'getjson.js', From 02daabb4c225f9238e14119cb7764591e4510f80 Mon Sep 17 00:00:00 2001 From: Michael Ratcliffe Date: Wed, 13 Feb 2019 13:12:52 +0000 Subject: [PATCH 20/79] Bug 1500488 - Cookie viewer columns are not resizable when the toolbox is narrow r=pbro Differential Revision: https://phabricator.services.mozilla.com/D19482 --HG-- extra : moz-landing-system : lando --- devtools/client/themes/storage.css | 35 ++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/devtools/client/themes/storage.css b/devtools/client/themes/storage.css index 6ce166728b17..ec8b6329c58a 100644 --- a/devtools/client/themes/storage.css +++ b/devtools/client/themes/storage.css @@ -14,9 +14,40 @@ background: var(--theme-sidebar-background); } -/* Columns with date should have a min width so that date is visible */ +/* The minimum column width needs to be determined by the header width */ +.table-widget-cell { + min-width: unset; +} + +/* Set minimum column widths */ +#name { + min-width: 65px; +} + +#host { + min-width: 80px; +} + +#path { + min-width: 60px; +} + #expires, #lastAccessed, #creationTime { - min-width: 150px; + min-width: 115px; +} + +#value { + min-width: 95px; +} + +#hostOnly, +#isHttpOnly, +#sameSite { + min-width: 50px; +} + +#isSecure { + min-width: 40px; } /* Variables View Sidebar */ From 60e1acb7f94688aaeac094574db0b3bfcc449307 Mon Sep 17 00:00:00 2001 From: Michael Ratcliffe Date: Tue, 12 Feb 2019 14:03:57 +0000 Subject: [PATCH 21/79] Bug 1527282 - Fix caching of justify content pattern in Flexbox highlighter r=pbro Differential Revision: https://phabricator.services.mozilla.com/D19478 --HG-- extra : moz-landing-system : lando --- devtools/server/actors/highlighters/flexbox.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devtools/server/actors/highlighters/flexbox.js b/devtools/server/actors/highlighters/flexbox.js index 8701f11e6b35..8dab1c5103ff 100644 --- a/devtools/server/actors/highlighters/flexbox.js +++ b/devtools/server/actors/highlighters/flexbox.js @@ -264,8 +264,8 @@ class FlexboxHighlighter extends AutoRefreshHighlighter { flexboxPatternMap = new Map(); } - if (gCachedFlexboxPattern.has(JUSTIFY_CONTENT)) { - return gCachedFlexboxPattern.get(JUSTIFY_CONTENT); + if (flexboxPatternMap.has(JUSTIFY_CONTENT)) { + return flexboxPatternMap.get(JUSTIFY_CONTENT); } // Create the inversed diagonal lines pattern From 1f7b0b5219accd1e92e7ab14a4f873476a788f08 Mon Sep 17 00:00:00 2001 From: "Nicolas B. Pierron" Date: Tue, 12 Feb 2019 19:49:34 +0000 Subject: [PATCH 22/79] Bug 1522300 - ARM64: Restore the Pseudo stack pointer before asserting that it has the correct alignment. r=sstangl Differential Revision: https://phabricator.services.mozilla.com/D19543 --HG-- extra : moz-landing-system : lando --- js/src/wasm/WasmStubs.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/src/wasm/WasmStubs.cpp b/js/src/wasm/WasmStubs.cpp index db2e16a1f9e9..dab5cb86dbb9 100644 --- a/js/src/wasm/WasmStubs.cpp +++ b/js/src/wasm/WasmStubs.cpp @@ -1097,13 +1097,12 @@ void wasm::GenerateDirectCallFromJit(MacroAssembler& masm, const FuncExport& fe, masm.assertStackAlignment(WasmStackAlignment); masm.callJit(ImmPtr(callee)); - masm.assertStackAlignment(WasmStackAlignment); - #ifdef JS_CODEGEN_ARM64 // WASM does not use the emulated stack pointer, so reinitialize it as it // might be clobbered either by WASM or by any C++ calls within. masm.initPseudoStackPtr(); #endif + masm.assertStackAlignment(WasmStackAlignment); masm.branchPtr(Assembler::Equal, FramePointer, Imm32(wasm::FailFP), masm.exceptionLabel()); From b85491b0a35a550001b4cf488481560fd8af1483 Mon Sep 17 00:00:00 2001 From: Noemi Erli Date: Wed, 13 Feb 2019 15:32:27 +0200 Subject: [PATCH 23/79] Backed out 4 changesets (bug 1500074, bug 1500072) for devtools failures in browser_browserloader_mocks.js CLOSED TREE Backed out changeset e381b765ee73 (bug 1500074) Backed out changeset 7cb353ea123d (bug 1500072) Backed out changeset 9d792d03c36b (bug 1500072) Backed out changeset a11b90e9e698 (bug 1500072) --- devtools/client/framework/moz.build | 2 - .../test/metrics/browser_metrics_debugger.ini | 12 ----- .../test/metrics/browser_metrics_debugger.js | 31 ----------- .../test/metrics/browser_metrics_inspector.js | 48 +++++++++++++++-- .../metrics/browser_metrics_netmonitor.ini | 12 ----- .../metrics/browser_metrics_netmonitor.js | 31 ----------- .../metrics/browser_metrics_webconsole.js | 52 +++++++++++++++--- .../client/framework/test/metrics/head.js | 54 ------------------- devtools/client/shared/browser-loader.js | 4 -- devtools/client/webconsole/main.js | 9 +++- 10 files changed, 95 insertions(+), 160 deletions(-) delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_debugger.ini delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_debugger.js delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_netmonitor.js diff --git a/devtools/client/framework/moz.build b/devtools/client/framework/moz.build index 487a177fc6cc..ba5debde871f 100644 --- a/devtools/client/framework/moz.build +++ b/devtools/client/framework/moz.build @@ -6,9 +6,7 @@ BROWSER_CHROME_MANIFESTS += [ 'test/browser.ini', - 'test/metrics/browser_metrics_debugger.ini', 'test/metrics/browser_metrics_inspector.ini', - 'test/metrics/browser_metrics_netmonitor.ini', 'test/metrics/browser_metrics_webconsole.ini', ] XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini'] diff --git a/devtools/client/framework/test/metrics/browser_metrics_debugger.ini b/devtools/client/framework/test/metrics/browser_metrics_debugger.ini deleted file mode 100644 index d1ec7232f6e4..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_debugger.ini +++ /dev/null @@ -1,12 +0,0 @@ -[DEFAULT] -tags = devtools -subsuite = devtools -support-files = - head.js - !/devtools/client/shared/test/shared-head.js - !/devtools/client/shared/test/telemetry-test-helpers.js - -# Each metrics tests is loaded in a separate .ini file. This way the test is executed -# individually, without any other test being executed before or after. -[browser_metrics_debugger.js] -skip-if = os != 'linux' || debug || asan # Results should be platform agnostic - only run on linux64-opt diff --git a/devtools/client/framework/test/metrics/browser_metrics_debugger.js b/devtools/client/framework/test/metrics/browser_metrics_debugger.js deleted file mode 100644 index 749d0b9564a2..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_debugger.js +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ -/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -/* import-globals-from ../../../shared/test/shared-head.js */ - -/** - * This test records the number of modules loaded by DevTools, as well as the total count - * of characters in those modules, when opening the debugger. These metrics are - * retrieved by perfherder via logs. - */ - -const TEST_URL = "data:text/html;charset=UTF-8,
Debugger modules load test
"; - -add_task(async function() { - const toolbox = await openNewTabAndToolbox(TEST_URL, "jsdebugger"); - const panel = toolbox.getCurrentPanel(); - - // Retrieve the browser loader dedicated to the Debugger. - const debuggerLoader = panel.panelWin.getBrowserLoaderForWindow(); - const loaders = [loader.provider.loader, debuggerLoader.loader]; - - runMetricsTest({ - filterString: "devtools/client/debugger", - loaders, - panelName: "debugger", - }); -}); diff --git a/devtools/client/framework/test/metrics/browser_metrics_inspector.js b/devtools/client/framework/test/metrics/browser_metrics_inspector.js index 123ee4a9643b..c6e2200a9c9a 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_inspector.js +++ b/devtools/client/framework/test/metrics/browser_metrics_inspector.js @@ -21,9 +21,47 @@ add_task(async function() { // The inspector does not use a dedicated browser loader. const loaders = [loader.provider.loader]; - runMetricsTest({ - filterString: "devtools/client/inspector", - loaders, - panelName: "inspector", - }); + const allModules = getFilteredModules("", loaders); + const inspectorModules = getFilteredModules("devtools/client/inspector", loaders); + + const allModulesCount = allModules.length; + const inspectorModulesCount = inspectorModules.length; + + const allModulesChars = countCharsInModules(allModules); + const inspectorModulesChars = countCharsInModules(inspectorModules); + + const PERFHERDER_DATA = { + framework: { + name: "devtools", + }, + suites: [{ + name: "inspector-metrics", + value: allModulesChars, + subtests: [ + { + name: "inspector-modules", + value: inspectorModulesCount, + }, + { + name: "inspector-chars", + value: inspectorModulesChars, + }, + { + name: "all-modules", + value: allModulesCount, + }, + { + name: "all-chars", + value: allModulesChars, + }, + ], + }], + }; + info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); + + // Simply check that we found valid values. + ok(allModulesCount > inspectorModulesCount && + inspectorModulesCount > 0, "Successfully recorded module count for Inspector"); + ok(allModulesChars > inspectorModulesChars && + inspectorModulesChars > 0, "Successfully recorded char count for Inspector"); }); diff --git a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini deleted file mode 100644 index 8cb733e546c5..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini +++ /dev/null @@ -1,12 +0,0 @@ -[DEFAULT] -tags = devtools -subsuite = devtools -support-files = - head.js - !/devtools/client/shared/test/shared-head.js - !/devtools/client/shared/test/telemetry-test-helpers.js - -# Each metrics tests is loaded in a separate .ini file. This way the test is executed -# individually, without any other test being executed before or after. -[browser_metrics_netmonitor.js] -skip-if = os != 'linux' || debug || asan # Results should be platform agnostic - only run on linux64-opt diff --git a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js deleted file mode 100644 index b38e80eb9e30..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ -/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -/* import-globals-from ../../../shared/test/shared-head.js */ - -/** - * This test records the number of modules loaded by DevTools, as well as the total count - * of characters in those modules, when opening the netmonitor. These metrics are - * retrieved by perfherder via logs. - */ - -const TEST_URL = "data:text/html;charset=UTF-8,
Netmonitor modules load test
"; - -add_task(async function() { - const toolbox = await openNewTabAndToolbox(TEST_URL, "netmonitor"); - const panel = toolbox.getCurrentPanel(); - - // Retrieve the browser loader dedicated to the Netmonitor. - const netmonitorLoader = panel.panelWin.getBrowserLoaderForWindow(); - const loaders = [loader.provider.loader, netmonitorLoader.loader]; - - runMetricsTest({ - filterString: "devtools/client/netmonitor", - loaders, - panelName: "netmonitor", - }); -}); diff --git a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js index bf56c1606fd8..d255e9bca1f1 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js +++ b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js @@ -17,15 +17,53 @@ const TEST_URL = "data:text/html;charset=UTF-8,
Webconsole modules load test add_task(async function() { const toolbox = await openNewTabAndToolbox(TEST_URL, "webconsole"); - const panel = toolbox.getCurrentPanel(); + const hud = toolbox.getCurrentPanel().hud; // Retrieve the browser loader dedicated to the WebConsole. - const webconsoleLoader = panel._frameWindow.getBrowserLoaderForWindow(); + const webconsoleLoader = hud.ui.browserLoader; const loaders = [loader.provider.loader, webconsoleLoader.loader]; - runMetricsTest({ - filterString: "devtools/client/webconsole", - loaders, - panelName: "webconsole", - }); + const allModules = getFilteredModules("", loaders); + const webconsoleModules = getFilteredModules("devtools/client/webconsole", loaders); + + const allModulesCount = allModules.length; + const webconsoleModulesCount = webconsoleModules.length; + + const allModulesChars = countCharsInModules(allModules); + const webconsoleModulesChars = countCharsInModules(webconsoleModules); + + const PERFHERDER_DATA = { + framework: { + name: "devtools", + }, + suites: [{ + name: "webconsole-metrics", + value: allModulesChars, + subtests: [ + { + name: "webconsole-modules", + value: webconsoleModulesCount, + }, + { + name: "webconsole-chars", + value: webconsoleModulesChars, + }, + { + name: "all-modules", + value: allModulesCount, + }, + { + name: "all-chars", + value: allModulesChars, + }, + ], + }], + }; + info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); + + // Simply check that we found valid values. + ok(allModulesCount > webconsoleModulesCount && + webconsoleModulesCount > 0, "Successfully recorded module count for WebConsole"); + ok(allModulesChars > webconsoleModulesChars && + webconsoleModulesChars > 0, "Successfully recorded char count for WebConsole"); }); diff --git a/devtools/client/framework/test/metrics/head.js b/devtools/client/framework/test/metrics/head.js index c0f4412f9a44..330dbb9981be 100644 --- a/devtools/client/framework/test/metrics/head.js +++ b/devtools/client/framework/test/metrics/head.js @@ -30,57 +30,3 @@ function countCharsInModules(modules) { } }, 0); } - -/** - * Record module loading data. - * - * @param {Object} - * - filterString {String} path to use to filter modules specific to the current panel - * - loaders {Array} Array of Loaders to check for modules - * - panelName {String} reused in identifiers for perfherder data - */ -function runMetricsTest({ filterString, loaders, panelName }) { - const allModules = getFilteredModules("", loaders); - const panelModules = getFilteredModules(filterString, loaders); - - const allModulesCount = allModules.length; - const panelModulesCount = panelModules.length; - - const allModulesChars = countCharsInModules(allModules); - const panelModulesChars = countCharsInModules(panelModules); - - const PERFHERDER_DATA = { - framework: { - name: "devtools", - }, - suites: [{ - name: panelName + "-metrics", - value: allModulesChars, - subtests: [ - { - name: panelName + "-modules", - value: panelModulesCount, - }, - { - name: panelName + "-chars", - value: panelModulesChars, - }, - { - name: "all-modules", - value: allModulesCount, - }, - { - name: "all-chars", - value: allModulesChars, - }, - ], - }], - }; - info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); - - // Simply check that we found valid values. - ok(allModulesCount > panelModulesCount && - panelModulesCount > 0, "Successfully recorded module count for " + panelName); - ok(allModulesChars > panelModulesChars && - panelModulesChars > 0, "Successfully recorded char count for " + panelName); -} diff --git a/devtools/client/shared/browser-loader.js b/devtools/client/shared/browser-loader.js index 8008bcbd8cb5..9ad5cef442d9 100644 --- a/devtools/client/shared/browser-loader.js +++ b/devtools/client/shared/browser-loader.js @@ -188,10 +188,6 @@ function BrowserLoaderBuilder({ baseURI, window, useOnlyShared, commonLibRequire const mainModule = loaders.Module(baseURI, joinURI(baseURI, "main.js")); this.loader = loaders.Loader(opts); - // When running tests, expose the BrowserLoader instance for metrics tests. - if (flags.testing) { - window.getBrowserLoaderForWindow = () => this; - } this.require = loaders.Require(this.loader, mainModule); } diff --git a/devtools/client/webconsole/main.js b/devtools/client/webconsole/main.js index c389eb4bfd6c..5e22506776b2 100644 --- a/devtools/client/webconsole/main.js +++ b/devtools/client/webconsole/main.js @@ -12,9 +12,14 @@ this.WebConsoleWrapper = function(parentNode, hud, toolbox, owner, document) { // Initialize module loader and load all modules of the new inline // preview feature. The entire code-base doesn't need any extra // privileges and runs entirely in content scope. - const WebConsoleWrapper = BrowserLoader({ + const browserLoader = BrowserLoader({ baseURI: "resource://devtools/client/webconsole/", window, - }).require("./webconsole-wrapper"); + }); + + // Expose the browserLoader instance on the webconsole hud for metrics tests. + hud.browserLoader = browserLoader; + + const WebConsoleWrapper = browserLoader.require("./webconsole-wrapper"); return new WebConsoleWrapper(parentNode, hud, toolbox, owner, document); }; From ea113873649d8f3ca70d8a89c594fba1b2ba0060 Mon Sep 17 00:00:00 2001 From: Cosmin Sabou Date: Wed, 13 Feb 2019 15:35:34 +0200 Subject: [PATCH 24/79] Backed out changeset a14a11bf2d6f (bug 1436086) for eslint failure on browser_toolbarButtonKeyPress.js. CLOSED TREE --- browser/app/profile/firefox.js | 2 - browser/base/content/browser-toolbarKeyNav.js | 246 ------------------ browser/base/content/browser.css | 8 +- browser/base/content/browser.js | 19 -- browser/base/content/browser.xul | 7 - .../base/content/test/keyboard/browser.ini | 2 - .../keyboard/browser_toolbarButtonKeyPress.js | 84 ------ .../test/keyboard/browser_toolbarKeyNav.js | 219 ---------------- browser/base/jar.mn | 3 +- 9 files changed, 3 insertions(+), 587 deletions(-) delete mode 100644 browser/base/content/browser-toolbarKeyNav.js delete mode 100644 browser/base/content/test/keyboard/browser_toolbarKeyNav.js diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 0dbb97808d3a..fdb2541f7603 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1816,5 +1816,3 @@ pref("browser.aboutConfig.showWarning", true); // Launcher process is disabled by default, will be selectively enabled via SHIELD pref("browser.launcherProcess.enabled", false); #endif // defined(XP_WIN) && defined(MOZ_LAUNCHER_PROCESS) - -pref("browser.toolbars.keyboard_navigation", false); diff --git a/browser/base/content/browser-toolbarKeyNav.js b/browser/base/content/browser-toolbarKeyNav.js deleted file mode 100644 index 31c7fb8586bc..000000000000 --- a/browser/base/content/browser-toolbarKeyNav.js +++ /dev/null @@ -1,246 +0,0 @@ -/* 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/. */ - -// This file is loaded into the browser window scope. -/* eslint-env mozilla/browser-window */ - -/** - * Handle keyboard navigation for toolbars. - * Having separate tab stops for every toolbar control results in an - * unmanageable number of tab stops. Therefore, we group buttons under a single - * tab stop and allow movement between them using left/right arrows. - * However, text inputs use the arrow keys for their own purposes, so they need - * their own tab stop. There are also groups of buttons before and after the - * URL bar input which should get their own tab stop. The subsequent buttons on - * the toolbar are then another tab stop after that. - * Tab stops for groups of buttons are set using the element. - * This element is invisible, but gets included in the tab order. When one of - * these gets focus, it redirects focus to the appropriate button. This avoids - * the need to continually manage the tabindex of toolbar buttons in response to - * toolbarchanges. - */ - -ToolbarKeyboardNavigator = { - // Toolbars we want to be keyboard navigable. - kToolbars: [CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_BOOKMARKS], - - _isButton(aElem) { - return aElem.tagName == "toolbarbutton" || - aElem.getAttribute("role") == "button"; - }, - - // Get a TreeWalker which includes only controls which should be keyboard - // navigable. - _getWalker(aRoot) { - if (aRoot._toolbarKeyNavWalker) { - return aRoot._toolbarKeyNavWalker; - } - - let filter = (aNode) => { - if (aNode.tagName == "toolbartabstop") { - return NodeFilter.FILTER_ACCEPT; - } - - // Special case for the "View site information" button, which isn't - // actionable in some cases but is still visible. - if (aNode.id == "identity-box" && - document.getElementById("urlbar").getAttribute("pageproxystate") == - "invalid") { - return NodeFilter.FILTER_REJECT; - } - - // Skip invisible or disabled elements. - if (aNode.hidden || aNode.disabled) { - return NodeFilter.FILTER_REJECT; - } - // This width check excludes the overflow button when there's no overflow. - let bounds = window.windowUtils.getBoundsWithoutFlushing(aNode); - if (bounds.width == 0) { - return NodeFilter.FILTER_REJECT; - } - - if (this._isButton(aNode)) { - return NodeFilter.FILTER_ACCEPT; - } - return NodeFilter.FILTER_SKIP; - }; - aRoot._toolbarKeyNavWalker = document.createTreeWalker(aRoot, - NodeFilter.SHOW_ELEMENT, filter); - return aRoot._toolbarKeyNavWalker; - }, - - init() { - for (let id of this.kToolbars) { - let toolbar = document.getElementById(id); - // When enabled, no toolbar buttons should themselves be tabbable. - // We manage toolbar focus completely. This attribute ensures that CSS - // doesn't set -moz-user-focus: normal. - toolbar.setAttribute("keyNav", "true"); - for (let stop of toolbar.getElementsByTagName("toolbartabstop")) { - // These are invisible, but because they need to be in the tab order, - // they can't get display: none or similar. They must therefore be - // explicitly hidden for accessibility. - stop.setAttribute("aria-hidden", "true"); - stop.addEventListener("focus", this); - } - toolbar.addEventListener("keydown", this); - toolbar.addEventListener("keypress", this); - } - }, - - uninit() { - for (let id of this.kToolbars) { - let toolbar = document.getElementById(id); - for (let stop of toolbar.getElementsByTagName("toolbartabstop")) { - stop.removeEventListener("focus", this); - } - toolbar.removeEventListener("keydown", this); - toolbar.removeEventListener("keypress", this); - toolbar.removeAttribute("keyNav"); - } - }, - - _focusButton(aButton) { - // Toolbar buttons aren't focusable because if they were, clicking them - // would focus them, which is undesirable. Therefore, we must make a - // button focusable only when we want to focus it. - aButton.setAttribute("tabindex", "-1"); - aButton.focus(); - // We could remove tabindex now, but even though the button keeps DOM - // focus, a11y gets confused because the button reports as not being - // focusable. This results in weirdness if the user switches windows and - // then switches back. Instead, remove tabindex when the button loses - // focus. - aButton.addEventListener("blur", this); - }, - - _onButtonBlur(aEvent) { - if (document.activeElement == aEvent.target) { - // This event was fired because the user switched windows. This button - // will get focus again when the user returns. - return; - } - aEvent.target.removeEventListener("blur", this); - aEvent.target.removeAttribute("tabindex"); - }, - - _onTabStopFocus(aEvent) { - let toolbar = aEvent.target.closest("toolbar"); - let walker = this._getWalker(toolbar); - - let oldFocus = aEvent.relatedTarget; - if (oldFocus) { - // Save this because we might rewind focus and the subsequent focus event - // won't get a relatedTarget. - this._isFocusMovingBackward = - oldFocus.compareDocumentPosition(aEvent.target) & - Node.DOCUMENT_POSITION_PRECEDING; - if (this._isFocusMovingBackward && oldFocus && this._isButton(oldFocus)) { - // Shift+tabbing from a button will land on its toolbartabstop. Skip it. - document.commandDispatcher.rewindFocus(); - return; - } - } - - walker.currentNode = aEvent.target; - let button = walker.nextNode(); - if (!button || !this._isButton(button)) { - // No navigable buttons for this tab stop. Skip it. - if (this._isFocusMovingBackward) { - document.commandDispatcher.rewindFocus(); - } else { - document.commandDispatcher.advanceFocus(); - } - return; - } - - this._focusButton(button); - }, - - navigateButtons(aToolbar, aPrevious) { - let oldFocus = document.activeElement; - let walker = this._getWalker(aToolbar); - // Start from the current control and walk to the next/previous control. - walker.currentNode = oldFocus; - let newFocus; - if (aPrevious) { - newFocus = walker.previousNode(); - } else { - newFocus = walker.nextNode(); - } - if (!newFocus || newFocus.tagName == "toolbartabstop") { - // There are no more controls or we hit a tab stop placeholder. - return; - } - this._focusButton(newFocus); - }, - - _onKeyDown(aEvent) { - let focus = document.activeElement; - if (aEvent.altKey || aEvent.controlKey || aEvent.metaKey || - aEvent.shiftKey || !this._isButton(focus)) { - return; - } - - switch (aEvent.key) { - case "ArrowLeft": - this.navigateButtons(aEvent.currentTarget, true); - break; - case "ArrowRight": - this.navigateButtons(aEvent.currentTarget, false); - break; - default: - return; - } - aEvent.preventDefault(); - }, - - _onKeyPress(aEvent) { - let focus = document.activeElement; - if ((aEvent.key != "Enter" && aEvent.key != " ") || - !this._isButton(focus)) { - return; - } - - if (focus.getAttribute("type") == "menu") { - focus.open = true; - } else { - // Several buttons specifically don't use command events; e.g. because - // they want to activate for middle click. Therefore, simulate a - // click event. - // If this button does handle command events, that won't trigger here. - // Command events have their own keyboard handling: keypress for enter - // and keyup for space. We rely on that behavior, since there's no way - // for us to reliably know what events a button handles. - focus.dispatchEvent(new MouseEvent("click", { - bubbles: true, - ctrlKey: aEvent.ctrlKey, - altKey: aEvent.altKey, - shiftKey: aEvent.shiftKey, - metaKey: aEvent.metaKey, - })); - } - // We deliberately don't call aEvent.preventDefault() here so that enter - // will trigger a command event handler if appropriate. - aEvent.stopPropagation(); - }, - - handleEvent(aEvent) { - switch (aEvent.type) { - case "focus": - this._onTabStopFocus(aEvent); - break; - case "keydown": - this._onKeyDown(aEvent); - break; - case "keypress": - this._onKeyPress(aEvent); - break; - case "blur": - this._onButtonBlur(aEvent); - break; - } - }, - -}; diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css index 5ea8d4c9cfc5..07e3301468a7 100644 --- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -778,7 +778,7 @@ html|input.urlbar-input { display: none; } -#nav-bar:not([keyNav=true]) #identity-box { +#identity-box { -moz-user-focus: normal; } @@ -981,7 +981,7 @@ html|*#fullscreen-exit-button { /* notification anchors should only be visible when their associated notifications are */ -#nav-bar:not([keyNav=true]) .notification-anchor-icon { +.notification-anchor-icon { -moz-user-focus: normal; } @@ -1427,8 +1427,4 @@ toolbarpaletteitem > toolbaritem { } } -toolbar[keyNav=true]:not([collapsed=true]):not([customizing=true]) toolbartabstop { - -moz-user-focus: normal; -} - %include theme-vars.inc.css diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 9994cb518a03..3ba325ebfd88 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -148,8 +148,6 @@ if (AppConstants.NIGHTLY_BUILD) { } XPCOMUtils.defineLazyScriptGetter(this, "pktUI", "chrome://pocket/content/main.js"); -XPCOMUtils.defineLazyScriptGetter(this, "ToolbarKeyboardNavigator", - "chrome://browser/content/browser-toolbarKeyNav.js"); // lazy service getters @@ -285,16 +283,6 @@ XPCOMUtils.defineLazyGetter(this, "Win7Features", () => { return null; }); -XPCOMUtils.defineLazyPreferenceGetter(this, "gToolbarKeyNavEnabled", - "browser.toolbars.keyboard_navigation", false, - (aPref, aOldVal, aNewVal) => { - if (aNewVal) { - ToolbarKeyboardNavigator.init(); - } else { - ToolbarKeyboardNavigator.uninit(); - } - }); - customElements.setElementCreationCallback("translation-notification", () => { Services.scriptloader.loadSubScript( "chrome://browser/content/translation-notification.js", window); @@ -1396,9 +1384,6 @@ var gBrowserInit = { BrowserPageActions.init(); gAccessibilityServiceIndicator.init(); AccessibilityRefreshBlocker.init(); - if (gToolbarKeyNavEnabled) { - ToolbarKeyboardNavigator.init(); - } gRemoteControl.updateVisualCue(Marionette.running); @@ -1945,10 +1930,6 @@ var gBrowserInit = { AccessibilityRefreshBlocker.uninit(); - if (gToolbarKeyNavEnabled) { - ToolbarKeyboardNavigator.uninit(); - } - LanguagePrompt.uninit(); BrowserSearch.uninit(); diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul index 5e68756be5af..c7d922c6144b 100644 --- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -835,7 +835,6 @@ xmlns="http://www.w3.org/1999/xhtml" overflowpanel="widget-overflow" context="toolbar-context-menu"> - - - - @@ -1163,7 +1159,6 @@ xmlns="http://www.w3.org/1999/xhtml" toolbarname="&personalbarCmd.label;" accesskey="&personalbarCmd.accesskey;" collapsed="true" customizable="true"> - - - diff --git a/browser/base/content/test/keyboard/browser.ini b/browser/base/content/test/keyboard/browser.ini index aae273bd759c..b5e1a49ec672 100644 --- a/browser/base/content/test/keyboard/browser.ini +++ b/browser/base/content/test/keyboard/browser.ini @@ -1,3 +1 @@ [browser_toolbarButtonKeyPress.js] -[browser_toolbarKeyNav.js] -support-files = !/browser/base/content/test/permissions/permissions.html diff --git a/browser/base/content/test/keyboard/browser_toolbarButtonKeyPress.js b/browser/base/content/test/keyboard/browser_toolbarButtonKeyPress.js index dccbb1f9ab25..4e618654dedf 100644 --- a/browser/base/content/test/keyboard/browser_toolbarButtonKeyPress.js +++ b/browser/base/content/test/keyboard/browser_toolbarButtonKeyPress.js @@ -30,12 +30,6 @@ function waitForLocationChange() { return promise; } -add_task(async function setPref() { - await SpecialPowers.pushPrefEnv({ - set: [["browser.toolbars.keyboard_navigation", true]], - }); -}); - // Test activation of the app menu button from the keyboard. // The app menu should appear and focus should move inside it. add_task(async function testAppMenuButtonPress() { @@ -92,7 +86,6 @@ add_task(async function testDeveloperButtonPress() { await hidden; CustomizableUI.reset(); }); - // Test that the Developer menu doesn't open when a key other than space or // enter is pressed . add_task(async function testDeveloperButtonWrongKey() { @@ -166,80 +159,3 @@ add_task(async function testSendTabToDeviceButtonPress() { PageActions.actionForID("sendToDevice").pinnedToUrlbar = false; }); }); - -// Test activation of the Reload button from the keyboard. -// This is a toolbarbutton with a click handler and no command handler, but -// the toolbar keyboard navigation code should handle keyboard activation. -add_task(async function testReloadButtonPress() { - await BrowserTestUtils.withNewTab("https://example.com", async function(aBrowser) { - let button = document.getElementById("reload-button"); - await TestUtils.waitForCondition(() => !button.disabled); - forceFocus(button); - let loaded = BrowserTestUtils.browserLoaded(aBrowser); - EventUtils.synthesizeKey(" "); - await loaded; - ok(true, "Page loaded after Reload button pressed"); - }); -}); - -// Test activation of the Sidebars button from the keyboard. -// This is a toolbarbutton with a command handler. -add_task(async function testSidebarsButtonPress() { - let button = document.getElementById("sidebar-button"); - ok(!button.checked, "Sidebars button not checked at start of test"); - let sidebarBox = document.getElementById("sidebar-box"); - ok(sidebarBox.hidden, "Sidebar hidden at start of test"); - forceFocus(button); - EventUtils.synthesizeKey(" "); - await TestUtils.waitForCondition(() => button.checked); - ok(true, "Sidebars button checked after press"); - ok(!sidebar.hidden, "Sidebar visible after press"); - // Make sure the sidebar is fully loaded before we hide it. - // Otherwise, the unload event might call JS which isn't loaded yet. - // We can't use BrowserTestUtils.browserLoaded because it fails on non-tab - // docs. Instead, wait for something in the JS script. - let sidebarWin = document.getElementById("sidebar").contentWindow; - await TestUtils.waitForCondition(() => sidebarWin.PlacesUIUtils); - forceFocus(button); - EventUtils.synthesizeKey(" "); - await TestUtils.waitForCondition(() => !button.checked); - ok(true, "Sidebars button not checked after press"); - ok(sidebarBox.hidden, "Sidebar hidden after press"); -}); - -// Test activation of the Bookmark this page button from the keyboard. -// This is an image with a click handler on its parent and no command handler, -// but the toolbar keyboard navigation code should handle keyboard activation. -add_task(async function testBookmarkButtonPress() { - await BrowserTestUtils.withNewTab("https://example.com", async function(aBrowser) { - let button = document.getElementById("star-button"); - forceFocus(button); - let panel = document.getElementById("editBookmarkPanel"); - let focused = BrowserTestUtils.waitForEvent(panel, "focus", true); - EventUtils.synthesizeKey(" "); - await focused; - ok(true, "Focus inside edit bookmark panel after Bookmark button pressed"); - let hidden = BrowserTestUtils.waitForEvent(panel, "popuphidden"); - EventUtils.synthesizeKey("KEY_Escape"); - await hidden; - }); -}); - -// Test activation of the Bookmarks Menu button from the keyboard. -// This is a button with type="menu". -// The Bookmarks Menu should appear. -add_task(async function testBookmarksmenuButtonPress() { - CustomizableUI.addWidgetToArea("bookmarks-menu-button", - CustomizableUI.AREA_NAVBAR); - let button = document.getElementById("bookmarks-menu-button"); - forceFocus(button); - let menu = document.getElementById("BMB_bookmarksPopup"); - let shown = BrowserTestUtils.waitForEvent(menu, "popupshown"); - EventUtils.synthesizeKey(" "); - await shown; - ok(true, "Bookmarks Menu shown after toolbar button pressed"); - let hidden = BrowserTestUtils.waitForEvent(menu, "popuphidden"); - menu.hidePopup(); - await hidden; - CustomizableUI.reset(); -}); diff --git a/browser/base/content/test/keyboard/browser_toolbarKeyNav.js b/browser/base/content/test/keyboard/browser_toolbarKeyNav.js deleted file mode 100644 index f7486fed9786..000000000000 --- a/browser/base/content/test/keyboard/browser_toolbarKeyNav.js +++ /dev/null @@ -1,219 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -/** - * Test browser toolbar keyboard navigation. - * These tests assume the default browser configuration for toolbars unless - * otherwise specified. - */ - -const PERMISSIONS_PAGE = "https://example.com/browser/browser/base/content/test/permissions/permissions.html"; - -async function expectFocusAfterKey(aKey, aFocus, aAncestorOk = false) { - let res = aKey.match(/^(Shift\+)?(?:(.)|(.+))$/); - let shift = Boolean(res[1]); - let key; - if (res[2]) { - key = res[2]; // Character. - } else { - key = "KEY_" + res[3]; // Tab, ArrowRight, etc. - } - let expected; - let friendlyExpected; - if (typeof aFocus == "string") { - expected = document.getElementById(aFocus); - friendlyExpected = aFocus; - } else { - expected = aFocus; - if (aFocus == gURLBar.inputField) { - friendlyExpected = "URL bar input"; - } else if (aFocus == gBrowser.selectedBrowser) { - friendlyExpected = "Web document"; - } - } - let focused = BrowserTestUtils.waitForEvent(expected, "focus", aAncestorOk); - EventUtils.synthesizeKey(key, {shiftKey: shift}); - await focused; - ok(true, friendlyExpected + " focused after " + aKey + " pressed"); -} - -function startFromUrlBar() { - gURLBar.focus(); - is(document.activeElement, gURLBar.inputField, - "URL bar focused for start of test"); -} - -// The Reload button is disabled for a short time even after the page finishes -// loading. Wait for it to be enabled. -async function waitUntilReloadEnabled() { - let button = document.getElementById("reload-button"); - await TestUtils.waitForCondition(() => !button.disabled); -} - -add_task(async function setPref() { - await SpecialPowers.pushPrefEnv({ - set: [ - ["browser.toolbars.keyboard_navigation", true], - ["accessibility.tabfocus", 7], - ], - }); -}); - -// Test tab stops with no page loaded. -add_task(async function testTabStopsNoPage() { - await BrowserTestUtils.withNewTab("about:blank", async function() { - startFromUrlBar(); - await expectFocusAfterKey("Shift+Tab", "home-button"); - await expectFocusAfterKey("Shift+Tab", "tabbrowser-tabs", true); - await expectFocusAfterKey("Tab", "home-button"); - await expectFocusAfterKey("Tab", gURLBar.inputField); - await expectFocusAfterKey("Tab", "library-button"); - await expectFocusAfterKey("Tab", gBrowser.selectedBrowser); - }); -}); - -// Test tab stops with a page loaded. -add_task(async function testTabStopsPageLoaded() { - await BrowserTestUtils.withNewTab("https://example.com", async function() { - await waitUntilReloadEnabled(); - startFromUrlBar(); - await expectFocusAfterKey("Shift+Tab", "identity-box"); - await expectFocusAfterKey("Shift+Tab", "reload-button"); - await expectFocusAfterKey("Shift+Tab", "tabbrowser-tabs", true); - await expectFocusAfterKey("Tab", "reload-button"); - await expectFocusAfterKey("Tab", "identity-box"); - await expectFocusAfterKey("Tab", gURLBar.inputField); - await expectFocusAfterKey("Tab", "pageActionButton"); - await expectFocusAfterKey("Tab", "library-button"); - await expectFocusAfterKey("Tab", gBrowser.selectedBrowser); - }); -}); - -// Test tab stops with a notification anchor visible. -// The notification anchor should not get its own tab stop. -add_task(async function testTabStopsWithNotification() { - await BrowserTestUtils.withNewTab(PERMISSIONS_PAGE, async function(aBrowser) { - let popupShown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); - // Request a permission. - BrowserTestUtils.synthesizeMouseAtCenter("#geo", {}, aBrowser); - await popupShown; - startFromUrlBar(); - // If the notification anchor were in the tab order, the next shift+tab - // would focus it instead of #identity-box. - await expectFocusAfterKey("Shift+Tab", "identity-box"); - }); -}); - -// Test tab stops with the Bookmarks toolbar visible. -add_task(async function testTabStopsWithBookmarksToolbar() { - await BrowserTestUtils.withNewTab("about:blank", async function() { - CustomizableUI.setToolbarVisibility("PersonalToolbar", true); - startFromUrlBar(); - await expectFocusAfterKey("Tab", "library-button"); - await expectFocusAfterKey("Tab", "PersonalToolbar", true); - await expectFocusAfterKey("Tab", gBrowser.selectedBrowser); - - // Make sure the Bookmarks toolbar is no longer tabbable once hidden. - CustomizableUI.setToolbarVisibility("PersonalToolbar", false); - startFromUrlBar(); - await expectFocusAfterKey("Tab", "library-button"); - await expectFocusAfterKey("Tab", gBrowser.selectedBrowser); - }); -}); - -// Test a focusable toolbartabstop which has no navigable buttons. -add_task(async function testTabStopNoButtons() { - await BrowserTestUtils.withNewTab("about:blank", async function() { - // The Back, Forward and Reload buttons are all currently disabled. - // The Home button is the only other button at that tab stop. - CustomizableUI.removeWidgetFromArea("home-button"); - startFromUrlBar(); - await expectFocusAfterKey("Shift+Tab", "tabbrowser-tabs", true); - await expectFocusAfterKey("Tab", gURLBar.inputField); - CustomizableUI.reset(); - // Make sure the button is reachable now that it has been re-added. - await expectFocusAfterKey("Shift+Tab", "home-button", true); - }); -}); - -// Test that right/left arrows move through toolbarbuttons. -// This also verifies that: -// 1. Right/left arrows do nothing when at the edges; and -// 2. The overflow menu button can't be reached by right arrow when it isn't -// visible. -add_task(async function testArrowsToolbarbuttons() { - await BrowserTestUtils.withNewTab("about:blank", async function() { - startFromUrlBar(); - await expectFocusAfterKey("Tab", "library-button"); - EventUtils.synthesizeKey("KEY_ArrowLeft"); - is(document.activeElement.id, "library-button", - "ArrowLeft at end of button group does nothing"); - await expectFocusAfterKey("ArrowRight", "sidebar-button"); - // This next check also confirms that the overflow menu button is skipped, - // since it is currently invisible. - await expectFocusAfterKey("ArrowRight", "PanelUI-menu-button"); - EventUtils.synthesizeKey("KEY_ArrowRight"); - is(document.activeElement.id, "PanelUI-menu-button", - "ArrowRight at end of button group does nothing"); - await expectFocusAfterKey("ArrowLeft", "sidebar-button"); - await expectFocusAfterKey("ArrowLeft", "library-button"); - }); -}); - -// Test that right/left arrows move through buttons wihch aren't toolbarbuttons -// but have role="button". -add_task(async function testArrowsRoleButton() { - await BrowserTestUtils.withNewTab("https://example.com", async function() { - startFromUrlBar(); - await expectFocusAfterKey("Tab", "pageActionButton"); - await expectFocusAfterKey("ArrowRight", "pocket-button"); - await expectFocusAfterKey("ArrowRight", "star-button"); - await expectFocusAfterKey("ArrowLeft", "pocket-button"); - await expectFocusAfterKey("ArrowLeft", "pageActionButton"); - }); -}); - -// Test that right/left arrows do not land on disabled buttons. -add_task(async function testArrowsDisabledButtons() { - await BrowserTestUtils.withNewTab("https://example.com", async function(aBrowser) { - await waitUntilReloadEnabled(); - startFromUrlBar(); - await expectFocusAfterKey("Shift+Tab", "identity-box"); - // Back and Forward buttons are disabled. - await expectFocusAfterKey("Shift+Tab", "reload-button"); - EventUtils.synthesizeKey("KEY_ArrowLeft"); - is(document.activeElement.id, "reload-button", - "ArrowLeft on Reload button when prior buttons disabled does nothing"); - - BrowserTestUtils.loadURI(aBrowser, "https://example.com/2"); - await BrowserTestUtils.browserLoaded(aBrowser); - await waitUntilReloadEnabled(); - startFromUrlBar(); - await expectFocusAfterKey("Shift+Tab", "identity-box"); - await expectFocusAfterKey("Shift+Tab", "back-button"); - // Forward button is still disabled. - await expectFocusAfterKey("ArrowRight", "reload-button"); - }); -}); - -// Test that right arrow reaches the overflow menu button when it is visible. -add_task(async function testArrowsOverflowButton() { - await BrowserTestUtils.withNewTab("about:blank", async function() { - // Move something to the overflow menu to make the button appear. - CustomizableUI.addWidgetToArea("home-button", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL); - startFromUrlBar(); - await expectFocusAfterKey("Tab", "library-button"); - await expectFocusAfterKey("ArrowRight", "sidebar-button"); - await expectFocusAfterKey("ArrowRight", "nav-bar-overflow-button"); - await expectFocusAfterKey("ArrowRight", "PanelUI-menu-button"); - await expectFocusAfterKey("ArrowLeft", "nav-bar-overflow-button"); - // Make sure the button is not reachable once it is invisible again. - await expectFocusAfterKey("ArrowRight", "PanelUI-menu-button"); - CustomizableUI.reset(); - // Flush layout so its invisibility can be detected. - document.getElementById("nav-bar-overflow-button").clientWidth; - await expectFocusAfterKey("ArrowLeft", "sidebar-button"); - }); -}); diff --git a/browser/base/jar.mn b/browser/base/jar.mn index df9b4afbcfe1..bdc989379a75 100644 --- a/browser/base/jar.mn +++ b/browser/base/jar.mn @@ -55,8 +55,7 @@ browser.jar: content/browser/browser-sidebar.js (content/browser-sidebar.js) content/browser/browser-siteIdentity.js (content/browser-siteIdentity.js) content/browser/browser-sync.js (content/browser-sync.js) - content/browser/browser-tabsintitlebar.js (content/browser-tabsintitlebar.js) - content/browser/browser-toolbarKeyNav.js (content/browser-toolbarKeyNav.js) + content/browser/browser-tabsintitlebar.js (content/browser-tabsintitlebar.js) content/browser/browser-thumbnails.js (content/browser-thumbnails.js) content/browser/browser-webrender.js (content/browser-webrender.js) content/browser/tab-content.js (content/tab-content.js) From 816560fce569198544830570fdcea68517287f71 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 13 Feb 2019 13:50:01 +0000 Subject: [PATCH 25/79] Bug 1488679 - Use MOZ_APP_VERSION_DISPLAY for --version to show the full version r=glandium Differential Revision: https://phabricator.services.mozilla.com/D19026 --HG-- extra : moz-landing-system : lando --- toolkit/xre/nsAppRunner.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 3168f1188162..7c1ba322e8da 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -1531,7 +1531,12 @@ static inline void DumpVersion() { if (gAppData->vendor) { printf("%s ", (const char*)gAppData->vendor); } - printf("%s %s", (const char*)gAppData->name, (const char*)gAppData->version); + printf("%s ", (const char*)gAppData->name); + + // Use the displayed version + // For example, for beta, we would display 42.0b2 instead of 42.0 + printf("%s", NS_STRINGIFY(MOZ_APP_VERSION_DISPLAY)); + if (gAppData->copyright) { printf(", %s", (const char*)gAppData->copyright); } From 89d99f24ccc7d1ed260f2140dbab0b73cd363738 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 13 Feb 2019 08:42:45 +0000 Subject: [PATCH 26/79] Bug 1527443. Add a way to create a new Realm in a given compartment. r=jandem Differential Revision: https://phabricator.services.mozilla.com/D19566 --HG-- extra : moz-landing-system : lando --- js/src/jsapi.cpp | 7 +++++++ js/src/jsapi.h | 1 + 2 files changed, 8 insertions(+) diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 94814c543541..9fc70c2537f1 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1578,6 +1578,13 @@ JS::RealmCreationOptions& JS::RealmCreationOptions::setExistingCompartment( return *this; } +JS::RealmCreationOptions& JS::RealmCreationOptions::setExistingCompartment( + JS::Compartment* compartment) { + compSpec_ = CompartmentSpecifier::ExistingCompartment; + comp_ = compartment; + return *this; +} + JS::RealmCreationOptions& JS::RealmCreationOptions::setNewCompartmentAndZone() { compSpec_ = CompartmentSpecifier::NewCompartmentAndZone; comp_ = nullptr; diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 7920fd2f508a..77862291160a 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -972,6 +972,7 @@ class JS_PUBLIC_API RealmCreationOptions { RealmCreationOptions& setNewCompartmentInExistingZone(JSObject* obj); RealmCreationOptions& setNewCompartmentAndZone(); RealmCreationOptions& setExistingCompartment(JSObject* obj); + RealmCreationOptions& setExistingCompartment(JS::Compartment* compartment); // Certain compartments are implementation details of the embedding, and // references to them should never leak out to script. This flag causes this From 604b72af8094d25cb9ab4b0b9d2850a40510f30f Mon Sep 17 00:00:00 2001 From: Florin Strugariu Date: Tue, 12 Feb 2019 14:33:49 +0000 Subject: [PATCH 27/79] Bug 1520447 For raptor tp6 on windows use mitmproxy executable instead of creating a separate python environment r=rwood,davehunt Differential Revision: https://phabricator.services.mozilla.com/D16802 --HG-- extra : moz-landing-system : lando --- testing/raptor/mach_commands.py | 4 - testing/raptor/raptor/manifest.py | 2 +- .../playback/mitmproxy-rel-bin-win.manifest | 10 +++ testing/raptor/raptor/playback/mitmproxy.py | 80 ++++--------------- .../raptor/raptor/playback/python3.manifest | 10 --- .../raptor/playback/python3_x64.manifest | 10 --- testing/raptor/raptor/raptor.py | 1 - testing/raptor/raptor/tests/raptor-tp6-1.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-10.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-2.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-3.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-4.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-5.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-6.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-7.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-8.ini | 1 - testing/raptor/raptor/tests/raptor-tp6-9.ini | 1 - testing/raptor/raptor/tests/raptor-tp6m-1.ini | 1 - testing/raptor/test/test_manifest.py | 3 - 19 files changed, 27 insertions(+), 104 deletions(-) create mode 100644 testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest delete mode 100644 testing/raptor/raptor/playback/python3.manifest delete mode 100644 testing/raptor/raptor/playback/python3_x64.manifest diff --git a/testing/raptor/mach_commands.py b/testing/raptor/mach_commands.py index 20480a8821f8..22f8889aa0b1 100644 --- a/testing/raptor/mach_commands.py +++ b/testing/raptor/mach_commands.py @@ -132,10 +132,6 @@ class RaptorRunner(MozbuildObject): 'title': socket.gethostname(), 'default_actions': default_actions, 'raptor_cmd_line_args': self.raptor_args, - 'python3_manifest': { - 'win32': 'python3.manifest', - 'win64': 'python3_x64.manifest', - }, 'host': self.host, 'power_test': self.power_test, 'is_release_build': self.is_release_build, diff --git a/testing/raptor/raptor/manifest.py b/testing/raptor/raptor/manifest.py index 7a59f410a9d8..a0f71fb5ecc6 100644 --- a/testing/raptor/raptor/manifest.py +++ b/testing/raptor/raptor/manifest.py @@ -19,7 +19,7 @@ required_settings = ['apps', 'type', 'page_cycles', 'test_url', 'measure', 'unit', 'lower_is_better', 'alert_threshold'] playback_settings = ['playback_binary_manifest', 'playback_pageset_manifest', - 'playback_recordings', 'python3_win_manifest'] + 'playback_recordings'] def filter_app(tests, values): diff --git a/testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest b/testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest new file mode 100644 index 000000000000..2029c0b1631f --- /dev/null +++ b/testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest @@ -0,0 +1,10 @@ +[ + { + "size": 13576786, + "visibility": "public", + "digest": "5d471e470369381f130de28a3c54db27c3724e1e9269c510a593d61c4cf41713c9424da62e46ae98fd1decce00ecca876209ed059487f5a02882ba16a50daed1", + "algorithm": "sha512", + "filename": "mitmdump-win-2.0.2.zip", + "unpack": true + } +] \ No newline at end of file diff --git a/testing/raptor/raptor/playback/mitmproxy.py b/testing/raptor/raptor/playback/mitmproxy.py index 6194b2a6d1c0..1e2d7251eeb3 100644 --- a/testing/raptor/raptor/playback/mitmproxy.py +++ b/testing/raptor/raptor/playback/mitmproxy.py @@ -12,6 +12,7 @@ import time import mozinfo from mozlog import get_proxy_logger +from mozprocess import ProcessHandler from .base import Playback @@ -27,11 +28,6 @@ else: mozharness_dir = os.path.join(here, '../../../mozharness') sys.path.insert(0, mozharness_dir) -# required for using a python3 virtualenv on win for mitmproxy -from mozharness.base.python import Python3Virtualenv -from mozharness.mozilla.testing.testbase import TestingMixin -from mozharness.base.vcs.vcsbase import MercurialScript - raptor_dir = os.path.join(here, '..') sys.path.insert(0, raptor_dir) @@ -79,7 +75,7 @@ POLICIES_CONTENT_OFF = '''{ }''' -class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): +class Mitmproxy(Playback): def __init__(self, config): self.config = config @@ -106,10 +102,6 @@ class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): # go ahead and download and setup mitmproxy self.download() - # on windows we must use a python3 virtualen for mitmproxy - if 'win' in self.config['platform']: - self.setup_py3_virtualenv() - # mitmproxy must be started before setup, so that the CA cert is available self.start() self.setup() @@ -119,16 +111,10 @@ class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): if not os.path.exists(self.raptor_dir): os.makedirs(self.raptor_dir) - if 'win' in self.config['platform']: - # on windows we need a python3 environment and use our own package from tooltool - self.py3_path = self.fetch_python3() - LOG.info("python3 path is: %s" % self.py3_path) - else: - # on osx and linux we use pre-built binaries - LOG.info("downloading mitmproxy binary") - _manifest = os.path.join(here, self.config['playback_binary_manifest']) - transformed_manifest = transform_platform(_manifest, self.config['platform']) - tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) + LOG.info("downloading mitmproxy binary") + _manifest = os.path.join(here, self.config['playback_binary_manifest']) + transformed_manifest = transform_platform(_manifest, self.config['platform']) + tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) # we use one pageset for all platforms LOG.info("downloading mitmproxy pageset") @@ -137,44 +123,10 @@ class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) return - def fetch_python3(self): - """Mitmproxy on windows needs Python 3.x""" - python3_path = os.path.join(self.raptor_dir, 'python3.6', 'python') - if not os.path.exists(os.path.dirname(python3_path)): - _manifest = os.path.join(here, self.config['python3_win_manifest']) - transformed_manifest = transform_platform(_manifest, self.config['platform'], - self.config['processor']) - LOG.info("downloading py3 package for mitmproxy windows: %s" % transformed_manifest) - tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) - cmd = [python3_path, '--version'] - # just want python3 ver printed in production log - subprocess.Popen(cmd, env=os.environ.copy()) - return python3_path - - def setup_py3_virtualenv(self): - """Mitmproxy on windows needs Python 3.x; set up a separate py 3.x env here""" - LOG.info("Setting up python 3.x virtualenv, required for mitmproxy on windows") - # these next two are required for py3_venv_configuration - self.abs_dirs = {'base_work_dir': mozharness_dir} - self.log_obj = None - # now create the py3 venv - venv_path = os.path.join(self.raptor_dir, 'py3venv') - self.py3_venv_configuration(python_path=self.py3_path, venv_path=venv_path) - self.py3_create_venv() - self.py3_install_modules(["cffi==1.10.0"]) - requirements = [os.path.join(here, "mitmproxy_requirements.txt")] - self.py3_install_requirement_files(requirements) - # add py3 executables path to system path - sys.path.insert(1, self.py3_path_to_executables()) - # install mitmproxy itself - self.py3_install_modules(modules=['mitmproxy']) - self.mitmdump_path = os.path.join(self.py3_path_to_executables(), 'mitmdump') - def start(self): - """Start playing back the mitmproxy recording. If on windows, the mitmdump_path was - already set when creating py3 env""" - if self.mitmdump_path is None: - self.mitmdump_path = os.path.join(self.raptor_dir, 'mitmdump') + """Start playing back the mitmproxy recording.""" + + self.mitmdump_path = os.path.join(self.raptor_dir, 'mitmdump') recordings_list = self.recordings.split() self.mitmproxy_proc = self.start_mitmproxy_playback(self.mitmdump_path, @@ -228,7 +180,9 @@ class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): LOG.info("Starting mitmproxy playback using command: %s" % ' '.join(command)) # to turn off mitmproxy log output, use these params for Popen: # Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) - mitmproxy_proc = subprocess.Popen(command, env=env) + mitmproxy_proc = ProcessHandler(command, env=env) + mitmproxy_proc.run() + time.sleep(MITMDUMP_SLEEP) data = mitmproxy_proc.poll() if data is None: # None value indicates process hasn't terminated @@ -242,10 +196,8 @@ class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): """Stop the mitproxy server playback""" mitmproxy_proc = self.mitmproxy_proc LOG.info("Stopping mitmproxy playback, klling process %d" % mitmproxy_proc.pid) - if mozinfo.os == 'win': - mitmproxy_proc.kill() - else: - mitmproxy_proc.terminate() + mitmproxy_proc.kill() + time.sleep(MITMDUMP_SLEEP) status = mitmproxy_proc.poll() if status is None: # None value indicates process hasn't terminated @@ -334,8 +286,8 @@ class MitmproxyDesktop(Mitmproxy): LOG.info("Firefox policies file contents:") LOG.info(contents) if (POLICIES_CONTENT_ON % { - 'cert': self.cert_path, - 'host': self.config['host']}) in contents: + 'cert': self.cert_path, + 'host': self.config['host']}) in contents: LOG.info("Verified mitmproxy CA certificate is installed in Firefox") else: diff --git a/testing/raptor/raptor/playback/python3.manifest b/testing/raptor/raptor/playback/python3.manifest deleted file mode 100644 index fd992f9fdf33..000000000000 --- a/testing/raptor/raptor/playback/python3.manifest +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "size": 15380470, - "visibility": "public", - "digest": "cd78b88d95b69bef99d7192b71dd34118700f44db0a0069a13bfd4943b131e8d7fdac83859f8ac15d873d4b329eef69d8d75d0a6746d06fdcfc5d06da0c9784c", - "algorithm": "sha512", - "unpack": true, - "filename": "python3.6.zip" - } -] diff --git a/testing/raptor/raptor/playback/python3_x64.manifest b/testing/raptor/raptor/playback/python3_x64.manifest deleted file mode 100644 index 550585deedd1..000000000000 --- a/testing/raptor/raptor/playback/python3_x64.manifest +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "size": 16026760, - "visibility": "public", - "digest": "379428e3955671213a245ccd9ccf6f9d17d368db68c02da8baed7be629f2691127cd3e3f86807b25e2098d9840083fdc07946ab1bed0c14db4a5b628a47ed9ef", - "algorithm": "sha512", - "unpack": true, - "filename": "python3.6.amd64.zip" - } -] diff --git a/testing/raptor/raptor/raptor.py b/testing/raptor/raptor/raptor.py index d92f6f460a34..51717eed3c27 100644 --- a/testing/raptor/raptor/raptor.py +++ b/testing/raptor/raptor/raptor.py @@ -171,7 +171,6 @@ class Raptor(object): _key = 'playback_pageset_zip_%s' % self.config['platform'] self.config['playback_pageset_zip'] = test.get(_key, None) self.config['playback_recordings'] = test.get('playback_recordings', None) - self.config['python3_win_manifest'] = test.get('python3_win_manifest', None) def run_test(self, test, timeout=None): self.log.info("starting raptor test: %s" % test['name']) diff --git a/testing/raptor/raptor/tests/raptor-tp6-1.ini b/testing/raptor/raptor/tests/raptor-tp6-1.ini index efc679a49462..78f7c1a4b4ac 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-1.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-1.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-1.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-10.ini b/testing/raptor/raptor/tests/raptor-tp6-10.ini index 6d2d4f4776a1..55d25b126dd1 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-10.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-10.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest page_cycles = 25 unit = ms lower_is_better = true diff --git a/testing/raptor/raptor/tests/raptor-tp6-2.ini b/testing/raptor/raptor/tests/raptor-tp6-2.ini index d5ec3beffa5f..519d8acf7e3d 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-2.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-2.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-2.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-3.ini b/testing/raptor/raptor/tests/raptor-tp6-3.ini index 2a2da425b5c4..f7fe6f5fb5ac 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-3.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-3.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-3.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-4.ini b/testing/raptor/raptor/tests/raptor-tp6-4.ini index b9a4191555d3..43e42d1c57f9 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-4.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-4.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-4.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-5.ini b/testing/raptor/raptor/tests/raptor-tp6-5.ini index 12e34bb5d1b6..187b032de205 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-5.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-5.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-5.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-6.ini b/testing/raptor/raptor/tests/raptor-tp6-6.ini index 2590b4e05159..d82f2b0dbe8f 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-6.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-6.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-6.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-7.ini b/testing/raptor/raptor/tests/raptor-tp6-7.ini index 3f2d0ac9e0d2..59a5a69a2aab 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-7.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-7.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-7.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-8.ini b/testing/raptor/raptor/tests/raptor-tp6-8.ini index 33417f0f618e..15b66746112d 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-8.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-8.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest page_cycles = 25 unit = ms lower_is_better = true diff --git a/testing/raptor/raptor/tests/raptor-tp6-9.ini b/testing/raptor/raptor/tests/raptor-tp6-9.ini index 5fca0ea65fa0..dad8bd780206 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-9.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-9.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest page_cycles = 25 unit = ms lower_is_better = true diff --git a/testing/raptor/raptor/tests/raptor-tp6m-1.ini b/testing/raptor/raptor/tests/raptor-tp6m-1.ini index 17ec6cc5c6aa..ccd62af71f5b 100644 --- a/testing/raptor/raptor/tests/raptor-tp6m-1.ini +++ b/testing/raptor/raptor/tests/raptor-tp6m-1.ini @@ -8,7 +8,6 @@ type = pageload playback = mitmproxy-android playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest -python3_win_manifest = python3{x64}.manifest page_cycles = 15 unit = ms lower_is_better = true diff --git a/testing/raptor/test/test_manifest.py b/testing/raptor/test/test_manifest.py index e1846060e232..20848d02c79f 100644 --- a/testing/raptor/test/test_manifest.py +++ b/testing/raptor/test/test_manifest.py @@ -36,7 +36,6 @@ VALID_MANIFESTS = [{'apps': 'firefox', 'playback_binary_manifest': 'binary.manifest', 'playback_pageset_manifest': 'pageset.manifest', 'playback_recordings': 'recorded_site.mp', - 'python3_win_manifest': 'py3.manifest', 'manifest': 'valid_details_1'}, {'apps': 'chrome', 'type': 'benchmark', @@ -59,7 +58,6 @@ INVALID_MANIFESTS = [{'apps': 'firefox', 'playback_binary_manifest': 'binary.manifest', 'playback_pageset_manifest': 'pageset.manifest', 'playback_recordings': 'recorded_site.mp', - 'python3_win_manifest': 'py3.manifest', 'manifest': 'invalid_details_1'}, {'apps': 'chrome', 'type': 'pageload', @@ -84,7 +82,6 @@ INVALID_MANIFESTS = [{'apps': 'firefox', 'playback_binary_manifest': 'binary.manifest', 'playback_pageset_manifest': 'pageset.manifest', 'playback_recordings': 'recorded_site.mp', - 'python3_win_manifest': 'py3.manifest', 'manifest': 'invalid_details_3'}] From 2b3455d14fa9ce4a89c4838d1c2458ddecb25858 Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 13 Feb 2019 13:46:17 +0000 Subject: [PATCH 28/79] Bug 1500072 - Add a shared helper to record metrics in tests;r=ochameau Depends on D19364 Differential Revision: https://phabricator.services.mozilla.com/D19582 --HG-- extra : moz-landing-system : lando --- .../test/metrics/browser_metrics_inspector.js | 48 ++--------------- .../metrics/browser_metrics_webconsole.js | 48 ++--------------- .../client/framework/test/metrics/head.js | 54 +++++++++++++++++++ 3 files changed, 64 insertions(+), 86 deletions(-) diff --git a/devtools/client/framework/test/metrics/browser_metrics_inspector.js b/devtools/client/framework/test/metrics/browser_metrics_inspector.js index c6e2200a9c9a..123ee4a9643b 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_inspector.js +++ b/devtools/client/framework/test/metrics/browser_metrics_inspector.js @@ -21,47 +21,9 @@ add_task(async function() { // The inspector does not use a dedicated browser loader. const loaders = [loader.provider.loader]; - const allModules = getFilteredModules("", loaders); - const inspectorModules = getFilteredModules("devtools/client/inspector", loaders); - - const allModulesCount = allModules.length; - const inspectorModulesCount = inspectorModules.length; - - const allModulesChars = countCharsInModules(allModules); - const inspectorModulesChars = countCharsInModules(inspectorModules); - - const PERFHERDER_DATA = { - framework: { - name: "devtools", - }, - suites: [{ - name: "inspector-metrics", - value: allModulesChars, - subtests: [ - { - name: "inspector-modules", - value: inspectorModulesCount, - }, - { - name: "inspector-chars", - value: inspectorModulesChars, - }, - { - name: "all-modules", - value: allModulesCount, - }, - { - name: "all-chars", - value: allModulesChars, - }, - ], - }], - }; - info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); - - // Simply check that we found valid values. - ok(allModulesCount > inspectorModulesCount && - inspectorModulesCount > 0, "Successfully recorded module count for Inspector"); - ok(allModulesChars > inspectorModulesChars && - inspectorModulesChars > 0, "Successfully recorded char count for Inspector"); + runMetricsTest({ + filterString: "devtools/client/inspector", + loaders, + panelName: "inspector", + }); }); diff --git a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js index d255e9bca1f1..7feeff989b41 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js +++ b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js @@ -23,47 +23,9 @@ add_task(async function() { const webconsoleLoader = hud.ui.browserLoader; const loaders = [loader.provider.loader, webconsoleLoader.loader]; - const allModules = getFilteredModules("", loaders); - const webconsoleModules = getFilteredModules("devtools/client/webconsole", loaders); - - const allModulesCount = allModules.length; - const webconsoleModulesCount = webconsoleModules.length; - - const allModulesChars = countCharsInModules(allModules); - const webconsoleModulesChars = countCharsInModules(webconsoleModules); - - const PERFHERDER_DATA = { - framework: { - name: "devtools", - }, - suites: [{ - name: "webconsole-metrics", - value: allModulesChars, - subtests: [ - { - name: "webconsole-modules", - value: webconsoleModulesCount, - }, - { - name: "webconsole-chars", - value: webconsoleModulesChars, - }, - { - name: "all-modules", - value: allModulesCount, - }, - { - name: "all-chars", - value: allModulesChars, - }, - ], - }], - }; - info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); - - // Simply check that we found valid values. - ok(allModulesCount > webconsoleModulesCount && - webconsoleModulesCount > 0, "Successfully recorded module count for WebConsole"); - ok(allModulesChars > webconsoleModulesChars && - webconsoleModulesChars > 0, "Successfully recorded char count for WebConsole"); + runMetricsTest({ + filterString: "devtools/client/webconsole", + loaders, + panelName: "webconsole", + }); }); diff --git a/devtools/client/framework/test/metrics/head.js b/devtools/client/framework/test/metrics/head.js index 330dbb9981be..c0f4412f9a44 100644 --- a/devtools/client/framework/test/metrics/head.js +++ b/devtools/client/framework/test/metrics/head.js @@ -30,3 +30,57 @@ function countCharsInModules(modules) { } }, 0); } + +/** + * Record module loading data. + * + * @param {Object} + * - filterString {String} path to use to filter modules specific to the current panel + * - loaders {Array} Array of Loaders to check for modules + * - panelName {String} reused in identifiers for perfherder data + */ +function runMetricsTest({ filterString, loaders, panelName }) { + const allModules = getFilteredModules("", loaders); + const panelModules = getFilteredModules(filterString, loaders); + + const allModulesCount = allModules.length; + const panelModulesCount = panelModules.length; + + const allModulesChars = countCharsInModules(allModules); + const panelModulesChars = countCharsInModules(panelModules); + + const PERFHERDER_DATA = { + framework: { + name: "devtools", + }, + suites: [{ + name: panelName + "-metrics", + value: allModulesChars, + subtests: [ + { + name: panelName + "-modules", + value: panelModulesCount, + }, + { + name: panelName + "-chars", + value: panelModulesChars, + }, + { + name: "all-modules", + value: allModulesCount, + }, + { + name: "all-chars", + value: allModulesChars, + }, + ], + }], + }; + info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); + + // Simply check that we found valid values. + ok(allModulesCount > panelModulesCount && + panelModulesCount > 0, "Successfully recorded module count for " + panelName); + ok(allModulesChars > panelModulesChars && + panelModulesChars > 0, "Successfully recorded char count for " + panelName); +} From a2cbcb26b8454c2201b638f8a75ef543b266be7c Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 13 Feb 2019 13:47:01 +0000 Subject: [PATCH 29/79] Bug 1500072 - Add browserLoader reference on window when flags.testing is true;r=ochameau Depends on D19582 Differential Revision: https://phabricator.services.mozilla.com/D19638 --HG-- extra : moz-landing-system : lando --- .../framework/test/metrics/browser_metrics_webconsole.js | 4 ++-- devtools/client/shared/browser-loader.js | 4 ++++ .../client/shared/test/browser_browserloader_mocks.js | 1 + devtools/client/webconsole/main.js | 9 ++------- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js index 7feeff989b41..bf56c1606fd8 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js +++ b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js @@ -17,10 +17,10 @@ const TEST_URL = "data:text/html;charset=UTF-8,
Webconsole modules load test add_task(async function() { const toolbox = await openNewTabAndToolbox(TEST_URL, "webconsole"); - const hud = toolbox.getCurrentPanel().hud; + const panel = toolbox.getCurrentPanel(); // Retrieve the browser loader dedicated to the WebConsole. - const webconsoleLoader = hud.ui.browserLoader; + const webconsoleLoader = panel._frameWindow.getBrowserLoaderForWindow(); const loaders = [loader.provider.loader, webconsoleLoader.loader]; runMetricsTest({ diff --git a/devtools/client/shared/browser-loader.js b/devtools/client/shared/browser-loader.js index 9ad5cef442d9..8008bcbd8cb5 100644 --- a/devtools/client/shared/browser-loader.js +++ b/devtools/client/shared/browser-loader.js @@ -188,6 +188,10 @@ function BrowserLoaderBuilder({ baseURI, window, useOnlyShared, commonLibRequire const mainModule = loaders.Module(baseURI, joinURI(baseURI, "main.js")); this.loader = loaders.Loader(opts); + // When running tests, expose the BrowserLoader instance for metrics tests. + if (flags.testing) { + window.getBrowserLoaderForWindow = () => this; + } this.require = loaders.Require(this.loader, mainModule); } diff --git a/devtools/client/shared/test/browser_browserloader_mocks.js b/devtools/client/shared/test/browser_browserloader_mocks.js index ff6230e52ea8..7251ea3e13a7 100644 --- a/devtools/client/shared/test/browser_browserloader_mocks.js +++ b/devtools/client/shared/test/browser_browserloader_mocks.js @@ -102,5 +102,6 @@ function testWithRegularDevtoolsModule() { function test() { testWithChromeScheme(); testWithRegularDevtoolsModule(); + delete window.getBrowserLoaderForWindow; finish(); } diff --git a/devtools/client/webconsole/main.js b/devtools/client/webconsole/main.js index 5e22506776b2..c389eb4bfd6c 100644 --- a/devtools/client/webconsole/main.js +++ b/devtools/client/webconsole/main.js @@ -12,14 +12,9 @@ this.WebConsoleWrapper = function(parentNode, hud, toolbox, owner, document) { // Initialize module loader and load all modules of the new inline // preview feature. The entire code-base doesn't need any extra // privileges and runs entirely in content scope. - const browserLoader = BrowserLoader({ + const WebConsoleWrapper = BrowserLoader({ baseURI: "resource://devtools/client/webconsole/", window, - }); - - // Expose the browserLoader instance on the webconsole hud for metrics tests. - hud.browserLoader = browserLoader; - - const WebConsoleWrapper = browserLoader.require("./webconsole-wrapper"); + }).require("./webconsole-wrapper"); return new WebConsoleWrapper(parentNode, hud, toolbox, owner, document); }; From bc5a0f0e1b4a2056929a349424fca5f629d4423b Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 13 Feb 2019 13:48:43 +0000 Subject: [PATCH 30/79] Bug 1500072 - Add metrics test for netmonitor;r=ochameau Depends on D19638 Differential Revision: https://phabricator.services.mozilla.com/D19639 --HG-- rename : devtools/client/framework/test/metrics/browser_metrics_webconsole.ini => devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini rename : devtools/client/framework/test/metrics/browser_metrics_webconsole.js => devtools/client/framework/test/metrics/browser_metrics_netmonitor.js extra : moz-landing-system : lando --- devtools/client/framework/moz.build | 1 + .../metrics/browser_metrics_netmonitor.ini | 12 +++++++ .../metrics/browser_metrics_netmonitor.js | 31 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini create mode 100644 devtools/client/framework/test/metrics/browser_metrics_netmonitor.js diff --git a/devtools/client/framework/moz.build b/devtools/client/framework/moz.build index ba5debde871f..b0928ad796f8 100644 --- a/devtools/client/framework/moz.build +++ b/devtools/client/framework/moz.build @@ -7,6 +7,7 @@ BROWSER_CHROME_MANIFESTS += [ 'test/browser.ini', 'test/metrics/browser_metrics_inspector.ini', + 'test/metrics/browser_metrics_netmonitor.ini', 'test/metrics/browser_metrics_webconsole.ini', ] XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini'] diff --git a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini new file mode 100644 index 000000000000..8cb733e546c5 --- /dev/null +++ b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini @@ -0,0 +1,12 @@ +[DEFAULT] +tags = devtools +subsuite = devtools +support-files = + head.js + !/devtools/client/shared/test/shared-head.js + !/devtools/client/shared/test/telemetry-test-helpers.js + +# Each metrics tests is loaded in a separate .ini file. This way the test is executed +# individually, without any other test being executed before or after. +[browser_metrics_netmonitor.js] +skip-if = os != 'linux' || debug || asan # Results should be platform agnostic - only run on linux64-opt diff --git a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js new file mode 100644 index 000000000000..b38e80eb9e30 --- /dev/null +++ b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js @@ -0,0 +1,31 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from ../../../shared/test/shared-head.js */ + +/** + * This test records the number of modules loaded by DevTools, as well as the total count + * of characters in those modules, when opening the netmonitor. These metrics are + * retrieved by perfherder via logs. + */ + +const TEST_URL = "data:text/html;charset=UTF-8,
Netmonitor modules load test
"; + +add_task(async function() { + const toolbox = await openNewTabAndToolbox(TEST_URL, "netmonitor"); + const panel = toolbox.getCurrentPanel(); + + // Retrieve the browser loader dedicated to the Netmonitor. + const netmonitorLoader = panel.panelWin.getBrowserLoaderForWindow(); + const loaders = [loader.provider.loader, netmonitorLoader.loader]; + + runMetricsTest({ + filterString: "devtools/client/netmonitor", + loaders, + panelName: "netmonitor", + }); +}); From dbb5a03863801b8d59b8fe4bafe177b97d8781ab Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 13 Feb 2019 13:48:47 +0000 Subject: [PATCH 31/79] Bug 1500074 - Add metrics test for jsdebugger;r=ochameau Depends on D19639 Differential Revision: https://phabricator.services.mozilla.com/D19640 --HG-- rename : devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini => devtools/client/framework/test/metrics/browser_metrics_debugger.ini rename : devtools/client/framework/test/metrics/browser_metrics_netmonitor.js => devtools/client/framework/test/metrics/browser_metrics_debugger.js extra : moz-landing-system : lando --- devtools/client/framework/moz.build | 1 + .../test/metrics/browser_metrics_debugger.ini | 12 +++++++ .../test/metrics/browser_metrics_debugger.js | 31 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 devtools/client/framework/test/metrics/browser_metrics_debugger.ini create mode 100644 devtools/client/framework/test/metrics/browser_metrics_debugger.js diff --git a/devtools/client/framework/moz.build b/devtools/client/framework/moz.build index b0928ad796f8..487a177fc6cc 100644 --- a/devtools/client/framework/moz.build +++ b/devtools/client/framework/moz.build @@ -6,6 +6,7 @@ BROWSER_CHROME_MANIFESTS += [ 'test/browser.ini', + 'test/metrics/browser_metrics_debugger.ini', 'test/metrics/browser_metrics_inspector.ini', 'test/metrics/browser_metrics_netmonitor.ini', 'test/metrics/browser_metrics_webconsole.ini', diff --git a/devtools/client/framework/test/metrics/browser_metrics_debugger.ini b/devtools/client/framework/test/metrics/browser_metrics_debugger.ini new file mode 100644 index 000000000000..d1ec7232f6e4 --- /dev/null +++ b/devtools/client/framework/test/metrics/browser_metrics_debugger.ini @@ -0,0 +1,12 @@ +[DEFAULT] +tags = devtools +subsuite = devtools +support-files = + head.js + !/devtools/client/shared/test/shared-head.js + !/devtools/client/shared/test/telemetry-test-helpers.js + +# Each metrics tests is loaded in a separate .ini file. This way the test is executed +# individually, without any other test being executed before or after. +[browser_metrics_debugger.js] +skip-if = os != 'linux' || debug || asan # Results should be platform agnostic - only run on linux64-opt diff --git a/devtools/client/framework/test/metrics/browser_metrics_debugger.js b/devtools/client/framework/test/metrics/browser_metrics_debugger.js new file mode 100644 index 000000000000..749d0b9564a2 --- /dev/null +++ b/devtools/client/framework/test/metrics/browser_metrics_debugger.js @@ -0,0 +1,31 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from ../../../shared/test/shared-head.js */ + +/** + * This test records the number of modules loaded by DevTools, as well as the total count + * of characters in those modules, when opening the debugger. These metrics are + * retrieved by perfherder via logs. + */ + +const TEST_URL = "data:text/html;charset=UTF-8,
Debugger modules load test
"; + +add_task(async function() { + const toolbox = await openNewTabAndToolbox(TEST_URL, "jsdebugger"); + const panel = toolbox.getCurrentPanel(); + + // Retrieve the browser loader dedicated to the Debugger. + const debuggerLoader = panel.panelWin.getBrowserLoaderForWindow(); + const loaders = [loader.provider.loader, debuggerLoader.loader]; + + runMetricsTest({ + filterString: "devtools/client/debugger", + loaders, + panelName: "debugger", + }); +}); From e40194db783ad848736d24b54643454e3433a7a0 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 13 Feb 2019 14:10:19 +0000 Subject: [PATCH 32/79] Bug 1527413 part 1. Give JSIterateCompartmentCallback a return value that can be used to stop the iteration. r=jandem Differential Revision: https://phabricator.services.mozilla.com/D19559 --HG-- extra : moz-landing-system : lando --- js/src/gc/PublicIterators.cpp | 5 ++++- js/src/jsapi.h | 19 ++++++++++++++----- js/xpconnect/src/XPCWrappedJS.cpp | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/js/src/gc/PublicIterators.cpp b/js/src/gc/PublicIterators.cpp index 185cc98e6904..2a09d7f35719 100644 --- a/js/src/gc/PublicIterators.cpp +++ b/js/src/gc/PublicIterators.cpp @@ -220,7 +220,10 @@ JS_PUBLIC_API void JS_IterateCompartments( AutoTraceSession session(cx->runtime()); for (CompartmentsIter c(cx->runtime()); !c.done(); c.next()) { - (*compartmentCallback)(cx, data, c); + if ((*compartmentCallback)(cx, data, c) == + JS::CompartmentIterResult::Stop) { + break; + } } } diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 77862291160a..9dee8c00a26a 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -570,13 +570,22 @@ extern JS_PUBLIC_API void IterateRealmsInCompartment( } // namespace JS -typedef void (*JSIterateCompartmentCallback)(JSContext* cx, void* data, - JS::Compartment* compartment); +/** + * An enum that JSIterateCompartmentCallback can return to indicate + * whether to keep iterating. + */ +namespace JS { +enum class CompartmentIterResult { KeepGoing, Stop }; +} // namespace JS + +typedef JS::CompartmentIterResult (*JSIterateCompartmentCallback)( + JSContext* cx, void* data, JS::Compartment* compartment); /** - * This function calls |compartmentCallback| on every compartment. Beware that - * there is no guarantee that the compartment will survive after the callback - * returns. Also, barriers are disabled via the TraceSession. + * This function calls |compartmentCallback| on every compartment until either + * all compartments have been iterated or CompartmentIterResult::Stop is + * returned. Beware that there is no guarantee that the compartment will survive + * after the callback returns. Also, barriers are disabled via the TraceSession. */ extern JS_PUBLIC_API void JS_IterateCompartments( JSContext* cx, void* data, diff --git a/js/xpconnect/src/XPCWrappedJS.cpp b/js/xpconnect/src/XPCWrappedJS.cpp index f8e0f40d0c3e..b2d991fd2059 100644 --- a/js/xpconnect/src/XPCWrappedJS.cpp +++ b/js/xpconnect/src/XPCWrappedJS.cpp @@ -462,11 +462,12 @@ void XPCJSRuntime::RemoveWrappedJS(nsXPCWrappedJS* wrapper) { } #ifdef DEBUG -static void NotHasWrapperAssertionCallback(JSContext* cx, void* data, - JS::Compartment* comp) { +static JS::CompartmentIterResult NotHasWrapperAssertionCallback( + JSContext* cx, void* data, JS::Compartment* comp) { auto wrapper = static_cast(data); auto xpcComp = xpc::CompartmentPrivate::Get(comp); MOZ_ASSERT_IF(xpcComp, !xpcComp->GetWrappedJSMap()->HasWrapper(wrapper)); + return JS::CompartmentIterResult::KeepGoing; } #endif From 82a9e7be8af41f875999ec84167f20cadbf62afd Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 13 Feb 2019 14:10:21 +0000 Subject: [PATCH 33/79] Bug 1527413 part 2. Add a way to iterate the compartments in a given zone. r=jandem Differential Revision: https://phabricator.services.mozilla.com/D19560 --HG-- extra : moz-landing-system : lando --- js/src/gc/PublicIterators.cpp | 13 +++++++++++++ js/src/jsapi.h | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/js/src/gc/PublicIterators.cpp b/js/src/gc/PublicIterators.cpp index 2a09d7f35719..79feb03fbedf 100644 --- a/js/src/gc/PublicIterators.cpp +++ b/js/src/gc/PublicIterators.cpp @@ -227,6 +227,19 @@ JS_PUBLIC_API void JS_IterateCompartments( } } +JS_PUBLIC_API void JS_IterateCompartmentsInZone( + JSContext* cx, JS::Zone* zone, void* data, + JSIterateCompartmentCallback compartmentCallback) { + AutoTraceSession session(cx->runtime()); + + for (CompartmentsInZoneIter c(zone); !c.done(); c.next()) { + if ((*compartmentCallback)(cx, data, c) == + JS::CompartmentIterResult::Stop) { + break; + } + } +} + JS_PUBLIC_API void JS::IterateRealms(JSContext* cx, void* data, JS::IterateRealmCallback realmCallback) { AutoTraceSession session(cx->runtime()); diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 9dee8c00a26a..f0afffd5e426 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -591,6 +591,17 @@ extern JS_PUBLIC_API void JS_IterateCompartments( JSContext* cx, void* data, JSIterateCompartmentCallback compartmentCallback); +/** + * This function calls |compartmentCallback| on every compartment in the given + * zone until either all compartments have been iterated or + * CompartmentIterResult::Stop is returned. Beware that there is no guarantee + * that the compartment will survive after the callback returns. Also, barriers + * are disabled via the TraceSession. + */ +extern JS_PUBLIC_API void JS_IterateCompartmentsInZone( + JSContext* cx, JS::Zone* zone, void* data, + JSIterateCompartmentCallback compartmentCallback); + /** * Mark a jsid after entering a new compartment. Different zones separately * mark the ids in a runtime, and this must be used any time an id is obtained From 3c72e5c58205c7df823cf0725b1549ac4206c525 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Wed, 13 Feb 2019 14:17:30 +0000 Subject: [PATCH 34/79] Bug 1510603 - Rename some members of CacheIRSpewer for consistency r=mgaudet Renamed outputLock, output, and json to add an underscore suffix Differential Revision: https://phabricator.services.mozilla.com/D19331 --HG-- extra : moz-landing-system : lando --- js/src/jit/CacheIRSpewer.cpp | 28 ++++++++++++++-------------- js/src/jit/CacheIRSpewer.h | 12 ++++++------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/js/src/jit/CacheIRSpewer.cpp b/js/src/jit/CacheIRSpewer.cpp index 763002dcbfb6..315b5e310e7b 100644 --- a/js/src/jit/CacheIRSpewer.cpp +++ b/js/src/jit/CacheIRSpewer.cpp @@ -31,7 +31,7 @@ using namespace js::jit; CacheIRSpewer CacheIRSpewer::cacheIRspewer; CacheIRSpewer::CacheIRSpewer() - : outputLock(mutexid::CacheIRSpewer), guardCount_(0) { + : outputLock_(mutexid::CacheIRSpewer), guardCount_(0) { spewInterval_ = getenv("CACHEIR_LOG_FLUSH") ? atoi(getenv("CACHEIR_LOG_FLUSH")) : 10000; @@ -45,9 +45,9 @@ CacheIRSpewer::~CacheIRSpewer() { return; } - json.ref().endList(); - output.flush(); - output.finish(); + json_.ref().endList(); + output_.flush(); + output_.finish(); } # ifndef JIT_SPEW_DIR @@ -74,18 +74,18 @@ bool CacheIRSpewer::init(const char* filename) { SprintfLiteral(name, "%s%" PRIu32 ".json", filename, pid); } - if (!output.init(name)) { + if (!output_.init(name)) { return false; } - output.put("["); + output_.put("["); - json.emplace(output); + json_.emplace(output_); return true; } void CacheIRSpewer::beginCache(const IRGenerator& gen) { MOZ_ASSERT(enabled()); - JSONPrinter& j = json.ref(); + JSONPrinter& j = json_.ref(); const char* filename = gen.script_->filename(); j.beginObject(); j.property("name", CacheKindNames[uint8_t(gen.cacheKind_)]); @@ -128,7 +128,7 @@ static void QuoteString(GenericPrinter& out, JSLinearString* str) { void CacheIRSpewer::valueProperty(const char* name, const Value& v) { MOZ_ASSERT(enabled()); - JSONPrinter& j = json.ref(); + JSONPrinter& j = json_.ref(); j.beginObjectProperty(name); @@ -146,7 +146,7 @@ void CacheIRSpewer::valueProperty(const char* name, const Value& v) { JSString* str = v.isString() ? v.toString() : v.toSymbol()->description(); if (str && str->isLinear()) { j.beginStringProperty("value"); - QuoteString(output, &str->asLinear()); + QuoteString(output_, &str->asLinear()); j.endStringProperty(); } } else if (v.isObject()) { @@ -185,21 +185,21 @@ void CacheIRSpewer::valueProperty(const char* name, const Value& v) { void CacheIRSpewer::opcodeProperty(const char* name, const JSOp op) { MOZ_ASSERT(enabled()); - JSONPrinter& j = json.ref(); + JSONPrinter& j = json_.ref(); j.beginStringProperty(name); - output.put(CodeName[op]); + output_.put(CodeName[op]); j.endStringProperty(); } void CacheIRSpewer::attached(const char* name) { MOZ_ASSERT(enabled()); - json.ref().property("attached", name); + json_.ref().property("attached", name); } void CacheIRSpewer::endCache() { MOZ_ASSERT(enabled()); - json.ref().endObject(); + json_.ref().endObject(); } #endif /* JS_CACHEIR_SPEW */ diff --git a/js/src/jit/CacheIRSpewer.h b/js/src/jit/CacheIRSpewer.h index e2790f44b0a1..860016c1b725 100644 --- a/js/src/jit/CacheIRSpewer.h +++ b/js/src/jit/CacheIRSpewer.h @@ -21,9 +21,9 @@ namespace js { namespace jit { class CacheIRSpewer { - Mutex outputLock; - Fprinter output; - mozilla::Maybe json; + Mutex outputLock_; + Fprinter output_; + mozilla::Maybe json_; static CacheIRSpewer cacheIRspewer; // Counter to record how many times Guard class is called. This is used to @@ -39,12 +39,12 @@ class CacheIRSpewer { CacheIRSpewer(); ~CacheIRSpewer(); - bool enabled() { return json.isSome(); } + bool enabled() { return json_.isSome(); } // These methods can only be called when enabled() is true. Mutex& lock() { MOZ_ASSERT(enabled()); - return outputLock; + return outputLock_; } void beginCache(const IRGenerator& generator); @@ -78,7 +78,7 @@ class CacheIRSpewer { } sp_.endCache(); if (sp_.guardCount_++ % sp_.spewInterval_ == 0) { - sp_.output.flush(); + sp_.output_.flush(); } sp_.lock().unlock(); } From 0a63dd9be69cdf8c9c1d278190690b2059e5e546 Mon Sep 17 00:00:00 2001 From: Noemi Erli Date: Wed, 13 Feb 2019 16:22:44 +0200 Subject: [PATCH 35/79] Backed out 2 changesets (bug 1509738) for failures in propagate-nonce-external-classic.html Backed out changeset fbf4b73c8786 (bug 1509738) Backed out changeset 53f624bc7c22 (bug 1509738) --- .../security/nsIContentSecurityPolicy.idl | 3 +- dom/script/ScriptLoader.cpp | 21 -------- dom/security/nsCSPContext.cpp | 15 ++++-- dom/security/nsCSPService.cpp | 26 +++++----- dom/security/test/csp/file_nonce_snapshot.sjs | 48 ------------------- dom/security/test/csp/mochitest.ini | 3 -- .../test/csp/test_nonce_snapshot.html | 35 -------------- dom/security/test/unit/test_csp_reports.js | 10 ++-- ipc/glue/BackgroundUtils.cpp | 7 +-- layout/style/Loader.cpp | 33 ------------- netwerk/base/LoadInfo.cpp | 18 +------ netwerk/base/LoadInfo.h | 5 +- netwerk/base/nsILoadInfo.idl | 8 ---- netwerk/ipc/NeckoChannelParams.ipdlh | 1 - 14 files changed, 35 insertions(+), 198 deletions(-) delete mode 100644 dom/security/test/csp/file_nonce_snapshot.sjs delete mode 100644 dom/security/test/csp/test_nonce_snapshot.html diff --git a/dom/interfaces/security/nsIContentSecurityPolicy.idl b/dom/interfaces/security/nsIContentSecurityPolicy.idl index 5b736aee86f0..c1f2716bb75b 100644 --- a/dom/interfaces/security/nsIContentSecurityPolicy.idl +++ b/dom/interfaces/security/nsIContentSecurityPolicy.idl @@ -302,8 +302,7 @@ interface nsIContentSecurityPolicy : nsISerializable in nsISupports aContext, in ACString aMimeTypeGuess, in nsIURI aOriginalURIIfRedirect, - in bool aSendViolationReports, - in AString aNonce); + in bool aSendViolationReports); %{ C++ // nsIObserver topic to fire when the policy encounters a violation. diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index 96f24b7eaa9d..cef10861776d 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -311,16 +311,6 @@ nsresult ScriptLoader::CheckContentPolicy(Document* aDocument, requestingNode, nsILoadInfo::SEC_ONLY_FOR_EXPLICIT_CONTENTSEC_CHECK, contentPolicyType); - // snapshot the nonce at load start time for performing CSP checks - if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_SCRIPT) { - nsCOMPtr element = do_QueryInterface(aContext); - if (element && element->IsHTMLElement()) { - nsAutoString cspNonce; - element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); - secCheckLoadInfo->SetCspNonce(cspNonce); - } - } - int16_t shouldLoad = nsIContentPolicy::ACCEPT; nsresult rv = NS_CheckContentLoadPolicy( aRequest->mURI, secCheckLoadInfo, NS_LossyConvertUTF16toASCII(aType), @@ -1262,17 +1252,6 @@ nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) { NS_ENSURE_SUCCESS(rv, rv); - // snapshot the nonce at load start time for performing CSP checks - if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_SCRIPT) { - nsCOMPtr element = do_QueryInterface(context); - if (element && element->IsHTMLElement()) { - nsAutoString cspNonce; - element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); - nsCOMPtr loadInfo = channel->GetLoadInfo(); - loadInfo->SetCspNonce(cspNonce); - } - } - // To avoid decoding issues, the build-id is part of the JSBytecodeMimeType // constant. aRequest->mCacheInfo = nullptr; diff --git a/dom/security/nsCSPContext.cpp b/dom/security/nsCSPContext.cpp index e16e4e86bf8b..d954801a8a1b 100644 --- a/dom/security/nsCSPContext.cpp +++ b/dom/security/nsCSPContext.cpp @@ -121,8 +121,7 @@ nsCSPContext::ShouldLoad(nsContentPolicyType aContentType, nsISupports* aRequestContext, const nsACString& aMimeTypeGuess, nsIURI* aOriginalURIIfRedirect, - bool aSendViolationReports, const nsAString& aNonce, - int16_t* outDecision) { + bool aSendViolationReports, int16_t* outDecision) { if (CSPCONTEXTLOGENABLED()) { CSPCONTEXTLOG(("nsCSPContext::ShouldLoad, aContentLocation: %s", aContentLocation->GetSpecOrDefault().get())); @@ -156,8 +155,18 @@ nsCSPContext::ShouldLoad(nsContentPolicyType aContentType, return NS_OK; } + nsAutoString nonce; bool parserCreated = false; if (!isPreload) { + if (aContentType == nsIContentPolicy::TYPE_SCRIPT || + aContentType == nsIContentPolicy::TYPE_STYLESHEET) { + nsCOMPtr element = do_QueryInterface(aRequestContext); + if (element && element->IsHTMLElement()) { + // XXXbz What about SVG elements that can have nonce? + element->GetAttribute(NS_LITERAL_STRING("nonce"), nonce); + } + } + nsCOMPtr script = do_QueryInterface(aRequestContext); if (script && script->GetParserCreated() != mozilla::dom::NOT_FROM_PARSER) { parserCreated = true; @@ -168,7 +177,7 @@ nsCSPContext::ShouldLoad(nsContentPolicyType aContentType, permitsInternal(dir, nullptr, // aTriggeringElement aCSPEventListener, aContentLocation, - aOriginalURIIfRedirect, aNonce, isPreload, + aOriginalURIIfRedirect, nonce, isPreload, false, // allow fallback to default-src aSendViolationReports, true, // send blocked URI in violation reports diff --git a/dom/security/nsCSPService.cpp b/dom/security/nsCSPService.cpp index c40dda86ed15..82b4678c488d 100644 --- a/dom/security/nsCSPService.cpp +++ b/dom/security/nsCSPService.cpp @@ -172,10 +172,6 @@ CSPService::ShouldLoad(nsIURI *aContentLocation, nsILoadInfo *aLoadInfo, return NS_OK; } - nsAutoString cspNonce; - rv = aLoadInfo->GetCspNonce(cspNonce); - NS_ENSURE_SUCCESS(rv, rv); - // 1) Apply speculate CSP for preloads bool isPreload = nsContentUtils::IsPreloadType(contentType); @@ -190,7 +186,7 @@ CSPService::ShouldLoad(nsIURI *aContentLocation, nsILoadInfo *aLoadInfo, contentType, cspEventListener, aContentLocation, requestOrigin, requestContext, aMimeTypeGuess, nullptr, // no redirect, aOriginal URL is null. - aLoadInfo->GetSendCSPViolationEvents(), cspNonce, aDecision); + aLoadInfo->GetSendCSPViolationEvents(), aDecision); NS_ENSURE_SUCCESS(rv, rv); // if the preload policy already denied the load, then there @@ -211,8 +207,7 @@ CSPService::ShouldLoad(nsIURI *aContentLocation, nsILoadInfo *aLoadInfo, rv = csp->ShouldLoad(contentType, cspEventListener, aContentLocation, requestOrigin, requestContext, aMimeTypeGuess, nullptr, // no redirect, aOriginal URL is null. - aLoadInfo->GetSendCSPViolationEvents(), cspNonce, - aDecision); + aLoadInfo->GetSendCSPViolationEvents(), aDecision); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; @@ -256,6 +251,17 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, nsIAsyncVerifyRedirectCallback *callback) { net::nsAsyncRedirectAutoCallback autoCallback(callback); + if (XRE_IsE10sParentProcess()) { + nsCOMPtr parentChannel; + NS_QueryNotificationCallbacks(oldChannel, parentChannel); + if (parentChannel) { + // This is an IPC'd channel. Don't check it here, because we won't have + // access to the request context; we'll check them in the content + // process instead. Bug 1509738 covers fixing this. + return NS_OK; + } + } + nsCOMPtr newUri; nsresult rv = newChannel->GetURI(getter_AddRefs(newUri)); NS_ENSURE_SUCCESS(rv, rv); @@ -297,10 +303,6 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, return rv; } - nsAutoString cspNonce; - rv = loadInfo->GetCspNonce(cspNonce); - NS_ENSURE_SUCCESS(rv, rv); - bool isPreload = nsContentUtils::IsPreloadType(policyType); /* On redirect, if the content policy is a preload type, rejecting the preload @@ -328,7 +330,6 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, EmptyCString(), // ACString - MIME guess originalUri, // Original nsIURI true, // aSendViolationReports - cspNonce, // nonce &aDecision); // if the preload policy already denied the load, then there @@ -355,7 +356,6 @@ CSPService::AsyncOnChannelRedirect(nsIChannel *oldChannel, EmptyCString(), // ACString - MIME guess originalUri, // Original nsIURI true, // aSendViolationReports - cspNonce, // nonce &aDecision); } diff --git a/dom/security/test/csp/file_nonce_snapshot.sjs b/dom/security/test/csp/file_nonce_snapshot.sjs deleted file mode 100644 index 1f2aa759c88d..000000000000 --- a/dom/security/test/csp/file_nonce_snapshot.sjs +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; - -const TEST_FRAME = - ` - - - - - - `; - -const SCRIPT = "window.parent.postMessage('script-loaded', '*');"; - -function handleRequest(request, response) -{ - // avoid confusing cache behaviors - response.setHeader("Cache-Control", "no-cache", false); - - let queryString = request.queryString; - - if (queryString === "load-frame") { - response.setHeader("Content-Security-Policy", "script-src 'nonce-123456789'", false); - response.setHeader("Content-Type", "text/html", false); - response.write(TEST_FRAME); - return; - } - - if (queryString === "redir-script") { - response.setStatusLine("1.1", 302, "Found"); - response.setHeader("Location", "file_nonce_snapshot.sjs?load-script", false); - return; - } - - if (queryString === "load-script") { - response.setHeader("Content-Type", "application/javascript", false); - response.write(SCRIPT); - return; - } - - // we should never get here but just in case return something unexpected - response.write("do'h"); -} diff --git a/dom/security/test/csp/mochitest.ini b/dom/security/test/csp/mochitest.ini index 12efa09e4526..3c3b6696050f 100644 --- a/dom/security/test/csp/mochitest.ini +++ b/dom/security/test/csp/mochitest.ini @@ -368,6 +368,3 @@ support-files = worker_helper.js main_csp_worker.html main_csp_worker.html^headers^ -[test_nonce_snapshot.html] -support-files = - file_nonce_snapshot.sjs diff --git a/dom/security/test/csp/test_nonce_snapshot.html b/dom/security/test/csp/test_nonce_snapshot.html deleted file mode 100644 index 7e94e6df1cb2..000000000000 --- a/dom/security/test/csp/test_nonce_snapshot.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Bug 1509738 - Snapshot nonce at load start time - - - - - - - - - diff --git a/dom/security/test/unit/test_csp_reports.js b/dom/security/test/unit/test_csp_reports.js index d5ecd210af6c..af90899bd690 100644 --- a/dom/security/test/unit/test_csp_reports.js +++ b/dom/security/test/unit/test_csp_reports.js @@ -153,7 +153,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SCRIPT, null, // nsICSPEventListener NetUtil.newURI("http://blocked.test/foo.js"), - null, null, null, null, true, null); + null, null, null, null, true); }); // test that inline script violations cause a report in report-only policy @@ -206,7 +206,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_IMAGE, null, // nsICSPEventListener NetUtil.newURI("data:image/png;base64," + base64data), - null, null, null, null, true, null); + null, null, null, null, true); }); // test that only the uri's scheme is reported for globally unique identifiers @@ -216,7 +216,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SUBDOCUMENT, null, // nsICSPEventListener NetUtil.newURI("intent://mymaps.com/maps?um=1&ie=UTF-8&fb=1&sll"), - null, null, null, null, true, null); + null, null, null, null, true); }); // test fragment removal @@ -227,7 +227,7 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SCRIPT, null, // nsICSPEventListener NetUtil.newURI(selfSpec + "#bar"), - null, null, null, null, true, null); + null, null, null, null, true); }); // test scheme of ftp: @@ -237,6 +237,6 @@ function run_test() { csp.shouldLoad(Ci.nsIContentPolicy.TYPE_SCRIPT, null, // nsICSPEventListener NetUtil.newURI("ftp://blocked.test/profile.png"), - null, null, null, null, true, null); + null, null, null, null, true); }); } diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 9c7ed8a07ae9..c5331e7eefc1 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -457,9 +457,6 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo, ipcController = controller.ref().ToIPC(); } - nsAutoString cspNonce; - Unused << NS_WARN_IF(NS_FAILED(aLoadInfo->GetCspNonce(cspNonce))); - *aOptionalLoadInfoArgs = LoadInfoArgs( loadingPrincipalInfo, triggeringPrincipalInfo, principalToInheritInfo, sandboxedLoadingPrincipalInfo, topLevelPrincipalInfo, @@ -487,7 +484,7 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo, aLoadInfo->GetIsPreflight(), aLoadInfo->GetLoadTriggeredFromExternal(), aLoadInfo->GetServiceWorkerTaintingSynthesized(), aLoadInfo->GetDocumentHasUserInteracted(), - aLoadInfo->GetDocumentHasLoaded(), cspNonce, + aLoadInfo->GetDocumentHasLoaded(), aLoadInfo->GetIsFromProcessingFrameAttributes()); return NS_OK; @@ -643,7 +640,7 @@ nsresult LoadInfoArgsToLoadInfo( loadInfoArgs.isPreflight(), loadInfoArgs.loadTriggeredFromExternal(), loadInfoArgs.serviceWorkerTaintingSynthesized(), loadInfoArgs.documentHasUserInteracted(), - loadInfoArgs.documentHasLoaded(), loadInfoArgs.cspNonce()); + loadInfoArgs.documentHasLoaded()); if (loadInfoArgs.isFromProcessingFrameAttributes()) { loadInfo->SetIsFromProcessingFrameAttributes(); diff --git a/layout/style/Loader.cpp b/layout/style/Loader.cpp index 1272dbd48ca9..41e04cf7b1ba 100644 --- a/layout/style/Loader.cpp +++ b/layout/style/Loader.cpp @@ -858,16 +858,6 @@ nsresult Loader::CheckContentPolicy(nsIPrincipal* aLoadingPrincipal, aLoadingPrincipal, aTriggeringPrincipal, aRequestingNode, nsILoadInfo::SEC_ONLY_FOR_EXPLICIT_CONTENTSEC_CHECK, contentPolicyType); - // snapshot the nonce at load start time for performing CSP checks - if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET) { - nsCOMPtr element = do_QueryInterface(aRequestingNode); - if (element && element->IsHTMLElement()) { - nsAutoString cspNonce; - element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); - secCheckLoadInfo->SetCspNonce(cspNonce); - } - } - int16_t shouldLoad = nsIContentPolicy::ACCEPT; nsresult rv = NS_CheckContentLoadPolicy( aTargetURI, secCheckLoadInfo, NS_LITERAL_CSTRING("text/css"), &shouldLoad, @@ -1320,18 +1310,6 @@ nsresult Loader::LoadSheet(SheetLoadData* aLoadData, return rv; } - // snapshot the nonce at load start time for performing CSP checks - if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET) { - nsCOMPtr element = - do_QueryInterface(aLoadData->mRequestingNode); - if (element && element->IsHTMLElement()) { - nsAutoString cspNonce; - element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); - nsCOMPtr loadInfo = channel->GetLoadInfo(); - loadInfo->SetCspNonce(cspNonce); - } - } - nsCOMPtr stream; rv = channel->Open(getter_AddRefs(stream)); @@ -1460,17 +1438,6 @@ nsresult Loader::LoadSheet(SheetLoadData* aLoadData, return rv; } - // snapshot the nonce at load start time for performing CSP checks - if (contentPolicyType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET) { - nsCOMPtr element = do_QueryInterface(aLoadData->mRequestingNode); - if (element && element->IsHTMLElement()) { - nsAutoString cspNonce; - element->GetAttribute(NS_LITERAL_STRING("nonce"), cspNonce); - nsCOMPtr loadInfo = channel->GetLoadInfo(); - loadInfo->SetCspNonce(cspNonce); - } - } - if (!aLoadData->ShouldDefer()) { nsCOMPtr cos(do_QueryInterface(channel)); if (cos) { diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp index a35b8ce525b7..0cc4f3e33964 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp @@ -478,7 +478,6 @@ LoadInfo::LoadInfo(const LoadInfo& rhs) mServiceWorkerTaintingSynthesized(false), mDocumentHasUserInteracted(rhs.mDocumentHasUserInteracted), mDocumentHasLoaded(rhs.mDocumentHasLoaded), - mCspNonce(rhs.mCspNonce), mIsFromProcessingFrameAttributes(rhs.mIsFromProcessingFrameAttributes) {} LoadInfo::LoadInfo( @@ -511,7 +510,7 @@ LoadInfo::LoadInfo( const nsTArray& aCorsUnsafeHeaders, bool aForcePreflight, bool aIsPreflight, bool aLoadTriggeredFromExternal, bool aServiceWorkerTaintingSynthesized, bool aDocumentHasUserInteracted, - bool aDocumentHasLoaded, const nsAString& aCspNonce) + bool aDocumentHasLoaded) : mLoadingPrincipal(aLoadingPrincipal), mTriggeringPrincipal(aTriggeringPrincipal), mPrincipalToInherit(aPrincipalToInherit), @@ -557,7 +556,6 @@ LoadInfo::LoadInfo( mServiceWorkerTaintingSynthesized(aServiceWorkerTaintingSynthesized), mDocumentHasUserInteracted(aDocumentHasUserInteracted), mDocumentHasLoaded(aDocumentHasLoaded), - mCspNonce(aCspNonce), mIsFromProcessingFrameAttributes(false) { // Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal MOZ_ASSERT(mLoadingPrincipal || @@ -1256,20 +1254,6 @@ LoadInfo::SetDocumentHasLoaded(bool aDocumentHasLoaded) { return NS_OK; } -NS_IMETHODIMP -LoadInfo::GetCspNonce(nsAString& aCspNonce) { - aCspNonce = mCspNonce; - return NS_OK; -} - -NS_IMETHODIMP -LoadInfo::SetCspNonce(const nsAString& aCspNonce) { - MOZ_ASSERT(!mInitialSecurityCheckDone, - "setting the nonce is only allowed before any sec checks"); - mCspNonce = aCspNonce; - return NS_OK; -} - NS_IMETHODIMP LoadInfo::GetIsTopLevelLoad(bool* aResult) { *aResult = mFrameOuterWindowID ? mFrameOuterWindowID == mOuterWindowID diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h index 851602553ebe..0698cc86a559 100644 --- a/netwerk/base/LoadInfo.h +++ b/netwerk/base/LoadInfo.h @@ -12,7 +12,6 @@ #include "nsIPrincipal.h" #include "nsIWeakReferenceUtils.h" // for nsWeakPtr #include "nsIURI.h" -#include "nsString.h" #include "nsTArray.h" #include "mozilla/BasePrincipal.h" @@ -122,8 +121,7 @@ class LoadInfo final : public nsILoadInfo { const nsTArray& aUnsafeHeaders, bool aForcePreflight, bool aIsPreflight, bool aLoadTriggeredFromExternal, bool aServiceWorkerTaintingSynthesized, - bool aDocumentHasUserInteracted, bool aDocumentHasLoaded, - const nsAString& aCspNonce); + bool aDocumentHasUserInteracted, bool aDocumentHasLoaded); LoadInfo(const LoadInfo& rhs); NS_IMETHOD GetRedirects(JSContext* aCx, @@ -200,7 +198,6 @@ class LoadInfo final : public nsILoadInfo { bool mServiceWorkerTaintingSynthesized; bool mDocumentHasUserInteracted; bool mDocumentHasLoaded; - nsString mCspNonce; // Is true if this load was triggered by processing the attributes of the // browsing context container. diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl index 6a8ba66c1a47..92d99bd4d513 100644 --- a/netwerk/base/nsILoadInfo.idl +++ b/netwerk/base/nsILoadInfo.idl @@ -1047,14 +1047,6 @@ interface nsILoadInfo : nsISupports */ [infallible] attribute boolean documentHasLoaded; - /** - * A snapshot of the nonce at load start time which is used for CSP - * checks and only set for: - * * TYPE_SCRIPT and - * * TYPE_STYLESHEET - */ - attribute AString cspNonce; - /** * The object in charged to receive CSP violation events. It can be null. * This attribute will be merged into the CSP object eventually. diff --git a/netwerk/ipc/NeckoChannelParams.ipdlh b/netwerk/ipc/NeckoChannelParams.ipdlh index 267f9ea22aaa..ee8d38fb4ed1 100644 --- a/netwerk/ipc/NeckoChannelParams.ipdlh +++ b/netwerk/ipc/NeckoChannelParams.ipdlh @@ -109,7 +109,6 @@ struct LoadInfoArgs bool serviceWorkerTaintingSynthesized; bool documentHasUserInteracted; bool documentHasLoaded; - nsString cspNonce; bool isFromProcessingFrameAttributes; }; From dbf700470cfa7148b78a57049f541e5d788f17c7 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Wed, 13 Feb 2019 14:22:06 +0000 Subject: [PATCH 36/79] Bug 1527600 - Update moz.build files to use new bugzilla component 'Core :: DOM: Web Authentication' r=jcj Differential Revision: https://phabricator.services.mozilla.com/D19659 --HG-- extra : moz-landing-system : lando --- dom/u2f/moz.build | 2 +- dom/webauthn/moz.build | 2 +- testing/web-platform/moz.build | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dom/u2f/moz.build b/dom/u2f/moz.build index 0752bbd64247..5fe7cbe3e54e 100644 --- a/dom/u2f/moz.build +++ b/dom/u2f/moz.build @@ -5,7 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. with Files("**"): - BUG_COMPONENT = ("Core", "DOM: Device Interfaces") + BUG_COMPONENT = ("Core", "DOM: Web Authentication") EXPORTS.mozilla.dom += [ 'U2F.h', diff --git a/dom/webauthn/moz.build b/dom/webauthn/moz.build index e54a5f97b400..774df2f0dbdb 100644 --- a/dom/webauthn/moz.build +++ b/dom/webauthn/moz.build @@ -5,7 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. with Files("**"): - BUG_COMPONENT = ("Core", "DOM: Device Interfaces") + BUG_COMPONENT = ("Core", "DOM: Web Authentication") IPDL_SOURCES += [ 'PWebAuthnTransaction.ipdl' diff --git a/testing/web-platform/moz.build b/testing/web-platform/moz.build index ef8a9088c37b..735aee30abd2 100644 --- a/testing/web-platform/moz.build +++ b/testing/web-platform/moz.build @@ -551,7 +551,7 @@ with Files("tests/webaudio/**"): BUG_COMPONENT = ("Core", "Web Audio") with Files("tests/webauthn/**"): - BUG_COMPONENT = ("Core", "DOM: Device Interfaces") + BUG_COMPONENT = ("Core", "DOM: Web Authentication") with Files("tests/webdriver/**"): BUG_COMPONENT = ("Testing", "geckodriver") From 8b42c45ed45ded787ad0398bb065d97cbd498225 Mon Sep 17 00:00:00 2001 From: Michael Froman Date: Wed, 13 Feb 2019 14:11:45 +0000 Subject: [PATCH 37/79] Bug 1527472 - devirtualize IPC methods in PVideoDecoder and PRemoteVideoDecoder. r=Alex_Gaynor Differential Revision: https://phabricator.services.mozilla.com/D19578 --HG-- extra : moz-landing-system : lando --- dom/media/ipc/RemoteVideoDecoderChild.h | 21 +++++++++++---------- dom/media/ipc/RemoteVideoDecoderParent.h | 15 +++++++++------ dom/media/ipc/VideoDecoderChild.h | 22 +++++++++++++--------- dom/media/ipc/VideoDecoderParent.h | 15 +++++++++------ dom/media/ipc/moz.build | 5 +++++ ipc/ipdl/ipdl/direct_call.py | 4 ---- 6 files changed, 47 insertions(+), 35 deletions(-) diff --git a/dom/media/ipc/RemoteVideoDecoderChild.h b/dom/media/ipc/RemoteVideoDecoderChild.h index 4394230690c6..3984c26b562a 100644 --- a/dom/media/ipc/RemoteVideoDecoderChild.h +++ b/dom/media/ipc/RemoteVideoDecoderChild.h @@ -20,23 +20,24 @@ namespace mozilla { class RemoteDecoderManagerChild; using mozilla::MediaDataDecoder; +using mozilla::ipc::IPCResult; class RemoteVideoDecoderChild final : public PRemoteVideoDecoderChild, public IRemoteDecoderChild { + friend class PRemoteVideoDecoderChild; + public: explicit RemoteVideoDecoderChild(); // PRemoteVideoDecoderChild - mozilla::ipc::IPCResult RecvVideoOutput( - const RemoteVideoDataIPDL& aData) override; - mozilla::ipc::IPCResult RecvInputExhausted() override; - mozilla::ipc::IPCResult RecvDrainComplete() override; - mozilla::ipc::IPCResult RecvError(const nsresult& aError) override; - mozilla::ipc::IPCResult RecvInitComplete( - const nsCString& aDecoderDescription, - const ConversionRequired& aConversion) override; - mozilla::ipc::IPCResult RecvInitFailed(const nsresult& aReason) override; - mozilla::ipc::IPCResult RecvFlushComplete() override; + IPCResult RecvVideoOutput(const RemoteVideoDataIPDL& aData); + IPCResult RecvInputExhausted(); + IPCResult RecvDrainComplete(); + IPCResult RecvError(const nsresult& aError); + IPCResult RecvInitComplete(const nsCString& aDecoderDescription, + const ConversionRequired& aConversion); + IPCResult RecvInitFailed(const nsresult& aReason); + IPCResult RecvFlushComplete(); void ActorDestroy(ActorDestroyReason aWhy) override; diff --git a/dom/media/ipc/RemoteVideoDecoderParent.h b/dom/media/ipc/RemoteVideoDecoderParent.h index 7b9406d08b68..301740095f6f 100644 --- a/dom/media/ipc/RemoteVideoDecoderParent.h +++ b/dom/media/ipc/RemoteVideoDecoderParent.h @@ -10,8 +10,11 @@ namespace mozilla { class RemoteDecoderManagerParent; +using mozilla::ipc::IPCResult; class RemoteVideoDecoderParent final : public PRemoteVideoDecoderParent { + friend class PRemoteVideoDecoderParent; + public: // We refcount this class since the task queue can have runnables // that reference us. @@ -27,12 +30,12 @@ class RemoteVideoDecoderParent final : public PRemoteVideoDecoderParent { void Destroy(); // PRemoteVideoDecoderParent - mozilla::ipc::IPCResult RecvInit() override; - mozilla::ipc::IPCResult RecvInput(const MediaRawDataIPDL& aData) override; - mozilla::ipc::IPCResult RecvFlush() override; - mozilla::ipc::IPCResult RecvDrain() override; - mozilla::ipc::IPCResult RecvShutdown() override; - mozilla::ipc::IPCResult RecvSetSeekThreshold(const int64_t& aTime) override; + IPCResult RecvInit(); + IPCResult RecvInput(const MediaRawDataIPDL& aData); + IPCResult RecvFlush(); + IPCResult RecvDrain(); + IPCResult RecvShutdown(); + IPCResult RecvSetSeekThreshold(const int64_t& aTime); void ActorDestroy(ActorDestroyReason aWhy) override; diff --git a/dom/media/ipc/VideoDecoderChild.h b/dom/media/ipc/VideoDecoderChild.h index 034ce9de3cb7..c109c278ec99 100644 --- a/dom/media/ipc/VideoDecoderChild.h +++ b/dom/media/ipc/VideoDecoderChild.h @@ -16,22 +16,26 @@ namespace mozilla { class RemoteVideoDecoder; class RemoteDecoderModule; class VideoDecoderManagerChild; +using mozilla::ipc::IPCResult; class VideoDecoderChild final : public PVideoDecoderChild, public IRemoteDecoderChild { + friend class PVideoDecoderChild; + public: explicit VideoDecoderChild(); // PVideoDecoderChild - mozilla::ipc::IPCResult RecvOutput(const VideoDataIPDL& aData) override; - mozilla::ipc::IPCResult RecvInputExhausted() override; - mozilla::ipc::IPCResult RecvDrainComplete() override; - mozilla::ipc::IPCResult RecvError(const nsresult& aError) override; - mozilla::ipc::IPCResult RecvInitComplete( - const nsCString& aDecoderDescription, const bool& aHardware, - const nsCString& aHardwareReason, const uint32_t& aConversion) override; - mozilla::ipc::IPCResult RecvInitFailed(const nsresult& aReason) override; - mozilla::ipc::IPCResult RecvFlushComplete() override; + IPCResult RecvOutput(const VideoDataIPDL& aData); + IPCResult RecvInputExhausted(); + IPCResult RecvDrainComplete(); + IPCResult RecvError(const nsresult& aError); + IPCResult RecvInitComplete(const nsCString& aDecoderDescription, + const bool& aHardware, + const nsCString& aHardwareReason, + const uint32_t& aConversion); + IPCResult RecvInitFailed(const nsresult& aReason); + IPCResult RecvFlushComplete(); void ActorDestroy(ActorDestroyReason aWhy) override; diff --git a/dom/media/ipc/VideoDecoderParent.h b/dom/media/ipc/VideoDecoderParent.h index ce7d930892ca..7d36e24a75b8 100644 --- a/dom/media/ipc/VideoDecoderParent.h +++ b/dom/media/ipc/VideoDecoderParent.h @@ -17,8 +17,11 @@ namespace mozilla { class KnowsCompositorVideo; +using mozilla::ipc::IPCResult; class VideoDecoderParent final : public PVideoDecoderParent { + friend class PVideoDecoderParent; + public: // We refcount this class since the task queue can have runnables // that reference us. @@ -34,12 +37,12 @@ class VideoDecoderParent final : public PVideoDecoderParent { void Destroy(); // PVideoDecoderParent - mozilla::ipc::IPCResult RecvInit() override; - mozilla::ipc::IPCResult RecvInput(const MediaRawDataIPDL& aData) override; - mozilla::ipc::IPCResult RecvFlush() override; - mozilla::ipc::IPCResult RecvDrain() override; - mozilla::ipc::IPCResult RecvShutdown() override; - mozilla::ipc::IPCResult RecvSetSeekThreshold(const int64_t& aTime) override; + IPCResult RecvInit(); + IPCResult RecvInput(const MediaRawDataIPDL& aData); + IPCResult RecvFlush(); + IPCResult RecvDrain(); + IPCResult RecvShutdown(); + IPCResult RecvSetSeekThreshold(const int64_t& aTime); void ActorDestroy(ActorDestroyReason aWhy) override; diff --git a/dom/media/ipc/moz.build b/dom/media/ipc/moz.build index e34c75318887..ffd708685693 100644 --- a/dom/media/ipc/moz.build +++ b/dom/media/ipc/moz.build @@ -16,6 +16,7 @@ IPDL_SOURCES += [ EXPORTS.mozilla += [ 'GpuDecoderModule.h', + 'IRemoteDecoderChild.h', 'RDDChild.h', 'RDDParent.h', 'RDDProcessHost.h', @@ -25,8 +26,12 @@ EXPORTS.mozilla += [ 'RemoteDecoderManagerParent.h', 'RemoteDecoderModule.h', 'RemoteMediaDataDecoder.h', + 'RemoteVideoDecoderChild.h', + 'RemoteVideoDecoderParent.h', + 'VideoDecoderChild.h', 'VideoDecoderManagerChild.h', 'VideoDecoderManagerParent.h', + 'VideoDecoderParent.h', ] EXPORTS.mozilla.dom += [ diff --git a/ipc/ipdl/ipdl/direct_call.py b/ipc/ipdl/ipdl/direct_call.py index 50dadec329a7..d6c95caeaf80 100644 --- a/ipc/ipdl/ipdl/direct_call.py +++ b/ipc/ipdl/ipdl/direct_call.py @@ -254,8 +254,6 @@ VIRTUAL_CALL_CLASSES = set([ ("PQuota", "child"), ("PQuotaRequest", "child"), ("PQuotaUsageRequest", "child"), - ("PRemoteVideoDecoder", "child"), - ("PRemoteVideoDecoder", "parent"), ("PServiceWorker", "child"), ("PServiceWorker", "parent"), ("PServiceWorkerContainer", "child"), @@ -264,8 +262,6 @@ VIRTUAL_CALL_CLASSES = set([ ("PServiceWorkerRegistration", "parent"), ("PServiceWorkerUpdater", "child"), ("PServiceWorkerUpdater", "parent"), - ("PVideoDecoder", "child"), - ("PVideoDecoder", "parent"), ("PVRLayer", "parent"), ("PWebBrowserPersistResources", "child"), ("PWebBrowserPersistResources", "parent"), From 6777b792b43e2bbd71f89dbdd32bc739dcd5d654 Mon Sep 17 00:00:00 2001 From: Michael Kaply Date: Wed, 13 Feb 2019 14:54:24 +0000 Subject: [PATCH 38/79] Bug 1525635 - Properly handle mozAddonManager compatibility failure. r=aswan Differential Revision: https://phabricator.services.mozilla.com/D18859 --HG-- extra : moz-landing-system : lando --- toolkit/mozapps/extensions/AddonManager.jsm | 88 ++++++++++-------- .../test/browser/browser_webapi_install.js | 21 +++++ .../xpinstall/browser_doorhanger_installs.js | 6 +- .../test/xpinstall/incompatible.xpi | Bin 4442 -> 428 bytes 4 files changed, 72 insertions(+), 43 deletions(-) diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm index ff82d8768d2b..a86bb2b5812f 100644 --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -1809,7 +1809,7 @@ var AddonManagerInternal = { onDownloadEnded() { if (install.addon.appDisabled) { - // App disabled items are not compatible and so fail to install + // App disabled items are not compatible and so fail to install. install.removeListener(listener); install.cancel(); self.installNotifyObservers("addon-install-failed", browser, url, install); @@ -2615,45 +2615,6 @@ var AddonManagerInternal = { obj.maxProgress = install.maxProgress; }, - makeListener(id, mm) { - const events = [ - "onDownloadStarted", - "onDownloadProgress", - "onDownloadEnded", - "onDownloadCancelled", - "onDownloadFailed", - "onInstallStarted", - "onInstallEnded", - "onInstallCancelled", - "onInstallFailed", - ]; - - let listener = {}; - let installPromise = new Promise((resolve, reject) => { - events.forEach(event => { - listener[event] = (install, addon) => { - let data = {event, id}; - AddonManager.webAPI.copyProps(install, data); - this.sendEvent(mm, data); - if (event == "onInstallEnded") { - resolve(addon); - } else if (event == "onDownloadFailed" || event == "onInstallFailed") { - reject({message: "install failed"}); - } else if (event == "onDownloadCancelled" || event == "onInstallCancelled") { - reject({message: "install cancelled"}); - } - }; - }); - }); - - // We create the promise here since this is where we're setting - // up the InstallListener, but if the install is never started, - // no handlers will be attached so make sure we terminate errors. - installPromise.catch(() => {}); - - return {listener, installPromise}; - }, - forgetInstall(id) { let info = this.installs.get(id); if (!info) { @@ -2679,6 +2640,51 @@ var AddonManagerInternal = { throw new Error(`Install from ${host} not permitted`); } + const makeListener = (id, mm) => { + const events = [ + "onDownloadStarted", + "onDownloadProgress", + "onDownloadEnded", + "onDownloadCancelled", + "onDownloadFailed", + "onInstallStarted", + "onInstallEnded", + "onInstallCancelled", + "onInstallFailed", + ]; + + let listener = {}; + let installPromise = new Promise((resolve, reject) => { + events.forEach(event => { + listener[event] = (install, addon) => { + let data = {event, id}; + AddonManager.webAPI.copyProps(install, data); + this.sendEvent(mm, data); + if (event == "onInstallEnded") { + resolve(addon); + } else if (event == "onDownloadFailed" || event == "onInstallFailed") { + reject({message: "install failed"}); + } else if (event == "onDownloadCancelled" || event == "onInstallCancelled") { + reject({message: "install cancelled"}); + } else if (event == "onDownloadEnded") { + if (install.addon.appDisabled) { + // App disabled items are not compatible and so fail to install + install.cancel(); + AddonManagerInternal.installNotifyObservers("addon-install-failed", target, Services.io.newURI(options.url), install); + } + } + }; + }); + }); + + // We create the promise here since this is where we're setting + // up the InstallListener, but if the install is never started, + // no handlers will be attached so make sure we terminate errors. + installPromise.catch(() => {}); + + return {listener, installPromise}; + }; + try { checkInstallUrl(options.url); } catch (err) { @@ -2695,7 +2701,7 @@ var AddonManagerInternal = { AddonManagerInternal.setupPromptHandler(target, null, install, false, "AMO"); let id = this.nextInstall++; - let {listener, installPromise} = this.makeListener(id, target.messageManager); + let {listener, installPromise} = makeListener(id, target.messageManager); install.addListener(listener); this.installs.set(id, {install, target, listener, installPromise}); diff --git a/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js b/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js index b56648fb5134..eb16332d408d 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js +++ b/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js @@ -328,3 +328,24 @@ add_task(async function test_permissions() { "not permitted", "Installing from non-approved URL fails"); }); + +add_task(makeInstallTest(async function(browser) { + let xpiURL = `${SECURE_TESTROOT}../xpinstall/incompatible.xpi`; + let id = "incompatible-xpi@tests.mozilla.org"; + + let steps = [ + {action: "install", expectError: true}, + { + event: "onDownloadStarted", + props: {state: "STATE_DOWNLOADING"}, + }, + {event: "onDownloadProgress"}, + {event: "onDownloadEnded"}, + {event: "onDownloadCancelled"}, + ]; + + await testInstall(browser, {url: xpiURL}, steps, "install of an incompatible XPI fails"); + + let addons = await promiseAddonsByIDs([id]); + is(addons[0], null, "The addon was not installed"); +})); diff --git a/toolkit/mozapps/extensions/test/xpinstall/browser_doorhanger_installs.js b/toolkit/mozapps/extensions/test/xpinstall/browser_doorhanger_installs.js index 912784f94ce6..5a1913c6214d 100644 --- a/toolkit/mozapps/extensions/test/xpinstall/browser_doorhanger_installs.js +++ b/toolkit/mozapps/extensions/test/xpinstall/browser_doorhanger_installs.js @@ -375,9 +375,11 @@ async function test_incompatible() { let panel = await failPromise; let notification = panel.childNodes[0]; + let brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties"); + let brandShortName = brandBundle.GetStringFromName("brandShortName"); + let message = `XPI Test could not be installed because it is not compatible with ${brandShortName} ${Services.appinfo.version}.`; is(notification.getAttribute("label"), - "The add-on downloaded from this site could not be installed " + - "because it appears to be corrupt.", + message, "Should have seen the right message"); Services.perms.remove(makeURI("http://example.com/"), "install"); diff --git a/toolkit/mozapps/extensions/test/xpinstall/incompatible.xpi b/toolkit/mozapps/extensions/test/xpinstall/incompatible.xpi index 262ed38a7928eb78a9df5e57aa4b1dc71259abd6..de895fd1d9edcb0b249a439852d9e34c5b974af3 100644 GIT binary patch literal 428 zcmWIWW@h1H00HA5cfY=SrnP^7Y!K#UkYUJ8%*#wmEiTc^D$dUf4dG;9R*H&=0pZdL zZU#n{uZ#=~EFwU~)m#b+N-)*&WvNBQnfZB2RtiQsTp*de#N1RMPbnh6Qy~Oso{|no z6roJXM9%;y1`Ic~ZRFa;WoShHn0tGTt zK!#`LCFkcBB$i|*<)rFX6l6M-0BtJP%gwLK%*jdA%P&d?TMIU#xTGjExg literal 4442 zcma)=XH-+&wuS?tcZ?u{2!bFj6zNr@lLYBiigf9i&=gR5l^VJKC`>9FH4<#a4`dw-hv zv}n$<5HWa|kA2L5VR|3=Xv^_Z&PE6~gDHwA zS*4=TXkMeD70uU=%s34U<-NattWB_JA616zw zTgVcNEl}=X=^3|*DC}tXx}sB%(=+6gBNu>U`$}8ck=numT{(E~E@v72&*scNB{ z5WqROxQo^$rcU}#ss9`-=ly9c*(+L~j+jo@+Y?H3+_h)faqBfH5MLyIaB%) zyUM`Dj918etL9A&UN;N=xuz7_X6cYAT4d{0vnwYq^)2Q&=A+y`44lY?_NA`b^&>^q zN{r9Mb8uw6?KyN9`94bEE3BNx(3Y$2cnm&sz$Q_01?2+Vh8qvAk63H92j(>Mai_rY zy_c|Y`q!4(yEv^tH7|0-Ax#P@h|*-swT$9lch46mdM9FN8bv;qZhNa4CyEg*O}JP( zFU=@o$fB2BP|vS6PY1<~0jXuLQk82HA<$L#rGa(e>Mn?||)$=KGU>iyaW}of6H${7hrBGM(Ebi13bV5rk zoapRdcYXVw>>V3t{Kuq%#FSt~e-5GhK|=~XDKAij(4!3g6{i#PPpZd1gbKA{gQ@q^ zcrL$9lLTJBJ5rxNVy#@^AWiL!t?6d9kkD*J#M+9{XhR?TU1=)Y1wnfnNj zYWAP~Brn*-M3$e(l#u;Rj#4XZ+uPEU0^l4o?mhlBrBMMeB(A+;=iV% z#(TEaX5(j)vNM0GA)nbYLpIYgFJyDzmKoRjK{ootEGY%#FlXjSTH%JGV4hk0_9pU z;{~yO#L+Ydt26lW&Hi!KX#qNj?37`Cq3~u`2?UHsS7up@-{O)HfFt9sqi&7!Y&78e zeXMbBtK~xitCc{n@G4~6Wo?JSQ-ZI740P$GX*)~^>_XpH9`^EWa`TR}ylt2hoR{co z*pt(~^j1vqmgJmLpR{>(F4CrfBTg>+(z1a#2&J7M(*)bzx4h!mR_AJbKVny-bejrC zr^aKK@obAAN^laceaj#@yT2P=RgjzSL)UVZBMX~3kVLFLA-4=k_~`?^)~IrPyl*@- z-hBAR*v2i24oe2Q$+Ey>8vH%7bI*6$Z7OcqUp*+%dOIxS_FU{lD51qd4in}Dpj-Q{ zuMkUB7fzhyYrAiK9dB0-7X<7f`!w4gN)>_eTEysKPUVMp1lTCwIP3{k$gxOgf@#bq zV%$4F5nq_@7qPX)mn-<$IjoY&R-7y3XUKXyx;vm~XfNp2F~L``E1hwmT2^{qx8G{T z?C_xS6<+4^(x^|@6Jo9ua+v?~_S0O8+3Y=!Cs!ryIBPukBOm7k$uGX5k@-p=aK}^L z^6uV!dqw&N5>96JrO*sSh^5uAE=KhA9MQjAgy7<8E{?9=ZlsDX>YGZf))lv(8{P|3GNt8%AkII<)!O4JATkw1s zG3*`_!-`24xu9=l5cNy^_8aqR&BycviFIs`c@i$4Gh;>V(ov*yVe;UtjFrwp($$e8 zywsA_(cRSrqm6`M)IrqEfo$GxrIh)z7mVit0U0+(t3#P{OJIsSZi~fc#kzOwoq|zm zu{iOD&LYOQS7uyD1!c3)R+;`oJ5`z+sWp`;syiFWh&<3ci4{{*^#jcjFeiJ5+BCOA z&_|c#lACrUX<6W*1uIk5Q`@8M z$Urld&!F#Np)8+e4br1;mM>Lo*49oVh>nm4VX9$5&o^ZGNxFWQQAVgOYY_7H_Fj5C z5GSf6v8D6IEG<{VZUz5N8h={ZsR(3Lr?Bhjt{{&J=(;1PQYZy?su@ACy7lin^N?nD z8tW7l>bCqaTtS{OsdIKqf#Z*hk7Qe;Y3FxJL<*?R(8@yO3;mbmlAe*N(m^1ED=!YS z7>nb5rm-qBOo8U0Prh&!T5Xw*ls^(%-e|z5b#DnIDYD{Xhsk|=N)GyP)n6oP-B{J?mU0g=VNV7|sz zzb$_YW-acbZ4cNPPR1^-1ehqM@4Q`wTTfilzO#sK1gA(@IP(46u%7sI19k@M*$mg`KpJl9Gn^Fkt4bfc z?|gfFe1!WJvU0CHb;R<0xswgbrXQ~D5hk4f4)W zI&5}L^$>+;{K9vsUqsnH(t=`XX;j+roj(C!k3F}`>Me4es8JN{XBa>0XC^xxt7k|( z;o;mx7^oQ@U9@zl?V+ZfNhuQ4qp6Il;k zy|YH8W@2^?)g$M6jea19CinByTypn#two;y=Fz^ZPBb~%c`g^kk zXrsP`h9FL0MOJgPHhU*+lKgPjonkyd?PPi@OVD=3XcwP|@6eW2J07FXxAchEkkjVoVgE)T5;xm~g-uoQ>5d8hu#vZC54Q`ck3Z+H2c9<$6n5wK z0L{Eus=4_BZL=@lb>uC=6RLJ4q|* zMMED>V;F+oS1Q{B^}4zva}E#WIinJOdeiN?{)O5|$x*M|RsLE)4;OI=;NW zz_mk12S*O0?aWG~%YJ=%S=HO*CiO|Acy;N%#=U1FBkdeQlUPoQEzW?du{+Ebu;Uv8y)uuQe`_5 z06-fE0MG*10B+t0KYLG4QMi+fsR=m%_#ooDnST&1fP{>2vFjh6s|slc{Um<*^W3SR z!y$i}E^&Tz*dO$2K9ZYf!DF;sGN-J(rQUcCJ>|U7xIlJye>51|dsYBP-W!FKnA>s~ z{(QF){Jp>_899rsHk=xA*;E0VP~XtQ1?jD29;6>Vx&~rT<;EP8U{>^i_Z__`sv~8( z*+JD$Y)w081#{cEi=}w1y{3UpoUsN9i~Kd3X6Os7 z@{kl<7Gh3>t+ko3041`o)d)*On>i$Fzj8uNqXW|FdrBL}LKTC_YoGM~sH-UJxjJ5` zH|DtI9-P5gnDS63@x~yq&)1KcMXt~|`7AYBWMxnMnr4x5{$N$q)6F-(IY$kvYMeKC zw~oz%-}sj;aa5QV#u2*54YKf>m|w5$p7Jc#0EdZ?z!-_vYAF30MC==wQpOR(^d+|8 z8*FcLeVao0J%^J|Jqx;|{n350TYOv4-h8ot&F7D`)n5Jxin*|~nHTj}YisZA=HiU- z6ZLZ0*Bj`ELBXO!^iZ(S-~hJXNc_9x`~n_2px0p3GaxLgJJ35M4AEVL_rfRz5d*qd zu|ARB9&n@4uD^sS6~R|(iS)ML4ZIo67Yb4SyUSm61+{XYGP|{C>awuR8m>1sT61Um zn#O$jFw1YRxz6%mVp~t6$h7&hmaJMW+)pi!jx}7S;EzZy&`3xx1OM;5;DYZT zE9~MI{|~4a>A@d`>;F{vPuJ#8-=F5PaK(!p;{S1p{*LtbIsXy-v%*NG82%mUUsM0P o!r#C6fA{}UKr;Tj!apMsgo^=`oZ` Date: Wed, 13 Feb 2019 17:00:13 +0200 Subject: [PATCH 39/79] Backed out 4 changesets (bug 1500074, bug 1500072) for devtools failures on browser_require_raw.js. CLOSED TREE Backed out changeset 81a368ce3847 (bug 1500074) Backed out changeset 7e6a4063398d (bug 1500072) Backed out changeset 4003039a82c0 (bug 1500072) Backed out changeset accf4033d8cc (bug 1500072) --- devtools/client/framework/moz.build | 2 - .../test/metrics/browser_metrics_debugger.ini | 12 ----- .../test/metrics/browser_metrics_debugger.js | 31 ----------- .../test/metrics/browser_metrics_inspector.js | 48 +++++++++++++++-- .../metrics/browser_metrics_netmonitor.ini | 12 ----- .../metrics/browser_metrics_netmonitor.js | 31 ----------- .../metrics/browser_metrics_webconsole.js | 52 +++++++++++++++--- .../client/framework/test/metrics/head.js | 54 ------------------- devtools/client/shared/browser-loader.js | 4 -- .../test/browser_browserloader_mocks.js | 1 - devtools/client/webconsole/main.js | 9 +++- 11 files changed, 95 insertions(+), 161 deletions(-) delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_debugger.ini delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_debugger.js delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini delete mode 100644 devtools/client/framework/test/metrics/browser_metrics_netmonitor.js diff --git a/devtools/client/framework/moz.build b/devtools/client/framework/moz.build index 487a177fc6cc..ba5debde871f 100644 --- a/devtools/client/framework/moz.build +++ b/devtools/client/framework/moz.build @@ -6,9 +6,7 @@ BROWSER_CHROME_MANIFESTS += [ 'test/browser.ini', - 'test/metrics/browser_metrics_debugger.ini', 'test/metrics/browser_metrics_inspector.ini', - 'test/metrics/browser_metrics_netmonitor.ini', 'test/metrics/browser_metrics_webconsole.ini', ] XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini'] diff --git a/devtools/client/framework/test/metrics/browser_metrics_debugger.ini b/devtools/client/framework/test/metrics/browser_metrics_debugger.ini deleted file mode 100644 index d1ec7232f6e4..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_debugger.ini +++ /dev/null @@ -1,12 +0,0 @@ -[DEFAULT] -tags = devtools -subsuite = devtools -support-files = - head.js - !/devtools/client/shared/test/shared-head.js - !/devtools/client/shared/test/telemetry-test-helpers.js - -# Each metrics tests is loaded in a separate .ini file. This way the test is executed -# individually, without any other test being executed before or after. -[browser_metrics_debugger.js] -skip-if = os != 'linux' || debug || asan # Results should be platform agnostic - only run on linux64-opt diff --git a/devtools/client/framework/test/metrics/browser_metrics_debugger.js b/devtools/client/framework/test/metrics/browser_metrics_debugger.js deleted file mode 100644 index 749d0b9564a2..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_debugger.js +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ -/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -/* import-globals-from ../../../shared/test/shared-head.js */ - -/** - * This test records the number of modules loaded by DevTools, as well as the total count - * of characters in those modules, when opening the debugger. These metrics are - * retrieved by perfherder via logs. - */ - -const TEST_URL = "data:text/html;charset=UTF-8,
Debugger modules load test
"; - -add_task(async function() { - const toolbox = await openNewTabAndToolbox(TEST_URL, "jsdebugger"); - const panel = toolbox.getCurrentPanel(); - - // Retrieve the browser loader dedicated to the Debugger. - const debuggerLoader = panel.panelWin.getBrowserLoaderForWindow(); - const loaders = [loader.provider.loader, debuggerLoader.loader]; - - runMetricsTest({ - filterString: "devtools/client/debugger", - loaders, - panelName: "debugger", - }); -}); diff --git a/devtools/client/framework/test/metrics/browser_metrics_inspector.js b/devtools/client/framework/test/metrics/browser_metrics_inspector.js index 123ee4a9643b..c6e2200a9c9a 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_inspector.js +++ b/devtools/client/framework/test/metrics/browser_metrics_inspector.js @@ -21,9 +21,47 @@ add_task(async function() { // The inspector does not use a dedicated browser loader. const loaders = [loader.provider.loader]; - runMetricsTest({ - filterString: "devtools/client/inspector", - loaders, - panelName: "inspector", - }); + const allModules = getFilteredModules("", loaders); + const inspectorModules = getFilteredModules("devtools/client/inspector", loaders); + + const allModulesCount = allModules.length; + const inspectorModulesCount = inspectorModules.length; + + const allModulesChars = countCharsInModules(allModules); + const inspectorModulesChars = countCharsInModules(inspectorModules); + + const PERFHERDER_DATA = { + framework: { + name: "devtools", + }, + suites: [{ + name: "inspector-metrics", + value: allModulesChars, + subtests: [ + { + name: "inspector-modules", + value: inspectorModulesCount, + }, + { + name: "inspector-chars", + value: inspectorModulesChars, + }, + { + name: "all-modules", + value: allModulesCount, + }, + { + name: "all-chars", + value: allModulesChars, + }, + ], + }], + }; + info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); + + // Simply check that we found valid values. + ok(allModulesCount > inspectorModulesCount && + inspectorModulesCount > 0, "Successfully recorded module count for Inspector"); + ok(allModulesChars > inspectorModulesChars && + inspectorModulesChars > 0, "Successfully recorded char count for Inspector"); }); diff --git a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini deleted file mode 100644 index 8cb733e546c5..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.ini +++ /dev/null @@ -1,12 +0,0 @@ -[DEFAULT] -tags = devtools -subsuite = devtools -support-files = - head.js - !/devtools/client/shared/test/shared-head.js - !/devtools/client/shared/test/telemetry-test-helpers.js - -# Each metrics tests is loaded in a separate .ini file. This way the test is executed -# individually, without any other test being executed before or after. -[browser_metrics_netmonitor.js] -skip-if = os != 'linux' || debug || asan # Results should be platform agnostic - only run on linux64-opt diff --git a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js b/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js deleted file mode 100644 index b38e80eb9e30..000000000000 --- a/devtools/client/framework/test/metrics/browser_metrics_netmonitor.js +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ -/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -/* import-globals-from ../../../shared/test/shared-head.js */ - -/** - * This test records the number of modules loaded by DevTools, as well as the total count - * of characters in those modules, when opening the netmonitor. These metrics are - * retrieved by perfherder via logs. - */ - -const TEST_URL = "data:text/html;charset=UTF-8,
Netmonitor modules load test
"; - -add_task(async function() { - const toolbox = await openNewTabAndToolbox(TEST_URL, "netmonitor"); - const panel = toolbox.getCurrentPanel(); - - // Retrieve the browser loader dedicated to the Netmonitor. - const netmonitorLoader = panel.panelWin.getBrowserLoaderForWindow(); - const loaders = [loader.provider.loader, netmonitorLoader.loader]; - - runMetricsTest({ - filterString: "devtools/client/netmonitor", - loaders, - panelName: "netmonitor", - }); -}); diff --git a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js index bf56c1606fd8..d255e9bca1f1 100644 --- a/devtools/client/framework/test/metrics/browser_metrics_webconsole.js +++ b/devtools/client/framework/test/metrics/browser_metrics_webconsole.js @@ -17,15 +17,53 @@ const TEST_URL = "data:text/html;charset=UTF-8,
Webconsole modules load test add_task(async function() { const toolbox = await openNewTabAndToolbox(TEST_URL, "webconsole"); - const panel = toolbox.getCurrentPanel(); + const hud = toolbox.getCurrentPanel().hud; // Retrieve the browser loader dedicated to the WebConsole. - const webconsoleLoader = panel._frameWindow.getBrowserLoaderForWindow(); + const webconsoleLoader = hud.ui.browserLoader; const loaders = [loader.provider.loader, webconsoleLoader.loader]; - runMetricsTest({ - filterString: "devtools/client/webconsole", - loaders, - panelName: "webconsole", - }); + const allModules = getFilteredModules("", loaders); + const webconsoleModules = getFilteredModules("devtools/client/webconsole", loaders); + + const allModulesCount = allModules.length; + const webconsoleModulesCount = webconsoleModules.length; + + const allModulesChars = countCharsInModules(allModules); + const webconsoleModulesChars = countCharsInModules(webconsoleModules); + + const PERFHERDER_DATA = { + framework: { + name: "devtools", + }, + suites: [{ + name: "webconsole-metrics", + value: allModulesChars, + subtests: [ + { + name: "webconsole-modules", + value: webconsoleModulesCount, + }, + { + name: "webconsole-chars", + value: webconsoleModulesChars, + }, + { + name: "all-modules", + value: allModulesCount, + }, + { + name: "all-chars", + value: allModulesChars, + }, + ], + }], + }; + info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); + + // Simply check that we found valid values. + ok(allModulesCount > webconsoleModulesCount && + webconsoleModulesCount > 0, "Successfully recorded module count for WebConsole"); + ok(allModulesChars > webconsoleModulesChars && + webconsoleModulesChars > 0, "Successfully recorded char count for WebConsole"); }); diff --git a/devtools/client/framework/test/metrics/head.js b/devtools/client/framework/test/metrics/head.js index c0f4412f9a44..330dbb9981be 100644 --- a/devtools/client/framework/test/metrics/head.js +++ b/devtools/client/framework/test/metrics/head.js @@ -30,57 +30,3 @@ function countCharsInModules(modules) { } }, 0); } - -/** - * Record module loading data. - * - * @param {Object} - * - filterString {String} path to use to filter modules specific to the current panel - * - loaders {Array} Array of Loaders to check for modules - * - panelName {String} reused in identifiers for perfherder data - */ -function runMetricsTest({ filterString, loaders, panelName }) { - const allModules = getFilteredModules("", loaders); - const panelModules = getFilteredModules(filterString, loaders); - - const allModulesCount = allModules.length; - const panelModulesCount = panelModules.length; - - const allModulesChars = countCharsInModules(allModules); - const panelModulesChars = countCharsInModules(panelModules); - - const PERFHERDER_DATA = { - framework: { - name: "devtools", - }, - suites: [{ - name: panelName + "-metrics", - value: allModulesChars, - subtests: [ - { - name: panelName + "-modules", - value: panelModulesCount, - }, - { - name: panelName + "-chars", - value: panelModulesChars, - }, - { - name: "all-modules", - value: allModulesCount, - }, - { - name: "all-chars", - value: allModulesChars, - }, - ], - }], - }; - info("PERFHERDER_DATA: " + JSON.stringify(PERFHERDER_DATA)); - - // Simply check that we found valid values. - ok(allModulesCount > panelModulesCount && - panelModulesCount > 0, "Successfully recorded module count for " + panelName); - ok(allModulesChars > panelModulesChars && - panelModulesChars > 0, "Successfully recorded char count for " + panelName); -} diff --git a/devtools/client/shared/browser-loader.js b/devtools/client/shared/browser-loader.js index 8008bcbd8cb5..9ad5cef442d9 100644 --- a/devtools/client/shared/browser-loader.js +++ b/devtools/client/shared/browser-loader.js @@ -188,10 +188,6 @@ function BrowserLoaderBuilder({ baseURI, window, useOnlyShared, commonLibRequire const mainModule = loaders.Module(baseURI, joinURI(baseURI, "main.js")); this.loader = loaders.Loader(opts); - // When running tests, expose the BrowserLoader instance for metrics tests. - if (flags.testing) { - window.getBrowserLoaderForWindow = () => this; - } this.require = loaders.Require(this.loader, mainModule); } diff --git a/devtools/client/shared/test/browser_browserloader_mocks.js b/devtools/client/shared/test/browser_browserloader_mocks.js index 7251ea3e13a7..ff6230e52ea8 100644 --- a/devtools/client/shared/test/browser_browserloader_mocks.js +++ b/devtools/client/shared/test/browser_browserloader_mocks.js @@ -102,6 +102,5 @@ function testWithRegularDevtoolsModule() { function test() { testWithChromeScheme(); testWithRegularDevtoolsModule(); - delete window.getBrowserLoaderForWindow; finish(); } diff --git a/devtools/client/webconsole/main.js b/devtools/client/webconsole/main.js index c389eb4bfd6c..5e22506776b2 100644 --- a/devtools/client/webconsole/main.js +++ b/devtools/client/webconsole/main.js @@ -12,9 +12,14 @@ this.WebConsoleWrapper = function(parentNode, hud, toolbox, owner, document) { // Initialize module loader and load all modules of the new inline // preview feature. The entire code-base doesn't need any extra // privileges and runs entirely in content scope. - const WebConsoleWrapper = BrowserLoader({ + const browserLoader = BrowserLoader({ baseURI: "resource://devtools/client/webconsole/", window, - }).require("./webconsole-wrapper"); + }); + + // Expose the browserLoader instance on the webconsole hud for metrics tests. + hud.browserLoader = browserLoader; + + const WebConsoleWrapper = browserLoader.require("./webconsole-wrapper"); return new WebConsoleWrapper(parentNode, hud, toolbox, owner, document); }; From 75d8d540ab38314a32b9efd51293713e6916f731 Mon Sep 17 00:00:00 2001 From: Cosmin Sabou Date: Wed, 13 Feb 2019 17:04:19 +0200 Subject: [PATCH 40/79] Backed out changeset a5ad662d5bbb (bug 1520447) for android build bustages. CLOSED TREE --- testing/raptor/mach_commands.py | 4 + testing/raptor/raptor/manifest.py | 2 +- .../playback/mitmproxy-rel-bin-win.manifest | 10 --- testing/raptor/raptor/playback/mitmproxy.py | 80 +++++++++++++++---- .../raptor/raptor/playback/python3.manifest | 10 +++ .../raptor/playback/python3_x64.manifest | 10 +++ testing/raptor/raptor/raptor.py | 1 + testing/raptor/raptor/tests/raptor-tp6-1.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-10.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-2.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-3.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-4.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-5.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-6.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-7.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-8.ini | 1 + testing/raptor/raptor/tests/raptor-tp6-9.ini | 1 + testing/raptor/raptor/tests/raptor-tp6m-1.ini | 1 + testing/raptor/test/test_manifest.py | 3 + 19 files changed, 104 insertions(+), 27 deletions(-) delete mode 100644 testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest create mode 100644 testing/raptor/raptor/playback/python3.manifest create mode 100644 testing/raptor/raptor/playback/python3_x64.manifest diff --git a/testing/raptor/mach_commands.py b/testing/raptor/mach_commands.py index 22f8889aa0b1..20480a8821f8 100644 --- a/testing/raptor/mach_commands.py +++ b/testing/raptor/mach_commands.py @@ -132,6 +132,10 @@ class RaptorRunner(MozbuildObject): 'title': socket.gethostname(), 'default_actions': default_actions, 'raptor_cmd_line_args': self.raptor_args, + 'python3_manifest': { + 'win32': 'python3.manifest', + 'win64': 'python3_x64.manifest', + }, 'host': self.host, 'power_test': self.power_test, 'is_release_build': self.is_release_build, diff --git a/testing/raptor/raptor/manifest.py b/testing/raptor/raptor/manifest.py index a0f71fb5ecc6..7a59f410a9d8 100644 --- a/testing/raptor/raptor/manifest.py +++ b/testing/raptor/raptor/manifest.py @@ -19,7 +19,7 @@ required_settings = ['apps', 'type', 'page_cycles', 'test_url', 'measure', 'unit', 'lower_is_better', 'alert_threshold'] playback_settings = ['playback_binary_manifest', 'playback_pageset_manifest', - 'playback_recordings'] + 'playback_recordings', 'python3_win_manifest'] def filter_app(tests, values): diff --git a/testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest b/testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest deleted file mode 100644 index 2029c0b1631f..000000000000 --- a/testing/raptor/raptor/playback/mitmproxy-rel-bin-win.manifest +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "size": 13576786, - "visibility": "public", - "digest": "5d471e470369381f130de28a3c54db27c3724e1e9269c510a593d61c4cf41713c9424da62e46ae98fd1decce00ecca876209ed059487f5a02882ba16a50daed1", - "algorithm": "sha512", - "filename": "mitmdump-win-2.0.2.zip", - "unpack": true - } -] \ No newline at end of file diff --git a/testing/raptor/raptor/playback/mitmproxy.py b/testing/raptor/raptor/playback/mitmproxy.py index 1e2d7251eeb3..6194b2a6d1c0 100644 --- a/testing/raptor/raptor/playback/mitmproxy.py +++ b/testing/raptor/raptor/playback/mitmproxy.py @@ -12,7 +12,6 @@ import time import mozinfo from mozlog import get_proxy_logger -from mozprocess import ProcessHandler from .base import Playback @@ -28,6 +27,11 @@ else: mozharness_dir = os.path.join(here, '../../../mozharness') sys.path.insert(0, mozharness_dir) +# required for using a python3 virtualenv on win for mitmproxy +from mozharness.base.python import Python3Virtualenv +from mozharness.mozilla.testing.testbase import TestingMixin +from mozharness.base.vcs.vcsbase import MercurialScript + raptor_dir = os.path.join(here, '..') sys.path.insert(0, raptor_dir) @@ -75,7 +79,7 @@ POLICIES_CONTENT_OFF = '''{ }''' -class Mitmproxy(Playback): +class Mitmproxy(Playback, Python3Virtualenv, TestingMixin, MercurialScript): def __init__(self, config): self.config = config @@ -102,6 +106,10 @@ class Mitmproxy(Playback): # go ahead and download and setup mitmproxy self.download() + # on windows we must use a python3 virtualen for mitmproxy + if 'win' in self.config['platform']: + self.setup_py3_virtualenv() + # mitmproxy must be started before setup, so that the CA cert is available self.start() self.setup() @@ -111,10 +119,16 @@ class Mitmproxy(Playback): if not os.path.exists(self.raptor_dir): os.makedirs(self.raptor_dir) - LOG.info("downloading mitmproxy binary") - _manifest = os.path.join(here, self.config['playback_binary_manifest']) - transformed_manifest = transform_platform(_manifest, self.config['platform']) - tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) + if 'win' in self.config['platform']: + # on windows we need a python3 environment and use our own package from tooltool + self.py3_path = self.fetch_python3() + LOG.info("python3 path is: %s" % self.py3_path) + else: + # on osx and linux we use pre-built binaries + LOG.info("downloading mitmproxy binary") + _manifest = os.path.join(here, self.config['playback_binary_manifest']) + transformed_manifest = transform_platform(_manifest, self.config['platform']) + tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) # we use one pageset for all platforms LOG.info("downloading mitmproxy pageset") @@ -123,10 +137,44 @@ class Mitmproxy(Playback): tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) return - def start(self): - """Start playing back the mitmproxy recording.""" + def fetch_python3(self): + """Mitmproxy on windows needs Python 3.x""" + python3_path = os.path.join(self.raptor_dir, 'python3.6', 'python') + if not os.path.exists(os.path.dirname(python3_path)): + _manifest = os.path.join(here, self.config['python3_win_manifest']) + transformed_manifest = transform_platform(_manifest, self.config['platform'], + self.config['processor']) + LOG.info("downloading py3 package for mitmproxy windows: %s" % transformed_manifest) + tooltool_download(transformed_manifest, self.config['run_local'], self.raptor_dir) + cmd = [python3_path, '--version'] + # just want python3 ver printed in production log + subprocess.Popen(cmd, env=os.environ.copy()) + return python3_path - self.mitmdump_path = os.path.join(self.raptor_dir, 'mitmdump') + def setup_py3_virtualenv(self): + """Mitmproxy on windows needs Python 3.x; set up a separate py 3.x env here""" + LOG.info("Setting up python 3.x virtualenv, required for mitmproxy on windows") + # these next two are required for py3_venv_configuration + self.abs_dirs = {'base_work_dir': mozharness_dir} + self.log_obj = None + # now create the py3 venv + venv_path = os.path.join(self.raptor_dir, 'py3venv') + self.py3_venv_configuration(python_path=self.py3_path, venv_path=venv_path) + self.py3_create_venv() + self.py3_install_modules(["cffi==1.10.0"]) + requirements = [os.path.join(here, "mitmproxy_requirements.txt")] + self.py3_install_requirement_files(requirements) + # add py3 executables path to system path + sys.path.insert(1, self.py3_path_to_executables()) + # install mitmproxy itself + self.py3_install_modules(modules=['mitmproxy']) + self.mitmdump_path = os.path.join(self.py3_path_to_executables(), 'mitmdump') + + def start(self): + """Start playing back the mitmproxy recording. If on windows, the mitmdump_path was + already set when creating py3 env""" + if self.mitmdump_path is None: + self.mitmdump_path = os.path.join(self.raptor_dir, 'mitmdump') recordings_list = self.recordings.split() self.mitmproxy_proc = self.start_mitmproxy_playback(self.mitmdump_path, @@ -180,9 +228,7 @@ class Mitmproxy(Playback): LOG.info("Starting mitmproxy playback using command: %s" % ' '.join(command)) # to turn off mitmproxy log output, use these params for Popen: # Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) - mitmproxy_proc = ProcessHandler(command, env=env) - mitmproxy_proc.run() - + mitmproxy_proc = subprocess.Popen(command, env=env) time.sleep(MITMDUMP_SLEEP) data = mitmproxy_proc.poll() if data is None: # None value indicates process hasn't terminated @@ -196,8 +242,10 @@ class Mitmproxy(Playback): """Stop the mitproxy server playback""" mitmproxy_proc = self.mitmproxy_proc LOG.info("Stopping mitmproxy playback, klling process %d" % mitmproxy_proc.pid) - mitmproxy_proc.kill() - + if mozinfo.os == 'win': + mitmproxy_proc.kill() + else: + mitmproxy_proc.terminate() time.sleep(MITMDUMP_SLEEP) status = mitmproxy_proc.poll() if status is None: # None value indicates process hasn't terminated @@ -286,8 +334,8 @@ class MitmproxyDesktop(Mitmproxy): LOG.info("Firefox policies file contents:") LOG.info(contents) if (POLICIES_CONTENT_ON % { - 'cert': self.cert_path, - 'host': self.config['host']}) in contents: + 'cert': self.cert_path, + 'host': self.config['host']}) in contents: LOG.info("Verified mitmproxy CA certificate is installed in Firefox") else: diff --git a/testing/raptor/raptor/playback/python3.manifest b/testing/raptor/raptor/playback/python3.manifest new file mode 100644 index 000000000000..fd992f9fdf33 --- /dev/null +++ b/testing/raptor/raptor/playback/python3.manifest @@ -0,0 +1,10 @@ +[ + { + "size": 15380470, + "visibility": "public", + "digest": "cd78b88d95b69bef99d7192b71dd34118700f44db0a0069a13bfd4943b131e8d7fdac83859f8ac15d873d4b329eef69d8d75d0a6746d06fdcfc5d06da0c9784c", + "algorithm": "sha512", + "unpack": true, + "filename": "python3.6.zip" + } +] diff --git a/testing/raptor/raptor/playback/python3_x64.manifest b/testing/raptor/raptor/playback/python3_x64.manifest new file mode 100644 index 000000000000..550585deedd1 --- /dev/null +++ b/testing/raptor/raptor/playback/python3_x64.manifest @@ -0,0 +1,10 @@ +[ + { + "size": 16026760, + "visibility": "public", + "digest": "379428e3955671213a245ccd9ccf6f9d17d368db68c02da8baed7be629f2691127cd3e3f86807b25e2098d9840083fdc07946ab1bed0c14db4a5b628a47ed9ef", + "algorithm": "sha512", + "unpack": true, + "filename": "python3.6.amd64.zip" + } +] diff --git a/testing/raptor/raptor/raptor.py b/testing/raptor/raptor/raptor.py index 51717eed3c27..d92f6f460a34 100644 --- a/testing/raptor/raptor/raptor.py +++ b/testing/raptor/raptor/raptor.py @@ -171,6 +171,7 @@ class Raptor(object): _key = 'playback_pageset_zip_%s' % self.config['platform'] self.config['playback_pageset_zip'] = test.get(_key, None) self.config['playback_recordings'] = test.get('playback_recordings', None) + self.config['python3_win_manifest'] = test.get('python3_win_manifest', None) def run_test(self, test, timeout=None): self.log.info("starting raptor test: %s" % test['name']) diff --git a/testing/raptor/raptor/tests/raptor-tp6-1.ini b/testing/raptor/raptor/tests/raptor-tp6-1.ini index 78f7c1a4b4ac..efc679a49462 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-1.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-1.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-1.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-10.ini b/testing/raptor/raptor/tests/raptor-tp6-10.ini index 55d25b126dd1..6d2d4f4776a1 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-10.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-10.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest page_cycles = 25 unit = ms lower_is_better = true diff --git a/testing/raptor/raptor/tests/raptor-tp6-2.ini b/testing/raptor/raptor/tests/raptor-tp6-2.ini index 519d8acf7e3d..d5ec3beffa5f 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-2.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-2.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-2.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-3.ini b/testing/raptor/raptor/tests/raptor-tp6-3.ini index f7fe6f5fb5ac..2a2da425b5c4 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-3.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-3.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-3.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-4.ini b/testing/raptor/raptor/tests/raptor-tp6-4.ini index 43e42d1c57f9..b9a4191555d3 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-4.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-4.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-4.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-5.ini b/testing/raptor/raptor/tests/raptor-tp6-5.ini index 187b032de205..12e34bb5d1b6 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-5.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-5.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-5.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-6.ini b/testing/raptor/raptor/tests/raptor-tp6-6.ini index d82f2b0dbe8f..2590b4e05159 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-6.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-6.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-6.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-7.ini b/testing/raptor/raptor/tests/raptor-tp6-7.ini index 59a5a69a2aab..3f2d0ac9e0d2 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-7.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-7.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest playback_pageset_manifest = mitmproxy-recordings-raptor-tp6-7.manifest page_cycles = 25 unit = ms diff --git a/testing/raptor/raptor/tests/raptor-tp6-8.ini b/testing/raptor/raptor/tests/raptor-tp6-8.ini index 15b66746112d..33417f0f618e 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-8.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-8.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest page_cycles = 25 unit = ms lower_is_better = true diff --git a/testing/raptor/raptor/tests/raptor-tp6-9.ini b/testing/raptor/raptor/tests/raptor-tp6-9.ini index dad8bd780206..5fca0ea65fa0 100644 --- a/testing/raptor/raptor/tests/raptor-tp6-9.ini +++ b/testing/raptor/raptor/tests/raptor-tp6-9.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest page_cycles = 25 unit = ms lower_is_better = true diff --git a/testing/raptor/raptor/tests/raptor-tp6m-1.ini b/testing/raptor/raptor/tests/raptor-tp6m-1.ini index ccd62af71f5b..17ec6cc5c6aa 100644 --- a/testing/raptor/raptor/tests/raptor-tp6m-1.ini +++ b/testing/raptor/raptor/tests/raptor-tp6m-1.ini @@ -8,6 +8,7 @@ type = pageload playback = mitmproxy-android playback_binary_manifest = mitmproxy-rel-bin-{platform}.manifest +python3_win_manifest = python3{x64}.manifest page_cycles = 15 unit = ms lower_is_better = true diff --git a/testing/raptor/test/test_manifest.py b/testing/raptor/test/test_manifest.py index 20848d02c79f..e1846060e232 100644 --- a/testing/raptor/test/test_manifest.py +++ b/testing/raptor/test/test_manifest.py @@ -36,6 +36,7 @@ VALID_MANIFESTS = [{'apps': 'firefox', 'playback_binary_manifest': 'binary.manifest', 'playback_pageset_manifest': 'pageset.manifest', 'playback_recordings': 'recorded_site.mp', + 'python3_win_manifest': 'py3.manifest', 'manifest': 'valid_details_1'}, {'apps': 'chrome', 'type': 'benchmark', @@ -58,6 +59,7 @@ INVALID_MANIFESTS = [{'apps': 'firefox', 'playback_binary_manifest': 'binary.manifest', 'playback_pageset_manifest': 'pageset.manifest', 'playback_recordings': 'recorded_site.mp', + 'python3_win_manifest': 'py3.manifest', 'manifest': 'invalid_details_1'}, {'apps': 'chrome', 'type': 'pageload', @@ -82,6 +84,7 @@ INVALID_MANIFESTS = [{'apps': 'firefox', 'playback_binary_manifest': 'binary.manifest', 'playback_pageset_manifest': 'pageset.manifest', 'playback_recordings': 'recorded_site.mp', + 'python3_win_manifest': 'py3.manifest', 'manifest': 'invalid_details_3'}] From f5688160863d10b6d449b480063e4ddb1a78f34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A3o=20Gottwald?= Date: Wed, 13 Feb 2019 15:06:54 +0000 Subject: [PATCH 41/79] Bug 1527260 - Integrate one off buttons into keyboard navigation. r=Standard8 Differential Revision: https://phabricator.services.mozilla.com/D19656 --HG-- extra : moz-landing-system : lando --- .../search/content/search-one-offs.js | 24 ++++++++++++------- .../components/urlbar/UrlbarController.jsm | 14 +++++++++++ browser/components/urlbar/UrlbarView.jsm | 12 ++++++---- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/browser/components/search/content/search-one-offs.js b/browser/components/search/content/search-one-offs.js index 3190be513f13..b6f5191dfb51 100644 --- a/browser/components/search/content/search-one-offs.js +++ b/browser/components/search/content/search-one-offs.js @@ -298,7 +298,7 @@ class SearchOneOffs { // If the button doesn't have an engine, then clear the popup's // selection to indicate that pressing Return while the button is // selected will do the button's command, not search. - this.popup.selectedIndex = -1; + this.selectedAutocompleteIndex = -1; } let event = new CustomEvent("SelectedOneOffButtonChanged", { previousSelectedButton: previousButton, @@ -334,6 +334,14 @@ class SearchOneOffs { return -1; } + get selectedAutocompleteIndex() { + return (this._view || this.popup).selectedIndex; + } + + set selectedAutocompleteIndex(val) { + return (this._view || this.popup).selectedIndex = val; + } + get compact() { return this.getAttribute("compact") == "true"; } @@ -887,7 +895,7 @@ class SearchOneOffs { this.selectedButton = null; return false; } - this.popup.selectedIndex = -1; + this.selectedAutocompleteIndex = -1; this.advanceSelection(!event.shiftKey, true, false); return !!this.selectedButton; } @@ -904,13 +912,13 @@ class SearchOneOffs { this.advanceSelection(false, true, false); return true; } - if (this.popup.selectedIndex > 0) { + if (this.selectedAutocompleteIndex > 0) { // Moving up within the list. The autocomplete controller should // handle this case. A button may be selected, so null it. this.selectedButton = null; return false; } - if (this.popup.selectedIndex == 0) { + if (this.selectedAutocompleteIndex == 0) { // Moving up from the top of the list. if (allowEmptySelection) { // Let the autocomplete controller remove selection in the list @@ -952,14 +960,14 @@ class SearchOneOffs { this.advanceSelection(true, true, false); return true; } - if (this.popup.selectedIndex >= 0 && - this.popup.selectedIndex < numListItems - 1) { + if (this.selectedAutocompleteIndex >= 0 && + this.selectedAutocompleteIndex < numListItems - 1) { // Moving down within the list. The autocomplete controller // should handle this case. A button may be selected, so null it. this.selectedButton = null; return false; } - if (this.popup.selectedIndex == numListItems - 1) { + if (this.selectedAutocompleteIndex == numListItems - 1) { // Moving down from the last item in the list to the buttons. this.selectedButtonIndex = 0; if (allowEmptySelection) { @@ -970,7 +978,7 @@ class SearchOneOffs { if (this.textbox && typeof textboxUserValue == "string") { this.textbox.value = textboxUserValue; } - this.popup.selectedIndex = -1; + this.selectedAutocompleteIndex = -1; return true; } if (this.selectedButton) { diff --git a/browser/components/urlbar/UrlbarController.jsm b/browser/components/urlbar/UrlbarController.jsm index 61bcb30bfd55..f40d06a3ed61 100644 --- a/browser/components/urlbar/UrlbarController.jsm +++ b/browser/components/urlbar/UrlbarController.jsm @@ -198,6 +198,20 @@ class UrlbarController { return; } + if (this.view.isOpen) { + let queryContext = this._lastQueryContext; + if (queryContext) { + this.view.oneOffSearchButtons.handleKeyPress( + event, + queryContext.results.length, + this.view.allowEmptySelection, + queryContext.searchString); + if (event.defaultPrevented) { + return; + } + } + } + switch (event.keyCode) { case KeyEvent.DOM_VK_ESCAPE: this.input.handleRevert(); diff --git a/browser/components/urlbar/UrlbarView.jsm b/browser/components/urlbar/UrlbarView.jsm index b04d3270dbe6..5327c68b2dd8 100644 --- a/browser/components/urlbar/UrlbarView.jsm +++ b/browser/components/urlbar/UrlbarView.jsm @@ -64,6 +64,12 @@ class UrlbarView { return this.panel.state == "open" || this.panel.state == "showing"; } + get allowEmptySelection() { + return !(this._queryContext && + this._queryContext.results[0] && + this._queryContext.results[0].heuristic); + } + get selectedIndex() { if (!this.isOpen || !this._selected) { return -1; @@ -115,15 +121,13 @@ class UrlbarView { throw new Error("UrlbarView: Cannot select an item if the view isn't open."); } - // TODO bug 1527260: handle one-off search buttons - let row; if (reverse) { row = (this._selected && this._selected.previousElementSibling) || - this._rows.lastElementChild; + ((this._selected && this.allowEmptySelection) ? null : this._rows.lastElementChild); } else { row = (this._selected && this._selected.nextElementSibling) || - this._rows.firstElementChild; + ((this._selected && this.allowEmptySelection) ? null : this._rows.firstElementChild); } this._selectItem(row); } From 3c6b421c801a73c92d7b2242b1ad560b33e423dd Mon Sep 17 00:00:00 2001 From: Nico Grunbaum Date: Wed, 13 Feb 2019 12:35:11 +0000 Subject: [PATCH 42/79] Bug 1527526 - AudioConduit is reporting send instead of recv RTP stats r=dminor AudioConduit is reporting send instead of recv RTP stats Differential Revision: https://phabricator.services.mozilla.com/D19607 --HG-- extra : moz-landing-system : lando --- media/webrtc/signaling/src/media-conduit/AudioConduit.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp b/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp index dfd57b185b01..9e40af50c6ff 100644 --- a/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp +++ b/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp @@ -179,7 +179,13 @@ bool WebrtcAudioConduit::GetRTPStats(unsigned int* jitterMs, ASSERT_ON_THREAD(mStsThread); *jitterMs = 0; *cumulativeLost = 0; - return !mSendChannelProxy->GetRTPStatistics(*jitterMs, *cumulativeLost); + if (!mRecvStream) { + return false; + } + auto stats = mRecvStream->GetStats(); + *jitterMs = stats.jitter_ms; + *cumulativeLost = stats.packets_lost; + return true; } bool WebrtcAudioConduit::GetRTCPReceiverReport(uint32_t* jitterMs, From 521b6a3a226c1668deb23f432c9dceb6ac6ebd03 Mon Sep 17 00:00:00 2001 From: Nicolas Chevobbe Date: Wed, 13 Feb 2019 15:37:08 +0000 Subject: [PATCH 43/79] Bug 1527322 - Move the sourceeditor folder under devtools/client/shared; r=gl. Differential Revision: https://phabricator.services.mozilla.com/D19641 --HG-- rename : devtools/client/sourceeditor/.eslintrc.js => devtools/client/shared/sourceeditor/.eslintrc.js rename : devtools/client/sourceeditor/README => devtools/client/shared/sourceeditor/README rename : devtools/client/sourceeditor/autocomplete.js => devtools/client/shared/sourceeditor/autocomplete.js rename : devtools/client/sourceeditor/codemirror/LICENSE => devtools/client/shared/sourceeditor/codemirror/LICENSE rename : devtools/client/sourceeditor/codemirror/addon/comment/comment.js => devtools/client/shared/sourceeditor/codemirror/addon/comment/comment.js rename : devtools/client/sourceeditor/codemirror/addon/comment/continuecomment.js => devtools/client/shared/sourceeditor/codemirror/addon/comment/continuecomment.js rename : devtools/client/sourceeditor/codemirror/addon/dialog/dialog.css => devtools/client/shared/sourceeditor/codemirror/addon/dialog/dialog.css rename : devtools/client/sourceeditor/codemirror/addon/dialog/dialog.js => devtools/client/shared/sourceeditor/codemirror/addon/dialog/dialog.js rename : devtools/client/sourceeditor/codemirror/addon/edit/closebrackets.js => devtools/client/shared/sourceeditor/codemirror/addon/edit/closebrackets.js rename : devtools/client/sourceeditor/codemirror/addon/edit/closetag.js => devtools/client/shared/sourceeditor/codemirror/addon/edit/closetag.js rename : devtools/client/sourceeditor/codemirror/addon/edit/continuelist.js => devtools/client/shared/sourceeditor/codemirror/addon/edit/continuelist.js rename : devtools/client/sourceeditor/codemirror/addon/edit/matchbrackets.js => devtools/client/shared/sourceeditor/codemirror/addon/edit/matchbrackets.js rename : devtools/client/sourceeditor/codemirror/addon/edit/matchtags.js => devtools/client/shared/sourceeditor/codemirror/addon/edit/matchtags.js rename : devtools/client/sourceeditor/codemirror/addon/edit/trailingspace.js => devtools/client/shared/sourceeditor/codemirror/addon/edit/trailingspace.js rename : devtools/client/sourceeditor/codemirror/addon/fold/brace-fold.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/brace-fold.js rename : devtools/client/sourceeditor/codemirror/addon/fold/comment-fold.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/comment-fold.js rename : devtools/client/sourceeditor/codemirror/addon/fold/foldcode.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/foldcode.js rename : devtools/client/sourceeditor/codemirror/addon/fold/foldgutter.css => devtools/client/shared/sourceeditor/codemirror/addon/fold/foldgutter.css rename : devtools/client/sourceeditor/codemirror/addon/fold/foldgutter.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/foldgutter.js rename : devtools/client/sourceeditor/codemirror/addon/fold/indent-fold.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/indent-fold.js rename : devtools/client/sourceeditor/codemirror/addon/fold/markdown-fold.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/markdown-fold.js rename : devtools/client/sourceeditor/codemirror/addon/fold/xml-fold.js => devtools/client/shared/sourceeditor/codemirror/addon/fold/xml-fold.js rename : devtools/client/sourceeditor/codemirror/addon/hint/show-hint.js => devtools/client/shared/sourceeditor/codemirror/addon/hint/show-hint.js rename : devtools/client/sourceeditor/codemirror/addon/runmode/runmode.js => devtools/client/shared/sourceeditor/codemirror/addon/runmode/runmode.js rename : devtools/client/sourceeditor/codemirror/addon/search/match-highlighter.js => devtools/client/shared/sourceeditor/codemirror/addon/search/match-highlighter.js rename : devtools/client/sourceeditor/codemirror/addon/search/search.js => devtools/client/shared/sourceeditor/codemirror/addon/search/search.js rename : devtools/client/sourceeditor/codemirror/addon/search/searchcursor.js => devtools/client/shared/sourceeditor/codemirror/addon/search/searchcursor.js rename : devtools/client/sourceeditor/codemirror/addon/selection/active-line.js => devtools/client/shared/sourceeditor/codemirror/addon/selection/active-line.js rename : devtools/client/sourceeditor/codemirror/addon/selection/mark-selection.js => devtools/client/shared/sourceeditor/codemirror/addon/selection/mark-selection.js rename : devtools/client/sourceeditor/codemirror/addon/tern/tern.css => devtools/client/shared/sourceeditor/codemirror/addon/tern/tern.css rename : devtools/client/sourceeditor/codemirror/addon/tern/tern.js => devtools/client/shared/sourceeditor/codemirror/addon/tern/tern.js rename : devtools/client/sourceeditor/codemirror/cmiframe.html => devtools/client/shared/sourceeditor/codemirror/cmiframe.html rename : devtools/client/sourceeditor/codemirror/codemirror.bundle.js => devtools/client/shared/sourceeditor/codemirror/codemirror.bundle.js rename : devtools/client/sourceeditor/codemirror/keymap/emacs.js => devtools/client/shared/sourceeditor/codemirror/keymap/emacs.js rename : devtools/client/sourceeditor/codemirror/keymap/sublime.js => devtools/client/shared/sourceeditor/codemirror/keymap/sublime.js rename : devtools/client/sourceeditor/codemirror/keymap/vim.js => devtools/client/shared/sourceeditor/codemirror/keymap/vim.js rename : devtools/client/sourceeditor/codemirror/lib/codemirror.css => devtools/client/shared/sourceeditor/codemirror/lib/codemirror.css rename : devtools/client/sourceeditor/codemirror/lib/codemirror.js => devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js rename : devtools/client/sourceeditor/codemirror/mode/clike/clike.js => devtools/client/shared/sourceeditor/codemirror/mode/clike/clike.js rename : devtools/client/sourceeditor/codemirror/mode/clojure/clojure.js => devtools/client/shared/sourceeditor/codemirror/mode/clojure/clojure.js rename : devtools/client/sourceeditor/codemirror/mode/coffeescript/coffeescript.js => devtools/client/shared/sourceeditor/codemirror/mode/coffeescript/coffeescript.js rename : devtools/client/sourceeditor/codemirror/mode/css/css.js => devtools/client/shared/sourceeditor/codemirror/mode/css/css.js rename : devtools/client/sourceeditor/codemirror/mode/elm/elm.js => devtools/client/shared/sourceeditor/codemirror/mode/elm/elm.js rename : devtools/client/sourceeditor/codemirror/mode/haxe/haxe.js => devtools/client/shared/sourceeditor/codemirror/mode/haxe/haxe.js rename : devtools/client/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js => devtools/client/shared/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js rename : devtools/client/sourceeditor/codemirror/mode/javascript/javascript.js => devtools/client/shared/sourceeditor/codemirror/mode/javascript/javascript.js rename : devtools/client/sourceeditor/codemirror/mode/jsx/jsx.js => devtools/client/shared/sourceeditor/codemirror/mode/jsx/jsx.js rename : devtools/client/sourceeditor/codemirror/mode/wasm/wasm.js => devtools/client/shared/sourceeditor/codemirror/mode/wasm/wasm.js rename : devtools/client/sourceeditor/codemirror/mode/xml/xml.js => devtools/client/shared/sourceeditor/codemirror/mode/xml/xml.js rename : devtools/client/sourceeditor/codemirror/mozilla.css => devtools/client/shared/sourceeditor/codemirror/mozilla.css rename : devtools/client/sourceeditor/css-autocompleter.js => devtools/client/shared/sourceeditor/css-autocompleter.js rename : devtools/client/sourceeditor/debugger.js => devtools/client/shared/sourceeditor/debugger.js rename : devtools/client/sourceeditor/editor-commands-controller.js => devtools/client/shared/sourceeditor/editor-commands-controller.js rename : devtools/client/sourceeditor/editor.js => devtools/client/shared/sourceeditor/editor.js rename : devtools/client/sourceeditor/moz.build => devtools/client/shared/sourceeditor/moz.build rename : devtools/client/sourceeditor/package.json => devtools/client/shared/sourceeditor/package.json rename : devtools/client/sourceeditor/tern/README => devtools/client/shared/sourceeditor/tern/README rename : devtools/client/sourceeditor/tern/browser.js => devtools/client/shared/sourceeditor/tern/browser.js rename : devtools/client/sourceeditor/tern/comment.js => devtools/client/shared/sourceeditor/tern/comment.js rename : devtools/client/sourceeditor/tern/condense.js => devtools/client/shared/sourceeditor/tern/condense.js rename : devtools/client/sourceeditor/tern/def.js => devtools/client/shared/sourceeditor/tern/def.js rename : devtools/client/sourceeditor/tern/ecma5.js => devtools/client/shared/sourceeditor/tern/ecma5.js rename : devtools/client/sourceeditor/tern/infer.js => devtools/client/shared/sourceeditor/tern/infer.js rename : devtools/client/sourceeditor/tern/moz.build => devtools/client/shared/sourceeditor/tern/moz.build rename : devtools/client/sourceeditor/tern/signal.js => devtools/client/shared/sourceeditor/tern/signal.js rename : devtools/client/sourceeditor/tern/tern.js => devtools/client/shared/sourceeditor/tern/tern.js rename : devtools/client/sourceeditor/tern/tests/unit/head_tern.js => devtools/client/shared/sourceeditor/tern/tests/unit/head_tern.js rename : devtools/client/sourceeditor/tern/tests/unit/test_autocompletion.js => devtools/client/shared/sourceeditor/tern/tests/unit/test_autocompletion.js rename : devtools/client/sourceeditor/tern/tests/unit/test_import_tern.js => devtools/client/shared/sourceeditor/tern/tests/unit/test_import_tern.js rename : devtools/client/sourceeditor/tern/tests/unit/xpcshell.ini => devtools/client/shared/sourceeditor/tern/tests/unit/xpcshell.ini rename : devtools/client/sourceeditor/test/.eslintrc.js => devtools/client/shared/sourceeditor/test/.eslintrc.js rename : devtools/client/sourceeditor/test/browser.ini => devtools/client/shared/sourceeditor/test/browser.ini rename : devtools/client/sourceeditor/test/browser_codemirror.js => devtools/client/shared/sourceeditor/test/browser_codemirror.js rename : devtools/client/sourceeditor/test/browser_css_autocompletion.js => devtools/client/shared/sourceeditor/test/browser_css_autocompletion.js rename : devtools/client/sourceeditor/test/browser_css_getInfo.js => devtools/client/shared/sourceeditor/test/browser_css_getInfo.js rename : devtools/client/sourceeditor/test/browser_css_statemachine.js => devtools/client/shared/sourceeditor/test/browser_css_statemachine.js rename : devtools/client/sourceeditor/test/browser_detectindent.js => devtools/client/shared/sourceeditor/test/browser_detectindent.js rename : devtools/client/sourceeditor/test/browser_editor_addons.js => devtools/client/shared/sourceeditor/test/browser_editor_addons.js rename : devtools/client/sourceeditor/test/browser_editor_alt_b_f.js => devtools/client/shared/sourceeditor/test/browser_editor_alt_b_f.js rename : devtools/client/sourceeditor/test/browser_editor_autocomplete_basic.js => devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js rename : devtools/client/sourceeditor/test/browser_editor_autocomplete_events.js => devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_events.js rename : devtools/client/sourceeditor/test/browser_editor_autocomplete_js.js => devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_js.js rename : devtools/client/sourceeditor/test/browser_editor_basic.js => devtools/client/shared/sourceeditor/test/browser_editor_basic.js rename : devtools/client/sourceeditor/test/browser_editor_cursor.js => devtools/client/shared/sourceeditor/test/browser_editor_cursor.js rename : devtools/client/sourceeditor/test/browser_editor_find_again.js => devtools/client/shared/sourceeditor/test/browser_editor_find_again.js rename : devtools/client/sourceeditor/test/browser_editor_goto_line.js => devtools/client/shared/sourceeditor/test/browser_editor_goto_line.js rename : devtools/client/sourceeditor/test/browser_editor_history.js => devtools/client/shared/sourceeditor/test/browser_editor_history.js rename : devtools/client/sourceeditor/test/browser_editor_markers.js => devtools/client/shared/sourceeditor/test/browser_editor_markers.js rename : devtools/client/sourceeditor/test/browser_editor_movelines.js => devtools/client/shared/sourceeditor/test/browser_editor_movelines.js rename : devtools/client/sourceeditor/test/browser_editor_prefs.js => devtools/client/shared/sourceeditor/test/browser_editor_prefs.js rename : devtools/client/sourceeditor/test/browser_editor_script_injection.js => devtools/client/shared/sourceeditor/test/browser_editor_script_injection.js rename : devtools/client/sourceeditor/test/browser_vimemacs.js => devtools/client/shared/sourceeditor/test/browser_vimemacs.js rename : devtools/client/sourceeditor/test/cm_mode_ruby.js => devtools/client/shared/sourceeditor/test/cm_mode_ruby.js rename : devtools/client/sourceeditor/test/cm_script_injection_test.js => devtools/client/shared/sourceeditor/test/cm_script_injection_test.js rename : devtools/client/sourceeditor/test/codemirror/codemirror.html => devtools/client/shared/sourceeditor/test/codemirror/codemirror.html rename : devtools/client/sourceeditor/test/codemirror/comment_test.js => devtools/client/shared/sourceeditor/test/codemirror/comment_test.js rename : devtools/client/sourceeditor/test/codemirror/doc_test.js => devtools/client/shared/sourceeditor/test/codemirror/doc_test.js rename : devtools/client/sourceeditor/test/codemirror/driver.js => devtools/client/shared/sourceeditor/test/codemirror/driver.js rename : devtools/client/sourceeditor/test/codemirror/emacs_test.js => devtools/client/shared/sourceeditor/test/codemirror/emacs_test.js rename : devtools/client/sourceeditor/test/codemirror/mode/javascript/test.js => devtools/client/shared/sourceeditor/test/codemirror/mode/javascript/test.js rename : devtools/client/sourceeditor/test/codemirror/mode_test.css => devtools/client/shared/sourceeditor/test/codemirror/mode_test.css rename : devtools/client/sourceeditor/test/codemirror/mode_test.js => devtools/client/shared/sourceeditor/test/codemirror/mode_test.js rename : devtools/client/sourceeditor/test/codemirror/multi_test.js => devtools/client/shared/sourceeditor/test/codemirror/multi_test.js rename : devtools/client/sourceeditor/test/codemirror/search_test.js => devtools/client/shared/sourceeditor/test/codemirror/search_test.js rename : devtools/client/sourceeditor/test/codemirror/sublime_test.js => devtools/client/shared/sourceeditor/test/codemirror/sublime_test.js rename : devtools/client/sourceeditor/test/codemirror/test.js => devtools/client/shared/sourceeditor/test/codemirror/test.js rename : devtools/client/sourceeditor/test/codemirror/vim_test.js => devtools/client/shared/sourceeditor/test/codemirror/vim_test.js rename : devtools/client/sourceeditor/test/codemirror/vimemacs.html => devtools/client/shared/sourceeditor/test/codemirror/vimemacs.html rename : devtools/client/sourceeditor/test/css_autocompletion_tests.json => devtools/client/shared/sourceeditor/test/css_autocompletion_tests.json rename : devtools/client/sourceeditor/test/css_statemachine_testcases.css => devtools/client/shared/sourceeditor/test/css_statemachine_testcases.css rename : devtools/client/sourceeditor/test/css_statemachine_tests.json => devtools/client/shared/sourceeditor/test/css_statemachine_tests.json rename : devtools/client/sourceeditor/test/head.js => devtools/client/shared/sourceeditor/test/head.js rename : devtools/client/sourceeditor/test/head.xul => devtools/client/shared/sourceeditor/test/head.xul rename : devtools/client/sourceeditor/test/helper_codemirror_runner.js => devtools/client/shared/sourceeditor/test/helper_codemirror_runner.js rename : devtools/client/sourceeditor/wasm.js => devtools/client/shared/sourceeditor/wasm.js rename : devtools/client/sourceeditor/webpack.config.js => devtools/client/shared/sourceeditor/webpack.config.js extra : moz-landing-system : lando --- .clang-format-ignore | 4 +- .eslintignore | 10 +- .../client/debugger/new/build/copy-module.js | 4 +- devtools/client/debugger/new/index.html | 6 +- devtools/client/inspector/markup/markup.xhtml | 6 +- .../inspector/markup/views/html-editor.js | 2 +- devtools/client/jar.mn | 14 +- devtools/client/moz.build | 1 - .../netmonitor/src/assets/styles/httpi.css | 6 +- .../src/assets/styles/netmonitor.css | 6 +- .../netmonitor/src/components/SourceEditor.js | 2 +- .../browser_net_simple-request-details.js | 2 +- devtools/client/netmonitor/webpack.config.js | 2 +- devtools/client/scratchpad/scratchpad.js | 2 +- devtools/client/shadereditor/shadereditor.js | 2 +- devtools/client/shared/moz.build | 1 + .../{ => shared}/sourceeditor/.eslintrc.js | 2 +- .../client/{ => shared}/sourceeditor/README | 22 +- .../{ => shared}/sourceeditor/autocomplete.js | 6 +- .../sourceeditor/codemirror/LICENSE | 0 .../codemirror/addon/comment/comment.js | 0 .../addon/comment/continuecomment.js | 0 .../codemirror/addon/dialog/dialog.css | 0 .../codemirror/addon/dialog/dialog.js | 0 .../codemirror/addon/edit/closebrackets.js | 0 .../codemirror/addon/edit/closetag.js | 0 .../codemirror/addon/edit/continuelist.js | 0 .../codemirror/addon/edit/matchbrackets.js | 0 .../codemirror/addon/edit/matchtags.js | 0 .../codemirror/addon/edit/trailingspace.js | 0 .../codemirror/addon/fold/brace-fold.js | 0 .../codemirror/addon/fold/comment-fold.js | 0 .../codemirror/addon/fold/foldcode.js | 0 .../codemirror/addon/fold/foldgutter.css | 0 .../codemirror/addon/fold/foldgutter.js | 0 .../codemirror/addon/fold/indent-fold.js | 0 .../codemirror/addon/fold/markdown-fold.js | 0 .../codemirror/addon/fold/xml-fold.js | 0 .../codemirror/addon/hint/show-hint.js | 0 .../codemirror/addon/runmode/runmode.js | 0 .../addon/search/match-highlighter.js | 0 .../codemirror/addon/search/search.js | 0 .../codemirror/addon/search/searchcursor.js | 0 .../codemirror/addon/selection/active-line.js | 0 .../addon/selection/mark-selection.js | 0 .../codemirror/addon/tern/tern.css | 0 .../codemirror/addon/tern/tern.js | 0 .../sourceeditor/codemirror/cmiframe.html | 14 + .../codemirror/codemirror.bundle.js | 0 .../sourceeditor/codemirror/keymap/emacs.js | 0 .../sourceeditor/codemirror/keymap/sublime.js | 0 .../sourceeditor/codemirror/keymap/vim.js | 0 .../codemirror/lib/codemirror.css | 0 .../sourceeditor/codemirror/lib/codemirror.js | 0 .../codemirror/mode/clike/clike.js | 0 .../codemirror/mode/clojure/clojure.js | 0 .../mode/coffeescript/coffeescript.js | 0 .../sourceeditor/codemirror/mode/css/css.js | 0 .../sourceeditor/codemirror/mode/elm/elm.js | 0 .../sourceeditor/codemirror/mode/haxe/haxe.js | 0 .../codemirror/mode/htmlmixed/htmlmixed.js | 0 .../codemirror/mode/javascript/javascript.js | 0 .../sourceeditor/codemirror/mode/jsx/jsx.js | 0 .../sourceeditor/codemirror/mode/wasm/wasm.js | 0 .../sourceeditor/codemirror/mode/xml/xml.js | 0 .../sourceeditor/codemirror/mozilla.css | 0 .../sourceeditor/css-autocompleter.js | 0 .../{ => shared}/sourceeditor/debugger.js | 0 .../editor-commands-controller.js | 0 .../{ => shared}/sourceeditor/editor.js | 6 +- .../{ => shared}/sourceeditor/moz.build | 0 .../{ => shared}/sourceeditor/package.json | 0 .../{ => shared}/sourceeditor/tern/README | 2 +- .../{ => shared}/sourceeditor/tern/browser.js | 0 .../{ => shared}/sourceeditor/tern/comment.js | 0 .../sourceeditor/tern/condense.js | 0 .../{ => shared}/sourceeditor/tern/def.js | 0 .../{ => shared}/sourceeditor/tern/ecma5.js | 0 .../{ => shared}/sourceeditor/tern/infer.js | 0 .../{ => shared}/sourceeditor/tern/moz.build | 0 .../{ => shared}/sourceeditor/tern/signal.js | 0 .../{ => shared}/sourceeditor/tern/tern.js | 0 .../sourceeditor/tern/tests/unit/head_tern.js | 0 .../tern/tests/unit/test_autocompletion.js | 4 +- .../tern/tests/unit/test_import_tern.js | 6 +- .../sourceeditor/tern/tests/unit/xpcshell.ini | 0 .../sourceeditor/test/.eslintrc.js | 2 +- .../sourceeditor/test/browser.ini | 0 .../sourceeditor/test/browser_codemirror.js | 6 +- .../test/browser_css_autocompletion.js | 6 +- .../sourceeditor/test/browser_css_getInfo.js | 3 +- .../test/browser_css_statemachine.js | 6 +- .../sourceeditor/test/browser_detectindent.js | 0 .../test/browser_editor_addons.js | 0 .../test/browser_editor_alt_b_f.js | 0 .../test/browser_editor_autocomplete_basic.js | 0 .../browser_editor_autocomplete_events.js | 0 .../test/browser_editor_autocomplete_js.js | 0 .../sourceeditor/test/browser_editor_basic.js | 0 .../test/browser_editor_cursor.js | 0 .../test/browser_editor_find_again.js | 0 .../test/browser_editor_goto_line.js | 0 .../test/browser_editor_history.js | 0 .../test/browser_editor_markers.js | 0 .../test/browser_editor_movelines.js | 0 .../sourceeditor/test/browser_editor_prefs.js | 0 .../test/browser_editor_script_injection.js | 2 +- .../sourceeditor/test/browser_vimemacs.js | 2 +- .../sourceeditor/test/cm_mode_ruby.js | 0 .../test/cm_script_injection_test.js | 0 .../test/codemirror/codemirror.html | 4 +- .../test/codemirror/comment_test.js | 0 .../sourceeditor/test/codemirror/doc_test.js | 0 .../sourceeditor/test/codemirror/driver.js | 0 .../test/codemirror/emacs_test.js | 0 .../test/codemirror/mode/javascript/test.js | 0 .../test/codemirror/mode_test.css | 0 .../sourceeditor/test/codemirror/mode_test.js | 0 .../test/codemirror/multi_test.js | 0 .../test/codemirror/search_test.js | 0 .../test/codemirror/sublime_test.js | 0 .../sourceeditor/test/codemirror/test.js | 0 .../sourceeditor/test/codemirror/vim_test.js | 0 .../test/codemirror/vimemacs.html | 4 +- .../test/css_autocompletion_tests.json | 0 .../test/css_statemachine_testcases.css | 0 .../test/css_statemachine_tests.json | 0 .../{ => shared}/sourceeditor/test/head.js | 4 +- .../{ => shared}/sourceeditor/test/head.xul | 0 .../test/helper_codemirror_runner.js | 0 .../client/{ => shared}/sourceeditor/wasm.js | 0 .../sourceeditor/webpack.config.js | 0 .../widgets/tooltip/EventTooltipHelper.js | 2 +- .../sourceeditor/codemirror/cmiframe.html | 14 - .../client/styleeditor/StyleSheetEditor.jsm | 2 +- .../client/webconsole/components/JSTerm.js | 2 +- ...chitest-devtools-chrome-e10s.runtimes.json | 1812 +++++++-------- .../mochitest-devtools-chrome.runtimes.json | 1940 ++++++++--------- toolkit/content/license.html | 4 +- tools/rewriting/ThirdPartyPaths.txt | 4 +- 140 files changed, 1975 insertions(+), 1976 deletions(-) rename devtools/client/{ => shared}/sourceeditor/.eslintrc.js (92%) rename devtools/client/{ => shared}/sourceeditor/README (91%) rename devtools/client/{ => shared}/sourceeditor/autocomplete.js (98%) rename devtools/client/{ => shared}/sourceeditor/codemirror/LICENSE (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/comment/comment.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/comment/continuecomment.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/dialog/dialog.css (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/dialog/dialog.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/edit/closebrackets.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/edit/closetag.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/edit/continuelist.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/edit/matchbrackets.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/edit/matchtags.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/edit/trailingspace.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/brace-fold.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/comment-fold.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/foldcode.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/foldgutter.css (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/foldgutter.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/indent-fold.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/markdown-fold.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/fold/xml-fold.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/hint/show-hint.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/runmode/runmode.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/search/match-highlighter.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/search/search.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/search/searchcursor.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/selection/active-line.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/selection/mark-selection.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/tern/tern.css (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/addon/tern/tern.js (100%) create mode 100644 devtools/client/shared/sourceeditor/codemirror/cmiframe.html rename devtools/client/{ => shared}/sourceeditor/codemirror/codemirror.bundle.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/keymap/emacs.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/keymap/sublime.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/keymap/vim.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/lib/codemirror.css (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/lib/codemirror.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/clike/clike.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/clojure/clojure.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/coffeescript/coffeescript.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/css/css.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/elm/elm.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/haxe/haxe.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/javascript/javascript.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/jsx/jsx.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/wasm/wasm.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mode/xml/xml.js (100%) rename devtools/client/{ => shared}/sourceeditor/codemirror/mozilla.css (100%) rename devtools/client/{ => shared}/sourceeditor/css-autocompleter.js (100%) rename devtools/client/{ => shared}/sourceeditor/debugger.js (100%) rename devtools/client/{ => shared}/sourceeditor/editor-commands-controller.js (100%) rename devtools/client/{ => shared}/sourceeditor/editor.js (99%) rename devtools/client/{ => shared}/sourceeditor/moz.build (100%) rename devtools/client/{ => shared}/sourceeditor/package.json (100%) rename devtools/client/{ => shared}/sourceeditor/tern/README (78%) rename devtools/client/{ => shared}/sourceeditor/tern/browser.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/comment.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/condense.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/def.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/ecma5.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/infer.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/moz.build (100%) rename devtools/client/{ => shared}/sourceeditor/tern/signal.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/tern.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/tests/unit/head_tern.js (100%) rename devtools/client/{ => shared}/sourceeditor/tern/tests/unit/test_autocompletion.js (82%) rename devtools/client/{ => shared}/sourceeditor/tern/tests/unit/test_import_tern.js (56%) rename devtools/client/{ => shared}/sourceeditor/tern/tests/unit/xpcshell.ini (100%) rename devtools/client/{ => shared}/sourceeditor/test/.eslintrc.js (77%) rename devtools/client/{ => shared}/sourceeditor/test/browser.ini (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_codemirror.js (87%) rename devtools/client/{ => shared}/sourceeditor/test/browser_css_autocompletion.js (95%) rename devtools/client/{ => shared}/sourceeditor/test/browser_css_getInfo.js (98%) rename devtools/client/{ => shared}/sourceeditor/test/browser_css_statemachine.js (95%) rename devtools/client/{ => shared}/sourceeditor/test/browser_detectindent.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_addons.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_alt_b_f.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_autocomplete_basic.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_autocomplete_events.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_autocomplete_js.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_basic.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_cursor.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_find_again.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_goto_line.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_history.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_markers.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_movelines.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_prefs.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/browser_editor_script_injection.js (90%) rename devtools/client/{ => shared}/sourceeditor/test/browser_vimemacs.js (85%) rename devtools/client/{ => shared}/sourceeditor/test/cm_mode_ruby.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/cm_script_injection_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/codemirror.html (97%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/comment_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/doc_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/driver.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/emacs_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/mode/javascript/test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/mode_test.css (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/mode_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/multi_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/search_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/sublime_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/vim_test.js (100%) rename devtools/client/{ => shared}/sourceeditor/test/codemirror/vimemacs.html (97%) rename devtools/client/{ => shared}/sourceeditor/test/css_autocompletion_tests.json (100%) rename devtools/client/{ => shared}/sourceeditor/test/css_statemachine_testcases.css (100%) rename devtools/client/{ => shared}/sourceeditor/test/css_statemachine_tests.json (100%) rename devtools/client/{ => shared}/sourceeditor/test/head.js (96%) rename devtools/client/{ => shared}/sourceeditor/test/head.xul (100%) rename devtools/client/{ => shared}/sourceeditor/test/helper_codemirror_runner.js (100%) rename devtools/client/{ => shared}/sourceeditor/wasm.js (100%) rename devtools/client/{ => shared}/sourceeditor/webpack.config.js (100%) delete mode 100644 devtools/client/sourceeditor/codemirror/cmiframe.html diff --git a/.clang-format-ignore b/.clang-format-ignore index c0840411c43d..e39e5579504c 100644 --- a/.clang-format-ignore +++ b/.clang-format-ignore @@ -59,8 +59,8 @@ xpcom/reflect/xptcall/md/unix/.* browser/components/translation/cld2/.* browser/extensions/mortar/ppapi/.* db/sqlite3/src/.* -devtools/client/sourceeditor/codemirror/.* -devtools/client/sourceeditor/tern/.* +devtools/client/shared/sourceeditor/codemirror/.* +devtools/client/shared/sourceeditor/tern/.* dom/canvas/test/webgl-conf/checkout/closure-library/.* dom/media/gmp/rlz/.* dom/media/gmp/widevine-adapter/content_decryption_module.h diff --git a/.eslintignore b/.eslintignore index f5219d5be971..6017ffbd06e7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -143,11 +143,11 @@ devtools/client/jsonview/lib/require.js devtools/client/shared/demangle.js devtools/client/shared/source-map/* devtools/client/shared/vendor/* -devtools/client/sourceeditor/codemirror/*.js -devtools/client/sourceeditor/codemirror/**/*.js -devtools/client/sourceeditor/tern/* -devtools/client/sourceeditor/test/cm_mode_ruby.js -devtools/client/sourceeditor/test/codemirror/* +devtools/client/shared/sourceeditor/codemirror/*.js +devtools/client/shared/sourceeditor/codemirror/**/*.js +devtools/client/shared/sourceeditor/tern/* +devtools/client/shared/sourceeditor/test/cm_mode_ruby.js +devtools/client/shared/sourceeditor/test/codemirror/* devtools/server/actors/utils/automation-timeline.js # Ignore devtools files testing sourcemaps / code style diff --git a/devtools/client/debugger/new/build/copy-module.js b/devtools/client/debugger/new/build/copy-module.js index 285d2480efb7..943d84313058 100644 --- a/devtools/client/debugger/new/build/copy-module.js +++ b/devtools/client/debugger/new/build/copy-module.js @@ -16,8 +16,8 @@ const EXCLUDED_FILES = { const mappings = Object.assign( { - "./source-editor": "devtools/client/sourceeditor/editor", - "../editor/source-editor": "devtools/client/sourceeditor/editor", + "./source-editor": "devtools/client/shared/sourceeditor/editor", + "../editor/source-editor": "devtools/client/shared/sourceeditor/editor", "./test-flag": "devtools/shared/flags", "./fronts-device": "devtools/shared/fronts/device", immutable: "devtools/client/shared/vendor/immutable", diff --git a/devtools/client/debugger/new/index.html b/devtools/client/debugger/new/index.html index 0c56dc5207c7..f471fb17282b 100644 --- a/devtools/client/debugger/new/index.html +++ b/devtools/client/debugger/new/index.html @@ -5,9 +5,9 @@ - - - + + + diff --git a/devtools/client/inspector/markup/markup.xhtml b/devtools/client/inspector/markup/markup.xhtml index 8175d1c2d1e8..0b97eb38488f 100644 --- a/devtools/client/inspector/markup/markup.xhtml +++ b/devtools/client/inspector/markup/markup.xhtml @@ -9,9 +9,9 @@ - - - + + + diff --git a/devtools/client/inspector/markup/views/html-editor.js b/devtools/client/inspector/markup/views/html-editor.js index ee859965c64c..63fde10121e4 100644 --- a/devtools/client/inspector/markup/views/html-editor.js +++ b/devtools/client/inspector/markup/views/html-editor.js @@ -4,7 +4,7 @@ "use strict"; -const Editor = require("devtools/client/sourceeditor/editor"); +const Editor = require("devtools/client/shared/sourceeditor/editor"); const Services = require("Services"); const EventEmitter = require("devtools/shared/event-emitter"); diff --git a/devtools/client/jar.mn b/devtools/client/jar.mn index 5964bee2134a..3bd13fa3ee28 100644 --- a/devtools/client/jar.mn +++ b/devtools/client/jar.mn @@ -15,13 +15,13 @@ devtools.jar: * content/styleeditor/index.xul (styleeditor/index.xul) * content/storage/index.xul (storage/index.xul) content/inspector/markup/markup.xhtml (inspector/markup/markup.xhtml) - content/sourceeditor/codemirror/addon/dialog/dialog.css (sourceeditor/codemirror/addon/dialog/dialog.css) - content/sourceeditor/codemirror/addon/hint/show-hint.js (sourceeditor/codemirror/addon/hint/show-hint.js) - content/sourceeditor/codemirror/addon/tern/tern.js (sourceeditor/codemirror/addon/tern/tern.js) - content/sourceeditor/codemirror/codemirror.bundle.js (sourceeditor/codemirror/codemirror.bundle.js) - content/sourceeditor/codemirror/lib/codemirror.css (sourceeditor/codemirror/lib/codemirror.css) - content/sourceeditor/codemirror/mozilla.css (sourceeditor/codemirror/mozilla.css) - content/sourceeditor/codemirror/cmiframe.html (sourceeditor/codemirror/cmiframe.html) + content/shared/sourceeditor/codemirror/addon/dialog/dialog.css (shared/sourceeditor/codemirror/addon/dialog/dialog.css) + content/shared/sourceeditor/codemirror/addon/hint/show-hint.js (shared/sourceeditor/codemirror/addon/hint/show-hint.js) + content/shared/sourceeditor/codemirror/addon/tern/tern.js (shared/sourceeditor/codemirror/addon/tern/tern.js) + content/shared/sourceeditor/codemirror/codemirror.bundle.js (shared/sourceeditor/codemirror/codemirror.bundle.js) + content/shared/sourceeditor/codemirror/lib/codemirror.css (shared/sourceeditor/codemirror/lib/codemirror.css) + content/shared/sourceeditor/codemirror/mozilla.css (shared/sourceeditor/codemirror/mozilla.css) + content/shared/sourceeditor/codemirror/cmiframe.html (shared/sourceeditor/codemirror/cmiframe.html) content/debugger/new/index.html (debugger/new/index.html) content/shadereditor/index.xul (shadereditor/index.xul) content/canvasdebugger/index.xul (canvasdebugger/index.xul) diff --git a/devtools/client/moz.build b/devtools/client/moz.build index 5b1d3c093773..49f14aa5fd9b 100644 --- a/devtools/client/moz.build +++ b/devtools/client/moz.build @@ -27,7 +27,6 @@ DIRS += [ 'scratchpad', 'shadereditor', 'shared', - 'sourceeditor', 'storage', 'styleeditor', 'themes', diff --git a/devtools/client/netmonitor/src/assets/styles/httpi.css b/devtools/client/netmonitor/src/assets/styles/httpi.css index 8d6da98c04e9..e7021d37bbac 100644 --- a/devtools/client/netmonitor/src/assets/styles/httpi.css +++ b/devtools/client/netmonitor/src/assets/styles/httpi.css @@ -8,9 +8,9 @@ @import "resource://devtools/client/shared/components/tabs/Tabs.css"; @import "resource://devtools/client/shared/components/tabs/TabBar.css"; @import "chrome://devtools/skin/components-frame.css"; -@import "chrome://devtools/content/sourceeditor/codemirror/lib/codemirror.css"; -@import "chrome://devtools/content/sourceeditor/codemirror/addon/dialog/dialog.css"; -@import "chrome://devtools/content/sourceeditor/codemirror/mozilla.css"; +@import "chrome://devtools/content/shared/sourceeditor/codemirror/lib/codemirror.css"; +@import "chrome://devtools/content/shared/sourceeditor/codemirror/addon/dialog/dialog.css"; +@import "chrome://devtools/content/shared/sourceeditor/codemirror/mozilla.css"; @import "resource://devtools/client/shared/components/MdnLink.css"; /* Network panel components & styles */ diff --git a/devtools/client/netmonitor/src/assets/styles/netmonitor.css b/devtools/client/netmonitor/src/assets/styles/netmonitor.css index 7d56bd02e9a3..78ee49b5dc2d 100644 --- a/devtools/client/netmonitor/src/assets/styles/netmonitor.css +++ b/devtools/client/netmonitor/src/assets/styles/netmonitor.css @@ -8,9 +8,9 @@ @import "resource://devtools/client/shared/components/tabs/Tabs.css"; @import "resource://devtools/client/shared/components/tabs/TabBar.css"; @import "chrome://devtools/skin/components-frame.css"; -@import "chrome://devtools/content/sourceeditor/codemirror/lib/codemirror.css"; -@import "chrome://devtools/content/sourceeditor/codemirror/addon/dialog/dialog.css"; -@import "chrome://devtools/content/sourceeditor/codemirror/mozilla.css"; +@import "chrome://devtools/content/shared/sourceeditor/codemirror/lib/codemirror.css"; +@import "chrome://devtools/content/shared/sourceeditor/codemirror/addon/dialog/dialog.css"; +@import "chrome://devtools/content/shared/sourceeditor/codemirror/mozilla.css"; @import "resource://devtools/client/shared/components/MdnLink.css"; /* Network panel components & styles */ diff --git a/devtools/client/netmonitor/src/components/SourceEditor.js b/devtools/client/netmonitor/src/components/SourceEditor.js index ebb757f29c62..37027f506c43 100644 --- a/devtools/client/netmonitor/src/components/SourceEditor.js +++ b/devtools/client/netmonitor/src/components/SourceEditor.js @@ -7,7 +7,7 @@ const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const dom = require("devtools/client/shared/vendor/react-dom-factories"); -const Editor = require("devtools/client/sourceeditor/editor"); +const Editor = require("devtools/client/shared/sourceeditor/editor"); const { div } = dom; diff --git a/devtools/client/netmonitor/test/browser_net_simple-request-details.js b/devtools/client/netmonitor/test/browser_net_simple-request-details.js index 6b24c3209396..aa8aa07848e3 100644 --- a/devtools/client/netmonitor/test/browser_net_simple-request-details.js +++ b/devtools/client/netmonitor/test/browser_net_simple-request-details.js @@ -20,7 +20,7 @@ add_task(async function() { getSelectedRequest, getSortedRequests, } = windowRequire("devtools/client/netmonitor/src/selectors/index"); - const Editor = require("devtools/client/sourceeditor/editor"); + const Editor = require("devtools/client/shared/sourceeditor/editor"); store.dispatch(Actions.batchEnable(false)); diff --git a/devtools/client/netmonitor/webpack.config.js b/devtools/client/netmonitor/webpack.config.js index 56dd6cc12607..856a3c098f11 100644 --- a/devtools/client/netmonitor/webpack.config.js +++ b/devtools/client/netmonitor/webpack.config.js @@ -83,7 +83,7 @@ const webpackConfig = { "devtools/client/shared/vendor/reselect": "reselect", "devtools/client/shared/vendor/jszip": "jszip", - "devtools/client/sourceeditor/editor": "devtools-source-editor/src/source-editor", + "devtools/client/shared/sourceeditor/editor": "devtools-source-editor/src/source-editor", "devtools/shared/event-emitter": "devtools-modules/src/utils/event-emitter", "devtools/shared/platform/clipboard": path.join(__dirname, "../../client/shared/webpack/shims/platform-clipboard-stub"), diff --git a/devtools/client/scratchpad/scratchpad.js b/devtools/client/scratchpad/scratchpad.js index 66390cade607..40e05a8454be 100644 --- a/devtools/client/scratchpad/scratchpad.js +++ b/devtools/client/scratchpad/scratchpad.js @@ -45,7 +45,7 @@ const VARIABLES_VIEW_URL = "chrome://devtools/content/shared/widgets/VariablesVi const {require, loader} = ChromeUtils.import("resource://devtools/shared/Loader.jsm"); -const Editor = require("devtools/client/sourceeditor/editor"); +const Editor = require("devtools/client/shared/sourceeditor/editor"); const TargetFactory = require("devtools/client/framework/target").TargetFactory; const EventEmitter = require("devtools/shared/event-emitter"); const DevToolsUtils = require("devtools/shared/DevToolsUtils"); diff --git a/devtools/client/shadereditor/shadereditor.js b/devtools/client/shadereditor/shadereditor.js index c84cdc6af979..dd163da267b5 100644 --- a/devtools/client/shadereditor/shadereditor.js +++ b/devtools/client/shadereditor/shadereditor.js @@ -9,7 +9,7 @@ const promise = require("promise"); const {Task} = require("devtools/shared/task"); const EventEmitter = require("devtools/shared/event-emitter"); const { HTMLTooltip } = require("devtools/client/shared/widgets/tooltip/HTMLTooltip"); -const Editor = require("devtools/client/sourceeditor/editor"); +const Editor = require("devtools/client/shared/sourceeditor/editor"); const {LocalizationHelper} = require("devtools/shared/l10n"); const {extend} = require("devtools/shared/extend"); const {WidgetMethods, setNamedTimeout} = diff --git a/devtools/client/shared/moz.build b/devtools/client/shared/moz.build index 4a0cfa74aacf..0ce864448fd4 100644 --- a/devtools/client/shared/moz.build +++ b/devtools/client/shared/moz.build @@ -15,6 +15,7 @@ DIRS += [ 'redux', 'remote-debugging', 'source-map', + 'sourceeditor', 'vendor', 'webpack', 'widgets', diff --git a/devtools/client/sourceeditor/.eslintrc.js b/devtools/client/shared/sourceeditor/.eslintrc.js similarity index 92% rename from devtools/client/sourceeditor/.eslintrc.js rename to devtools/client/shared/sourceeditor/.eslintrc.js index e705169c7a0a..40add1706563 100644 --- a/devtools/client/sourceeditor/.eslintrc.js +++ b/devtools/client/shared/sourceeditor/.eslintrc.js @@ -2,7 +2,7 @@ module.exports = { // Extend from the devtools eslintrc. - "extends": "../../.eslintrc.js", + "extends": "../../../.eslintrc.js", "rules": { // The inspector is being migrated to HTML and cleaned of diff --git a/devtools/client/sourceeditor/README b/devtools/client/shared/sourceeditor/README similarity index 91% rename from devtools/client/sourceeditor/README rename to devtools/client/shared/sourceeditor/README index 1546d383c06a..8990953b55d6 100644 --- a/devtools/client/sourceeditor/README +++ b/devtools/client/shared/sourceeditor/README @@ -10,7 +10,7 @@ CodeMirror from the project's page [1] and replace all JavaScript and CSS files inside the codemirror directory [2]. Then to recreate codemirror.bundle.js: - > cd devtools/client/sourceeditor + > cd devtools/client/shared/sourceeditor > npm install > webpack @@ -46,14 +46,14 @@ below. # License -The following files in this directory and devtools/client/sourceeditor/test/codemirror/ +The following files in this directory and devtools/client/shared/sourceeditor/test/codemirror/ are licensed according to the contents in the LICENSE file. # Localization patches -diff --git a/devtools/client/sourceeditor/codemirror/addon/search/search.js b/devtools/client/sourceeditor/codemirror/addon/search/search.js ---- a/devtools/client/sourceeditor/codemirror/addon/search/search.js -+++ b/devtools/client/sourceeditor/codemirror/addon/search/search.js +diff --git a/devtools/client/shared/sourceeditor/codemirror/addon/search/search.js b/devtools/client/shared/sourceeditor/codemirror/addon/search/search.js +--- a/devtools/client/shared/sourceeditor/codemirror/addon/search/search.js ++++ b/devtools/client/shared/sourceeditor/codemirror/addon/search/search.js @@ -93,32 +93,47 @@ } else { query = parseString(query) @@ -231,9 +231,9 @@ diff --git a/devtools/client/sourceeditor/codemirror/addon/search/search.js b/de See Bug 1482875. Not needed anymore when https://github.com/codemirror/CodeMirror/pull/5751 lands. ```diff -diff --git a/devtools/client/sourceeditor/codemirror/lib/codemirror.js b/devtools/client/sourceeditor/codemirror/lib/codemirror.js ---- a/devtools/client/sourceeditor/codemirror/lib/codemirror.js -+++ b/devtools/client/sourceeditor/codemirror/lib/codemirror.js +diff --git a/devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js b/devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js +--- a/devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js ++++ b/devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js @@ -9256,8 +9256,9 @@ TextareaInput.prototype.init = function on(display.scroller, "paste", function (e) { @@ -251,7 +251,7 @@ diff --git a/devtools/client/sourceeditor/codemirror/lib/codemirror.js b/devtool # Footnotes [1] http://codemirror.net -[2] devtools/client/sourceeditor/codemirror -[3] devtools/client/sourceeditor/test/browser_codemirror.js +[2] devtools/client/shared/sourceeditor/codemirror +[3] devtools/client/shared/sourceeditor/test/browser_codemirror.js [4] devtools/client/jar.mn -[5] devtools/client/sourceeditor/editor.js +[5] devtools/client/shared/sourceeditor/editor.js diff --git a/devtools/client/sourceeditor/autocomplete.js b/devtools/client/shared/sourceeditor/autocomplete.js similarity index 98% rename from devtools/client/sourceeditor/autocomplete.js rename to devtools/client/shared/sourceeditor/autocomplete.js index 0c60a43484d7..76a436128c39 100644 --- a/devtools/client/sourceeditor/autocomplete.js +++ b/devtools/client/shared/sourceeditor/autocomplete.js @@ -8,11 +8,11 @@ const AutocompletePopup = require("devtools/client/shared/autocomplete-popup"); loader.lazyRequireGetter(this, "KeyCodes", "devtools/client/shared/keycodes", true); -loader.lazyRequireGetter(this, "CSSCompleter", "devtools/client/sourceeditor/css-autocompleter"); +loader.lazyRequireGetter(this, "CSSCompleter", "devtools/client/shared/sourceeditor/css-autocompleter"); const CM_TERN_SCRIPTS = [ - "chrome://devtools/content/sourceeditor/codemirror/addon/tern/tern.js", - "chrome://devtools/content/sourceeditor/codemirror/addon/hint/show-hint.js", + "chrome://devtools/content/shared/sourceeditor/codemirror/addon/tern/tern.js", + "chrome://devtools/content/shared/sourceeditor/codemirror/addon/hint/show-hint.js", ]; const autocompleteMap = new WeakMap(); diff --git a/devtools/client/sourceeditor/codemirror/LICENSE b/devtools/client/shared/sourceeditor/codemirror/LICENSE similarity index 100% rename from devtools/client/sourceeditor/codemirror/LICENSE rename to devtools/client/shared/sourceeditor/codemirror/LICENSE diff --git a/devtools/client/sourceeditor/codemirror/addon/comment/comment.js b/devtools/client/shared/sourceeditor/codemirror/addon/comment/comment.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/comment/comment.js rename to devtools/client/shared/sourceeditor/codemirror/addon/comment/comment.js diff --git a/devtools/client/sourceeditor/codemirror/addon/comment/continuecomment.js b/devtools/client/shared/sourceeditor/codemirror/addon/comment/continuecomment.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/comment/continuecomment.js rename to devtools/client/shared/sourceeditor/codemirror/addon/comment/continuecomment.js diff --git a/devtools/client/sourceeditor/codemirror/addon/dialog/dialog.css b/devtools/client/shared/sourceeditor/codemirror/addon/dialog/dialog.css similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/dialog/dialog.css rename to devtools/client/shared/sourceeditor/codemirror/addon/dialog/dialog.css diff --git a/devtools/client/sourceeditor/codemirror/addon/dialog/dialog.js b/devtools/client/shared/sourceeditor/codemirror/addon/dialog/dialog.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/dialog/dialog.js rename to devtools/client/shared/sourceeditor/codemirror/addon/dialog/dialog.js diff --git a/devtools/client/sourceeditor/codemirror/addon/edit/closebrackets.js b/devtools/client/shared/sourceeditor/codemirror/addon/edit/closebrackets.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/edit/closebrackets.js rename to devtools/client/shared/sourceeditor/codemirror/addon/edit/closebrackets.js diff --git a/devtools/client/sourceeditor/codemirror/addon/edit/closetag.js b/devtools/client/shared/sourceeditor/codemirror/addon/edit/closetag.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/edit/closetag.js rename to devtools/client/shared/sourceeditor/codemirror/addon/edit/closetag.js diff --git a/devtools/client/sourceeditor/codemirror/addon/edit/continuelist.js b/devtools/client/shared/sourceeditor/codemirror/addon/edit/continuelist.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/edit/continuelist.js rename to devtools/client/shared/sourceeditor/codemirror/addon/edit/continuelist.js diff --git a/devtools/client/sourceeditor/codemirror/addon/edit/matchbrackets.js b/devtools/client/shared/sourceeditor/codemirror/addon/edit/matchbrackets.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/edit/matchbrackets.js rename to devtools/client/shared/sourceeditor/codemirror/addon/edit/matchbrackets.js diff --git a/devtools/client/sourceeditor/codemirror/addon/edit/matchtags.js b/devtools/client/shared/sourceeditor/codemirror/addon/edit/matchtags.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/edit/matchtags.js rename to devtools/client/shared/sourceeditor/codemirror/addon/edit/matchtags.js diff --git a/devtools/client/sourceeditor/codemirror/addon/edit/trailingspace.js b/devtools/client/shared/sourceeditor/codemirror/addon/edit/trailingspace.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/edit/trailingspace.js rename to devtools/client/shared/sourceeditor/codemirror/addon/edit/trailingspace.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/brace-fold.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/brace-fold.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/brace-fold.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/brace-fold.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/comment-fold.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/comment-fold.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/comment-fold.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/comment-fold.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/foldcode.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/foldcode.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/foldcode.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/foldcode.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/foldgutter.css b/devtools/client/shared/sourceeditor/codemirror/addon/fold/foldgutter.css similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/foldgutter.css rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/foldgutter.css diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/foldgutter.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/foldgutter.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/foldgutter.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/foldgutter.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/indent-fold.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/indent-fold.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/indent-fold.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/indent-fold.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/markdown-fold.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/markdown-fold.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/markdown-fold.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/markdown-fold.js diff --git a/devtools/client/sourceeditor/codemirror/addon/fold/xml-fold.js b/devtools/client/shared/sourceeditor/codemirror/addon/fold/xml-fold.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/fold/xml-fold.js rename to devtools/client/shared/sourceeditor/codemirror/addon/fold/xml-fold.js diff --git a/devtools/client/sourceeditor/codemirror/addon/hint/show-hint.js b/devtools/client/shared/sourceeditor/codemirror/addon/hint/show-hint.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/hint/show-hint.js rename to devtools/client/shared/sourceeditor/codemirror/addon/hint/show-hint.js diff --git a/devtools/client/sourceeditor/codemirror/addon/runmode/runmode.js b/devtools/client/shared/sourceeditor/codemirror/addon/runmode/runmode.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/runmode/runmode.js rename to devtools/client/shared/sourceeditor/codemirror/addon/runmode/runmode.js diff --git a/devtools/client/sourceeditor/codemirror/addon/search/match-highlighter.js b/devtools/client/shared/sourceeditor/codemirror/addon/search/match-highlighter.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/search/match-highlighter.js rename to devtools/client/shared/sourceeditor/codemirror/addon/search/match-highlighter.js diff --git a/devtools/client/sourceeditor/codemirror/addon/search/search.js b/devtools/client/shared/sourceeditor/codemirror/addon/search/search.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/search/search.js rename to devtools/client/shared/sourceeditor/codemirror/addon/search/search.js diff --git a/devtools/client/sourceeditor/codemirror/addon/search/searchcursor.js b/devtools/client/shared/sourceeditor/codemirror/addon/search/searchcursor.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/search/searchcursor.js rename to devtools/client/shared/sourceeditor/codemirror/addon/search/searchcursor.js diff --git a/devtools/client/sourceeditor/codemirror/addon/selection/active-line.js b/devtools/client/shared/sourceeditor/codemirror/addon/selection/active-line.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/selection/active-line.js rename to devtools/client/shared/sourceeditor/codemirror/addon/selection/active-line.js diff --git a/devtools/client/sourceeditor/codemirror/addon/selection/mark-selection.js b/devtools/client/shared/sourceeditor/codemirror/addon/selection/mark-selection.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/selection/mark-selection.js rename to devtools/client/shared/sourceeditor/codemirror/addon/selection/mark-selection.js diff --git a/devtools/client/sourceeditor/codemirror/addon/tern/tern.css b/devtools/client/shared/sourceeditor/codemirror/addon/tern/tern.css similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/tern/tern.css rename to devtools/client/shared/sourceeditor/codemirror/addon/tern/tern.css diff --git a/devtools/client/sourceeditor/codemirror/addon/tern/tern.js b/devtools/client/shared/sourceeditor/codemirror/addon/tern/tern.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/addon/tern/tern.js rename to devtools/client/shared/sourceeditor/codemirror/addon/tern/tern.js diff --git a/devtools/client/shared/sourceeditor/codemirror/cmiframe.html b/devtools/client/shared/sourceeditor/codemirror/cmiframe.html new file mode 100644 index 000000000000..7d41fbec91ce --- /dev/null +++ b/devtools/client/shared/sourceeditor/codemirror/cmiframe.html @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/devtools/client/sourceeditor/codemirror/codemirror.bundle.js b/devtools/client/shared/sourceeditor/codemirror/codemirror.bundle.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/codemirror.bundle.js rename to devtools/client/shared/sourceeditor/codemirror/codemirror.bundle.js diff --git a/devtools/client/sourceeditor/codemirror/keymap/emacs.js b/devtools/client/shared/sourceeditor/codemirror/keymap/emacs.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/keymap/emacs.js rename to devtools/client/shared/sourceeditor/codemirror/keymap/emacs.js diff --git a/devtools/client/sourceeditor/codemirror/keymap/sublime.js b/devtools/client/shared/sourceeditor/codemirror/keymap/sublime.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/keymap/sublime.js rename to devtools/client/shared/sourceeditor/codemirror/keymap/sublime.js diff --git a/devtools/client/sourceeditor/codemirror/keymap/vim.js b/devtools/client/shared/sourceeditor/codemirror/keymap/vim.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/keymap/vim.js rename to devtools/client/shared/sourceeditor/codemirror/keymap/vim.js diff --git a/devtools/client/sourceeditor/codemirror/lib/codemirror.css b/devtools/client/shared/sourceeditor/codemirror/lib/codemirror.css similarity index 100% rename from devtools/client/sourceeditor/codemirror/lib/codemirror.css rename to devtools/client/shared/sourceeditor/codemirror/lib/codemirror.css diff --git a/devtools/client/sourceeditor/codemirror/lib/codemirror.js b/devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/lib/codemirror.js rename to devtools/client/shared/sourceeditor/codemirror/lib/codemirror.js diff --git a/devtools/client/sourceeditor/codemirror/mode/clike/clike.js b/devtools/client/shared/sourceeditor/codemirror/mode/clike/clike.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/clike/clike.js rename to devtools/client/shared/sourceeditor/codemirror/mode/clike/clike.js diff --git a/devtools/client/sourceeditor/codemirror/mode/clojure/clojure.js b/devtools/client/shared/sourceeditor/codemirror/mode/clojure/clojure.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/clojure/clojure.js rename to devtools/client/shared/sourceeditor/codemirror/mode/clojure/clojure.js diff --git a/devtools/client/sourceeditor/codemirror/mode/coffeescript/coffeescript.js b/devtools/client/shared/sourceeditor/codemirror/mode/coffeescript/coffeescript.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/coffeescript/coffeescript.js rename to devtools/client/shared/sourceeditor/codemirror/mode/coffeescript/coffeescript.js diff --git a/devtools/client/sourceeditor/codemirror/mode/css/css.js b/devtools/client/shared/sourceeditor/codemirror/mode/css/css.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/css/css.js rename to devtools/client/shared/sourceeditor/codemirror/mode/css/css.js diff --git a/devtools/client/sourceeditor/codemirror/mode/elm/elm.js b/devtools/client/shared/sourceeditor/codemirror/mode/elm/elm.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/elm/elm.js rename to devtools/client/shared/sourceeditor/codemirror/mode/elm/elm.js diff --git a/devtools/client/sourceeditor/codemirror/mode/haxe/haxe.js b/devtools/client/shared/sourceeditor/codemirror/mode/haxe/haxe.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/haxe/haxe.js rename to devtools/client/shared/sourceeditor/codemirror/mode/haxe/haxe.js diff --git a/devtools/client/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js b/devtools/client/shared/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js rename to devtools/client/shared/sourceeditor/codemirror/mode/htmlmixed/htmlmixed.js diff --git a/devtools/client/sourceeditor/codemirror/mode/javascript/javascript.js b/devtools/client/shared/sourceeditor/codemirror/mode/javascript/javascript.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/javascript/javascript.js rename to devtools/client/shared/sourceeditor/codemirror/mode/javascript/javascript.js diff --git a/devtools/client/sourceeditor/codemirror/mode/jsx/jsx.js b/devtools/client/shared/sourceeditor/codemirror/mode/jsx/jsx.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/jsx/jsx.js rename to devtools/client/shared/sourceeditor/codemirror/mode/jsx/jsx.js diff --git a/devtools/client/sourceeditor/codemirror/mode/wasm/wasm.js b/devtools/client/shared/sourceeditor/codemirror/mode/wasm/wasm.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/wasm/wasm.js rename to devtools/client/shared/sourceeditor/codemirror/mode/wasm/wasm.js diff --git a/devtools/client/sourceeditor/codemirror/mode/xml/xml.js b/devtools/client/shared/sourceeditor/codemirror/mode/xml/xml.js similarity index 100% rename from devtools/client/sourceeditor/codemirror/mode/xml/xml.js rename to devtools/client/shared/sourceeditor/codemirror/mode/xml/xml.js diff --git a/devtools/client/sourceeditor/codemirror/mozilla.css b/devtools/client/shared/sourceeditor/codemirror/mozilla.css similarity index 100% rename from devtools/client/sourceeditor/codemirror/mozilla.css rename to devtools/client/shared/sourceeditor/codemirror/mozilla.css diff --git a/devtools/client/sourceeditor/css-autocompleter.js b/devtools/client/shared/sourceeditor/css-autocompleter.js similarity index 100% rename from devtools/client/sourceeditor/css-autocompleter.js rename to devtools/client/shared/sourceeditor/css-autocompleter.js diff --git a/devtools/client/sourceeditor/debugger.js b/devtools/client/shared/sourceeditor/debugger.js similarity index 100% rename from devtools/client/sourceeditor/debugger.js rename to devtools/client/shared/sourceeditor/debugger.js diff --git a/devtools/client/sourceeditor/editor-commands-controller.js b/devtools/client/shared/sourceeditor/editor-commands-controller.js similarity index 100% rename from devtools/client/sourceeditor/editor-commands-controller.js rename to devtools/client/shared/sourceeditor/editor-commands-controller.js diff --git a/devtools/client/sourceeditor/editor.js b/devtools/client/shared/sourceeditor/editor.js similarity index 99% rename from devtools/client/sourceeditor/editor.js rename to devtools/client/shared/sourceeditor/editor.js index 428dcf168cf3..db874065244b 100644 --- a/devtools/client/sourceeditor/editor.js +++ b/devtools/client/shared/sourceeditor/editor.js @@ -52,10 +52,10 @@ const { OS } = Services.appinfo; // injected into an iframe in order to initialize a CodeMirror instance. const CM_SCRIPTS = [ - "chrome://devtools/content/sourceeditor/codemirror/codemirror.bundle.js", + "chrome://devtools/content/shared/sourceeditor/codemirror/codemirror.bundle.js", ]; -const CM_IFRAME = "chrome://devtools/content/sourceeditor/codemirror/cmiframe.html"; +const CM_IFRAME = "chrome://devtools/content/shared/sourceeditor/codemirror/cmiframe.html"; const CM_MAPPING = [ "clearHistory", @@ -518,7 +518,7 @@ Editor.prototype = { */ insertCommandsController: function() { const { insertCommandsController } = - require("devtools/client/sourceeditor/editor-commands-controller"); + require("devtools/client/shared/sourceeditor/editor-commands-controller"); insertCommandsController(this); }, diff --git a/devtools/client/sourceeditor/moz.build b/devtools/client/shared/sourceeditor/moz.build similarity index 100% rename from devtools/client/sourceeditor/moz.build rename to devtools/client/shared/sourceeditor/moz.build diff --git a/devtools/client/sourceeditor/package.json b/devtools/client/shared/sourceeditor/package.json similarity index 100% rename from devtools/client/sourceeditor/package.json rename to devtools/client/shared/sourceeditor/package.json diff --git a/devtools/client/sourceeditor/tern/README b/devtools/client/shared/sourceeditor/tern/README similarity index 78% rename from devtools/client/sourceeditor/tern/README rename to devtools/client/shared/sourceeditor/tern/README index d41e7b456454..f4585dc40f61 100644 --- a/devtools/client/sourceeditor/tern/README +++ b/devtools/client/shared/sourceeditor/tern/README @@ -7,7 +7,7 @@ Tern is a stand-alone code-analysis engine for JavaScript. It is intended to be Currently used version is 0.6.2. To upgrade, download the latest release from http://ternjs.net/, and copy the files from lib/ into this directory. -You may also need to update the CodeMirror plugin found in devtools/client/sourceeditor/codemirror/addon/tern, but it will most likely work without updating. +You may also need to update the CodeMirror plugin found in devtools/client/shared/sourceeditor/codemirror/addon/tern, but it will most likely work without updating. Replace instances of `require("acorn")` with `require("acorn/acorn")` Replace instances of `acorn/dist/` with `acorn/` \ No newline at end of file diff --git a/devtools/client/sourceeditor/tern/browser.js b/devtools/client/shared/sourceeditor/tern/browser.js similarity index 100% rename from devtools/client/sourceeditor/tern/browser.js rename to devtools/client/shared/sourceeditor/tern/browser.js diff --git a/devtools/client/sourceeditor/tern/comment.js b/devtools/client/shared/sourceeditor/tern/comment.js similarity index 100% rename from devtools/client/sourceeditor/tern/comment.js rename to devtools/client/shared/sourceeditor/tern/comment.js diff --git a/devtools/client/sourceeditor/tern/condense.js b/devtools/client/shared/sourceeditor/tern/condense.js similarity index 100% rename from devtools/client/sourceeditor/tern/condense.js rename to devtools/client/shared/sourceeditor/tern/condense.js diff --git a/devtools/client/sourceeditor/tern/def.js b/devtools/client/shared/sourceeditor/tern/def.js similarity index 100% rename from devtools/client/sourceeditor/tern/def.js rename to devtools/client/shared/sourceeditor/tern/def.js diff --git a/devtools/client/sourceeditor/tern/ecma5.js b/devtools/client/shared/sourceeditor/tern/ecma5.js similarity index 100% rename from devtools/client/sourceeditor/tern/ecma5.js rename to devtools/client/shared/sourceeditor/tern/ecma5.js diff --git a/devtools/client/sourceeditor/tern/infer.js b/devtools/client/shared/sourceeditor/tern/infer.js similarity index 100% rename from devtools/client/sourceeditor/tern/infer.js rename to devtools/client/shared/sourceeditor/tern/infer.js diff --git a/devtools/client/sourceeditor/tern/moz.build b/devtools/client/shared/sourceeditor/tern/moz.build similarity index 100% rename from devtools/client/sourceeditor/tern/moz.build rename to devtools/client/shared/sourceeditor/tern/moz.build diff --git a/devtools/client/sourceeditor/tern/signal.js b/devtools/client/shared/sourceeditor/tern/signal.js similarity index 100% rename from devtools/client/sourceeditor/tern/signal.js rename to devtools/client/shared/sourceeditor/tern/signal.js diff --git a/devtools/client/sourceeditor/tern/tern.js b/devtools/client/shared/sourceeditor/tern/tern.js similarity index 100% rename from devtools/client/sourceeditor/tern/tern.js rename to devtools/client/shared/sourceeditor/tern/tern.js diff --git a/devtools/client/sourceeditor/tern/tests/unit/head_tern.js b/devtools/client/shared/sourceeditor/tern/tests/unit/head_tern.js similarity index 100% rename from devtools/client/sourceeditor/tern/tests/unit/head_tern.js rename to devtools/client/shared/sourceeditor/tern/tests/unit/head_tern.js diff --git a/devtools/client/sourceeditor/tern/tests/unit/test_autocompletion.js b/devtools/client/shared/sourceeditor/tern/tests/unit/test_autocompletion.js similarity index 82% rename from devtools/client/sourceeditor/tern/tests/unit/test_autocompletion.js rename to devtools/client/shared/sourceeditor/tern/tests/unit/test_autocompletion.js index a8500b74baa8..5a6c88d199a6 100644 --- a/devtools/client/sourceeditor/tern/tests/unit/test_autocompletion.js +++ b/devtools/client/shared/sourceeditor/tern/tests/unit/test_autocompletion.js @@ -5,8 +5,8 @@ * Test that tern autocompletions work. */ -const tern = require("devtools/client/sourceeditor/tern/tern"); -const ecma5 = require("devtools/client/sourceeditor/tern/ecma5"); +const tern = require("devtools/client/shared/sourceeditor/tern/tern"); +const ecma5 = require("devtools/client/shared/sourceeditor/tern/ecma5"); function run_test() { do_test_pending(); diff --git a/devtools/client/sourceeditor/tern/tests/unit/test_import_tern.js b/devtools/client/shared/sourceeditor/tern/tests/unit/test_import_tern.js similarity index 56% rename from devtools/client/sourceeditor/tern/tests/unit/test_import_tern.js rename to devtools/client/shared/sourceeditor/tern/tests/unit/test_import_tern.js index 82cfd47e00fc..6caa1e16bd07 100644 --- a/devtools/client/sourceeditor/tern/tests/unit/test_import_tern.js +++ b/devtools/client/shared/sourceeditor/tern/tests/unit/test_import_tern.js @@ -6,9 +6,9 @@ */ function run_test() { - const tern = require("devtools/client/sourceeditor/tern/tern"); - const ecma5 = require("devtools/client/sourceeditor/tern/ecma5"); - const browser = require("devtools/client/sourceeditor/tern/browser"); + const tern = require("devtools/client/shared/sourceeditor/tern/tern"); + const ecma5 = require("devtools/client/shared/sourceeditor/tern/ecma5"); + const browser = require("devtools/client/shared/sourceeditor/tern/browser"); Assert.ok(!!tern); Assert.ok(!!ecma5); Assert.ok(!!browser); diff --git a/devtools/client/sourceeditor/tern/tests/unit/xpcshell.ini b/devtools/client/shared/sourceeditor/tern/tests/unit/xpcshell.ini similarity index 100% rename from devtools/client/sourceeditor/tern/tests/unit/xpcshell.ini rename to devtools/client/shared/sourceeditor/tern/tests/unit/xpcshell.ini diff --git a/devtools/client/sourceeditor/test/.eslintrc.js b/devtools/client/shared/sourceeditor/test/.eslintrc.js similarity index 77% rename from devtools/client/sourceeditor/test/.eslintrc.js rename to devtools/client/shared/sourceeditor/test/.eslintrc.js index b4bf2c0abf57..ebd0d5e5b936 100644 --- a/devtools/client/sourceeditor/test/.eslintrc.js +++ b/devtools/client/shared/sourceeditor/test/.eslintrc.js @@ -2,7 +2,7 @@ module.exports = { // Extend from the shared list of defined globals for mochitests. - "extends": "../../../.eslintrc.mochitests.js", + "extends": "../../../../.eslintrc.mochitests.js", "globals": { "runCodeMirrorTest": true, "gBrowser": true diff --git a/devtools/client/sourceeditor/test/browser.ini b/devtools/client/shared/sourceeditor/test/browser.ini similarity index 100% rename from devtools/client/sourceeditor/test/browser.ini rename to devtools/client/shared/sourceeditor/test/browser.ini diff --git a/devtools/client/sourceeditor/test/browser_codemirror.js b/devtools/client/shared/sourceeditor/test/browser_codemirror.js similarity index 87% rename from devtools/client/sourceeditor/test/browser_codemirror.js rename to devtools/client/shared/sourceeditor/test/browser_codemirror.js index 2f781d4d2806..481c20313780 100644 --- a/devtools/client/sourceeditor/test/browser_codemirror.js +++ b/devtools/client/shared/sourceeditor/test/browser_codemirror.js @@ -4,8 +4,8 @@ "use strict"; -const URI = "chrome://mochitests/content/browser/devtools/client/" + - "sourceeditor/test/codemirror/codemirror.html"; +const URI = "chrome://mochitests/content/browser/devtools/client/shared/sourceeditor/" + + "test/codemirror/codemirror.html"; loadHelperScript("helper_codemirror_runner.js"); function test() { @@ -13,7 +13,7 @@ function test() { waitForExplicitFinish(); /* - * In devtools/client/sourceeditor/test/codemirror/search_test.js there is a test + * In devtools/client/shared/sourceeditor/test/codemirror/search_test.js there is a test * multilineInsensitiveSlow which assumes an operation takes less than 100ms. * With a precision of 100ms, if we get unlikely and begin execution towards the * end of one spot (e.g. at 95 ms) we will clamp down, take (e.g.) 10ms to execute diff --git a/devtools/client/sourceeditor/test/browser_css_autocompletion.js b/devtools/client/shared/sourceeditor/test/browser_css_autocompletion.js similarity index 95% rename from devtools/client/sourceeditor/test/browser_css_autocompletion.js rename to devtools/client/shared/sourceeditor/test/browser_css_autocompletion.js index 544f147f725a..69f4d338e59c 100644 --- a/devtools/client/sourceeditor/test/browser_css_autocompletion.js +++ b/devtools/client/shared/sourceeditor/test/browser_css_autocompletion.js @@ -4,12 +4,12 @@ "use strict"; -const CSSCompleter = require("devtools/client/sourceeditor/css-autocompleter"); +const CSSCompleter = require("devtools/client/shared/sourceeditor/css-autocompleter"); -const CSS_URI = "http://mochi.test:8888/browser/devtools/client/sourceeditor" + +const CSS_URI = "http://mochi.test:8888/browser/devtools/client/shared/sourceeditor" + "/test/css_statemachine_testcases.css"; const TESTS_URI = "http://mochi.test:8888/browser/devtools/client" + - "/sourceeditor/test/css_autocompletion_tests.json"; + "/shared/sourceeditor/test/css_autocompletion_tests.json"; const source = read(CSS_URI); const {tests} = JSON.parse(read(TESTS_URI)); diff --git a/devtools/client/sourceeditor/test/browser_css_getInfo.js b/devtools/client/shared/sourceeditor/test/browser_css_getInfo.js similarity index 98% rename from devtools/client/sourceeditor/test/browser_css_getInfo.js rename to devtools/client/shared/sourceeditor/test/browser_css_getInfo.js index eae86e22fb9a..3e9ab74a5759 100644 --- a/devtools/client/sourceeditor/test/browser_css_getInfo.js +++ b/devtools/client/shared/sourceeditor/test/browser_css_getInfo.js @@ -4,8 +4,7 @@ "use strict"; -const CSSCompleter = - require("devtools/client/sourceeditor/css-autocompleter"); +const CSSCompleter = require("devtools/client/shared/sourceeditor/css-autocompleter"); const source = [ ".devtools-toolbar {", diff --git a/devtools/client/sourceeditor/test/browser_css_statemachine.js b/devtools/client/shared/sourceeditor/test/browser_css_statemachine.js similarity index 95% rename from devtools/client/sourceeditor/test/browser_css_statemachine.js rename to devtools/client/shared/sourceeditor/test/browser_css_statemachine.js index d5404210460d..eee524809467 100644 --- a/devtools/client/sourceeditor/test/browser_css_statemachine.js +++ b/devtools/client/shared/sourceeditor/test/browser_css_statemachine.js @@ -4,12 +4,12 @@ "use strict"; -const CSSCompleter = require("devtools/client/sourceeditor/css-autocompleter"); +const CSSCompleter = require("devtools/client/shared/sourceeditor/css-autocompleter"); -const CSS_URI = "http://mochi.test:8888/browser/devtools/client/sourceeditor" + +const CSS_URI = "http://mochi.test:8888/browser/devtools/client/shared/sourceeditor" + "/test/css_statemachine_testcases.css"; const TESTS_URI = "http://mochi.test:8888/browser/devtools/client" + - "/sourceeditor/test/css_statemachine_tests.json"; + "/shared/sourceeditor/test/css_statemachine_tests.json"; const source = read(CSS_URI); const {tests} = JSON.parse(read(TESTS_URI)); diff --git a/devtools/client/sourceeditor/test/browser_detectindent.js b/devtools/client/shared/sourceeditor/test/browser_detectindent.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_detectindent.js rename to devtools/client/shared/sourceeditor/test/browser_detectindent.js diff --git a/devtools/client/sourceeditor/test/browser_editor_addons.js b/devtools/client/shared/sourceeditor/test/browser_editor_addons.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_addons.js rename to devtools/client/shared/sourceeditor/test/browser_editor_addons.js diff --git a/devtools/client/sourceeditor/test/browser_editor_alt_b_f.js b/devtools/client/shared/sourceeditor/test/browser_editor_alt_b_f.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_alt_b_f.js rename to devtools/client/shared/sourceeditor/test/browser_editor_alt_b_f.js diff --git a/devtools/client/sourceeditor/test/browser_editor_autocomplete_basic.js b/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_autocomplete_basic.js rename to devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js diff --git a/devtools/client/sourceeditor/test/browser_editor_autocomplete_events.js b/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_events.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_autocomplete_events.js rename to devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_events.js diff --git a/devtools/client/sourceeditor/test/browser_editor_autocomplete_js.js b/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_js.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_autocomplete_js.js rename to devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_js.js diff --git a/devtools/client/sourceeditor/test/browser_editor_basic.js b/devtools/client/shared/sourceeditor/test/browser_editor_basic.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_basic.js rename to devtools/client/shared/sourceeditor/test/browser_editor_basic.js diff --git a/devtools/client/sourceeditor/test/browser_editor_cursor.js b/devtools/client/shared/sourceeditor/test/browser_editor_cursor.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_cursor.js rename to devtools/client/shared/sourceeditor/test/browser_editor_cursor.js diff --git a/devtools/client/sourceeditor/test/browser_editor_find_again.js b/devtools/client/shared/sourceeditor/test/browser_editor_find_again.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_find_again.js rename to devtools/client/shared/sourceeditor/test/browser_editor_find_again.js diff --git a/devtools/client/sourceeditor/test/browser_editor_goto_line.js b/devtools/client/shared/sourceeditor/test/browser_editor_goto_line.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_goto_line.js rename to devtools/client/shared/sourceeditor/test/browser_editor_goto_line.js diff --git a/devtools/client/sourceeditor/test/browser_editor_history.js b/devtools/client/shared/sourceeditor/test/browser_editor_history.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_history.js rename to devtools/client/shared/sourceeditor/test/browser_editor_history.js diff --git a/devtools/client/sourceeditor/test/browser_editor_markers.js b/devtools/client/shared/sourceeditor/test/browser_editor_markers.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_markers.js rename to devtools/client/shared/sourceeditor/test/browser_editor_markers.js diff --git a/devtools/client/sourceeditor/test/browser_editor_movelines.js b/devtools/client/shared/sourceeditor/test/browser_editor_movelines.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_movelines.js rename to devtools/client/shared/sourceeditor/test/browser_editor_movelines.js diff --git a/devtools/client/sourceeditor/test/browser_editor_prefs.js b/devtools/client/shared/sourceeditor/test/browser_editor_prefs.js similarity index 100% rename from devtools/client/sourceeditor/test/browser_editor_prefs.js rename to devtools/client/shared/sourceeditor/test/browser_editor_prefs.js diff --git a/devtools/client/sourceeditor/test/browser_editor_script_injection.js b/devtools/client/shared/sourceeditor/test/browser_editor_script_injection.js similarity index 90% rename from devtools/client/sourceeditor/test/browser_editor_script_injection.js rename to devtools/client/shared/sourceeditor/test/browser_editor_script_injection.js index d98aba484847..b410f9bff299 100644 --- a/devtools/client/sourceeditor/test/browser_editor_script_injection.js +++ b/devtools/client/shared/sourceeditor/test/browser_editor_script_injection.js @@ -12,7 +12,7 @@ add_task(async function() { async function runTest() { const baseURL = - "chrome://mochitests/content/browser/devtools/client/sourceeditor/test"; + "chrome://mochitests/content/browser/devtools/client/shared/sourceeditor/test"; const injectedText = "Script successfully injected!"; const {ed, win} = await setup(null, { diff --git a/devtools/client/sourceeditor/test/browser_vimemacs.js b/devtools/client/shared/sourceeditor/test/browser_vimemacs.js similarity index 85% rename from devtools/client/sourceeditor/test/browser_vimemacs.js rename to devtools/client/shared/sourceeditor/test/browser_vimemacs.js index e2c66f360644..da68bd9717ed 100644 --- a/devtools/client/sourceeditor/test/browser_vimemacs.js +++ b/devtools/client/shared/sourceeditor/test/browser_vimemacs.js @@ -4,7 +4,7 @@ "use strict"; const URI = "chrome://mochitests/content/browser/devtools/client" + - "/sourceeditor/test/codemirror/vimemacs.html"; + "/shared/sourceeditor/test/codemirror/vimemacs.html"; loadHelperScript("helper_codemirror_runner.js"); function test() { diff --git a/devtools/client/sourceeditor/test/cm_mode_ruby.js b/devtools/client/shared/sourceeditor/test/cm_mode_ruby.js similarity index 100% rename from devtools/client/sourceeditor/test/cm_mode_ruby.js rename to devtools/client/shared/sourceeditor/test/cm_mode_ruby.js diff --git a/devtools/client/sourceeditor/test/cm_script_injection_test.js b/devtools/client/shared/sourceeditor/test/cm_script_injection_test.js similarity index 100% rename from devtools/client/sourceeditor/test/cm_script_injection_test.js rename to devtools/client/shared/sourceeditor/test/cm_script_injection_test.js diff --git a/devtools/client/sourceeditor/test/codemirror/codemirror.html b/devtools/client/shared/sourceeditor/test/codemirror/codemirror.html similarity index 97% rename from devtools/client/sourceeditor/test/codemirror/codemirror.html rename to devtools/client/shared/sourceeditor/test/codemirror/codemirror.html index ada04a2d09f2..a0ef772e0d6e 100644 --- a/devtools/client/sourceeditor/test/codemirror/codemirror.html +++ b/devtools/client/shared/sourceeditor/test/codemirror/codemirror.html @@ -3,11 +3,11 @@ CodeMirror: Basic Tests - + - + - - - - - - diff --git a/devtools/client/styleeditor/StyleSheetEditor.jsm b/devtools/client/styleeditor/StyleSheetEditor.jsm index ab306a28afa6..0a61c27db32f 100644 --- a/devtools/client/styleeditor/StyleSheetEditor.jsm +++ b/devtools/client/styleeditor/StyleSheetEditor.jsm @@ -8,7 +8,7 @@ this.EXPORTED_SYMBOLS = ["StyleSheetEditor"]; const {require} = ChromeUtils.import("resource://devtools/shared/Loader.jsm"); -const Editor = require("devtools/client/sourceeditor/editor"); +const Editor = require("devtools/client/shared/sourceeditor/editor"); const promise = require("promise"); const {shortSource, prettifyCSS} = require("devtools/shared/inspector/css-logic"); const {throttle} = require("devtools/shared/throttle"); diff --git a/devtools/client/webconsole/components/JSTerm.js b/devtools/client/webconsole/components/JSTerm.js index dcc2acf3a14a..bb14aee2066a 100644 --- a/devtools/client/webconsole/components/JSTerm.js +++ b/devtools/client/webconsole/components/JSTerm.js @@ -16,7 +16,7 @@ loader.lazyRequireGetter(this, "AutocompletePopup", "devtools/client/shared/auto loader.lazyRequireGetter(this, "PropTypes", "devtools/client/shared/vendor/react-prop-types"); loader.lazyRequireGetter(this, "gDevTools", "devtools/client/framework/devtools", true); loader.lazyRequireGetter(this, "KeyCodes", "devtools/client/shared/keycodes", true); -loader.lazyRequireGetter(this, "Editor", "devtools/client/sourceeditor/editor"); +loader.lazyRequireGetter(this, "Editor", "devtools/client/shared/sourceeditor/editor"); loader.lazyRequireGetter(this, "Telemetry", "devtools/client/shared/telemetry"); loader.lazyRequireGetter(this, "saveScreenshot", "devtools/shared/screenshot/save"); loader.lazyRequireGetter(this, "focusableSelector", "devtools/client/shared/focus", true); diff --git a/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json b/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json index d91056d37a1d..bf3dce1d12af 100644 --- a/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json +++ b/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json @@ -1,915 +1,915 @@ { - "excluded_test_average": 1805, + "excluded_test_average": 1805, "runtimes": { - "Main app process exited normally": 464459, - "browser/base/content/test/static/browser_all_files_referenced.js": 4755, - "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 10703, - "devtools/client/aboutdebugging/test/browser_addons_debug_info.js": 6509, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 20926, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 19517, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 17886, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 18958, - "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 5614, - "devtools/client/aboutdebugging/test/browser_addons_install.js": 4482, - "devtools/client/aboutdebugging/test/browser_addons_reload.js": 4785, - "devtools/client/aboutdebugging/test/browser_addons_remove.js": 4510, - "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 5357, - "devtools/client/aboutdebugging/test/browser_service_workers_status.js": 5267, - "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 4584, - "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 4191, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 7303, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 7881, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 5276, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-reloading.js": 7538, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 10182, - "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 9493, - "devtools/client/debugger/new/test/mochitest/browser_dbg-console.js": 4155, - "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 9855, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 5728, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 5959, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 6946, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 10780, - "devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js": 7688, - "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 7488, - "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 11012, - "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 7356, - "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 7409, - "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 8390, - "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js": 8656, - "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 6767, - "devtools/client/debugger/new/test/mochitest/browser_dbg-search-file.js": 5707, - "devtools/client/debugger/new/test/mochitest/browser_dbg-search-project.js": 5490, - "devtools/client/debugger/new/test/mochitest/browser_dbg-search-sources.js": 4359, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 5731, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reloading.js": 7493, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 12821, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js": 6064, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 8745, - "devtools/client/debugger/new/test/mochitest/browser_dbg-tabs.js": 13022, - "devtools/client/debugger/new/test/mochitest/browser_dbg-toggling-tools.js": 5105, - "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 5173, - "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard_navigation.js": 4535, - "devtools/client/debugger/test/mochitest/browser_dbg_addon-panels.js": 4824, - "devtools/client/debugger/test/mochitest/browser_dbg_addon-sources.js": 4421, - "devtools/client/debugger/test/mochitest/browser_dbg_addon-workers-dbg-enabled.js": 4600, - "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 5839, - "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4084, - "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-03.js": 3662, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-01.js": 3722, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 4330, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 4413, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 4450, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-05.js": 4019, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 4318, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-07.js": 3543, - "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 4520, - "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 3827, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 6034, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 3826, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 3989, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 4204, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 5570, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 4333, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 4670, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 4596, - "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 3959, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 4106, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 4851, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4010, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-02.js": 3867, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 4293, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 12337, - "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 3520, - "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 6495, - "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js": 3543, - "devtools/client/debugger/test/mochitest/browser_dbg_post-page.js": 4653, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 4566, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-eval-02.js": 3669, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js": 3710, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 4276, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 4936, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 4011, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 4302, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 4239, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 13221, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 5677, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 6571, - "devtools/client/dom/test/browser_dom_array.js": 10408, - "devtools/client/dom/test/browser_dom_basic.js": 8536, - "devtools/client/dom/test/browser_dom_refresh.js": 10131, - "devtools/client/framework/test/browser_browser_toolbox.js": 13551, - "devtools/client/framework/test/browser_browser_toolbox_debugger.js": 12184, - "devtools/client/framework/test/browser_ignore_toolbox_network_requests.js": 3622, - "devtools/client/framework/test/browser_keybindings_01.js": 5700, - "devtools/client/framework/test/browser_keybindings_02.js": 4729, - "devtools/client/framework/test/browser_new_activation_workflow.js": 5970, - "devtools/client/framework/test/browser_source_map-inline.js": 3595, - "devtools/client/framework/test/browser_source_map-reload.js": 3710, - "devtools/client/framework/test/browser_toolbox_highlight.js": 3746, - "devtools/client/framework/test/browser_toolbox_hosts.js": 10291, - "devtools/client/framework/test/browser_toolbox_hosts_size.js": 7074, - "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 3935, - "devtools/client/framework/test/browser_toolbox_options.js": 8206, - "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 5046, - "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 7747, - "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 10903, - "devtools/client/framework/test/browser_toolbox_races.js": 6045, - "devtools/client/framework/test/browser_toolbox_raise.js": 5437, - "devtools/client/framework/test/browser_toolbox_remoteness_change.js": 3878, - "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 3754, - "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 11146, - "devtools/client/framework/test/browser_toolbox_target.js": 3981, - "devtools/client/framework/test/browser_toolbox_textbox_context_menu.js": 4025, - "devtools/client/framework/test/browser_toolbox_toggle.js": 8992, - "devtools/client/framework/test/browser_toolbox_tool_ready.js": 16445, - "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 11519, - "devtools/client/framework/test/browser_toolbox_toolbar_overflow.js": 3944, - "devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js": 3941, - "devtools/client/framework/test/browser_toolbox_view_source_03.js": 4458, - "devtools/client/framework/test/browser_toolbox_view_source_04.js": 4362, - "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 17448, - "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 7518, - "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 8289, - "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 5581, - "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_displayed.js": 7724, - "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_for_delayed_starttime_animations.js": 6036, - "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_path.js": 4763, - "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_progress_indicator.js": 5945, - "devtools/client/inspector/animation-old/test/browser_animation_click_selects_animation.js": 6788, - "devtools/client/inspector/animation-old/test/browser_animation_controller_exposes_document_currentTime.js": 7357, - "devtools/client/inspector/animation-old/test/browser_animation_detail_displayed.js": 5715, - "devtools/client/inspector/animation-old/test/browser_animation_empty_on_invalid_nodes.js": 8005, - "devtools/client/inspector/animation-old/test/browser_animation_keyframe_click_to_set_time.js": 6897, - "devtools/client/inspector/animation-old/test/browser_animation_keyframe_markers.js": 5533, - "devtools/client/inspector/animation-old/test/browser_animation_mutations_with_same_names.js": 4216, - "devtools/client/inspector/animation-old/test/browser_animation_participate_in_inspector_update.js": 6660, - "devtools/client/inspector/animation-old/test/browser_animation_playerFronts_are_refreshed.js": 7225, - "devtools/client/inspector/animation-old/test/browser_animation_playerWidgets_appear_on_panel_init.js": 4172, - "devtools/client/inspector/animation-old/test/browser_animation_playerWidgets_target_nodes.js": 6783, - "devtools/client/inspector/animation-old/test/browser_animation_pseudo_elements.js": 7457, - "devtools/client/inspector/animation-old/test/browser_animation_refresh_on_added_animation.js": 6898, - "devtools/client/inspector/animation-old/test/browser_animation_refresh_on_removed_animation.js": 5848, - "devtools/client/inspector/animation-old/test/browser_animation_refresh_when_active.js": 7633, - "devtools/client/inspector/animation-old/test/browser_animation_running_on_compositor.js": 7633, - "devtools/client/inspector/animation-old/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 6679, - "devtools/client/inspector/animation-old/test/browser_animation_shows_player_on_valid_node.js": 6281, - "devtools/client/inspector/animation-old/test/browser_animation_spacebar_toggles_animations.js": 6640, - "devtools/client/inspector/animation-old/test/browser_animation_spacebar_toggles_node_animations.js": 9149, - "devtools/client/inspector/animation-old/test/browser_animation_summarygraph_for_multiple_easings.js": 4155, - "devtools/client/inspector/animation-old/test/browser_animation_target_highlight_select.js": 9027, - "devtools/client/inspector/animation-old/test/browser_animation_target_highlighter_lock.js": 6835, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_currentTime.js": 9465, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_header.js": 5782, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_iterationStart.js": 4077, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_pause_button_01.js": 9881, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_pause_button_02.js": 9686, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_pause_button_03.js": 14425, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_rate_selector.js": 13016, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_rewind_button.js": 12155, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_scrubber_exists.js": 5786, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_scrubber_movable.js": 5949, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_scrubber_moves.js": 7929, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_setCurrentTime.js": 6432, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_short_duration.js": 3816, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_delay.js": 7551, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_endDelay.js": 5156, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_iterations.js": 7247, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_name_label.js": 7004, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_time_info.js": 6168, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_takes_rate_into_account.js": 3730, - "devtools/client/inspector/animation-old/test/browser_animation_timeline_ui.js": 6088, - "devtools/client/inspector/animation-old/test/browser_animation_toggle_button_resets_on_navigate.js": 8616, - "devtools/client/inspector/animation-old/test/browser_animation_toggle_button_toggles_animations.js": 6542, - "devtools/client/inspector/animation-old/test/browser_animation_toolbar_exists.js": 6439, - "devtools/client/inspector/animation-old/test/browser_animation_ui_updates_when_animation_data_changes.js": 8531, - "devtools/client/inspector/boxmodel/test/browser_boxmodel.js": 7500, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_computed-accordion-state.js": 7453, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel.js": 10137, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_bluronclick.js": 4964, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_border.js": 6025, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_pseudo.js": 5360, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_stylerules.js": 7790, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_guides.js": 4925, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_layout-accordion-state.js": 7854, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js": 5406, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_offsetparent.js": 5970, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_positions.js": 4785, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_properties.js": 4760, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_pseudo-element.js": 4530, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_rotate-labels-on-sides.js": 4608, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_sync.js": 5227, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-navigation.js": 9877, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-reload.js": 7538, - "devtools/client/inspector/components/test/browser_boxmodel.js": 8687, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 10773, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5149, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6278, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 8336, - "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 4912, - "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 4896, - "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 6243, - "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 5837, - "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 10440, - "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8010, - "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 7753, - "devtools/client/inspector/computed/test/browser_computed_cycle_color.js": 4269, - "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 4222, - "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 4528, - "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 4578, - "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 4449, - "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 4916, - "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 4239, - "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 4597, - "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 4761, - "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 6254, - "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 5396, - "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 4430, - "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 6788, - "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6436, - "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 8306, - "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 5295, - "devtools/client/inspector/fonts/test/browser_fontinspector.js": 6571, - "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 4505, - "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 4739, - "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 4390, - "devtools/client/inspector/grids/test/browser_grids_accordion-state.js": 9374, - "devtools/client/inspector/grids/test/browser_grids_color-in-rules-grid-toggle.js": 4645, - "devtools/client/inspector/grids/test/browser_grids_display-setting-extend-grid-lines.js": 3872, - "devtools/client/inspector/grids/test/browser_grids_display-setting-show-grid-areas.js": 4154, - "devtools/client/inspector/grids/test/browser_grids_display-setting-show-grid-line-numbers.js": 3932, - "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-ESC.js": 4095, - "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-RETURN.js": 3916, - "devtools/client/inspector/grids/test/browser_grids_grid-list-element-rep.js": 4174, - "devtools/client/inspector/grids/test/browser_grids_grid-list-no-grids.js": 3906, - "devtools/client/inspector/grids/test/browser_grids_grid-list-on-iframe-reloaded.js": 5439, - "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-added.js": 5082, - "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-removed.js": 4902, - "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-multiple-grids.js": 4852, - "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-single-grid.js": 4519, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-cannot-show-outline.js": 4674, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-area.js": 4778, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-cell.js": 4718, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-selected-grid.js": 4199, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-updates-on-grid-change.js": 4572, - "devtools/client/inspector/grids/test/browser_grids_highlighter-setting-rules-grid-toggle.js": 4327, - "devtools/client/inspector/grids/test/browser_grids_number-of-css-grids-telemetry.js": 4820, - "devtools/client/inspector/grids/test/browser_grids_restored-after-reload.js": 7256, - "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 5702, - "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 7558, - "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation_after_edit.js": 4067, - "devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js": 4080, - "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 4320, - "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 3931, - "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 5734, - "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 7196, - "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 5268, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 8452, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 9722, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 3683, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_dragRootNode.js": 3949, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_draggable.js": 3744, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_invalidNodes.js": 3829, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 7424, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js": 3613, - "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 11589, - "devtools/client/inspector/markup/test/browser_markup_events1.js": 9734, - "devtools/client/inspector/markup/test/browser_markup_events2.js": 11281, - "devtools/client/inspector/markup/test/browser_markup_events3.js": 12275, - "devtools/client/inspector/markup/test/browser_markup_events_01.js": 6776, - "devtools/client/inspector/markup/test/browser_markup_events_02.js": 8267, - "devtools/client/inspector/markup/test/browser_markup_events_03.js": 7466, - "devtools/client/inspector/markup/test/browser_markup_events_04.js": 8638, - "devtools/client/inspector/markup/test/browser_markup_events_click_to_close.js": 4472, - "devtools/client/inspector/markup/test/browser_markup_events_form.js": 4864, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 7471, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 7643, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 7715, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 6882, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 10036, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 9392, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 10709, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 10108, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 8658, - "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1.js": 9277, - "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1_jsx.js": 10500, - "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1.js": 8153, - "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1_jsx.js": 8318, - "devtools/client/inspector/markup/test/browser_markup_events_source_map.js": 6672, - "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 12005, - "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 9615, - "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 6963, - "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 4314, - "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 3854, - "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 3609, - "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 5530, - "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 6754, - "devtools/client/inspector/markup/test/browser_markup_keybindings_scrolltonode.js": 3801, - "devtools/client/inspector/markup/test/browser_markup_links_01.js": 5727, - "devtools/client/inspector/markup/test/browser_markup_links_02.js": 3907, - "devtools/client/inspector/markup/test/browser_markup_links_03.js": 3741, - "devtools/client/inspector/markup/test/browser_markup_links_05.js": 4939, - "devtools/client/inspector/markup/test/browser_markup_links_06.js": 7434, - "devtools/client/inspector/markup/test/browser_markup_links_07.js": 5782, - "devtools/client/inspector/markup/test/browser_markup_load_01.js": 5999, - "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 5942, - "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 4240, - "devtools/client/inspector/markup/test/browser_markup_navigation.js": 8587, - "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_01.js": 3603, - "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 5821, - "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 4407, - "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 6136, - "devtools/client/inspector/markup/test/browser_markup_search_01.js": 8035, - "devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js": 5872, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 6073, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 3603, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_03.js": 3826, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 10740, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 10258, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 4865, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 5390, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 5560, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 4937, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 4027, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_10.js": 3563, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_12.js": 3870, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_long-classname.js": 3657, - "devtools/client/inspector/markup/test/browser_markup_textcontent_display.js": 3692, - "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 5813, - "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 4566, - "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 4883, - "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 4779, - "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 4636, - "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 4244, - "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 3942, - "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 5483, - "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_01.js": 4019, - "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_02.js": 3646, - "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 3766, - "devtools/client/inspector/rules/test/browser_rules_add-property-commented.js": 3621, - "devtools/client/inspector/rules/test/browser_rules_add-property-svg.js": 4234, - "devtools/client/inspector/rules/test/browser_rules_add-property_01.js": 4014, - "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 4067, - "devtools/client/inspector/rules/test/browser_rules_add-rule-and-property.js": 3611, - "devtools/client/inspector/rules/test/browser_rules_add-rule-button-state.js": 3924, - "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 4032, - "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 4984, - "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 4570, - "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 6510, - "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 4308, - "devtools/client/inspector/rules/test/browser_rules_add-rule-with-menu.js": 3736, - "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 5754, - "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 5356, - "devtools/client/inspector/rules/test/browser_rules_blob_stylesheet.js": 3562, - "devtools/client/inspector/rules/test/browser_rules_class_panel_add.js": 4962, - "devtools/client/inspector/rules/test/browser_rules_class_panel_content.js": 3938, - "devtools/client/inspector/rules/test/browser_rules_class_panel_edit.js": 3639, - "devtools/client/inspector/rules/test/browser_rules_class_panel_invalid_nodes.js": 3636, - "devtools/client/inspector/rules/test/browser_rules_class_panel_mutation.js": 3897, - "devtools/client/inspector/rules/test/browser_rules_class_panel_state_preserved.js": 3655, - "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 8353, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js": 3600, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-appears-on-swatch-click.js": 3714, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js": 3620, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 4665, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-revert-on-ESC.js": 3580, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-swatch-displayed.js": 3532, - "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 7167, - "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 7211, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 5722, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 7922, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 4183, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 4618, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 4256, - "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 4417, - "devtools/client/inspector/rules/test/browser_rules_content_01.js": 3581, - "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-01.js": 4172, - "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-02.js": 3555, - "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 6725, - "devtools/client/inspector/rules/test/browser_rules_cubicbezier-appears-on-swatch-click.js": 3889, - "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 3835, - "devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js": 3678, - "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 4094, - "devtools/client/inspector/rules/test/browser_rules_cycle-color.js": 4325, - "devtools/client/inspector/rules/test/browser_rules_edit-property-cancel.js": 3736, - "devtools/client/inspector/rules/test/browser_rules_edit-property-click.js": 3863, - "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 4494, - "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 4046, - "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 8167, - "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 5681, - "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 4126, - "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_02.js": 4001, - "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 4098, - "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 6047, - "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 5323, - "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 4142, - "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 4226, - "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 4479, - "devtools/client/inspector/rules/test/browser_rules_edit-property_07.js": 3913, - "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 3990, - "devtools/client/inspector/rules/test/browser_rules_edit-property_09.js": 3736, - "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 3561, - "devtools/client/inspector/rules/test/browser_rules_edit-selector-click.js": 3608, - "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 4742, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 4016, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 4669, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_03.js": 3777, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_04.js": 4114, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 4454, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 4281, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 3941, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 4195, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 4730, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 4008, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 4027, - "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_01.js": 3928, - "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_02.js": 3924, - "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_03.js": 3803, - "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 3978, - "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 5940, - "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 4976, - "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5192, - "devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js": 3738, - "devtools/client/inspector/rules/test/browser_rules_filtereditor-commit-on-ENTER.js": 3751, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-mutation.js": 4041, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 4608, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-reload.js": 7231, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-restored-after-reload.js": 5544, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01.js": 3580, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01b.js": 3633, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_02.js": 3816, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 4120, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_04.js": 3710, - "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 4963, - "devtools/client/inspector/rules/test/browser_rules_inherited-properties_01.js": 3720, - "devtools/client/inspector/rules/test/browser_rules_inherited-properties_03.js": 3559, - "devtools/client/inspector/rules/test/browser_rules_inline-source-map.js": 3785, - "devtools/client/inspector/rules/test/browser_rules_invalid-source-map.js": 3770, - "devtools/client/inspector/rules/test/browser_rules_keybindings.js": 4324, - "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 4040, - "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 4001, - "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 3698, - "devtools/client/inspector/rules/test/browser_rules_lineNumbers.js": 4225, - "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 5167, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 4205, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_02.js": 3555, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_04.js": 3595, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 4000, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 4001, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_07.js": 3696, - "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 3995, - "devtools/client/inspector/rules/test/browser_rules_media-queries.js": 3693, - "devtools/client/inspector/rules/test/browser_rules_multiple-properties-duplicates.js": 4201, - "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 3873, - "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_01.js": 4086, - "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 4033, - "devtools/client/inspector/rules/test/browser_rules_multiple_properties_01.js": 3920, - "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 3911, - "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 5130, - "devtools/client/inspector/rules/test/browser_rules_original-source-link2.js": 5168, - "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 6701, - "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 4390, - "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 5169, - "devtools/client/inspector/rules/test/browser_rules_refresh-no-flicker.js": 3596, - "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_01.js": 3739, - "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 4407, - "devtools/client/inspector/rules/test/browser_rules_refresh-on-style-change.js": 3645, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 4876, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 4054, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_03.js": 3823, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 4046, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_expander.js": 3867, - "devtools/client/inspector/rules/test/browser_rules_search-filter-overridden-property.js": 3794, - "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 4922, - "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 3657, - "devtools/client/inspector/rules/test/browser_rules_search-filter_03.js": 3732, - "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 3981, - "devtools/client/inspector/rules/test/browser_rules_search-filter_05.js": 4234, - "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 4050, - "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 4176, - "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 4097, - "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 4162, - "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 4229, - "devtools/client/inspector/rules/test/browser_rules_search-filter_escape-keypress.js": 3872, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 4326, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 3790, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_03.js": 3978, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_04.js": 3581, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_05.js": 3584, - "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 5091, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_01.js": 3695, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_02.js": 3606, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_03.js": 4088, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_04.js": 4014, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_05.js": 3866, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_06.js": 4077, - "devtools/client/inspector/rules/test/browser_rules_shorthand-overridden-lists.js": 3640, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 5498, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 5587, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 4206, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_03.js": 3700, - "devtools/client/inspector/rules/test/browser_rules_url-click-opens-new-tab.js": 3803, - "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 4511, - "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 4337, - "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 16061, - "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 5565, - "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 13139, - "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 4492, - "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 3851, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 5575, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 4961, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 4912, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 3832, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js": 3739, - "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 4053, - "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 4252, - "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-03.js": 3576, - "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-04.js": 3605, - "devtools/client/inspector/test/browser_inspector_addNode_01.js": 5536, - "devtools/client/inspector/test/browser_inspector_addNode_02.js": 4614, - "devtools/client/inspector/test/browser_inspector_addNode_03.js": 3965, - "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 7164, - "devtools/client/inspector/test/browser_inspector_breadcrumbs_highlight_hover.js": 3818, - "devtools/client/inspector/test/browser_inspector_breadcrumbs_keybinding.js": 4064, - "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 5804, - "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 4651, - "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 5036, - "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 10492, - "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 4379, - "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 4406, - "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 3897, - "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 6065, - "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 4060, - "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 8115, - "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 4585, - "devtools/client/inspector/test/browser_inspector_highlighter-05.js": 6206, - "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 5943, - "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 5512, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_01.js": 4139, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_02.js": 3936, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_03.js": 4413, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_04.js": 5865, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_05.js": 4826, - "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4019, - "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 4727, - "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-csp.js": 3544, - "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js": 4127, - "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js": 4150, - "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 4991, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js": 3854, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 3961, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_03.js": 3632, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 4644, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 4917, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 5392, - "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 4642, - "devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js": 3537, - "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 5547, - "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 4736, - "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 5562, - "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 13375, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 5056, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 4709, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 3816, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 3957, - "devtools/client/inspector/test/browser_inspector_highlighter-measure_02.js": 3707, - "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 4514, - "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 6517, - "devtools/client/inspector/test/browser_inspector_highlighter-rect_01.js": 4735, - "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 4146, - "devtools/client/inspector/test/browser_inspector_highlighter-rulers_02.js": 3534, - "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 3959, - "devtools/client/inspector/test/browser_inspector_highlighter-selector_02.js": 3542, - "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 3933, - "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 5110, - "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 3530, - "devtools/client/inspector/test/browser_inspector_infobar_01.js": 9500, - "devtools/client/inspector/test/browser_inspector_infobar_02.js": 4920, - "devtools/client/inspector/test/browser_inspector_infobar_03.js": 4535, - "devtools/client/inspector/test/browser_inspector_infobar_04.js": 5736, - "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 6844, - "devtools/client/inspector/test/browser_inspector_inspect_node_contextmenu.js": 4581, - "devtools/client/inspector/test/browser_inspector_invalidate.js": 4226, - "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 9800, - "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 4561, - "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 4173, - "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 7817, - "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 9272, - "devtools/client/inspector/test/browser_inspector_navigation.js": 10497, - "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 5152, - "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 4249, - "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 4155, - "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 4468, - "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 6475, - "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 6832, - "devtools/client/inspector/test/browser_inspector_reload-01.js": 3854, - "devtools/client/inspector/test/browser_inspector_reload-02.js": 4292, - "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 4302, - "devtools/client/inspector/test/browser_inspector_search-01.js": 8346, - "devtools/client/inspector/test/browser_inspector_search-02.js": 5615, - "devtools/client/inspector/test/browser_inspector_search-03.js": 5170, - "devtools/client/inspector/test/browser_inspector_search-04.js": 4088, - "devtools/client/inspector/test/browser_inspector_search-05.js": 10572, - "devtools/client/inspector/test/browser_inspector_search-06.js": 6637, - "devtools/client/inspector/test/browser_inspector_search-07.js": 3595, - "devtools/client/inspector/test/browser_inspector_search-label.js": 4643, - "devtools/client/inspector/test/browser_inspector_search-navigation.js": 4923, - "devtools/client/inspector/test/browser_inspector_search-reserved.js": 4611, - "devtools/client/inspector/test/browser_inspector_search-selection.js": 9848, - "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 5678, - "devtools/client/inspector/test/browser_inspector_search-suggests-ids-and-classes.js": 4077, - "devtools/client/inspector/test/browser_inspector_search_keyboard_trap.js": 3814, - "devtools/client/inspector/test/browser_inspector_select-docshell.js": 4275, - "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 11227, - "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 7007, - "devtools/client/inspector/test/browser_inspector_startup.js": 4933, - "devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js": 3864, - "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 5238, - "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 4375, - "devtools/client/memory/test/browser/browser_memory_diff_01.js": 4372, - "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 12693, - "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 4417, - "devtools/client/memory/test/browser/browser_memory_filter_01.js": 4394, - "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 5529, - "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 5282, - "devtools/client/memory/test/browser/browser_memory_keyboard.js": 3707, - "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 5101, - "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 12490, - "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 12148, - "devtools/client/netmonitor/test/browser_net_api-calls.js": 5047, - "devtools/client/netmonitor/test/browser_net_autoscroll.js": 14300, - "devtools/client/netmonitor/test/browser_net_brotli.js": 5590, - "devtools/client/netmonitor/test/browser_net_cached-status.js": 4931, - "devtools/client/netmonitor/test/browser_net_cause.js": 6361, - "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 4761, - "devtools/client/netmonitor/test/browser_net_cause_source_map.js": 5425, - "devtools/client/netmonitor/test/browser_net_clear.js": 3846, - "devtools/client/netmonitor/test/browser_net_columns_last_column.js": 4068, - "devtools/client/netmonitor/test/browser_net_columns_showhide.js": 5393, - "devtools/client/netmonitor/test/browser_net_complex-params.js": 8947, - "devtools/client/netmonitor/test/browser_net_content-type.js": 8875, - "devtools/client/netmonitor/test/browser_net_cors_requests.js": 4958, - "devtools/client/netmonitor/test/browser_net_curl-utils.js": 5084, - "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 4486, - "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 4667, - "devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js": 5257, - "devtools/client/netmonitor/test/browser_net_filter-01.js": 11032, - "devtools/client/netmonitor/test/browser_net_filter-02.js": 12983, - "devtools/client/netmonitor/test/browser_net_filter-03.js": 10594, - "devtools/client/netmonitor/test/browser_net_filter-04.js": 6255, - "devtools/client/netmonitor/test/browser_net_filter-autocomplete.js": 7367, - "devtools/client/netmonitor/test/browser_net_filter-flags.js": 12792, - "devtools/client/netmonitor/test/browser_net_footer-summary.js": 11293, - "devtools/client/netmonitor/test/browser_net_frame.js": 9392, - "devtools/client/netmonitor/test/browser_net_header-docs.js": 4467, - "devtools/client/netmonitor/test/browser_net_html-preview.js": 4829, - "devtools/client/netmonitor/test/browser_net_icon-preview.js": 7404, - "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 6206, - "devtools/client/netmonitor/test/browser_net_json-b64.js": 4430, - "devtools/client/netmonitor/test/browser_net_json-long.js": 32915, - "devtools/client/netmonitor/test/browser_net_json-malformed.js": 4786, - "devtools/client/netmonitor/test/browser_net_json-null.js": 4498, - "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 4497, - "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 4427, - "devtools/client/netmonitor/test/browser_net_jsonp.js": 5120, - "devtools/client/netmonitor/test/browser_net_large-response.js": 5466, - "devtools/client/netmonitor/test/browser_net_open_in_debugger.js": 8313, - "devtools/client/netmonitor/test/browser_net_open_in_style_editor.js": 8743, - "devtools/client/netmonitor/test/browser_net_open_request_in_tab.js": 4042, - "devtools/client/netmonitor/test/browser_net_pane-collapse.js": 4536, - "devtools/client/netmonitor/test/browser_net_pane-toggle.js": 3736, - "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 5779, - "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5353, - "devtools/client/netmonitor/test/browser_net_post-data-02.js": 4409, - "devtools/client/netmonitor/test/browser_net_post-data-03.js": 4391, - "devtools/client/netmonitor/test/browser_net_post-data-04.js": 4221, - "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 31616, - "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5081, - "devtools/client/netmonitor/test/browser_net_reload-button.js": 4356, - "devtools/client/netmonitor/test/browser_net_reload-markers.js": 4124, - "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 6208, - "devtools/client/netmonitor/test/browser_net_resend.js": 6610, - "devtools/client/netmonitor/test/browser_net_resend_cors.js": 5807, - "devtools/client/netmonitor/test/browser_net_resend_headers.js": 4039, - "devtools/client/netmonitor/test/browser_net_security-details.js": 4406, - "devtools/client/netmonitor/test/browser_net_security-error.js": 4111, - "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5086, - "devtools/client/netmonitor/test/browser_net_security-redirect.js": 4453, - "devtools/client/netmonitor/test/browser_net_security-state.js": 5665, - "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 4642, - "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 5664, - "devtools/client/netmonitor/test/browser_net_security-warnings.js": 4688, - "devtools/client/netmonitor/test/browser_net_send-beacon-other-tab.js": 4306, - "devtools/client/netmonitor/test/browser_net_send-beacon.js": 3756, - "devtools/client/netmonitor/test/browser_net_simple-request-data.js": 4076, - "devtools/client/netmonitor/test/browser_net_simple-request.js": 4806, - "devtools/client/netmonitor/test/browser_net_sort-01.js": 11103, - "devtools/client/netmonitor/test/browser_net_sort-02.js": 9513, - "devtools/client/netmonitor/test/browser_net_sort-03.js": 10463, - "devtools/client/netmonitor/test/browser_net_statistics-01.js": 7278, - "devtools/client/netmonitor/test/browser_net_statistics-02.js": 4499, - "devtools/client/netmonitor/test/browser_net_status-codes.js": 6389, - "devtools/client/netmonitor/test/browser_net_streaming-response.js": 5701, - "devtools/client/netmonitor/test/browser_net_throttle.js": 9461, - "devtools/client/netmonitor/test/browser_net_thumbnail-click.js": 5404, - "devtools/client/netmonitor/test/browser_net_timing-division.js": 7122, - "devtools/client/netmonitor/test/browser_net_truncate.js": 11425, - "devtools/client/netmonitor/test/browser_net_waterfall-click.js": 5107, - "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 3798, - "devtools/client/performance/test/browser_perf-button-states.js": 3520, - "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 3524, - "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 3922, - "devtools/client/performance/test/browser_perf-console-record-02.js": 5040, - "devtools/client/performance/test/browser_perf-console-record-04.js": 4225, - "devtools/client/performance/test/browser_perf-console-record-05.js": 4568, - "devtools/client/performance/test/browser_perf-console-record-06.js": 5853, - "devtools/client/performance/test/browser_perf-console-record-07.js": 6446, - "devtools/client/performance/test/browser_perf-console-record-08.js": 9379, - "devtools/client/performance/test/browser_perf-console-record-09.js": 4551, - "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 3967, - "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 3698, - "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 3555, - "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 3621, - "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 3522, - "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 3546, - "devtools/client/performance/test/browser_perf-highlighted.js": 3807, - "devtools/client/performance/test/browser_perf-loading-02.js": 3740, - "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 3629, - "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 3613, - "devtools/client/performance/test/browser_perf-overview-render-01.js": 3715, - "devtools/client/performance/test/browser_perf-overview-render-02.js": 3887, - "devtools/client/performance/test/browser_perf-overview-render-04.js": 3719, - "devtools/client/performance/test/browser_perf-overview-selection-02.js": 3647, - "devtools/client/performance/test/browser_perf-recording-notices-02.js": 3688, - "devtools/client/performance/test/browser_perf-recording-notices-03.js": 4809, - "devtools/client/performance/test/browser_perf-recording-selected-01.js": 4097, - "devtools/client/performance/test/browser_perf-recording-selected-02.js": 3976, - "devtools/client/performance/test/browser_perf-recording-selected-03.js": 4056, - "devtools/client/performance/test/browser_perf-recording-selected-04.js": 4990, - "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 3787, - "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 4532, - "devtools/client/performance/test/browser_perf-telemetry-01.js": 3959, - "devtools/client/performance/test/browser_timeline-waterfall-background.js": 4017, - "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 4240, - "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 4299, - "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 4965, - "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 6040, - "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 5946, - "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 4816, - "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 4600, - "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_02.js": 3895, - "devtools/client/responsive.html/test/browser/browser_device_change.js": 3727, - "devtools/client/responsive.html/test/browser/browser_device_custom.js": 4458, - "devtools/client/responsive.html/test/browser/browser_device_modal_submit.js": 4384, - "devtools/client/responsive.html/test/browser/browser_exit_button.js": 6731, - "devtools/client/responsive.html/test/browser/browser_frame_script_active.js": 4307, - "devtools/client/responsive.html/test/browser/browser_hide_container.js": 5954, - "devtools/client/responsive.html/test/browser/browser_resize_cmd.js": 8457, - "devtools/client/responsive.html/test/browser/browser_toolbox_computed_view.js": 7938, - "devtools/client/responsive.html/test/browser/browser_toolbox_rule_view.js": 5761, - "devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js": 8137, - "devtools/client/responsivedesign/test/browser_responsive_cmd.js": 4247, - "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 4208, - "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 5533, - "devtools/client/scratchpad/test/browser_scratchpad_restore.js": 3578, - "devtools/client/scratchpad/test/browser_scratchpad_wrong_window_focus.js": 3807, - "devtools/client/shared/test/browser_html_tooltip-01.js": 4027, - "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 5610, - "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 6338, - "devtools/client/shared/test/browser_telemetry_sidebar.js": 8463, - "devtools/client/shared/test/browser_telemetry_toolbox.js": 8455, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_canvasdebugger.js": 3573, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 5534, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 5675, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 4270, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 4626, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 5075, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 3852, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js": 4088, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 4427, - "devtools/client/sourceeditor/test/browser_codemirror.js": 4764, - "devtools/client/sourceeditor/test/browser_vimemacs.js": 31688, - "devtools/client/storage/test/browser_storage_basic.js": 7188, - "devtools/client/storage/test/browser_storage_basic_usercontextid_1.js": 4958, - "devtools/client/storage/test/browser_storage_basic_usercontextid_2.js": 4889, - "devtools/client/storage/test/browser_storage_basic_with_fragment.js": 5053, - "devtools/client/storage/test/browser_storage_cache_delete.js": 3929, - "devtools/client/storage/test/browser_storage_cookies_add.js": 4323, - "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 4568, - "devtools/client/storage/test/browser_storage_cookies_edit.js": 5202, - "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 4634, - "devtools/client/storage/test/browser_storage_delete.js": 5518, - "devtools/client/storage/test/browser_storage_delete_all.js": 5456, - "devtools/client/storage/test/browser_storage_delete_tree.js": 5138, - "devtools/client/storage/test/browser_storage_delete_usercontextid.js": 10166, - "devtools/client/storage/test/browser_storage_dom_cache_disabled.js": 4388, - "devtools/client/storage/test/browser_storage_dynamic_updates.js": 6442, - "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 4594, - "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 3854, - "devtools/client/storage/test/browser_storage_localstorage_add.js": 4015, - "devtools/client/storage/test/browser_storage_localstorage_edit.js": 4477, - "devtools/client/storage/test/browser_storage_overflow.js": 8178, - "devtools/client/storage/test/browser_storage_sessionstorage_add.js": 4593, - "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5124, - "devtools/client/storage/test/browser_storage_sidebar.js": 6866, - "devtools/client/storage/test/browser_storage_sidebar_toggle.js": 4093, - "devtools/client/storage/test/browser_storage_values.js": 6707, - "devtools/client/styleeditor/test/browser_styleeditor_autocomplete-disabled.js": 4436, - "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 4280, - "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 6238, - "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 3917, - "devtools/client/styleeditor/test/browser_styleeditor_loading.js": 3908, - "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js": 3791, - "devtools/client/styleeditor/test/browser_styleeditor_navigate.js": 3775, - "devtools/client/styleeditor/test/browser_styleeditor_new.js": 3953, - "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 6516, - "devtools/client/styleeditor/test/browser_styleeditor_reload.js": 3702, - "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 7300, - "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 5904, - "devtools/client/styleeditor/test/browser_styleeditor_sync.js": 9523, - "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 4726, - "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 5026, - "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 4663, - "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 4931, - "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 6679, - "devtools/client/styleeditor/test/browser_styleeditor_transition_rule.js": 4269, - "devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js": 3537, - "devtools/client/webconsole/net/test/mochitest/browser_net_basic.js": 3836, - "devtools/client/webconsole/net/test/mochitest/browser_net_params.js": 4263, - "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 6898, - "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 6123, - "devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/browser_webconsole_check_stubs_console_api.js": 5892, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_inspect.js": 4413, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 6416, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 5265, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters_persist.js": 7767, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_debugger_link.js": 5592, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_scratchpad_link.js": 4971, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_styleeditor_link.js": 4469, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_click.js": 3871, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_nodes_select.js": 5570, + "Main app process exited normally": 464459, + "browser/base/content/test/static/browser_all_files_referenced.js": 4755, + "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 10703, + "devtools/client/aboutdebugging/test/browser_addons_debug_info.js": 6509, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 20926, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 19517, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 17886, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 18958, + "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 5614, + "devtools/client/aboutdebugging/test/browser_addons_install.js": 4482, + "devtools/client/aboutdebugging/test/browser_addons_reload.js": 4785, + "devtools/client/aboutdebugging/test/browser_addons_remove.js": 4510, + "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 5357, + "devtools/client/aboutdebugging/test/browser_service_workers_status.js": 5267, + "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 4584, + "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 4191, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 7303, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 7881, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 5276, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-reloading.js": 7538, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 10182, + "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 9493, + "devtools/client/debugger/new/test/mochitest/browser_dbg-console.js": 4155, + "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 9855, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 5728, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 5959, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 6946, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 10780, + "devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js": 7688, + "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 7488, + "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 11012, + "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 7356, + "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 7409, + "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 8390, + "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js": 8656, + "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 6767, + "devtools/client/debugger/new/test/mochitest/browser_dbg-search-file.js": 5707, + "devtools/client/debugger/new/test/mochitest/browser_dbg-search-project.js": 5490, + "devtools/client/debugger/new/test/mochitest/browser_dbg-search-sources.js": 4359, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 5731, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reloading.js": 7493, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 12821, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js": 6064, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 8745, + "devtools/client/debugger/new/test/mochitest/browser_dbg-tabs.js": 13022, + "devtools/client/debugger/new/test/mochitest/browser_dbg-toggling-tools.js": 5105, + "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 5173, + "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard_navigation.js": 4535, + "devtools/client/debugger/test/mochitest/browser_dbg_addon-panels.js": 4824, + "devtools/client/debugger/test/mochitest/browser_dbg_addon-sources.js": 4421, + "devtools/client/debugger/test/mochitest/browser_dbg_addon-workers-dbg-enabled.js": 4600, + "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 5839, + "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4084, + "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-03.js": 3662, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-01.js": 3722, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 4330, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 4413, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 4450, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-05.js": 4019, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 4318, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-07.js": 3543, + "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 4520, + "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 3827, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 6034, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 3826, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 3989, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 4204, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 5570, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 4333, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 4670, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 4596, + "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 3959, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 4106, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 4851, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4010, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-02.js": 3867, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 4293, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 12337, + "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 3520, + "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 6495, + "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js": 3543, + "devtools/client/debugger/test/mochitest/browser_dbg_post-page.js": 4653, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 4566, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-eval-02.js": 3669, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js": 3710, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 4276, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 4936, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 4011, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 4302, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 4239, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 13221, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 5677, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 6571, + "devtools/client/dom/test/browser_dom_array.js": 10408, + "devtools/client/dom/test/browser_dom_basic.js": 8536, + "devtools/client/dom/test/browser_dom_refresh.js": 10131, + "devtools/client/framework/test/browser_browser_toolbox.js": 13551, + "devtools/client/framework/test/browser_browser_toolbox_debugger.js": 12184, + "devtools/client/framework/test/browser_ignore_toolbox_network_requests.js": 3622, + "devtools/client/framework/test/browser_keybindings_01.js": 5700, + "devtools/client/framework/test/browser_keybindings_02.js": 4729, + "devtools/client/framework/test/browser_new_activation_workflow.js": 5970, + "devtools/client/framework/test/browser_source_map-inline.js": 3595, + "devtools/client/framework/test/browser_source_map-reload.js": 3710, + "devtools/client/framework/test/browser_toolbox_highlight.js": 3746, + "devtools/client/framework/test/browser_toolbox_hosts.js": 10291, + "devtools/client/framework/test/browser_toolbox_hosts_size.js": 7074, + "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 3935, + "devtools/client/framework/test/browser_toolbox_options.js": 8206, + "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 5046, + "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 7747, + "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 10903, + "devtools/client/framework/test/browser_toolbox_races.js": 6045, + "devtools/client/framework/test/browser_toolbox_raise.js": 5437, + "devtools/client/framework/test/browser_toolbox_remoteness_change.js": 3878, + "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 3754, + "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 11146, + "devtools/client/framework/test/browser_toolbox_target.js": 3981, + "devtools/client/framework/test/browser_toolbox_textbox_context_menu.js": 4025, + "devtools/client/framework/test/browser_toolbox_toggle.js": 8992, + "devtools/client/framework/test/browser_toolbox_tool_ready.js": 16445, + "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 11519, + "devtools/client/framework/test/browser_toolbox_toolbar_overflow.js": 3944, + "devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js": 3941, + "devtools/client/framework/test/browser_toolbox_view_source_03.js": 4458, + "devtools/client/framework/test/browser_toolbox_view_source_04.js": 4362, + "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 17448, + "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 7518, + "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 8289, + "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 5581, + "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_displayed.js": 7724, + "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_for_delayed_starttime_animations.js": 6036, + "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_path.js": 4763, + "devtools/client/inspector/animation-old/test/browser_animation_animated_properties_progress_indicator.js": 5945, + "devtools/client/inspector/animation-old/test/browser_animation_click_selects_animation.js": 6788, + "devtools/client/inspector/animation-old/test/browser_animation_controller_exposes_document_currentTime.js": 7357, + "devtools/client/inspector/animation-old/test/browser_animation_detail_displayed.js": 5715, + "devtools/client/inspector/animation-old/test/browser_animation_empty_on_invalid_nodes.js": 8005, + "devtools/client/inspector/animation-old/test/browser_animation_keyframe_click_to_set_time.js": 6897, + "devtools/client/inspector/animation-old/test/browser_animation_keyframe_markers.js": 5533, + "devtools/client/inspector/animation-old/test/browser_animation_mutations_with_same_names.js": 4216, + "devtools/client/inspector/animation-old/test/browser_animation_participate_in_inspector_update.js": 6660, + "devtools/client/inspector/animation-old/test/browser_animation_playerFronts_are_refreshed.js": 7225, + "devtools/client/inspector/animation-old/test/browser_animation_playerWidgets_appear_on_panel_init.js": 4172, + "devtools/client/inspector/animation-old/test/browser_animation_playerWidgets_target_nodes.js": 6783, + "devtools/client/inspector/animation-old/test/browser_animation_pseudo_elements.js": 7457, + "devtools/client/inspector/animation-old/test/browser_animation_refresh_on_added_animation.js": 6898, + "devtools/client/inspector/animation-old/test/browser_animation_refresh_on_removed_animation.js": 5848, + "devtools/client/inspector/animation-old/test/browser_animation_refresh_when_active.js": 7633, + "devtools/client/inspector/animation-old/test/browser_animation_running_on_compositor.js": 7633, + "devtools/client/inspector/animation-old/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 6679, + "devtools/client/inspector/animation-old/test/browser_animation_shows_player_on_valid_node.js": 6281, + "devtools/client/inspector/animation-old/test/browser_animation_spacebar_toggles_animations.js": 6640, + "devtools/client/inspector/animation-old/test/browser_animation_spacebar_toggles_node_animations.js": 9149, + "devtools/client/inspector/animation-old/test/browser_animation_summarygraph_for_multiple_easings.js": 4155, + "devtools/client/inspector/animation-old/test/browser_animation_target_highlight_select.js": 9027, + "devtools/client/inspector/animation-old/test/browser_animation_target_highlighter_lock.js": 6835, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_currentTime.js": 9465, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_header.js": 5782, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_iterationStart.js": 4077, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_pause_button_01.js": 9881, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_pause_button_02.js": 9686, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_pause_button_03.js": 14425, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_rate_selector.js": 13016, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_rewind_button.js": 12155, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_scrubber_exists.js": 5786, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_scrubber_movable.js": 5949, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_scrubber_moves.js": 7929, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_setCurrentTime.js": 6432, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_short_duration.js": 3816, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_delay.js": 7551, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_endDelay.js": 5156, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_iterations.js": 7247, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_name_label.js": 7004, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_shows_time_info.js": 6168, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_takes_rate_into_account.js": 3730, + "devtools/client/inspector/animation-old/test/browser_animation_timeline_ui.js": 6088, + "devtools/client/inspector/animation-old/test/browser_animation_toggle_button_resets_on_navigate.js": 8616, + "devtools/client/inspector/animation-old/test/browser_animation_toggle_button_toggles_animations.js": 6542, + "devtools/client/inspector/animation-old/test/browser_animation_toolbar_exists.js": 6439, + "devtools/client/inspector/animation-old/test/browser_animation_ui_updates_when_animation_data_changes.js": 8531, + "devtools/client/inspector/boxmodel/test/browser_boxmodel.js": 7500, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_computed-accordion-state.js": 7453, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel.js": 10137, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_bluronclick.js": 4964, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_border.js": 6025, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_pseudo.js": 5360, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_stylerules.js": 7790, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_guides.js": 4925, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_layout-accordion-state.js": 7854, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js": 5406, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_offsetparent.js": 5970, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_positions.js": 4785, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_properties.js": 4760, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_pseudo-element.js": 4530, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_rotate-labels-on-sides.js": 4608, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_sync.js": 5227, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-navigation.js": 9877, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-reload.js": 7538, + "devtools/client/inspector/components/test/browser_boxmodel.js": 8687, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 10773, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5149, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6278, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 8336, + "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 4912, + "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 4896, + "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 6243, + "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 5837, + "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 10440, + "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8010, + "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 7753, + "devtools/client/inspector/computed/test/browser_computed_cycle_color.js": 4269, + "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 4222, + "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 4528, + "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 4578, + "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 4449, + "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 4916, + "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 4239, + "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 4597, + "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 4761, + "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 6254, + "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 5396, + "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 4430, + "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 6788, + "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6436, + "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 8306, + "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 5295, + "devtools/client/inspector/fonts/test/browser_fontinspector.js": 6571, + "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 4505, + "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 4739, + "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 4390, + "devtools/client/inspector/grids/test/browser_grids_accordion-state.js": 9374, + "devtools/client/inspector/grids/test/browser_grids_color-in-rules-grid-toggle.js": 4645, + "devtools/client/inspector/grids/test/browser_grids_display-setting-extend-grid-lines.js": 3872, + "devtools/client/inspector/grids/test/browser_grids_display-setting-show-grid-areas.js": 4154, + "devtools/client/inspector/grids/test/browser_grids_display-setting-show-grid-line-numbers.js": 3932, + "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-ESC.js": 4095, + "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-RETURN.js": 3916, + "devtools/client/inspector/grids/test/browser_grids_grid-list-element-rep.js": 4174, + "devtools/client/inspector/grids/test/browser_grids_grid-list-no-grids.js": 3906, + "devtools/client/inspector/grids/test/browser_grids_grid-list-on-iframe-reloaded.js": 5439, + "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-added.js": 5082, + "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-removed.js": 4902, + "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-multiple-grids.js": 4852, + "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-single-grid.js": 4519, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-cannot-show-outline.js": 4674, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-area.js": 4778, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-cell.js": 4718, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-selected-grid.js": 4199, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-updates-on-grid-change.js": 4572, + "devtools/client/inspector/grids/test/browser_grids_highlighter-setting-rules-grid-toggle.js": 4327, + "devtools/client/inspector/grids/test/browser_grids_number-of-css-grids-telemetry.js": 4820, + "devtools/client/inspector/grids/test/browser_grids_restored-after-reload.js": 7256, + "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 5702, + "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 7558, + "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation_after_edit.js": 4067, + "devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js": 4080, + "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 4320, + "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 3931, + "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 5734, + "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 7196, + "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 5268, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 8452, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 9722, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 3683, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_dragRootNode.js": 3949, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_draggable.js": 3744, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_invalidNodes.js": 3829, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 7424, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js": 3613, + "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 11589, + "devtools/client/inspector/markup/test/browser_markup_events1.js": 9734, + "devtools/client/inspector/markup/test/browser_markup_events2.js": 11281, + "devtools/client/inspector/markup/test/browser_markup_events3.js": 12275, + "devtools/client/inspector/markup/test/browser_markup_events_01.js": 6776, + "devtools/client/inspector/markup/test/browser_markup_events_02.js": 8267, + "devtools/client/inspector/markup/test/browser_markup_events_03.js": 7466, + "devtools/client/inspector/markup/test/browser_markup_events_04.js": 8638, + "devtools/client/inspector/markup/test/browser_markup_events_click_to_close.js": 4472, + "devtools/client/inspector/markup/test/browser_markup_events_form.js": 4864, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 7471, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 7643, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 7715, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 6882, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 10036, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 9392, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 10709, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 10108, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 8658, + "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1.js": 9277, + "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1_jsx.js": 10500, + "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1.js": 8153, + "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1_jsx.js": 8318, + "devtools/client/inspector/markup/test/browser_markup_events_source_map.js": 6672, + "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 12005, + "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 9615, + "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 6963, + "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 4314, + "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 3854, + "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 3609, + "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 5530, + "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 6754, + "devtools/client/inspector/markup/test/browser_markup_keybindings_scrolltonode.js": 3801, + "devtools/client/inspector/markup/test/browser_markup_links_01.js": 5727, + "devtools/client/inspector/markup/test/browser_markup_links_02.js": 3907, + "devtools/client/inspector/markup/test/browser_markup_links_03.js": 3741, + "devtools/client/inspector/markup/test/browser_markup_links_05.js": 4939, + "devtools/client/inspector/markup/test/browser_markup_links_06.js": 7434, + "devtools/client/inspector/markup/test/browser_markup_links_07.js": 5782, + "devtools/client/inspector/markup/test/browser_markup_load_01.js": 5999, + "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 5942, + "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 4240, + "devtools/client/inspector/markup/test/browser_markup_navigation.js": 8587, + "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_01.js": 3603, + "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 5821, + "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 4407, + "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 6136, + "devtools/client/inspector/markup/test/browser_markup_search_01.js": 8035, + "devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js": 5872, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 6073, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 3603, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_03.js": 3826, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 10740, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 10258, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 4865, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 5390, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 5560, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 4937, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 4027, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_10.js": 3563, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_12.js": 3870, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_long-classname.js": 3657, + "devtools/client/inspector/markup/test/browser_markup_textcontent_display.js": 3692, + "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 5813, + "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 4566, + "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 4883, + "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 4779, + "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 4636, + "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 4244, + "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 3942, + "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 5483, + "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_01.js": 4019, + "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_02.js": 3646, + "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 3766, + "devtools/client/inspector/rules/test/browser_rules_add-property-commented.js": 3621, + "devtools/client/inspector/rules/test/browser_rules_add-property-svg.js": 4234, + "devtools/client/inspector/rules/test/browser_rules_add-property_01.js": 4014, + "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 4067, + "devtools/client/inspector/rules/test/browser_rules_add-rule-and-property.js": 3611, + "devtools/client/inspector/rules/test/browser_rules_add-rule-button-state.js": 3924, + "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 4032, + "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 4984, + "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 4570, + "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 6510, + "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 4308, + "devtools/client/inspector/rules/test/browser_rules_add-rule-with-menu.js": 3736, + "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 5754, + "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 5356, + "devtools/client/inspector/rules/test/browser_rules_blob_stylesheet.js": 3562, + "devtools/client/inspector/rules/test/browser_rules_class_panel_add.js": 4962, + "devtools/client/inspector/rules/test/browser_rules_class_panel_content.js": 3938, + "devtools/client/inspector/rules/test/browser_rules_class_panel_edit.js": 3639, + "devtools/client/inspector/rules/test/browser_rules_class_panel_invalid_nodes.js": 3636, + "devtools/client/inspector/rules/test/browser_rules_class_panel_mutation.js": 3897, + "devtools/client/inspector/rules/test/browser_rules_class_panel_state_preserved.js": 3655, + "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 8353, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js": 3600, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-appears-on-swatch-click.js": 3714, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js": 3620, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 4665, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-revert-on-ESC.js": 3580, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-swatch-displayed.js": 3532, + "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 7167, + "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 7211, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 5722, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 7922, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 4183, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 4618, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 4256, + "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 4417, + "devtools/client/inspector/rules/test/browser_rules_content_01.js": 3581, + "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-01.js": 4172, + "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-02.js": 3555, + "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 6725, + "devtools/client/inspector/rules/test/browser_rules_cubicbezier-appears-on-swatch-click.js": 3889, + "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 3835, + "devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js": 3678, + "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 4094, + "devtools/client/inspector/rules/test/browser_rules_cycle-color.js": 4325, + "devtools/client/inspector/rules/test/browser_rules_edit-property-cancel.js": 3736, + "devtools/client/inspector/rules/test/browser_rules_edit-property-click.js": 3863, + "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 4494, + "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 4046, + "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 8167, + "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 5681, + "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 4126, + "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_02.js": 4001, + "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 4098, + "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 6047, + "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 5323, + "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 4142, + "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 4226, + "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 4479, + "devtools/client/inspector/rules/test/browser_rules_edit-property_07.js": 3913, + "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 3990, + "devtools/client/inspector/rules/test/browser_rules_edit-property_09.js": 3736, + "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 3561, + "devtools/client/inspector/rules/test/browser_rules_edit-selector-click.js": 3608, + "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 4742, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 4016, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 4669, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_03.js": 3777, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_04.js": 4114, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 4454, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 4281, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 3941, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 4195, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 4730, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 4008, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 4027, + "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_01.js": 3928, + "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_02.js": 3924, + "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_03.js": 3803, + "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 3978, + "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 5940, + "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 4976, + "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5192, + "devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js": 3738, + "devtools/client/inspector/rules/test/browser_rules_filtereditor-commit-on-ENTER.js": 3751, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-mutation.js": 4041, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 4608, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-reload.js": 7231, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-restored-after-reload.js": 5544, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01.js": 3580, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01b.js": 3633, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_02.js": 3816, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 4120, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_04.js": 3710, + "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 4963, + "devtools/client/inspector/rules/test/browser_rules_inherited-properties_01.js": 3720, + "devtools/client/inspector/rules/test/browser_rules_inherited-properties_03.js": 3559, + "devtools/client/inspector/rules/test/browser_rules_inline-source-map.js": 3785, + "devtools/client/inspector/rules/test/browser_rules_invalid-source-map.js": 3770, + "devtools/client/inspector/rules/test/browser_rules_keybindings.js": 4324, + "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 4040, + "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 4001, + "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 3698, + "devtools/client/inspector/rules/test/browser_rules_lineNumbers.js": 4225, + "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 5167, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 4205, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_02.js": 3555, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_04.js": 3595, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 4000, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 4001, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_07.js": 3696, + "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 3995, + "devtools/client/inspector/rules/test/browser_rules_media-queries.js": 3693, + "devtools/client/inspector/rules/test/browser_rules_multiple-properties-duplicates.js": 4201, + "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 3873, + "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_01.js": 4086, + "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 4033, + "devtools/client/inspector/rules/test/browser_rules_multiple_properties_01.js": 3920, + "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 3911, + "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 5130, + "devtools/client/inspector/rules/test/browser_rules_original-source-link2.js": 5168, + "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 6701, + "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 4390, + "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 5169, + "devtools/client/inspector/rules/test/browser_rules_refresh-no-flicker.js": 3596, + "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_01.js": 3739, + "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 4407, + "devtools/client/inspector/rules/test/browser_rules_refresh-on-style-change.js": 3645, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 4876, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 4054, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_03.js": 3823, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 4046, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_expander.js": 3867, + "devtools/client/inspector/rules/test/browser_rules_search-filter-overridden-property.js": 3794, + "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 4922, + "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 3657, + "devtools/client/inspector/rules/test/browser_rules_search-filter_03.js": 3732, + "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 3981, + "devtools/client/inspector/rules/test/browser_rules_search-filter_05.js": 4234, + "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 4050, + "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 4176, + "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 4097, + "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 4162, + "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 4229, + "devtools/client/inspector/rules/test/browser_rules_search-filter_escape-keypress.js": 3872, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 4326, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 3790, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_03.js": 3978, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_04.js": 3581, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_05.js": 3584, + "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 5091, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_01.js": 3695, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_02.js": 3606, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_03.js": 4088, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_04.js": 4014, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_05.js": 3866, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_06.js": 4077, + "devtools/client/inspector/rules/test/browser_rules_shorthand-overridden-lists.js": 3640, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 5498, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 5587, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 4206, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_03.js": 3700, + "devtools/client/inspector/rules/test/browser_rules_url-click-opens-new-tab.js": 3803, + "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 4511, + "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 4337, + "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 16061, + "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 5565, + "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 13139, + "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 4492, + "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 3851, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 5575, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 4961, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 4912, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 3832, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js": 3739, + "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 4053, + "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 4252, + "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-03.js": 3576, + "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-04.js": 3605, + "devtools/client/inspector/test/browser_inspector_addNode_01.js": 5536, + "devtools/client/inspector/test/browser_inspector_addNode_02.js": 4614, + "devtools/client/inspector/test/browser_inspector_addNode_03.js": 3965, + "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 7164, + "devtools/client/inspector/test/browser_inspector_breadcrumbs_highlight_hover.js": 3818, + "devtools/client/inspector/test/browser_inspector_breadcrumbs_keybinding.js": 4064, + "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 5804, + "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 4651, + "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 5036, + "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 10492, + "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 4379, + "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 4406, + "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 3897, + "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 6065, + "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 4060, + "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 8115, + "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 4585, + "devtools/client/inspector/test/browser_inspector_highlighter-05.js": 6206, + "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 5943, + "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 5512, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_01.js": 4139, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_02.js": 3936, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_03.js": 4413, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_04.js": 5865, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_05.js": 4826, + "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4019, + "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 4727, + "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-csp.js": 3544, + "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js": 4127, + "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js": 4150, + "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 4991, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js": 3854, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 3961, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_03.js": 3632, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 4644, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 4917, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 5392, + "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 4642, + "devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js": 3537, + "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 5547, + "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 4736, + "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 5562, + "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 13375, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 5056, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 4709, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 3816, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 3957, + "devtools/client/inspector/test/browser_inspector_highlighter-measure_02.js": 3707, + "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 4514, + "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 6517, + "devtools/client/inspector/test/browser_inspector_highlighter-rect_01.js": 4735, + "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 4146, + "devtools/client/inspector/test/browser_inspector_highlighter-rulers_02.js": 3534, + "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 3959, + "devtools/client/inspector/test/browser_inspector_highlighter-selector_02.js": 3542, + "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 3933, + "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 5110, + "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 3530, + "devtools/client/inspector/test/browser_inspector_infobar_01.js": 9500, + "devtools/client/inspector/test/browser_inspector_infobar_02.js": 4920, + "devtools/client/inspector/test/browser_inspector_infobar_03.js": 4535, + "devtools/client/inspector/test/browser_inspector_infobar_04.js": 5736, + "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 6844, + "devtools/client/inspector/test/browser_inspector_inspect_node_contextmenu.js": 4581, + "devtools/client/inspector/test/browser_inspector_invalidate.js": 4226, + "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 9800, + "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 4561, + "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 4173, + "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 7817, + "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 9272, + "devtools/client/inspector/test/browser_inspector_navigation.js": 10497, + "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 5152, + "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 4249, + "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 4155, + "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 4468, + "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 6475, + "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 6832, + "devtools/client/inspector/test/browser_inspector_reload-01.js": 3854, + "devtools/client/inspector/test/browser_inspector_reload-02.js": 4292, + "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 4302, + "devtools/client/inspector/test/browser_inspector_search-01.js": 8346, + "devtools/client/inspector/test/browser_inspector_search-02.js": 5615, + "devtools/client/inspector/test/browser_inspector_search-03.js": 5170, + "devtools/client/inspector/test/browser_inspector_search-04.js": 4088, + "devtools/client/inspector/test/browser_inspector_search-05.js": 10572, + "devtools/client/inspector/test/browser_inspector_search-06.js": 6637, + "devtools/client/inspector/test/browser_inspector_search-07.js": 3595, + "devtools/client/inspector/test/browser_inspector_search-label.js": 4643, + "devtools/client/inspector/test/browser_inspector_search-navigation.js": 4923, + "devtools/client/inspector/test/browser_inspector_search-reserved.js": 4611, + "devtools/client/inspector/test/browser_inspector_search-selection.js": 9848, + "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 5678, + "devtools/client/inspector/test/browser_inspector_search-suggests-ids-and-classes.js": 4077, + "devtools/client/inspector/test/browser_inspector_search_keyboard_trap.js": 3814, + "devtools/client/inspector/test/browser_inspector_select-docshell.js": 4275, + "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 11227, + "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 7007, + "devtools/client/inspector/test/browser_inspector_startup.js": 4933, + "devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js": 3864, + "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 5238, + "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 4375, + "devtools/client/memory/test/browser/browser_memory_diff_01.js": 4372, + "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 12693, + "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 4417, + "devtools/client/memory/test/browser/browser_memory_filter_01.js": 4394, + "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 5529, + "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 5282, + "devtools/client/memory/test/browser/browser_memory_keyboard.js": 3707, + "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 5101, + "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 12490, + "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 12148, + "devtools/client/netmonitor/test/browser_net_api-calls.js": 5047, + "devtools/client/netmonitor/test/browser_net_autoscroll.js": 14300, + "devtools/client/netmonitor/test/browser_net_brotli.js": 5590, + "devtools/client/netmonitor/test/browser_net_cached-status.js": 4931, + "devtools/client/netmonitor/test/browser_net_cause.js": 6361, + "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 4761, + "devtools/client/netmonitor/test/browser_net_cause_source_map.js": 5425, + "devtools/client/netmonitor/test/browser_net_clear.js": 3846, + "devtools/client/netmonitor/test/browser_net_columns_last_column.js": 4068, + "devtools/client/netmonitor/test/browser_net_columns_showhide.js": 5393, + "devtools/client/netmonitor/test/browser_net_complex-params.js": 8947, + "devtools/client/netmonitor/test/browser_net_content-type.js": 8875, + "devtools/client/netmonitor/test/browser_net_cors_requests.js": 4958, + "devtools/client/netmonitor/test/browser_net_curl-utils.js": 5084, + "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 4486, + "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 4667, + "devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js": 5257, + "devtools/client/netmonitor/test/browser_net_filter-01.js": 11032, + "devtools/client/netmonitor/test/browser_net_filter-02.js": 12983, + "devtools/client/netmonitor/test/browser_net_filter-03.js": 10594, + "devtools/client/netmonitor/test/browser_net_filter-04.js": 6255, + "devtools/client/netmonitor/test/browser_net_filter-autocomplete.js": 7367, + "devtools/client/netmonitor/test/browser_net_filter-flags.js": 12792, + "devtools/client/netmonitor/test/browser_net_footer-summary.js": 11293, + "devtools/client/netmonitor/test/browser_net_frame.js": 9392, + "devtools/client/netmonitor/test/browser_net_header-docs.js": 4467, + "devtools/client/netmonitor/test/browser_net_html-preview.js": 4829, + "devtools/client/netmonitor/test/browser_net_icon-preview.js": 7404, + "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 6206, + "devtools/client/netmonitor/test/browser_net_json-b64.js": 4430, + "devtools/client/netmonitor/test/browser_net_json-long.js": 32915, + "devtools/client/netmonitor/test/browser_net_json-malformed.js": 4786, + "devtools/client/netmonitor/test/browser_net_json-null.js": 4498, + "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 4497, + "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 4427, + "devtools/client/netmonitor/test/browser_net_jsonp.js": 5120, + "devtools/client/netmonitor/test/browser_net_large-response.js": 5466, + "devtools/client/netmonitor/test/browser_net_open_in_debugger.js": 8313, + "devtools/client/netmonitor/test/browser_net_open_in_style_editor.js": 8743, + "devtools/client/netmonitor/test/browser_net_open_request_in_tab.js": 4042, + "devtools/client/netmonitor/test/browser_net_pane-collapse.js": 4536, + "devtools/client/netmonitor/test/browser_net_pane-toggle.js": 3736, + "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 5779, + "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5353, + "devtools/client/netmonitor/test/browser_net_post-data-02.js": 4409, + "devtools/client/netmonitor/test/browser_net_post-data-03.js": 4391, + "devtools/client/netmonitor/test/browser_net_post-data-04.js": 4221, + "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 31616, + "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5081, + "devtools/client/netmonitor/test/browser_net_reload-button.js": 4356, + "devtools/client/netmonitor/test/browser_net_reload-markers.js": 4124, + "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 6208, + "devtools/client/netmonitor/test/browser_net_resend.js": 6610, + "devtools/client/netmonitor/test/browser_net_resend_cors.js": 5807, + "devtools/client/netmonitor/test/browser_net_resend_headers.js": 4039, + "devtools/client/netmonitor/test/browser_net_security-details.js": 4406, + "devtools/client/netmonitor/test/browser_net_security-error.js": 4111, + "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5086, + "devtools/client/netmonitor/test/browser_net_security-redirect.js": 4453, + "devtools/client/netmonitor/test/browser_net_security-state.js": 5665, + "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 4642, + "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 5664, + "devtools/client/netmonitor/test/browser_net_security-warnings.js": 4688, + "devtools/client/netmonitor/test/browser_net_send-beacon-other-tab.js": 4306, + "devtools/client/netmonitor/test/browser_net_send-beacon.js": 3756, + "devtools/client/netmonitor/test/browser_net_simple-request-data.js": 4076, + "devtools/client/netmonitor/test/browser_net_simple-request.js": 4806, + "devtools/client/netmonitor/test/browser_net_sort-01.js": 11103, + "devtools/client/netmonitor/test/browser_net_sort-02.js": 9513, + "devtools/client/netmonitor/test/browser_net_sort-03.js": 10463, + "devtools/client/netmonitor/test/browser_net_statistics-01.js": 7278, + "devtools/client/netmonitor/test/browser_net_statistics-02.js": 4499, + "devtools/client/netmonitor/test/browser_net_status-codes.js": 6389, + "devtools/client/netmonitor/test/browser_net_streaming-response.js": 5701, + "devtools/client/netmonitor/test/browser_net_throttle.js": 9461, + "devtools/client/netmonitor/test/browser_net_thumbnail-click.js": 5404, + "devtools/client/netmonitor/test/browser_net_timing-division.js": 7122, + "devtools/client/netmonitor/test/browser_net_truncate.js": 11425, + "devtools/client/netmonitor/test/browser_net_waterfall-click.js": 5107, + "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 3798, + "devtools/client/performance/test/browser_perf-button-states.js": 3520, + "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 3524, + "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 3922, + "devtools/client/performance/test/browser_perf-console-record-02.js": 5040, + "devtools/client/performance/test/browser_perf-console-record-04.js": 4225, + "devtools/client/performance/test/browser_perf-console-record-05.js": 4568, + "devtools/client/performance/test/browser_perf-console-record-06.js": 5853, + "devtools/client/performance/test/browser_perf-console-record-07.js": 6446, + "devtools/client/performance/test/browser_perf-console-record-08.js": 9379, + "devtools/client/performance/test/browser_perf-console-record-09.js": 4551, + "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 3967, + "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 3698, + "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 3555, + "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 3621, + "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 3522, + "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 3546, + "devtools/client/performance/test/browser_perf-highlighted.js": 3807, + "devtools/client/performance/test/browser_perf-loading-02.js": 3740, + "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 3629, + "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 3613, + "devtools/client/performance/test/browser_perf-overview-render-01.js": 3715, + "devtools/client/performance/test/browser_perf-overview-render-02.js": 3887, + "devtools/client/performance/test/browser_perf-overview-render-04.js": 3719, + "devtools/client/performance/test/browser_perf-overview-selection-02.js": 3647, + "devtools/client/performance/test/browser_perf-recording-notices-02.js": 3688, + "devtools/client/performance/test/browser_perf-recording-notices-03.js": 4809, + "devtools/client/performance/test/browser_perf-recording-selected-01.js": 4097, + "devtools/client/performance/test/browser_perf-recording-selected-02.js": 3976, + "devtools/client/performance/test/browser_perf-recording-selected-03.js": 4056, + "devtools/client/performance/test/browser_perf-recording-selected-04.js": 4990, + "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 3787, + "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 4532, + "devtools/client/performance/test/browser_perf-telemetry-01.js": 3959, + "devtools/client/performance/test/browser_timeline-waterfall-background.js": 4017, + "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 4240, + "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 4299, + "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 4965, + "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 6040, + "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 5946, + "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 4816, + "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 4600, + "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_02.js": 3895, + "devtools/client/responsive.html/test/browser/browser_device_change.js": 3727, + "devtools/client/responsive.html/test/browser/browser_device_custom.js": 4458, + "devtools/client/responsive.html/test/browser/browser_device_modal_submit.js": 4384, + "devtools/client/responsive.html/test/browser/browser_exit_button.js": 6731, + "devtools/client/responsive.html/test/browser/browser_frame_script_active.js": 4307, + "devtools/client/responsive.html/test/browser/browser_hide_container.js": 5954, + "devtools/client/responsive.html/test/browser/browser_resize_cmd.js": 8457, + "devtools/client/responsive.html/test/browser/browser_toolbox_computed_view.js": 7938, + "devtools/client/responsive.html/test/browser/browser_toolbox_rule_view.js": 5761, + "devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js": 8137, + "devtools/client/responsivedesign/test/browser_responsive_cmd.js": 4247, + "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 4208, + "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 5533, + "devtools/client/scratchpad/test/browser_scratchpad_restore.js": 3578, + "devtools/client/scratchpad/test/browser_scratchpad_wrong_window_focus.js": 3807, + "devtools/client/shared/sourceeditor/test/browser_codemirror.js": 4764, + "devtools/client/shared/sourceeditor/test/browser_vimemacs.js": 31688, + "devtools/client/shared/test/browser_html_tooltip-01.js": 4027, + "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 5610, + "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 6338, + "devtools/client/shared/test/browser_telemetry_sidebar.js": 8463, + "devtools/client/shared/test/browser_telemetry_toolbox.js": 8455, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_canvasdebugger.js": 3573, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 5534, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 5675, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 4270, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 4626, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 5075, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 3852, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js": 4088, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 4427, + "devtools/client/storage/test/browser_storage_basic.js": 7188, + "devtools/client/storage/test/browser_storage_basic_usercontextid_1.js": 4958, + "devtools/client/storage/test/browser_storage_basic_usercontextid_2.js": 4889, + "devtools/client/storage/test/browser_storage_basic_with_fragment.js": 5053, + "devtools/client/storage/test/browser_storage_cache_delete.js": 3929, + "devtools/client/storage/test/browser_storage_cookies_add.js": 4323, + "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 4568, + "devtools/client/storage/test/browser_storage_cookies_edit.js": 5202, + "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 4634, + "devtools/client/storage/test/browser_storage_delete.js": 5518, + "devtools/client/storage/test/browser_storage_delete_all.js": 5456, + "devtools/client/storage/test/browser_storage_delete_tree.js": 5138, + "devtools/client/storage/test/browser_storage_delete_usercontextid.js": 10166, + "devtools/client/storage/test/browser_storage_dom_cache_disabled.js": 4388, + "devtools/client/storage/test/browser_storage_dynamic_updates.js": 6442, + "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 4594, + "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 3854, + "devtools/client/storage/test/browser_storage_localstorage_add.js": 4015, + "devtools/client/storage/test/browser_storage_localstorage_edit.js": 4477, + "devtools/client/storage/test/browser_storage_overflow.js": 8178, + "devtools/client/storage/test/browser_storage_sessionstorage_add.js": 4593, + "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5124, + "devtools/client/storage/test/browser_storage_sidebar.js": 6866, + "devtools/client/storage/test/browser_storage_sidebar_toggle.js": 4093, + "devtools/client/storage/test/browser_storage_values.js": 6707, + "devtools/client/styleeditor/test/browser_styleeditor_autocomplete-disabled.js": 4436, + "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 4280, + "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 6238, + "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 3917, + "devtools/client/styleeditor/test/browser_styleeditor_loading.js": 3908, + "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js": 3791, + "devtools/client/styleeditor/test/browser_styleeditor_navigate.js": 3775, + "devtools/client/styleeditor/test/browser_styleeditor_new.js": 3953, + "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 6516, + "devtools/client/styleeditor/test/browser_styleeditor_reload.js": 3702, + "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 7300, + "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 5904, + "devtools/client/styleeditor/test/browser_styleeditor_sync.js": 9523, + "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 4726, + "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 5026, + "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 4663, + "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 4931, + "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 6679, + "devtools/client/styleeditor/test/browser_styleeditor_transition_rule.js": 4269, + "devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js": 3537, + "devtools/client/webconsole/net/test/mochitest/browser_net_basic.js": 3836, + "devtools/client/webconsole/net/test/mochitest/browser_net_params.js": 4263, + "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 6898, + "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 6123, + "devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/browser_webconsole_check_stubs_console_api.js": 5892, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_inspect.js": 4413, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 6416, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 5265, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters_persist.js": 7767, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_debugger_link.js": 5592, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_scratchpad_link.js": 4971, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_styleeditor_link.js": 4469, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_click.js": 3871, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_nodes_select.js": 5570, "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js": 3676, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js": 4639, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_scroll.js": 3616, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_error.js": 3529, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_nosource.js": 4008, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_stacktrace_location_debugger_link.js": 5160, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_stacktrace_location_scratchpad_link.js": 3645, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_warn_about_replaced_api.js": 6869, - "devtools/client/webconsole/test/browser_bug664688_sandbox_update_after_navigation.js": 3934, - "devtools/client/webconsole/test/browser_cached_messages.js": 4512, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js": 4639, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_scroll.js": 3616, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_error.js": 3529, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_nosource.js": 4008, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_stacktrace_location_debugger_link.js": 5160, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_stacktrace_location_scratchpad_link.js": 3645, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_warn_about_replaced_api.js": 6869, + "devtools/client/webconsole/test/browser_bug664688_sandbox_update_after_navigation.js": 3934, + "devtools/client/webconsole/test/browser_cached_messages.js": 4512, "devtools/client/webconsole/test/browser_console_consolejsm_output.js": 4138, "devtools/client/webconsole/test/browser_console_devtools_loader_exception.js": 3748, "devtools/client/webconsole/test/browser_console_filters.js": 4025, - "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 9069, - "devtools/client/webconsole/test/browser_console_history_persist.js": 7397, - "devtools/client/webconsole/test/browser_console_iframe_messages.js": 5006, - "devtools/client/webconsole/test/browser_console_native_getters.js": 6389, - "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 5074, - "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 4977, - "devtools/client/webconsole/test/browser_console_server_logging.js": 5339, - "devtools/client/webconsole/test/browser_console_variables_view.js": 4545, - "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 4534, - "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 5134, - "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 9326, - "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 6097, - "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 5348, - "devtools/client/webconsole/test/browser_jsterm_inspect.js": 4304, - "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 6188, - "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 3777, - "devtools/client/webconsole/test/browser_webconsole_bug_580001_closing_after_completion.js": 4292, - "devtools/client/webconsole/test/browser_webconsole_bug_588342_document_focus.js": 3872, - "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 6910, - "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 6792, - "devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js": 4126, - "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 4727, - "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 4711, - "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 7457, - "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 3893, - "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 4399, - "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 13081, - "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 8826, - "devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js": 4121, - "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 5464, - "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 3989, - "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 6977, - "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 7941, - "devtools/client/webconsole/test/browser_webconsole_input_field_focus_on_panel_select.js": 3920, - "devtools/client/webconsole/test/browser_webconsole_netlogging.js": 16982, - "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 6541, - "devtools/client/webconsole/test/browser_webconsole_output_01.js": 5598, - "devtools/client/webconsole/test/browser_webconsole_output_02.js": 7341, - "devtools/client/webconsole/test/browser_webconsole_output_03.js": 6283, - "devtools/client/webconsole/test/browser_webconsole_output_04.js": 5452, - "devtools/client/webconsole/test/browser_webconsole_output_05.js": 6567, - "devtools/client/webconsole/test/browser_webconsole_output_06.js": 10194, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 4770, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 6878, - "devtools/client/webconsole/test/browser_webconsole_split.js": 15452, - "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 4380, - "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 3758, - "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 10510, - "devtools/client/webconsole/test/browser_webconsole_view_source.js": 5746, - "devtools/server/tests/browser/browser_markers-cycle-collection.js": 5381, + "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 9069, + "devtools/client/webconsole/test/browser_console_history_persist.js": 7397, + "devtools/client/webconsole/test/browser_console_iframe_messages.js": 5006, + "devtools/client/webconsole/test/browser_console_native_getters.js": 6389, + "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 5074, + "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 4977, + "devtools/client/webconsole/test/browser_console_server_logging.js": 5339, + "devtools/client/webconsole/test/browser_console_variables_view.js": 4545, + "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 4534, + "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 5134, + "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 9326, + "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 6097, + "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 5348, + "devtools/client/webconsole/test/browser_jsterm_inspect.js": 4304, + "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 6188, + "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 3777, + "devtools/client/webconsole/test/browser_webconsole_bug_580001_closing_after_completion.js": 4292, + "devtools/client/webconsole/test/browser_webconsole_bug_588342_document_focus.js": 3872, + "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 6910, + "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 6792, + "devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js": 4126, + "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 4727, + "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 4711, + "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 7457, + "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 3893, + "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 4399, + "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 13081, + "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 8826, + "devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js": 4121, + "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 5464, + "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 3989, + "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 6977, + "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 7941, + "devtools/client/webconsole/test/browser_webconsole_input_field_focus_on_panel_select.js": 3920, + "devtools/client/webconsole/test/browser_webconsole_netlogging.js": 16982, + "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 6541, + "devtools/client/webconsole/test/browser_webconsole_output_01.js": 5598, + "devtools/client/webconsole/test/browser_webconsole_output_02.js": 7341, + "devtools/client/webconsole/test/browser_webconsole_output_03.js": 6283, + "devtools/client/webconsole/test/browser_webconsole_output_04.js": 5452, + "devtools/client/webconsole/test/browser_webconsole_output_05.js": 6567, + "devtools/client/webconsole/test/browser_webconsole_output_06.js": 10194, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 4770, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 6878, + "devtools/client/webconsole/test/browser_webconsole_split.js": 15452, + "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 4380, + "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 3758, + "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 10510, + "devtools/client/webconsole/test/browser_webconsole_view_source.js": 5746, + "devtools/server/tests/browser/browser_markers-cycle-collection.js": 5381, "devtools/server/tests/browser/browser_webextension_inspected_window.js": 5888 } } diff --git a/testing/runtimes/mochitest-devtools-chrome.runtimes.json b/testing/runtimes/mochitest-devtools-chrome.runtimes.json index 353c225bf184..32251a01a332 100644 --- a/testing/runtimes/mochitest-devtools-chrome.runtimes.json +++ b/testing/runtimes/mochitest-devtools-chrome.runtimes.json @@ -1,975 +1,975 @@ { - "excluded_test_average": 2393, + "excluded_test_average": 2393, "runtimes": { - "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 10925, - "devtools/client/aboutdebugging/test/browser_addons_debug_info.js": 6014, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 11755, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 11262, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 11217, - "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 10958, - "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 5865, - "devtools/client/aboutdebugging/test/browser_addons_reload.js": 5484, - "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 5813, - "devtools/client/aboutdebugging/test/browser_service_workers_push.js": 29415, - "devtools/client/aboutdebugging/test/browser_service_workers_push_service.js": 29953, - "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 5152, - "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 4743, - "devtools/client/commandline/test/browser_cmd_addon.js": 5312, - "devtools/client/commandline/test/browser_cmd_commands.js": 4915, - "devtools/client/commandline/test/browser_cmd_csscoverage_startstop.js": 5247, - "devtools/client/commandline/test/browser_cmd_highlight_04.js": 8023, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 7179, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 9496, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 6806, - "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 12290, - "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 10108, - "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 12733, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 7846, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 5898, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 7228, - "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 16329, - "devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js": 7658, - "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 9124, - "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 13006, - "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 5784, - "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 8012, - "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 10460, - "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js": 7819, - "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 7923, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 5548, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reloading.js": 8179, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 13900, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js": 6133, - "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 7369, - "devtools/client/debugger/new/test/mochitest/browser_dbg-tabs.js": 13291, - "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 9276, - "devtools/client/debugger/test/mochitest/browser_dbg_aaa_run_first_leaktest.js": 6987, - "devtools/client/debugger/test/mochitest/browser_dbg_addon-modules-unpacked.js": 5029, - "devtools/client/debugger/test/mochitest/browser_dbg_addon-modules.js": 5403, - "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 5552, - "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4754, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 5281, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 5223, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 5218, - "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 5221, - "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 5385, - "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 4666, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 6803, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 4732, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 5078, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 5073, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 6478, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 5541, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 5812, - "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 5716, - "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 5004, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 5015, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 5906, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-break-on-last-line-of-script-on-reload.js": 6747, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4878, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-02.js": 4769, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-condition-thrown-message.js": 5719, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 5153, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 13721, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-disabled-reload.js": 9093, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-editor.js": 5288, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-eval.js": 4725, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-highlight.js": 5093, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-new-script.js": 5399, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-other-tabs.js": 7022, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-pane.js": 5408, - "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-reload.js": 5209, - "devtools/client/debugger/test/mochitest/browser_dbg_bug-896139.js": 5964, - "devtools/client/debugger/test/mochitest/browser_dbg_closure-inspection.js": 9366, - "devtools/client/debugger/test/mochitest/browser_dbg_cmd-blackbox.js": 6424, - "devtools/client/debugger/test/mochitest/browser_dbg_cmd-break.js": 5927, - "devtools/client/debugger/test/mochitest/browser_dbg_cmd-dbg.js": 6698, - "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 11945, - "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js": 6423, - "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-03.js": 5866, - "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-04.js": 5262, - "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-05.js": 7142, - "devtools/client/debugger/test/mochitest/browser_dbg_console-eval.js": 5528, - "devtools/client/debugger/test/mochitest/browser_dbg_console-named-eval.js": 5664, - "devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-01.js": 5482, - "devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-02.js": 5298, - "devtools/client/debugger/test/mochitest/browser_dbg_editor-contextmenu.js": 5319, - "devtools/client/debugger/test/mochitest/browser_dbg_editor-mode.js": 5209, - "devtools/client/debugger/test/mochitest/browser_dbg_file-reload.js": 4923, - "devtools/client/debugger/test/mochitest/browser_dbg_function-display-name.js": 5195, - "devtools/client/debugger/test/mochitest/browser_dbg_global-method-override.js": 4665, - "devtools/client/debugger/test/mochitest/browser_dbg_hide-toolbar-buttons.js": 4961, - "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 24115, - "devtools/client/debugger/test/mochitest/browser_dbg_iframes.js": 4997, - "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse.js": 4791, - "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js": 5448, - "devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js": 5694, - "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-01-simple.js": 5823, - "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-02-blank.js": 5121, - "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-03-new.js": 5856, - "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-04-breakpoint.js": 7180, - "devtools/client/debugger/test/mochitest/browser_dbg_no-dangling-breakpoints.js": 4803, - "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-highlight.js": 6455, - "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-raise.js": 6677, - "devtools/client/debugger/test/mochitest/browser_dbg_optimized-out-vars.js": 5498, - "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-01.js": 6136, - "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-02.js": 6528, - "devtools/client/debugger/test/mochitest/browser_dbg_pause-no-step.js": 5637, - "devtools/client/debugger/test/mochitest/browser_dbg_pause-resume.js": 4935, - "devtools/client/debugger/test/mochitest/browser_dbg_pause-warning.js": 8198, - "devtools/client/debugger/test/mochitest/browser_dbg_paused-keybindings.js": 6504, - "devtools/client/debugger/test/mochitest/browser_dbg_post-page.js": 4938, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-01.js": 5273, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-02.js": 5306, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-03.js": 5883, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-04.js": 5438, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-05.js": 4799, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-07.js": 4786, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-08.js": 5833, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-09.js": 5485, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-10.js": 5140, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-11.js": 5813, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-12.js": 5162, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-13.js": 5300, - "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-on-paused.js": 5924, - "devtools/client/debugger/test/mochitest/browser_dbg_progress-listener-bug.js": 5179, - "devtools/client/debugger/test/mochitest/browser_dbg_promises-allocation-stack.js": 5051, - "devtools/client/debugger/test/mochitest/browser_dbg_promises-fulfillment-stack.js": 4776, - "devtools/client/debugger/test/mochitest/browser_dbg_promises-rejection-stack.js": 4756, - "devtools/client/debugger/test/mochitest/browser_dbg_reload-preferred-script-02.js": 4961, - "devtools/client/debugger/test/mochitest/browser_dbg_reload-preferred-script-03.js": 4962, - "devtools/client/debugger/test/mochitest/browser_dbg_reload-same-script.js": 7352, - "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-01.js": 5860, - "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-02.js": 5812, - "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-03.js": 4637, - "devtools/client/debugger/test/mochitest/browser_dbg_search-autofill-identifier.js": 4863, - "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-01.js": 7125, - "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-02.js": 7456, - "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-03.js": 6264, - "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-04.js": 4978, - "devtools/client/debugger/test/mochitest/browser_dbg_search-global-01.js": 7042, - "devtools/client/debugger/test/mochitest/browser_dbg_search-global-02.js": 6241, - "devtools/client/debugger/test/mochitest/browser_dbg_search-global-03.js": 6359, - "devtools/client/debugger/test/mochitest/browser_dbg_search-global-04.js": 5852, - "devtools/client/debugger/test/mochitest/browser_dbg_search-global-05.js": 7218, - "devtools/client/debugger/test/mochitest/browser_dbg_search-global-06.js": 8635, - "devtools/client/debugger/test/mochitest/browser_dbg_search-popup-jank.js": 6270, - "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-01.js": 6590, - "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-02.js": 6369, - "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-03.js": 5454, - "devtools/client/debugger/test/mochitest/browser_dbg_search-symbols.js": 7088, - "devtools/client/debugger/test/mochitest/browser_dbg_searchbox-help-popup-01.js": 5695, - "devtools/client/debugger/test/mochitest/browser_dbg_searchbox-help-popup-02.js": 5404, - "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-01.js": 10666, - "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-02.js": 6832, - "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-03.js": 6057, - "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-04.js": 5422, - "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-05.js": 6784, - "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-01.js": 5895, - "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-02.js": 6763, - "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-03.js": 5768, - "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js": 6688, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-bookmarklet.js": 4972, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 5498, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-contextmenu-02.js": 5188, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-eval-02.js": 4803, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js": 5392, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-labels.js": 4810, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 5396, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-sorting.js": 4619, - "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 6448, - "devtools/client/debugger/test/mochitest/browser_dbg_stack-01.js": 5446, - "devtools/client/debugger/test/mochitest/browser_dbg_stack-02.js": 6282, - "devtools/client/debugger/test/mochitest/browser_dbg_stack-03.js": 4613, - "devtools/client/debugger/test/mochitest/browser_dbg_stack-contextmenu-01.js": 5113, - "devtools/client/debugger/test/mochitest/browser_dbg_step-out.js": 6387, - "devtools/client/debugger/test/mochitest/browser_dbg_terminate-on-tab-close.js": 5055, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-01.js": 4710, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-02.js": 4881, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-03.js": 4739, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-04.js": 4733, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-05.js": 4832, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-06.js": 5639, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-07.js": 5537, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-08.js": 5363, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-cancel.js": 5897, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-click.js": 5244, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 15720, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-02.js": 6750, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value-01.js": 10050, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value-02.js": 6366, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 9559, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-watch.js": 7787, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-01.js": 13366, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-02.js": 13948, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-03.js": 10745, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-04.js": 10395, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-05.js": 10646, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-pref.js": 5341, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-searchbox.js": 5061, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-01.js": 9608, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-02.js": 6519, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-03.js": 12588, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-with.js": 6475, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frozen-sealed-nonext.js": 5432, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 5415, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 16856, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-map-set.js": 7255, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-01.js": 10793, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-02.js": 5393, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-01.js": 7875, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-02.js": 6609, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-03.js": 5896, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-04.js": 5898, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-05.js": 5899, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-06.js": 5920, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-07.js": 7639, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-08.js": 6047, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-09.js": 6553, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-10.js": 6454, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-11.js": 7399, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-12.js": 7354, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-13.js": 9668, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-15.js": 6916, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-16.js": 13811, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-17.js": 6049, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 26923, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 31645, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-03.js": 6118, - "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-webidl.js": 12245, - "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-01.js": 6091, - "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-02.js": 11093, - "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js": 6032, - "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js": 9590, - "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js": 6083, - "devtools/client/debugger/test/mochitest/browser_dbg_worker-source-map.js": 9954, - "devtools/client/debugger/test/mochitest/browser_dbg_worker-window.js": 4882, - "devtools/client/dom/test/browser_dom_array.js": 11502, - "devtools/client/dom/test/browser_dom_basic.js": 10003, - "devtools/client/dom/test/browser_dom_refresh.js": 11615, - "devtools/client/framework/test/browser_browser_toolbox.js": 14762, - "devtools/client/framework/test/browser_keybindings_01.js": 6630, - "devtools/client/framework/test/browser_keybindings_02.js": 6178, - "devtools/client/framework/test/browser_new_activation_workflow.js": 7626, - "devtools/client/framework/test/browser_source_map-inline.js": 4685, - "devtools/client/framework/test/browser_toolbox_hosts.js": 13276, - "devtools/client/framework/test/browser_toolbox_hosts_size.js": 8670, - "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 4942, - "devtools/client/framework/test/browser_toolbox_options.js": 9428, - "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 6564, - "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 9104, - "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 13256, - "devtools/client/framework/test/browser_toolbox_races.js": 7875, - "devtools/client/framework/test/browser_toolbox_select_event.js": 19324, - "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 5117, - "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 12215, - "devtools/client/framework/test/browser_toolbox_toggle.js": 11449, - "devtools/client/framework/test/browser_toolbox_tool_ready.js": 20091, - "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 14150, - "devtools/client/framework/test/browser_toolbox_toolbar_overflow.js": 4613, - "devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js": 5464, - "devtools/client/framework/test/browser_toolbox_view_source_01.js": 4765, - "devtools/client/framework/test/browser_toolbox_view_source_03.js": 5049, - "devtools/client/framework/test/browser_toolbox_view_source_04.js": 5411, - "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 23446, - "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 9604, - "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 10478, - "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 6927, - "devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js": 10309, - "devtools/client/animationinspector/test/browser_animation_animated_properties_for_delayed_starttime_animations.js": 5954, - "devtools/client/animationinspector/test/browser_animation_animated_properties_path.js": 6085, - "devtools/client/animationinspector/test/browser_animation_animated_properties_progress_indicator.js": 7245, - "devtools/client/animationinspector/test/browser_animation_click_selects_animation.js": 9920, - "devtools/client/animationinspector/test/browser_animation_controller_exposes_document_currentTime.js": 10620, - "devtools/client/animationinspector/test/browser_animation_detail_displayed.js": 6401, - "devtools/client/animationinspector/test/browser_animation_empty_on_invalid_nodes.js": 9727, - "devtools/client/animationinspector/test/browser_animation_keyframe_click_to_set_time.js": 5929, - "devtools/client/animationinspector/test/browser_animation_keyframe_markers.js": 8722, - "devtools/client/animationinspector/test/browser_animation_mutations_with_same_names.js": 5005, - "devtools/client/animationinspector/test/browser_animation_participate_in_inspector_update.js": 8673, - "devtools/client/animationinspector/test/browser_animation_playerFronts_are_refreshed.js": 9964, - "devtools/client/animationinspector/test/browser_animation_playerWidgets_appear_on_panel_init.js": 6372, - "devtools/client/animationinspector/test/browser_animation_playerWidgets_target_nodes.js": 7762, - "devtools/client/animationinspector/test/browser_animation_pseudo_elements.js": 14193, - "devtools/client/animationinspector/test/browser_animation_refresh_on_added_animation.js": 10529, - "devtools/client/animationinspector/test/browser_animation_refresh_on_removed_animation.js": 9822, - "devtools/client/animationinspector/test/browser_animation_refresh_when_active.js": 11279, - "devtools/client/animationinspector/test/browser_animation_running_on_compositor.js": 11095, - "devtools/client/animationinspector/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 9960, - "devtools/client/animationinspector/test/browser_animation_shows_player_on_valid_node.js": 10131, - "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js": 9824, - "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_node_animations.js": 13391, - "devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js": 6937, - "devtools/client/animationinspector/test/browser_animation_target_highlight_select.js": 10710, - "devtools/client/animationinspector/test/browser_animation_target_highlighter_lock.js": 9962, - "devtools/client/animationinspector/test/browser_animation_timeline_currentTime.js": 13059, - "devtools/client/animationinspector/test/browser_animation_timeline_header.js": 8965, - "devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js": 5254, - "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_01.js": 13241, - "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_02.js": 10091, - "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_03.js": 16815, - "devtools/client/animationinspector/test/browser_animation_timeline_rate_selector.js": 16320, - "devtools/client/animationinspector/test/browser_animation_timeline_rewind_button.js": 15680, - "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_exists.js": 6323, - "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_movable.js": 9314, - "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_moves.js": 11475, - "devtools/client/animationinspector/test/browser_animation_timeline_setCurrentTime.js": 10011, - "devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js": 5706, - "devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js": 10441, - "devtools/client/animationinspector/test/browser_animation_timeline_shows_endDelay.js": 8865, - "devtools/client/animationinspector/test/browser_animation_timeline_shows_iterations.js": 9966, - "devtools/client/animationinspector/test/browser_animation_timeline_shows_name_label.js": 9965, - "devtools/client/animationinspector/test/browser_animation_timeline_shows_time_info.js": 9132, - "devtools/client/animationinspector/test/browser_animation_timeline_takes_rate_into_account.js": 5973, - "devtools/client/animationinspector/test/browser_animation_timeline_ui.js": 6851, - "devtools/client/animationinspector/test/browser_animation_toggle_button_resets_on_navigate.js": 11224, - "devtools/client/animationinspector/test/browser_animation_toggle_button_toggles_animations.js": 9841, - "devtools/client/animationinspector/test/browser_animation_toolbar_exists.js": 9659, - "devtools/client/animationinspector/test/browser_animation_ui_updates_when_animation_data_changes.js": 10789, - "devtools/client/inspector/boxmodel/test/browser_boxmodel.js": 7419, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_computed-accordion-state.js": 8578, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel.js": 11542, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_bluronclick.js": 5792, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_border.js": 6964, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_pseudo.js": 6446, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_stylerules.js": 9054, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_guides.js": 5696, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_layout-accordion-state.js": 8350, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js": 6780, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_offsetparent.js": 6406, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_positions.js": 5978, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_properties.js": 5210, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_pseudo-element.js": 5131, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_rotate-labels-on-sides.js": 5336, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_sync.js": 6297, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-navigation.js": 11172, - "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-reload.js": 8367, - "devtools/client/inspector/components/test/browser_boxmodel.js": 8827, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 11818, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5915, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6812, - "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 9327, - "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 5861, - "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 5910, - "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 6497, - "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 6470, - "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 12153, - "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8544, - "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 7925, - "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 5298, - "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 5452, - "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 5600, - "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 5370, - "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 5964, - "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 5020, - "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 4812, - "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 5406, - "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 7155, - "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 6477, - "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 5523, - "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 7843, - "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6628, - "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 10012, - "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 6056, - "devtools/client/inspector/fonts/test/browser_fontinspector.js": 6699, - "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 4961, - "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 6174, - "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 5109, - "devtools/client/inspector/grids/test/browser_grids_accordion-state.js": 9712, - "devtools/client/inspector/grids/test/browser_grids_color-in-rules-grid-toggle.js": 5839, - "devtools/client/inspector/grids/test/browser_grids_display-setting-extend-grid-lines.js": 4866, - "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-ESC.js": 4687, - "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-RETURN.js": 4801, - "devtools/client/inspector/grids/test/browser_grids_grid-list-element-rep.js": 5009, - "devtools/client/inspector/grids/test/browser_grids_grid-list-on-iframe-reloaded.js": 5584, - "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-added.js": 6338, - "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-removed.js": 6218, - "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-multiple-grids.js": 6158, - "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-single-grid.js": 5730, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-cannot-show-outline.js": 5674, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-area.js": 5788, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-cell.js": 5802, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-selected-grid.js": 5310, - "devtools/client/inspector/grids/test/browser_grids_grid-outline-updates-on-grid-change.js": 5226, - "devtools/client/inspector/grids/test/browser_grids_highlighter-setting-rules-grid-toggle.js": 5325, - "devtools/client/inspector/grids/test/browser_grids_number-of-css-grids-telemetry.js": 5586, - "devtools/client/inspector/grids/test/browser_grids_restored-after-reload.js": 9966, - "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 7197, - "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 7231, - "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 5212, - "devtools/client/inspector/markup/test/browser_markup_anonymous_02.js": 9547, - "devtools/client/inspector/markup/test/browser_markup_anonymous_03.js": 5061, - "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 4719, - "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 7202, - "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 8848, - "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 6456, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 9708, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 10649, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 4666, - "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 8490, - "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 12488, - "devtools/client/inspector/markup/test/browser_markup_events1.js": 11020, - "devtools/client/inspector/markup/test/browser_markup_events2.js": 12192, - "devtools/client/inspector/markup/test/browser_markup_events3.js": 12712, - "devtools/client/inspector/markup/test/browser_markup_events_01.js": 7923, - "devtools/client/inspector/markup/test/browser_markup_events_02.js": 9836, - "devtools/client/inspector/markup/test/browser_markup_events_03.js": 8537, - "devtools/client/inspector/markup/test/browser_markup_events_04.js": 10698, - "devtools/client/inspector/markup/test/browser_markup_events_click_to_close.js": 5899, - "devtools/client/inspector/markup/test/browser_markup_events_form.js": 5090, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 9981, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 9286, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 9594, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 8909, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 11702, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 11902, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 13478, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 13243, - "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 11906, - "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1.js": 18463, - "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1_jsx.js": 16306, - "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1.js": 13810, - "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1_jsx.js": 14446, - "devtools/client/inspector/markup/test/browser_markup_events_source_map.js": 7744, - "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 14883, - "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 12561, - "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 10346, - "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 6130, - "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 5546, - "devtools/client/inspector/markup/test/browser_markup_keybindings_01.js": 4763, - "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 4841, - "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 6399, - "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 8151, - "devtools/client/inspector/markup/test/browser_markup_links_01.js": 7184, - "devtools/client/inspector/markup/test/browser_markup_links_02.js": 5452, - "devtools/client/inspector/markup/test/browser_markup_links_05.js": 6306, - "devtools/client/inspector/markup/test/browser_markup_links_06.js": 9114, - "devtools/client/inspector/markup/test/browser_markup_links_07.js": 6839, - "devtools/client/inspector/markup/test/browser_markup_load_01.js": 6863, - "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 7340, - "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 5534, - "devtools/client/inspector/markup/test/browser_markup_navigation.js": 10263, - "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 5831, - "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 5860, - "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 7476, - "devtools/client/inspector/markup/test/browser_markup_search_01.js": 8257, - "devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js": 7495, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 7493, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 4821, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 12556, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 11653, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 5938, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 6660, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 6553, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 6260, - "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 5046, - "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 6988, - "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 5972, - "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 5253, - "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 5140, - "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 5363, - "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 5422, - "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 4693, - "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 6842, - "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 4619, - "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 4653, - "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 4658, - "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 5999, - "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 5578, - "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 7790, - "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 5273, - "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 6491, - "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 5911, - "devtools/client/inspector/rules/test/browser_rules_class_panel_add.js": 4875, - "devtools/client/inspector/rules/test/browser_rules_class_panel_content.js": 5007, - "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 10119, - "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 4989, - "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 8882, - "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 8534, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 6660, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 9523, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 5071, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 5118, - "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 5092, - "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 4931, - "devtools/client/inspector/rules/test/browser_rules_content_02.js": 5008, - "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 7424, - "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 4862, - "devtools/client/inspector/rules/test/browser_rules_custom.js": 5681, - "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 5142, - "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 5495, - "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 4947, - "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 9524, - "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 6965, - "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 5094, - "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 5242, - "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 7622, - "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 6453, - "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 5226, - "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 4738, - "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 5499, - "devtools/client/inspector/rules/test/browser_rules_edit-property_06.js": 5018, - "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 4829, - "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 4656, - "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 5374, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 5126, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 5377, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 5330, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 5081, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 4676, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 4650, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 5749, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 5037, - "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 4729, - "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 4721, - "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 7620, - "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 6299, - "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5619, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 5455, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-reload.js": 8761, - "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-restored-after-reload.js": 6904, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 4807, - "devtools/client/inspector/rules/test/browser_rules_grid-toggle_04.js": 4838, - "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 5442, - "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 7184, - "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 6389, - "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 6175, - "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 6418, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 5030, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 5122, - "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 4720, - "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 4645, - "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 4811, - "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 4871, - "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 4820, - "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 5559, - "devtools/client/inspector/rules/test/browser_rules_original-source-link2.js": 5985, - "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 8034, - "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 5297, - "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 5214, - "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 5550, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 5336, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 4980, - "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 4906, - "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 5430, - "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 6914, - "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 5063, - "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 4847, - "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 4847, - "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 4781, - "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 4744, - "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 4896, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 4864, - "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 4627, - "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 5710, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_01.js": 4771, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_03.js": 4748, - "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_06.js": 4733, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 5891, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 6545, - "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 5016, - "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 4928, - "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 5545, - "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 19357, - "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 6304, - "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 13183, - "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 12746, - "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 5346, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 6905, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-closes-on-new-selection.js": 5871, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 6002, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 6381, - "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 5024, - "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 5433, - "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 5218, - "devtools/client/inspector/test/browser_inspector_addNode_01.js": 5368, - "devtools/client/inspector/test/browser_inspector_addNode_02.js": 4632, - "devtools/client/inspector/test/browser_inspector_addNode_03.js": 5244, - "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 7683, - "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 6532, - "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 4802, - "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 5981, - "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 11539, - "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 5437, - "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 6119, - "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 4741, - "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 6794, - "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 5142, - "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 9080, - "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 5569, - "devtools/client/inspector/test/browser_inspector_highlighter-05.js": 6244, - "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 6461, - "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 6288, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_01.js": 4769, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_03.js": 5057, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_04.js": 7146, - "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_05.js": 6031, - "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4712, - "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 5325, - "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 5701, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 4983, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 4884, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 5380, - "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 6262, - "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 5988, - "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 6095, - "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 5429, - "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 6775, - "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 14205, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 5559, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 6046, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 5237, - "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 4846, - "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 4672, - "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 7775, - "devtools/client/inspector/test/browser_inspector_highlighter-rect_01.js": 5657, - "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 5032, - "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 5272, - "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 4754, - "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 5788, - "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 5060, - "devtools/client/inspector/test/browser_inspector_infobar_01.js": 9481, - "devtools/client/inspector/test/browser_inspector_infobar_02.js": 5976, - "devtools/client/inspector/test/browser_inspector_infobar_03.js": 5218, - "devtools/client/inspector/test/browser_inspector_infobar_04.js": 5932, - "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 7665, - "devtools/client/inspector/test/browser_inspector_initialization.js": 10847, - "devtools/client/inspector/test/browser_inspector_invalidate.js": 4987, - "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 9619, - "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 5627, - "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 5758, - "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 9195, - "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 11034, - "devtools/client/inspector/test/browser_inspector_navigation.js": 11571, - "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 6423, - "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 4764, - "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 5365, - "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 5250, - "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 7147, - "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 8837, - "devtools/client/inspector/test/browser_inspector_reload-01.js": 5066, - "devtools/client/inspector/test/browser_inspector_reload-02.js": 4851, - "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 5056, - "devtools/client/inspector/test/browser_inspector_search-01.js": 9071, - "devtools/client/inspector/test/browser_inspector_search-02.js": 6023, - "devtools/client/inspector/test/browser_inspector_search-03.js": 6308, - "devtools/client/inspector/test/browser_inspector_search-04.js": 4655, - "devtools/client/inspector/test/browser_inspector_search-05.js": 10229, - "devtools/client/inspector/test/browser_inspector_search-06.js": 8232, - "devtools/client/inspector/test/browser_inspector_search-07.js": 4619, - "devtools/client/inspector/test/browser_inspector_search-clear.js": 4628, - "devtools/client/inspector/test/browser_inspector_search-label.js": 4817, - "devtools/client/inspector/test/browser_inspector_search-navigation.js": 6501, - "devtools/client/inspector/test/browser_inspector_search-reserved.js": 5801, - "devtools/client/inspector/test/browser_inspector_search-selection.js": 9783, - "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 6573, - "devtools/client/inspector/test/browser_inspector_search-suggests-ids-and-classes.js": 5142, - "devtools/client/inspector/test/browser_inspector_select-docshell.js": 5066, - "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 13426, - "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 9348, - "devtools/client/inspector/test/browser_inspector_startup.js": 5377, - "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 6253, - "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 4735, - "devtools/client/memory/test/browser/browser_memory_diff_01.js": 4687, - "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 15806, - "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 5258, - "devtools/client/memory/test/browser/browser_memory_filter_01.js": 5096, - "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 8125, - "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 5934, - "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 4629, - "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 11909, - "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 12460, - "devtools/client/netmonitor/test/browser_net_api-calls.js": 5551, - "devtools/client/netmonitor/test/browser_net_autoscroll.js": 13333, - "devtools/client/netmonitor/test/browser_net_brotli.js": 5644, - "devtools/client/netmonitor/test/browser_net_cached-status.js": 5228, - "devtools/client/netmonitor/test/browser_net_cause.js": 6582, - "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 4995, - "devtools/client/netmonitor/test/browser_net_cause_source_map.js": 5906, - "devtools/client/netmonitor/test/browser_net_columns_showhide.js": 5817, - "devtools/client/netmonitor/test/browser_net_complex-params.js": 7964, - "devtools/client/netmonitor/test/browser_net_content-type.js": 9523, - "devtools/client/netmonitor/test/browser_net_cors_requests.js": 5064, - "devtools/client/netmonitor/test/browser_net_curl-utils.js": 5689, - "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 4944, - "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 5226, - "devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js": 5408, - "devtools/client/netmonitor/test/browser_net_filter-01.js": 12155, - "devtools/client/netmonitor/test/browser_net_filter-02.js": 13763, - "devtools/client/netmonitor/test/browser_net_filter-03.js": 11209, - "devtools/client/netmonitor/test/browser_net_filter-04.js": 6380, - "devtools/client/netmonitor/test/browser_net_filter-autocomplete.js": 8275, - "devtools/client/netmonitor/test/browser_net_filter-flags.js": 14085, - "devtools/client/netmonitor/test/browser_net_footer-summary.js": 12200, - "devtools/client/netmonitor/test/browser_net_frame.js": 9526, - "devtools/client/netmonitor/test/browser_net_header-docs.js": 4735, - "devtools/client/netmonitor/test/browser_net_html-preview.js": 5071, - "devtools/client/netmonitor/test/browser_net_icon-preview.js": 8044, - "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 6554, - "devtools/client/netmonitor/test/browser_net_json-b64.js": 4862, - "devtools/client/netmonitor/test/browser_net_json-long.js": 36479, - "devtools/client/netmonitor/test/browser_net_json-malformed.js": 5365, - "devtools/client/netmonitor/test/browser_net_json-null.js": 4997, - "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 4939, - "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 4766, - "devtools/client/netmonitor/test/browser_net_jsonp.js": 5265, - "devtools/client/netmonitor/test/browser_net_large-response.js": 5710, - "devtools/client/netmonitor/test/browser_net_open_in_debugger.js": 8970, - "devtools/client/netmonitor/test/browser_net_open_in_style_editor.js": 8921, - "devtools/client/netmonitor/test/browser_net_open_request_in_tab.js": 4654, - "devtools/client/netmonitor/test/browser_net_pane-collapse.js": 4991, - "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 6200, - "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5996, - "devtools/client/netmonitor/test/browser_net_post-data-02.js": 4745, - "devtools/client/netmonitor/test/browser_net_post-data-03.js": 4740, - "devtools/client/netmonitor/test/browser_net_post-data-04.js": 4621, - "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 16006, - "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5044, - "devtools/client/netmonitor/test/browser_net_reload-button.js": 4673, - "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 6672, - "devtools/client/netmonitor/test/browser_net_resend.js": 7298, - "devtools/client/netmonitor/test/browser_net_resend_cors.js": 6330, - "devtools/client/netmonitor/test/browser_net_security-details.js": 4725, - "devtools/client/netmonitor/test/browser_net_security-error.js": 4645, - "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5517, - "devtools/client/netmonitor/test/browser_net_security-redirect.js": 4727, - "devtools/client/netmonitor/test/browser_net_security-state.js": 6615, - "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 4921, - "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 6271, - "devtools/client/netmonitor/test/browser_net_security-warnings.js": 4979, - "devtools/client/netmonitor/test/browser_net_simple-request.js": 5200, - "devtools/client/netmonitor/test/browser_net_sort-01.js": 11528, - "devtools/client/netmonitor/test/browser_net_sort-02.js": 9794, - "devtools/client/netmonitor/test/browser_net_sort-03.js": 10545, - "devtools/client/netmonitor/test/browser_net_statistics-01.js": 7526, - "devtools/client/netmonitor/test/browser_net_statistics-02.js": 5183, - "devtools/client/netmonitor/test/browser_net_status-codes.js": 7089, - "devtools/client/netmonitor/test/browser_net_streaming-response.js": 5901, - "devtools/client/netmonitor/test/browser_net_throttle.js": 10446, - "devtools/client/netmonitor/test/browser_net_thumbnail-click.js": 5891, - "devtools/client/netmonitor/test/browser_net_timing-division.js": 7108, - "devtools/client/netmonitor/test/browser_net_truncate.js": 11198, - "devtools/client/netmonitor/test/browser_net_waterfall-click.js": 5739, - "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 6182, - "devtools/client/performance/test/browser_perf-button-states.js": 6725, - "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 9112, - "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 9434, - "devtools/client/performance/test/browser_perf-calltree-js-events.js": 6792, - "devtools/client/performance/test/browser_perf-calltree-memory-columns.js": 6409, - "devtools/client/performance/test/browser_perf-console-record-01.js": 7078, - "devtools/client/performance/test/browser_perf-console-record-02.js": 11579, - "devtools/client/performance/test/browser_perf-console-record-03.js": 7576, - "devtools/client/performance/test/browser_perf-console-record-04.js": 8773, - "devtools/client/performance/test/browser_perf-console-record-05.js": 9820, - "devtools/client/performance/test/browser_perf-console-record-06.js": 12894, - "devtools/client/performance/test/browser_perf-console-record-07.js": 13701, - "devtools/client/performance/test/browser_perf-console-record-08.js": 22183, - "devtools/client/performance/test/browser_perf-console-record-09.js": 9287, - "devtools/client/performance/test/browser_perf-details-01-toggle.js": 7019, - "devtools/client/performance/test/browser_perf-details-02-utility-fun.js": 6954, - "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 8960, - "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 8245, - "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 8262, - "devtools/client/performance/test/browser_perf-details-06-rerender-on-selection.js": 6886, - "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 8481, - "devtools/client/performance/test/browser_perf-details-render-00-waterfall.js": 7845, - "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 8114, - "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 8254, - "devtools/client/performance/test/browser_perf-details-render-03-memory-calltree.js": 7941, - "devtools/client/performance/test/browser_perf-details-render-04-memory-flamegraph.js": 8342, - "devtools/client/performance/test/browser_perf-docload.js": 7069, - "devtools/client/performance/test/browser_perf-highlighted.js": 8320, - "devtools/client/performance/test/browser_perf-loading-01.js": 6333, - "devtools/client/performance/test/browser_perf-loading-02.js": 8344, - "devtools/client/performance/test/browser_perf-options-02-toggle-throw-alt.js": 6292, - "devtools/client/performance/test/browser_perf-options-enable-framerate-01.js": 7671, - "devtools/client/performance/test/browser_perf-options-enable-framerate-02.js": 7295, - "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 8797, - "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 8801, - "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-01.js": 6720, - "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-02.js": 6575, - "devtools/client/performance/test/browser_perf-options-invert-call-tree-01.js": 7110, - "devtools/client/performance/test/browser_perf-options-invert-call-tree-02.js": 6449, - "devtools/client/performance/test/browser_perf-options-invert-flame-graph-01.js": 6702, - "devtools/client/performance/test/browser_perf-options-invert-flame-graph-02.js": 6569, - "devtools/client/performance/test/browser_perf-options-propagate-allocations.js": 6465, - "devtools/client/performance/test/browser_perf-options-propagate-profiler.js": 6099, - "devtools/client/performance/test/browser_perf-options-show-idle-blocks-01.js": 6688, - "devtools/client/performance/test/browser_perf-options-show-idle-blocks-02.js": 6563, - "devtools/client/performance/test/browser_perf-options-show-platform-data-01.js": 12699, - "devtools/client/performance/test/browser_perf-options-show-platform-data-02.js": 7351, - "devtools/client/performance/test/browser_perf-overview-render-01.js": 7805, - "devtools/client/performance/test/browser_perf-overview-render-02.js": 8223, - "devtools/client/performance/test/browser_perf-overview-render-03.js": 6732, - "devtools/client/performance/test/browser_perf-overview-render-04.js": 8012, - "devtools/client/performance/test/browser_perf-overview-selection-01.js": 6327, - "devtools/client/performance/test/browser_perf-overview-selection-02.js": 8316, - "devtools/client/performance/test/browser_perf-overview-selection-03.js": 6726, - "devtools/client/performance/test/browser_perf-overview-time-interval.js": 6344, - "devtools/client/performance/test/browser_perf-private-browsing.js": 5318, - "devtools/client/performance/test/browser_perf-range-changed-render.js": 7714, - "devtools/client/performance/test/browser_perf-recording-notices-01.js": 6330, - "devtools/client/performance/test/browser_perf-recording-notices-02.js": 8305, - "devtools/client/performance/test/browser_perf-recording-notices-04.js": 6193, - "devtools/client/performance/test/browser_perf-recording-selected-01.js": 9389, - "devtools/client/performance/test/browser_perf-recording-selected-02.js": 9099, - "devtools/client/performance/test/browser_perf-recording-selected-03.js": 9054, - "devtools/client/performance/test/browser_perf-recording-selected-04.js": 11716, - "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 8528, - "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 9891, - "devtools/client/performance/test/browser_perf-refresh.js": 7887, - "devtools/client/performance/test/browser_perf-states.js": 7421, - "devtools/client/performance/test/browser_perf-telemetry-01.js": 9517, - "devtools/client/performance/test/browser_perf-telemetry-02.js": 7484, - "devtools/client/performance/test/browser_perf-telemetry-03.js": 7382, - "devtools/client/performance/test/browser_perf-telemetry-04.js": 7682, - "devtools/client/performance/test/browser_perf-ui-recording.js": 6814, - "devtools/client/performance/test/browser_timeline-waterfall-background.js": 8786, - "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 8999, - "devtools/client/projecteditor/test/browser_projecteditor_delete_file.js": 5089, - "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 4754, - "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 5282, - "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 6274, - "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 6264, - "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 5020, - "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 4680, - "devtools/client/responsivedesign/test/browser_responsivecomputedview.js": 7348, - "devtools/client/responsivedesign/test/browser_responsiveruleview.js": 6732, - "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 5865, - "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 6964, - "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 7579, - "devtools/client/shared/test/browser_telemetry_button_paintflashing.js": 5656, - "devtools/client/shared/test/browser_telemetry_button_responsive.js": 5560, - "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 7776, - "devtools/client/shared/test/browser_telemetry_sidebar.js": 9719, - "devtools/client/shared/test/browser_telemetry_toolbox.js": 10905, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 6972, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 6941, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 5400, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 5829, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 6201, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 4941, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js": 5248, - "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 5253, - "devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js": 6160, - "devtools/client/sourceeditor/test/browser_codemirror.js": 4888, - "devtools/client/sourceeditor/test/browser_vimemacs.js": 47559, - "devtools/client/storage/test/browser_storage_basic.js": 8020, - "devtools/client/storage/test/browser_storage_basic_usercontextid_1.js": 6343, - "devtools/client/storage/test/browser_storage_basic_usercontextid_2.js": 6802, - "devtools/client/storage/test/browser_storage_basic_with_fragment.js": 6413, - "devtools/client/storage/test/browser_storage_cache_delete.js": 5384, - "devtools/client/storage/test/browser_storage_cookies_add.js": 5518, - "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 6088, - "devtools/client/storage/test/browser_storage_cookies_edit.js": 6426, - "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 5858, - "devtools/client/storage/test/browser_storage_delete.js": 7215, - "devtools/client/storage/test/browser_storage_delete_all.js": 7312, - "devtools/client/storage/test/browser_storage_delete_tree.js": 6878, - "devtools/client/storage/test/browser_storage_delete_usercontextid.js": 12717, - "devtools/client/storage/test/browser_storage_dom_cache_disabled.js": 6362, - "devtools/client/storage/test/browser_storage_dynamic_updates.js": 6765, - "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 5638, - "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 4885, - "devtools/client/storage/test/browser_storage_indexeddb_delete.js": 4657, - "devtools/client/storage/test/browser_storage_indexeddb_duplicate_names.js": 4625, - "devtools/client/storage/test/browser_storage_localstorage_add.js": 5140, - "devtools/client/storage/test/browser_storage_localstorage_edit.js": 5565, - "devtools/client/storage/test/browser_storage_overflow.js": 10971, - "devtools/client/storage/test/browser_storage_sessionstorage_add.js": 5173, - "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5616, - "devtools/client/storage/test/browser_storage_sidebar.js": 8371, - "devtools/client/storage/test/browser_storage_sidebar_toggle.js": 5668, - "devtools/client/storage/test/browser_storage_values.js": 7964, - "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 4915, - "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 6954, - "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 5042, - "devtools/client/styleeditor/test/browser_styleeditor_new.js": 4960, - "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 8555, - "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 6086, - "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 6790, - "devtools/client/styleeditor/test/browser_styleeditor_sync.js": 13270, - "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 6001, - "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 6052, - "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 6090, - "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 5715, - "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 7828, - "devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js": 5015, - "devtools/client/webaudioeditor/test/browser_wa_destroy-node-01.js": 4842, - "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 6853, - "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 9220, - "devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/browser_webconsole_check_stubs_console_api.js": 6083, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 7183, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 5547, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters_persist.js": 9387, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_debugger_link.js": 5895, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_scratchpad_link.js": 5607, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_styleeditor_link.js": 5394, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_nodes_select.js": 5829, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js": 4757, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_scroll.js": 5061, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_error.js": 5280, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_nosource.js": 6324, - "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_warn_about_replaced_api.js": 6853, - "devtools/client/webconsole/test/browser_bug_862916_console_dir_and_filter_off.js": 4852, - "devtools/client/webconsole/test/browser_cached_messages.js": 5727, - "devtools/client/webconsole/test/browser_console_filters.js": 5481, - "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 10031, - "devtools/client/webconsole/test/browser_console_history_persist.js": 7948, - "devtools/client/webconsole/test/browser_console_iframe_messages.js": 6600, - "devtools/client/webconsole/test/browser_console_native_getters.js": 7380, - "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 4984, - "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 6229, - "devtools/client/webconsole/test/browser_console_private_browsing.js": 8996, - "devtools/client/webconsole/test/browser_console_server_logging.js": 6682, - "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 4965, - "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 6534, - "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 15021, - "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 6418, - "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 7408, - "devtools/client/webconsole/test/browser_jsterm_inspect.js": 7508, - "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 6415, - "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 4634, - "devtools/client/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js": 4644, - "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 8906, - "devtools/client/webconsole/test/browser_webconsole_bug_595350_multiple_windows_and_tabs.js": 6850, - "devtools/client/webconsole/test/browser_webconsole_bug_595934_message_categories.js": 9213, - "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 8038, - "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 5957, - "devtools/client/webconsole/test/browser_webconsole_bug_613642_maintain_scroll.js": 4806, - "devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js": 4955, - "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 5859, - "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 7488, - "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 4845, - "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 5619, - "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 15571, - "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 10938, - "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 5996, - "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 4662, - "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 7804, - "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 10136, - "devtools/client/webconsole/test/browser_webconsole_netlogging.js": 20548, - "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 4860, - "devtools/client/webconsole/test/browser_webconsole_output_01.js": 6168, - "devtools/client/webconsole/test/browser_webconsole_output_02.js": 8660, - "devtools/client/webconsole/test/browser_webconsole_output_03.js": 7693, - "devtools/client/webconsole/test/browser_webconsole_output_04.js": 6705, - "devtools/client/webconsole/test/browser_webconsole_output_05.js": 8054, - "devtools/client/webconsole/test/browser_webconsole_output_06.js": 12333, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 5889, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_02.js": 11649, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_03.js": 5047, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_04.js": 8622, - "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 8407, - "devtools/client/webconsole/test/browser_webconsole_split.js": 17554, - "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 5579, - "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 4700, - "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 12517, - "devtools/client/webconsole/test/browser_webconsole_view_source.js": 7309, - "devtools/server/tests/browser/browser_markers-cycle-collection.js": 13330, - "devtools/server/tests/browser/browser_storage_cookies-duplicate-names.js": 6196, - "devtools/server/tests/browser/browser_storage_dynamic_windows.js": 4992, - "devtools/server/tests/browser/browser_storage_listings.js": 4871, + "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 10925, + "devtools/client/aboutdebugging/test/browser_addons_debug_info.js": 6014, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 11755, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 11262, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 11217, + "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 10958, + "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 5865, + "devtools/client/aboutdebugging/test/browser_addons_reload.js": 5484, + "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 5813, + "devtools/client/aboutdebugging/test/browser_service_workers_push.js": 29415, + "devtools/client/aboutdebugging/test/browser_service_workers_push_service.js": 29953, + "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 5152, + "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 4743, + "devtools/client/commandline/test/browser_cmd_addon.js": 5312, + "devtools/client/commandline/test/browser_cmd_commands.js": 4915, + "devtools/client/commandline/test/browser_cmd_csscoverage_startstop.js": 5247, + "devtools/client/commandline/test/browser_cmd_highlight_04.js": 8023, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 7179, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 9496, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 6806, + "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 12290, + "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 10108, + "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 12733, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 7846, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 5898, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 7228, + "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 16329, + "devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js": 7658, + "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 9124, + "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 13006, + "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 5784, + "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 8012, + "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 10460, + "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js": 7819, + "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 7923, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 5548, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reloading.js": 8179, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 13900, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js": 6133, + "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 7369, + "devtools/client/debugger/new/test/mochitest/browser_dbg-tabs.js": 13291, + "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 9276, + "devtools/client/debugger/test/mochitest/browser_dbg_aaa_run_first_leaktest.js": 6987, + "devtools/client/debugger/test/mochitest/browser_dbg_addon-modules-unpacked.js": 5029, + "devtools/client/debugger/test/mochitest/browser_dbg_addon-modules.js": 5403, + "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 5552, + "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4754, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 5281, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 5223, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 5218, + "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 5221, + "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 5385, + "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 4666, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 6803, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 4732, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 5078, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 5073, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 6478, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 5541, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 5812, + "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 5716, + "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 5004, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 5015, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 5906, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-break-on-last-line-of-script-on-reload.js": 6747, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4878, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-02.js": 4769, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-condition-thrown-message.js": 5719, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 5153, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 13721, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-disabled-reload.js": 9093, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-editor.js": 5288, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-eval.js": 4725, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-highlight.js": 5093, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-new-script.js": 5399, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-other-tabs.js": 7022, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-pane.js": 5408, + "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-reload.js": 5209, + "devtools/client/debugger/test/mochitest/browser_dbg_bug-896139.js": 5964, + "devtools/client/debugger/test/mochitest/browser_dbg_closure-inspection.js": 9366, + "devtools/client/debugger/test/mochitest/browser_dbg_cmd-blackbox.js": 6424, + "devtools/client/debugger/test/mochitest/browser_dbg_cmd-break.js": 5927, + "devtools/client/debugger/test/mochitest/browser_dbg_cmd-dbg.js": 6698, + "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 11945, + "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js": 6423, + "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-03.js": 5866, + "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-04.js": 5262, + "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-05.js": 7142, + "devtools/client/debugger/test/mochitest/browser_dbg_console-eval.js": 5528, + "devtools/client/debugger/test/mochitest/browser_dbg_console-named-eval.js": 5664, + "devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-01.js": 5482, + "devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-02.js": 5298, + "devtools/client/debugger/test/mochitest/browser_dbg_editor-contextmenu.js": 5319, + "devtools/client/debugger/test/mochitest/browser_dbg_editor-mode.js": 5209, + "devtools/client/debugger/test/mochitest/browser_dbg_file-reload.js": 4923, + "devtools/client/debugger/test/mochitest/browser_dbg_function-display-name.js": 5195, + "devtools/client/debugger/test/mochitest/browser_dbg_global-method-override.js": 4665, + "devtools/client/debugger/test/mochitest/browser_dbg_hide-toolbar-buttons.js": 4961, + "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 24115, + "devtools/client/debugger/test/mochitest/browser_dbg_iframes.js": 4997, + "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse.js": 4791, + "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js": 5448, + "devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js": 5694, + "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-01-simple.js": 5823, + "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-02-blank.js": 5121, + "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-03-new.js": 5856, + "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-04-breakpoint.js": 7180, + "devtools/client/debugger/test/mochitest/browser_dbg_no-dangling-breakpoints.js": 4803, + "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-highlight.js": 6455, + "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-raise.js": 6677, + "devtools/client/debugger/test/mochitest/browser_dbg_optimized-out-vars.js": 5498, + "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-01.js": 6136, + "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-02.js": 6528, + "devtools/client/debugger/test/mochitest/browser_dbg_pause-no-step.js": 5637, + "devtools/client/debugger/test/mochitest/browser_dbg_pause-resume.js": 4935, + "devtools/client/debugger/test/mochitest/browser_dbg_pause-warning.js": 8198, + "devtools/client/debugger/test/mochitest/browser_dbg_paused-keybindings.js": 6504, + "devtools/client/debugger/test/mochitest/browser_dbg_post-page.js": 4938, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-01.js": 5273, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-02.js": 5306, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-03.js": 5883, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-04.js": 5438, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-05.js": 4799, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-07.js": 4786, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-08.js": 5833, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-09.js": 5485, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-10.js": 5140, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-11.js": 5813, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-12.js": 5162, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-13.js": 5300, + "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-on-paused.js": 5924, + "devtools/client/debugger/test/mochitest/browser_dbg_progress-listener-bug.js": 5179, + "devtools/client/debugger/test/mochitest/browser_dbg_promises-allocation-stack.js": 5051, + "devtools/client/debugger/test/mochitest/browser_dbg_promises-fulfillment-stack.js": 4776, + "devtools/client/debugger/test/mochitest/browser_dbg_promises-rejection-stack.js": 4756, + "devtools/client/debugger/test/mochitest/browser_dbg_reload-preferred-script-02.js": 4961, + "devtools/client/debugger/test/mochitest/browser_dbg_reload-preferred-script-03.js": 4962, + "devtools/client/debugger/test/mochitest/browser_dbg_reload-same-script.js": 7352, + "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-01.js": 5860, + "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-02.js": 5812, + "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-03.js": 4637, + "devtools/client/debugger/test/mochitest/browser_dbg_search-autofill-identifier.js": 4863, + "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-01.js": 7125, + "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-02.js": 7456, + "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-03.js": 6264, + "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-04.js": 4978, + "devtools/client/debugger/test/mochitest/browser_dbg_search-global-01.js": 7042, + "devtools/client/debugger/test/mochitest/browser_dbg_search-global-02.js": 6241, + "devtools/client/debugger/test/mochitest/browser_dbg_search-global-03.js": 6359, + "devtools/client/debugger/test/mochitest/browser_dbg_search-global-04.js": 5852, + "devtools/client/debugger/test/mochitest/browser_dbg_search-global-05.js": 7218, + "devtools/client/debugger/test/mochitest/browser_dbg_search-global-06.js": 8635, + "devtools/client/debugger/test/mochitest/browser_dbg_search-popup-jank.js": 6270, + "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-01.js": 6590, + "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-02.js": 6369, + "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-03.js": 5454, + "devtools/client/debugger/test/mochitest/browser_dbg_search-symbols.js": 7088, + "devtools/client/debugger/test/mochitest/browser_dbg_searchbox-help-popup-01.js": 5695, + "devtools/client/debugger/test/mochitest/browser_dbg_searchbox-help-popup-02.js": 5404, + "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-01.js": 10666, + "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-02.js": 6832, + "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-03.js": 6057, + "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-04.js": 5422, + "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-05.js": 6784, + "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-01.js": 5895, + "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-02.js": 6763, + "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-03.js": 5768, + "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js": 6688, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-bookmarklet.js": 4972, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 5498, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-contextmenu-02.js": 5188, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-eval-02.js": 4803, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js": 5392, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-labels.js": 4810, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 5396, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-sorting.js": 4619, + "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 6448, + "devtools/client/debugger/test/mochitest/browser_dbg_stack-01.js": 5446, + "devtools/client/debugger/test/mochitest/browser_dbg_stack-02.js": 6282, + "devtools/client/debugger/test/mochitest/browser_dbg_stack-03.js": 4613, + "devtools/client/debugger/test/mochitest/browser_dbg_stack-contextmenu-01.js": 5113, + "devtools/client/debugger/test/mochitest/browser_dbg_step-out.js": 6387, + "devtools/client/debugger/test/mochitest/browser_dbg_terminate-on-tab-close.js": 5055, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-01.js": 4710, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-02.js": 4881, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-03.js": 4739, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-04.js": 4733, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-05.js": 4832, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-06.js": 5639, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-07.js": 5537, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-08.js": 5363, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-cancel.js": 5897, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-click.js": 5244, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 15720, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-02.js": 6750, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value-01.js": 10050, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value-02.js": 6366, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 9559, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-watch.js": 7787, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-01.js": 13366, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-02.js": 13948, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-03.js": 10745, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-04.js": 10395, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-05.js": 10646, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-pref.js": 5341, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-searchbox.js": 5061, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-01.js": 9608, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-02.js": 6519, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-03.js": 12588, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-with.js": 6475, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frozen-sealed-nonext.js": 5432, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 5415, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 16856, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-map-set.js": 7255, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-01.js": 10793, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-02.js": 5393, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-01.js": 7875, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-02.js": 6609, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-03.js": 5896, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-04.js": 5898, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-05.js": 5899, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-06.js": 5920, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-07.js": 7639, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-08.js": 6047, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-09.js": 6553, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-10.js": 6454, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-11.js": 7399, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-12.js": 7354, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-13.js": 9668, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-15.js": 6916, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-16.js": 13811, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-17.js": 6049, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 26923, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 31645, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-03.js": 6118, + "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-webidl.js": 12245, + "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-01.js": 6091, + "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-02.js": 11093, + "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js": 6032, + "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js": 9590, + "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js": 6083, + "devtools/client/debugger/test/mochitest/browser_dbg_worker-source-map.js": 9954, + "devtools/client/debugger/test/mochitest/browser_dbg_worker-window.js": 4882, + "devtools/client/dom/test/browser_dom_array.js": 11502, + "devtools/client/dom/test/browser_dom_basic.js": 10003, + "devtools/client/dom/test/browser_dom_refresh.js": 11615, + "devtools/client/framework/test/browser_browser_toolbox.js": 14762, + "devtools/client/framework/test/browser_keybindings_01.js": 6630, + "devtools/client/framework/test/browser_keybindings_02.js": 6178, + "devtools/client/framework/test/browser_new_activation_workflow.js": 7626, + "devtools/client/framework/test/browser_source_map-inline.js": 4685, + "devtools/client/framework/test/browser_toolbox_hosts.js": 13276, + "devtools/client/framework/test/browser_toolbox_hosts_size.js": 8670, + "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 4942, + "devtools/client/framework/test/browser_toolbox_options.js": 9428, + "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 6564, + "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 9104, + "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 13256, + "devtools/client/framework/test/browser_toolbox_races.js": 7875, + "devtools/client/framework/test/browser_toolbox_select_event.js": 19324, + "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 5117, + "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 12215, + "devtools/client/framework/test/browser_toolbox_toggle.js": 11449, + "devtools/client/framework/test/browser_toolbox_tool_ready.js": 20091, + "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 14150, + "devtools/client/framework/test/browser_toolbox_toolbar_overflow.js": 4613, + "devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js": 5464, + "devtools/client/framework/test/browser_toolbox_view_source_01.js": 4765, + "devtools/client/framework/test/browser_toolbox_view_source_03.js": 5049, + "devtools/client/framework/test/browser_toolbox_view_source_04.js": 5411, + "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 23446, + "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 9604, + "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 10478, + "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 6927, + "devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js": 10309, + "devtools/client/animationinspector/test/browser_animation_animated_properties_for_delayed_starttime_animations.js": 5954, + "devtools/client/animationinspector/test/browser_animation_animated_properties_path.js": 6085, + "devtools/client/animationinspector/test/browser_animation_animated_properties_progress_indicator.js": 7245, + "devtools/client/animationinspector/test/browser_animation_click_selects_animation.js": 9920, + "devtools/client/animationinspector/test/browser_animation_controller_exposes_document_currentTime.js": 10620, + "devtools/client/animationinspector/test/browser_animation_detail_displayed.js": 6401, + "devtools/client/animationinspector/test/browser_animation_empty_on_invalid_nodes.js": 9727, + "devtools/client/animationinspector/test/browser_animation_keyframe_click_to_set_time.js": 5929, + "devtools/client/animationinspector/test/browser_animation_keyframe_markers.js": 8722, + "devtools/client/animationinspector/test/browser_animation_mutations_with_same_names.js": 5005, + "devtools/client/animationinspector/test/browser_animation_participate_in_inspector_update.js": 8673, + "devtools/client/animationinspector/test/browser_animation_playerFronts_are_refreshed.js": 9964, + "devtools/client/animationinspector/test/browser_animation_playerWidgets_appear_on_panel_init.js": 6372, + "devtools/client/animationinspector/test/browser_animation_playerWidgets_target_nodes.js": 7762, + "devtools/client/animationinspector/test/browser_animation_pseudo_elements.js": 14193, + "devtools/client/animationinspector/test/browser_animation_refresh_on_added_animation.js": 10529, + "devtools/client/animationinspector/test/browser_animation_refresh_on_removed_animation.js": 9822, + "devtools/client/animationinspector/test/browser_animation_refresh_when_active.js": 11279, + "devtools/client/animationinspector/test/browser_animation_running_on_compositor.js": 11095, + "devtools/client/animationinspector/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 9960, + "devtools/client/animationinspector/test/browser_animation_shows_player_on_valid_node.js": 10131, + "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js": 9824, + "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_node_animations.js": 13391, + "devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js": 6937, + "devtools/client/animationinspector/test/browser_animation_target_highlight_select.js": 10710, + "devtools/client/animationinspector/test/browser_animation_target_highlighter_lock.js": 9962, + "devtools/client/animationinspector/test/browser_animation_timeline_currentTime.js": 13059, + "devtools/client/animationinspector/test/browser_animation_timeline_header.js": 8965, + "devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js": 5254, + "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_01.js": 13241, + "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_02.js": 10091, + "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_03.js": 16815, + "devtools/client/animationinspector/test/browser_animation_timeline_rate_selector.js": 16320, + "devtools/client/animationinspector/test/browser_animation_timeline_rewind_button.js": 15680, + "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_exists.js": 6323, + "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_movable.js": 9314, + "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_moves.js": 11475, + "devtools/client/animationinspector/test/browser_animation_timeline_setCurrentTime.js": 10011, + "devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js": 5706, + "devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js": 10441, + "devtools/client/animationinspector/test/browser_animation_timeline_shows_endDelay.js": 8865, + "devtools/client/animationinspector/test/browser_animation_timeline_shows_iterations.js": 9966, + "devtools/client/animationinspector/test/browser_animation_timeline_shows_name_label.js": 9965, + "devtools/client/animationinspector/test/browser_animation_timeline_shows_time_info.js": 9132, + "devtools/client/animationinspector/test/browser_animation_timeline_takes_rate_into_account.js": 5973, + "devtools/client/animationinspector/test/browser_animation_timeline_ui.js": 6851, + "devtools/client/animationinspector/test/browser_animation_toggle_button_resets_on_navigate.js": 11224, + "devtools/client/animationinspector/test/browser_animation_toggle_button_toggles_animations.js": 9841, + "devtools/client/animationinspector/test/browser_animation_toolbar_exists.js": 9659, + "devtools/client/animationinspector/test/browser_animation_ui_updates_when_animation_data_changes.js": 10789, + "devtools/client/inspector/boxmodel/test/browser_boxmodel.js": 7419, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_computed-accordion-state.js": 8578, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel.js": 11542, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_bluronclick.js": 5792, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_border.js": 6964, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_pseudo.js": 6446, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_stylerules.js": 9054, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_guides.js": 5696, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_layout-accordion-state.js": 8350, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js": 6780, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_offsetparent.js": 6406, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_positions.js": 5978, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_properties.js": 5210, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_pseudo-element.js": 5131, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_rotate-labels-on-sides.js": 5336, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_sync.js": 6297, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-navigation.js": 11172, + "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-reload.js": 8367, + "devtools/client/inspector/components/test/browser_boxmodel.js": 8827, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 11818, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5915, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6812, + "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 9327, + "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 5861, + "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 5910, + "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 6497, + "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 6470, + "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 12153, + "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8544, + "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 7925, + "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 5298, + "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 5452, + "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 5600, + "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 5370, + "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 5964, + "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 5020, + "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 4812, + "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 5406, + "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 7155, + "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 6477, + "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 5523, + "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 7843, + "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6628, + "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 10012, + "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 6056, + "devtools/client/inspector/fonts/test/browser_fontinspector.js": 6699, + "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 4961, + "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 6174, + "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 5109, + "devtools/client/inspector/grids/test/browser_grids_accordion-state.js": 9712, + "devtools/client/inspector/grids/test/browser_grids_color-in-rules-grid-toggle.js": 5839, + "devtools/client/inspector/grids/test/browser_grids_display-setting-extend-grid-lines.js": 4866, + "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-ESC.js": 4687, + "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-RETURN.js": 4801, + "devtools/client/inspector/grids/test/browser_grids_grid-list-element-rep.js": 5009, + "devtools/client/inspector/grids/test/browser_grids_grid-list-on-iframe-reloaded.js": 5584, + "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-added.js": 6338, + "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-removed.js": 6218, + "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-multiple-grids.js": 6158, + "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-single-grid.js": 5730, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-cannot-show-outline.js": 5674, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-area.js": 5788, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-cell.js": 5802, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-selected-grid.js": 5310, + "devtools/client/inspector/grids/test/browser_grids_grid-outline-updates-on-grid-change.js": 5226, + "devtools/client/inspector/grids/test/browser_grids_highlighter-setting-rules-grid-toggle.js": 5325, + "devtools/client/inspector/grids/test/browser_grids_number-of-css-grids-telemetry.js": 5586, + "devtools/client/inspector/grids/test/browser_grids_restored-after-reload.js": 9966, + "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 7197, + "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 7231, + "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 5212, + "devtools/client/inspector/markup/test/browser_markup_anonymous_02.js": 9547, + "devtools/client/inspector/markup/test/browser_markup_anonymous_03.js": 5061, + "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 4719, + "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 7202, + "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 8848, + "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 6456, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 9708, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 10649, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 4666, + "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 8490, + "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 12488, + "devtools/client/inspector/markup/test/browser_markup_events1.js": 11020, + "devtools/client/inspector/markup/test/browser_markup_events2.js": 12192, + "devtools/client/inspector/markup/test/browser_markup_events3.js": 12712, + "devtools/client/inspector/markup/test/browser_markup_events_01.js": 7923, + "devtools/client/inspector/markup/test/browser_markup_events_02.js": 9836, + "devtools/client/inspector/markup/test/browser_markup_events_03.js": 8537, + "devtools/client/inspector/markup/test/browser_markup_events_04.js": 10698, + "devtools/client/inspector/markup/test/browser_markup_events_click_to_close.js": 5899, + "devtools/client/inspector/markup/test/browser_markup_events_form.js": 5090, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 9981, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 9286, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 9594, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 8909, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 11702, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 11902, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 13478, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 13243, + "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 11906, + "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1.js": 18463, + "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1_jsx.js": 16306, + "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1.js": 13810, + "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1_jsx.js": 14446, + "devtools/client/inspector/markup/test/browser_markup_events_source_map.js": 7744, + "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 14883, + "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 12561, + "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 10346, + "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 6130, + "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 5546, + "devtools/client/inspector/markup/test/browser_markup_keybindings_01.js": 4763, + "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 4841, + "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 6399, + "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 8151, + "devtools/client/inspector/markup/test/browser_markup_links_01.js": 7184, + "devtools/client/inspector/markup/test/browser_markup_links_02.js": 5452, + "devtools/client/inspector/markup/test/browser_markup_links_05.js": 6306, + "devtools/client/inspector/markup/test/browser_markup_links_06.js": 9114, + "devtools/client/inspector/markup/test/browser_markup_links_07.js": 6839, + "devtools/client/inspector/markup/test/browser_markup_load_01.js": 6863, + "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 7340, + "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 5534, + "devtools/client/inspector/markup/test/browser_markup_navigation.js": 10263, + "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 5831, + "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 5860, + "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 7476, + "devtools/client/inspector/markup/test/browser_markup_search_01.js": 8257, + "devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js": 7495, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 7493, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 4821, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 12556, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 11653, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 5938, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 6660, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 6553, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 6260, + "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 5046, + "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 6988, + "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 5972, + "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 5253, + "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 5140, + "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 5363, + "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 5422, + "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 4693, + "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 6842, + "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 4619, + "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 4653, + "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 4658, + "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 5999, + "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 5578, + "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 7790, + "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 5273, + "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 6491, + "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 5911, + "devtools/client/inspector/rules/test/browser_rules_class_panel_add.js": 4875, + "devtools/client/inspector/rules/test/browser_rules_class_panel_content.js": 5007, + "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 10119, + "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 4989, + "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 8882, + "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 8534, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 6660, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 9523, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 5071, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 5118, + "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 5092, + "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 4931, + "devtools/client/inspector/rules/test/browser_rules_content_02.js": 5008, + "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 7424, + "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 4862, + "devtools/client/inspector/rules/test/browser_rules_custom.js": 5681, + "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 5142, + "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 5495, + "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 4947, + "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 9524, + "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 6965, + "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 5094, + "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 5242, + "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 7622, + "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 6453, + "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 5226, + "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 4738, + "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 5499, + "devtools/client/inspector/rules/test/browser_rules_edit-property_06.js": 5018, + "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 4829, + "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 4656, + "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 5374, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 5126, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 5377, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 5330, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 5081, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 4676, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 4650, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 5749, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 5037, + "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 4729, + "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 4721, + "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 7620, + "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 6299, + "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5619, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 5455, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-reload.js": 8761, + "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-restored-after-reload.js": 6904, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 4807, + "devtools/client/inspector/rules/test/browser_rules_grid-toggle_04.js": 4838, + "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 5442, + "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 7184, + "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 6389, + "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 6175, + "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 6418, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 5030, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 5122, + "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 4720, + "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 4645, + "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 4811, + "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 4871, + "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 4820, + "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 5559, + "devtools/client/inspector/rules/test/browser_rules_original-source-link2.js": 5985, + "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 8034, + "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 5297, + "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 5214, + "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 5550, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 5336, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 4980, + "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 4906, + "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 5430, + "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 6914, + "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 5063, + "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 4847, + "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 4847, + "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 4781, + "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 4744, + "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 4896, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 4864, + "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 4627, + "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 5710, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_01.js": 4771, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_03.js": 4748, + "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_06.js": 4733, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 5891, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 6545, + "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 5016, + "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 4928, + "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 5545, + "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 19357, + "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 6304, + "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 13183, + "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 12746, + "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 5346, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 6905, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-closes-on-new-selection.js": 5871, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 6002, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 6381, + "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 5024, + "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 5433, + "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 5218, + "devtools/client/inspector/test/browser_inspector_addNode_01.js": 5368, + "devtools/client/inspector/test/browser_inspector_addNode_02.js": 4632, + "devtools/client/inspector/test/browser_inspector_addNode_03.js": 5244, + "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 7683, + "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 6532, + "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 4802, + "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 5981, + "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 11539, + "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 5437, + "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 6119, + "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 4741, + "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 6794, + "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 5142, + "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 9080, + "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 5569, + "devtools/client/inspector/test/browser_inspector_highlighter-05.js": 6244, + "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 6461, + "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 6288, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_01.js": 4769, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_03.js": 5057, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_04.js": 7146, + "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_05.js": 6031, + "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4712, + "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 5325, + "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 5701, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 4983, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 4884, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 5380, + "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 6262, + "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 5988, + "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 6095, + "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 5429, + "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 6775, + "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 14205, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 5559, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 6046, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 5237, + "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 4846, + "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 4672, + "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 7775, + "devtools/client/inspector/test/browser_inspector_highlighter-rect_01.js": 5657, + "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 5032, + "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 5272, + "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 4754, + "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 5788, + "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 5060, + "devtools/client/inspector/test/browser_inspector_infobar_01.js": 9481, + "devtools/client/inspector/test/browser_inspector_infobar_02.js": 5976, + "devtools/client/inspector/test/browser_inspector_infobar_03.js": 5218, + "devtools/client/inspector/test/browser_inspector_infobar_04.js": 5932, + "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 7665, + "devtools/client/inspector/test/browser_inspector_initialization.js": 10847, + "devtools/client/inspector/test/browser_inspector_invalidate.js": 4987, + "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 9619, + "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 5627, + "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 5758, + "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 9195, + "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 11034, + "devtools/client/inspector/test/browser_inspector_navigation.js": 11571, + "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 6423, + "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 4764, + "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 5365, + "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 5250, + "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 7147, + "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 8837, + "devtools/client/inspector/test/browser_inspector_reload-01.js": 5066, + "devtools/client/inspector/test/browser_inspector_reload-02.js": 4851, + "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 5056, + "devtools/client/inspector/test/browser_inspector_search-01.js": 9071, + "devtools/client/inspector/test/browser_inspector_search-02.js": 6023, + "devtools/client/inspector/test/browser_inspector_search-03.js": 6308, + "devtools/client/inspector/test/browser_inspector_search-04.js": 4655, + "devtools/client/inspector/test/browser_inspector_search-05.js": 10229, + "devtools/client/inspector/test/browser_inspector_search-06.js": 8232, + "devtools/client/inspector/test/browser_inspector_search-07.js": 4619, + "devtools/client/inspector/test/browser_inspector_search-clear.js": 4628, + "devtools/client/inspector/test/browser_inspector_search-label.js": 4817, + "devtools/client/inspector/test/browser_inspector_search-navigation.js": 6501, + "devtools/client/inspector/test/browser_inspector_search-reserved.js": 5801, + "devtools/client/inspector/test/browser_inspector_search-selection.js": 9783, + "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 6573, + "devtools/client/inspector/test/browser_inspector_search-suggests-ids-and-classes.js": 5142, + "devtools/client/inspector/test/browser_inspector_select-docshell.js": 5066, + "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 13426, + "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 9348, + "devtools/client/inspector/test/browser_inspector_startup.js": 5377, + "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 6253, + "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 4735, + "devtools/client/memory/test/browser/browser_memory_diff_01.js": 4687, + "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 15806, + "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 5258, + "devtools/client/memory/test/browser/browser_memory_filter_01.js": 5096, + "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 8125, + "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 5934, + "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 4629, + "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 11909, + "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 12460, + "devtools/client/netmonitor/test/browser_net_api-calls.js": 5551, + "devtools/client/netmonitor/test/browser_net_autoscroll.js": 13333, + "devtools/client/netmonitor/test/browser_net_brotli.js": 5644, + "devtools/client/netmonitor/test/browser_net_cached-status.js": 5228, + "devtools/client/netmonitor/test/browser_net_cause.js": 6582, + "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 4995, + "devtools/client/netmonitor/test/browser_net_cause_source_map.js": 5906, + "devtools/client/netmonitor/test/browser_net_columns_showhide.js": 5817, + "devtools/client/netmonitor/test/browser_net_complex-params.js": 7964, + "devtools/client/netmonitor/test/browser_net_content-type.js": 9523, + "devtools/client/netmonitor/test/browser_net_cors_requests.js": 5064, + "devtools/client/netmonitor/test/browser_net_curl-utils.js": 5689, + "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 4944, + "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 5226, + "devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js": 5408, + "devtools/client/netmonitor/test/browser_net_filter-01.js": 12155, + "devtools/client/netmonitor/test/browser_net_filter-02.js": 13763, + "devtools/client/netmonitor/test/browser_net_filter-03.js": 11209, + "devtools/client/netmonitor/test/browser_net_filter-04.js": 6380, + "devtools/client/netmonitor/test/browser_net_filter-autocomplete.js": 8275, + "devtools/client/netmonitor/test/browser_net_filter-flags.js": 14085, + "devtools/client/netmonitor/test/browser_net_footer-summary.js": 12200, + "devtools/client/netmonitor/test/browser_net_frame.js": 9526, + "devtools/client/netmonitor/test/browser_net_header-docs.js": 4735, + "devtools/client/netmonitor/test/browser_net_html-preview.js": 5071, + "devtools/client/netmonitor/test/browser_net_icon-preview.js": 8044, + "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 6554, + "devtools/client/netmonitor/test/browser_net_json-b64.js": 4862, + "devtools/client/netmonitor/test/browser_net_json-long.js": 36479, + "devtools/client/netmonitor/test/browser_net_json-malformed.js": 5365, + "devtools/client/netmonitor/test/browser_net_json-null.js": 4997, + "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 4939, + "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 4766, + "devtools/client/netmonitor/test/browser_net_jsonp.js": 5265, + "devtools/client/netmonitor/test/browser_net_large-response.js": 5710, + "devtools/client/netmonitor/test/browser_net_open_in_debugger.js": 8970, + "devtools/client/netmonitor/test/browser_net_open_in_style_editor.js": 8921, + "devtools/client/netmonitor/test/browser_net_open_request_in_tab.js": 4654, + "devtools/client/netmonitor/test/browser_net_pane-collapse.js": 4991, + "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 6200, + "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5996, + "devtools/client/netmonitor/test/browser_net_post-data-02.js": 4745, + "devtools/client/netmonitor/test/browser_net_post-data-03.js": 4740, + "devtools/client/netmonitor/test/browser_net_post-data-04.js": 4621, + "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 16006, + "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5044, + "devtools/client/netmonitor/test/browser_net_reload-button.js": 4673, + "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 6672, + "devtools/client/netmonitor/test/browser_net_resend.js": 7298, + "devtools/client/netmonitor/test/browser_net_resend_cors.js": 6330, + "devtools/client/netmonitor/test/browser_net_security-details.js": 4725, + "devtools/client/netmonitor/test/browser_net_security-error.js": 4645, + "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5517, + "devtools/client/netmonitor/test/browser_net_security-redirect.js": 4727, + "devtools/client/netmonitor/test/browser_net_security-state.js": 6615, + "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 4921, + "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 6271, + "devtools/client/netmonitor/test/browser_net_security-warnings.js": 4979, + "devtools/client/netmonitor/test/browser_net_simple-request.js": 5200, + "devtools/client/netmonitor/test/browser_net_sort-01.js": 11528, + "devtools/client/netmonitor/test/browser_net_sort-02.js": 9794, + "devtools/client/netmonitor/test/browser_net_sort-03.js": 10545, + "devtools/client/netmonitor/test/browser_net_statistics-01.js": 7526, + "devtools/client/netmonitor/test/browser_net_statistics-02.js": 5183, + "devtools/client/netmonitor/test/browser_net_status-codes.js": 7089, + "devtools/client/netmonitor/test/browser_net_streaming-response.js": 5901, + "devtools/client/netmonitor/test/browser_net_throttle.js": 10446, + "devtools/client/netmonitor/test/browser_net_thumbnail-click.js": 5891, + "devtools/client/netmonitor/test/browser_net_timing-division.js": 7108, + "devtools/client/netmonitor/test/browser_net_truncate.js": 11198, + "devtools/client/netmonitor/test/browser_net_waterfall-click.js": 5739, + "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 6182, + "devtools/client/performance/test/browser_perf-button-states.js": 6725, + "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 9112, + "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 9434, + "devtools/client/performance/test/browser_perf-calltree-js-events.js": 6792, + "devtools/client/performance/test/browser_perf-calltree-memory-columns.js": 6409, + "devtools/client/performance/test/browser_perf-console-record-01.js": 7078, + "devtools/client/performance/test/browser_perf-console-record-02.js": 11579, + "devtools/client/performance/test/browser_perf-console-record-03.js": 7576, + "devtools/client/performance/test/browser_perf-console-record-04.js": 8773, + "devtools/client/performance/test/browser_perf-console-record-05.js": 9820, + "devtools/client/performance/test/browser_perf-console-record-06.js": 12894, + "devtools/client/performance/test/browser_perf-console-record-07.js": 13701, + "devtools/client/performance/test/browser_perf-console-record-08.js": 22183, + "devtools/client/performance/test/browser_perf-console-record-09.js": 9287, + "devtools/client/performance/test/browser_perf-details-01-toggle.js": 7019, + "devtools/client/performance/test/browser_perf-details-02-utility-fun.js": 6954, + "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 8960, + "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 8245, + "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 8262, + "devtools/client/performance/test/browser_perf-details-06-rerender-on-selection.js": 6886, + "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 8481, + "devtools/client/performance/test/browser_perf-details-render-00-waterfall.js": 7845, + "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 8114, + "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 8254, + "devtools/client/performance/test/browser_perf-details-render-03-memory-calltree.js": 7941, + "devtools/client/performance/test/browser_perf-details-render-04-memory-flamegraph.js": 8342, + "devtools/client/performance/test/browser_perf-docload.js": 7069, + "devtools/client/performance/test/browser_perf-highlighted.js": 8320, + "devtools/client/performance/test/browser_perf-loading-01.js": 6333, + "devtools/client/performance/test/browser_perf-loading-02.js": 8344, + "devtools/client/performance/test/browser_perf-options-02-toggle-throw-alt.js": 6292, + "devtools/client/performance/test/browser_perf-options-enable-framerate-01.js": 7671, + "devtools/client/performance/test/browser_perf-options-enable-framerate-02.js": 7295, + "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 8797, + "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 8801, + "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-01.js": 6720, + "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-02.js": 6575, + "devtools/client/performance/test/browser_perf-options-invert-call-tree-01.js": 7110, + "devtools/client/performance/test/browser_perf-options-invert-call-tree-02.js": 6449, + "devtools/client/performance/test/browser_perf-options-invert-flame-graph-01.js": 6702, + "devtools/client/performance/test/browser_perf-options-invert-flame-graph-02.js": 6569, + "devtools/client/performance/test/browser_perf-options-propagate-allocations.js": 6465, + "devtools/client/performance/test/browser_perf-options-propagate-profiler.js": 6099, + "devtools/client/performance/test/browser_perf-options-show-idle-blocks-01.js": 6688, + "devtools/client/performance/test/browser_perf-options-show-idle-blocks-02.js": 6563, + "devtools/client/performance/test/browser_perf-options-show-platform-data-01.js": 12699, + "devtools/client/performance/test/browser_perf-options-show-platform-data-02.js": 7351, + "devtools/client/performance/test/browser_perf-overview-render-01.js": 7805, + "devtools/client/performance/test/browser_perf-overview-render-02.js": 8223, + "devtools/client/performance/test/browser_perf-overview-render-03.js": 6732, + "devtools/client/performance/test/browser_perf-overview-render-04.js": 8012, + "devtools/client/performance/test/browser_perf-overview-selection-01.js": 6327, + "devtools/client/performance/test/browser_perf-overview-selection-02.js": 8316, + "devtools/client/performance/test/browser_perf-overview-selection-03.js": 6726, + "devtools/client/performance/test/browser_perf-overview-time-interval.js": 6344, + "devtools/client/performance/test/browser_perf-private-browsing.js": 5318, + "devtools/client/performance/test/browser_perf-range-changed-render.js": 7714, + "devtools/client/performance/test/browser_perf-recording-notices-01.js": 6330, + "devtools/client/performance/test/browser_perf-recording-notices-02.js": 8305, + "devtools/client/performance/test/browser_perf-recording-notices-04.js": 6193, + "devtools/client/performance/test/browser_perf-recording-selected-01.js": 9389, + "devtools/client/performance/test/browser_perf-recording-selected-02.js": 9099, + "devtools/client/performance/test/browser_perf-recording-selected-03.js": 9054, + "devtools/client/performance/test/browser_perf-recording-selected-04.js": 11716, + "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 8528, + "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 9891, + "devtools/client/performance/test/browser_perf-refresh.js": 7887, + "devtools/client/performance/test/browser_perf-states.js": 7421, + "devtools/client/performance/test/browser_perf-telemetry-01.js": 9517, + "devtools/client/performance/test/browser_perf-telemetry-02.js": 7484, + "devtools/client/performance/test/browser_perf-telemetry-03.js": 7382, + "devtools/client/performance/test/browser_perf-telemetry-04.js": 7682, + "devtools/client/performance/test/browser_perf-ui-recording.js": 6814, + "devtools/client/performance/test/browser_timeline-waterfall-background.js": 8786, + "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 8999, + "devtools/client/projecteditor/test/browser_projecteditor_delete_file.js": 5089, + "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 4754, + "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 5282, + "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 6274, + "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 6264, + "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 5020, + "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 4680, + "devtools/client/responsivedesign/test/browser_responsivecomputedview.js": 7348, + "devtools/client/responsivedesign/test/browser_responsiveruleview.js": 6732, + "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 5865, + "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 6964, + "devtools/client/shared/sourceeditor/test/browser_codemirror.js": 4888, + "devtools/client/shared/sourceeditor/test/browser_vimemacs.js": 47559, + "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 7579, + "devtools/client/shared/test/browser_telemetry_button_paintflashing.js": 5656, + "devtools/client/shared/test/browser_telemetry_button_responsive.js": 5560, + "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 7776, + "devtools/client/shared/test/browser_telemetry_sidebar.js": 9719, + "devtools/client/shared/test/browser_telemetry_toolbox.js": 10905, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 6972, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 6941, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 5400, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 5829, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 6201, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 4941, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js": 5248, + "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 5253, + "devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js": 6160, + "devtools/client/storage/test/browser_storage_basic.js": 8020, + "devtools/client/storage/test/browser_storage_basic_usercontextid_1.js": 6343, + "devtools/client/storage/test/browser_storage_basic_usercontextid_2.js": 6802, + "devtools/client/storage/test/browser_storage_basic_with_fragment.js": 6413, + "devtools/client/storage/test/browser_storage_cache_delete.js": 5384, + "devtools/client/storage/test/browser_storage_cookies_add.js": 5518, + "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 6088, + "devtools/client/storage/test/browser_storage_cookies_edit.js": 6426, + "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 5858, + "devtools/client/storage/test/browser_storage_delete.js": 7215, + "devtools/client/storage/test/browser_storage_delete_all.js": 7312, + "devtools/client/storage/test/browser_storage_delete_tree.js": 6878, + "devtools/client/storage/test/browser_storage_delete_usercontextid.js": 12717, + "devtools/client/storage/test/browser_storage_dom_cache_disabled.js": 6362, + "devtools/client/storage/test/browser_storage_dynamic_updates.js": 6765, + "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 5638, + "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 4885, + "devtools/client/storage/test/browser_storage_indexeddb_delete.js": 4657, + "devtools/client/storage/test/browser_storage_indexeddb_duplicate_names.js": 4625, + "devtools/client/storage/test/browser_storage_localstorage_add.js": 5140, + "devtools/client/storage/test/browser_storage_localstorage_edit.js": 5565, + "devtools/client/storage/test/browser_storage_overflow.js": 10971, + "devtools/client/storage/test/browser_storage_sessionstorage_add.js": 5173, + "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5616, + "devtools/client/storage/test/browser_storage_sidebar.js": 8371, + "devtools/client/storage/test/browser_storage_sidebar_toggle.js": 5668, + "devtools/client/storage/test/browser_storage_values.js": 7964, + "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 4915, + "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 6954, + "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 5042, + "devtools/client/styleeditor/test/browser_styleeditor_new.js": 4960, + "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 8555, + "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 6086, + "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 6790, + "devtools/client/styleeditor/test/browser_styleeditor_sync.js": 13270, + "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 6001, + "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 6052, + "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 6090, + "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 5715, + "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 7828, + "devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js": 5015, + "devtools/client/webaudioeditor/test/browser_wa_destroy-node-01.js": 4842, + "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 6853, + "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 9220, + "devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/browser_webconsole_check_stubs_console_api.js": 6083, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 7183, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 5547, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters_persist.js": 9387, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_debugger_link.js": 5895, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_scratchpad_link.js": 5607, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_styleeditor_link.js": 5394, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_nodes_select.js": 5829, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js": 4757, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_scroll.js": 5061, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_error.js": 5280, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_nosource.js": 6324, + "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_warn_about_replaced_api.js": 6853, + "devtools/client/webconsole/test/browser_bug_862916_console_dir_and_filter_off.js": 4852, + "devtools/client/webconsole/test/browser_cached_messages.js": 5727, + "devtools/client/webconsole/test/browser_console_filters.js": 5481, + "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 10031, + "devtools/client/webconsole/test/browser_console_history_persist.js": 7948, + "devtools/client/webconsole/test/browser_console_iframe_messages.js": 6600, + "devtools/client/webconsole/test/browser_console_native_getters.js": 7380, + "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 4984, + "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 6229, + "devtools/client/webconsole/test/browser_console_private_browsing.js": 8996, + "devtools/client/webconsole/test/browser_console_server_logging.js": 6682, + "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 4965, + "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 6534, + "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 15021, + "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 6418, + "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 7408, + "devtools/client/webconsole/test/browser_jsterm_inspect.js": 7508, + "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 6415, + "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 4634, + "devtools/client/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js": 4644, + "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 8906, + "devtools/client/webconsole/test/browser_webconsole_bug_595350_multiple_windows_and_tabs.js": 6850, + "devtools/client/webconsole/test/browser_webconsole_bug_595934_message_categories.js": 9213, + "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 8038, + "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 5957, + "devtools/client/webconsole/test/browser_webconsole_bug_613642_maintain_scroll.js": 4806, + "devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js": 4955, + "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 5859, + "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 7488, + "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 4845, + "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 5619, + "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 15571, + "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 10938, + "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 5996, + "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 4662, + "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 7804, + "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 10136, + "devtools/client/webconsole/test/browser_webconsole_netlogging.js": 20548, + "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 4860, + "devtools/client/webconsole/test/browser_webconsole_output_01.js": 6168, + "devtools/client/webconsole/test/browser_webconsole_output_02.js": 8660, + "devtools/client/webconsole/test/browser_webconsole_output_03.js": 7693, + "devtools/client/webconsole/test/browser_webconsole_output_04.js": 6705, + "devtools/client/webconsole/test/browser_webconsole_output_05.js": 8054, + "devtools/client/webconsole/test/browser_webconsole_output_06.js": 12333, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 5889, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_02.js": 11649, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_03.js": 5047, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_04.js": 8622, + "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 8407, + "devtools/client/webconsole/test/browser_webconsole_split.js": 17554, + "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 5579, + "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 4700, + "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 12517, + "devtools/client/webconsole/test/browser_webconsole_view_source.js": 7309, + "devtools/server/tests/browser/browser_markers-cycle-collection.js": 13330, + "devtools/server/tests/browser/browser_storage_cookies-duplicate-names.js": 6196, + "devtools/server/tests/browser/browser_storage_dynamic_windows.js": 4992, + "devtools/server/tests/browser/browser_storage_listings.js": 4871, "devtools/server/tests/browser/browser_webextension_inspected_window.js": 6198 } } \ No newline at end of file diff --git a/toolkit/content/license.html b/toolkit/content/license.html index eecd4e4014fb..36241b2e8938 100644 --- a/toolkit/content/license.html +++ b/toolkit/content/license.html @@ -3075,8 +3075,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

CodeMirror License

This license applies to all files in - devtools/client/sourceeditor/codemirror and - to specified files in the devtools/client/sourceeditor/test/: + devtools/client/shared/sourceeditor/codemirror and + to specified files in the devtools/client/shared/sourceeditor/test/:

  • cm_comment_test.js
  • diff --git a/tools/rewriting/ThirdPartyPaths.txt b/tools/rewriting/ThirdPartyPaths.txt index 242f9edf2ada..8f79b4d1a7cc 100644 --- a/tools/rewriting/ThirdPartyPaths.txt +++ b/tools/rewriting/ThirdPartyPaths.txt @@ -1,7 +1,7 @@ browser/components/translation/cld2/ db/sqlite3/src/ -devtools/client/sourceeditor/codemirror/ -devtools/client/sourceeditor/tern/ +devtools/client/shared/sourceeditor/codemirror/ +devtools/client/shared/sourceeditor/tern/ devtools/shared/heapsnapshot/CoreDump.pb.cc devtools/shared/heapsnapshot/CoreDump.pb.h dom/canvas/test/webgl-conf/checkout/closure-library/ From 0edb126b3e484cf6f3e625eedcd5c324f65e2f31 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 13 Feb 2019 14:35:37 +0000 Subject: [PATCH 44/79] Bug 1525876: Export FILES_PER_UNIFIED_FILES in js/src/moz.build to avoid redefining it; r=froydnj Before this patch, changing FILES_PER_UNIFIED_FILES in the directory would require changes to all the files that defined the sandbox variable, which is a bit misleading. Exporting the variable prevents this, and it is safe to use because it doesn't escape the scope of the js/src build directory. Differential Revision: https://phabricator.services.mozilla.com/D19647 --HG-- extra : moz-landing-system : lando --- js/src/frontend/moz.build | 2 -- js/src/gc/moz.build | 2 -- js/src/jit/moz.build | 2 -- js/src/moz.build | 4 ++++ js/src/wasm/moz.build | 2 -- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/js/src/frontend/moz.build b/js/src/frontend/moz.build index a90943ed9737..adf62256f158 100644 --- a/js/src/frontend/moz.build +++ b/js/src/frontend/moz.build @@ -6,8 +6,6 @@ FINAL_LIBRARY = 'js' -FILES_PER_UNIFIED_FILE = 6 - # Includes should be relative to parent path LOCAL_INCLUDES += [ '!..', diff --git a/js/src/gc/moz.build b/js/src/gc/moz.build index 4ba0646b9c25..0f7124eb6f12 100644 --- a/js/src/gc/moz.build +++ b/js/src/gc/moz.build @@ -6,8 +6,6 @@ FINAL_LIBRARY = 'js' -FILES_PER_UNIFIED_FILE = 6 - # Includes should be relative to parent path LOCAL_INCLUDES += [ '!..', diff --git a/js/src/jit/moz.build b/js/src/jit/moz.build index 62d47c45f97c..b76034a1778d 100644 --- a/js/src/jit/moz.build +++ b/js/src/jit/moz.build @@ -6,8 +6,6 @@ FINAL_LIBRARY = 'js' -FILES_PER_UNIFIED_FILE = 6 - # Includes should be relative to parent path LOCAL_INCLUDES += [ '!..', diff --git a/js/src/moz.build b/js/src/moz.build index 6651bfc704e9..21bac0e30a6d 100755 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -17,6 +17,10 @@ component_wasm = ('Core', 'Javascript: Web Assembly') FILES_PER_UNIFIED_FILE = 6 +# Prevent redefining FILES_PER_UNIFIED_FILE in each sub-directory of js. This +# will not escape this directory. +export('FILES_PER_UNIFIED_FILE') + with Files('*'): BUG_COMPONENT = component_engine diff --git a/js/src/wasm/moz.build b/js/src/wasm/moz.build index ec629c8f1efa..f4d347e4ed2a 100644 --- a/js/src/wasm/moz.build +++ b/js/src/wasm/moz.build @@ -6,8 +6,6 @@ FINAL_LIBRARY = 'js' -FILES_PER_UNIFIED_FILE = 6 - # Includes should be relative to parent path LOCAL_INCLUDES += [ '!..', From df9f0e097befbe8f025dbf6c969871027eb49d2e Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 13 Feb 2019 13:52:07 +0000 Subject: [PATCH 45/79] Bug 1525876: Move ENABLE_WASM_CRANELIFT build test in the wasm mozbuild; r=tcampbell Differential Revision: https://phabricator.services.mozilla.com/D19648 --HG-- extra : moz-landing-system : lando --- js/src/moz.build | 6 ------ js/src/wasm/moz.build | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/src/moz.build b/js/src/moz.build index 21bac0e30a6d..265275d1e36b 100755 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -422,12 +422,6 @@ DIRS += [ FINAL_LIBRARY = 'js' -if CONFIG['ENABLE_WASM_CRANELIFT']: - DIRS += ['rust'] - UNIFIED_SOURCES += [ - 'wasm/WasmCraneliftCompile.cpp', - ] - # Prepare self-hosted JS code for embedding GENERATED_FILES += [('selfhosted.out.h', 'selfhosted.js')] selfhosted = GENERATED_FILES[('selfhosted.out.h', 'selfhosted.js')] diff --git a/js/src/wasm/moz.build b/js/src/wasm/moz.build index f4d347e4ed2a..815f681b94fc 100644 --- a/js/src/wasm/moz.build +++ b/js/src/wasm/moz.build @@ -15,6 +15,12 @@ LOCAL_INCLUDES += [ include('../js-config.mozbuild') include('../js-cxxflags.mozbuild') +if CONFIG['ENABLE_WASM_CRANELIFT']: + DIRS += ['../rust'] + UNIFIED_SOURCES += [ + 'WasmCraneliftCompile.cpp', + ] + UNIFIED_SOURCES += [ 'AsmJS.cpp', 'WasmBaselineCompile.cpp', From 6b7e5f0896fbe2503216a96cd15942418a26abca Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 13 Feb 2019 02:31:00 +0000 Subject: [PATCH 46/79] Bug 1518661 - Part 4: Convert bytecode positions to be more expression-oriented. r=jimb,jorendorff This brings SpiderMonkey more in line with V8 for the positions that it uses for expressions nested within statements. We generally prefer to use the expression's own location rather than the location of the statement, in the majority of cases. Differential Revision: https://phabricator.services.mozilla.com/D15993 --HG-- extra : moz-landing-system : lando --- .../mochitest/browser_dbg-pause-points.js | 6 +-- .../browser_dbg-sourcemapped-stepping.js | 3 +- ...etBreakpoint-at-the-beginning-of-a-line.js | 2 +- ...point-at-the-beginning-of-a-minified-fn.js | 2 +- ...test_setBreakpoint-at-the-end-of-a-line.js | 2 +- ...t_setBreakpoint-on-column-in-gcd-script.js | 2 +- .../unit/test_setBreakpoint-on-column.js | 2 +- .../unit/test_stepping-with-pause-points.js | 4 +- .../test_stepping-with-skip-breakpoints.js | 6 +-- js/src/frontend/BytecodeEmitter.cpp | 53 ++++++++++++++++--- js/src/frontend/CallOrNewEmitter.cpp | 12 ++--- .../tests/debug/Script-getAllColumnOffsets.js | 23 ++++---- 12 files changed, 78 insertions(+), 39 deletions(-) diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js index 28fc28ada848..a3c2fbb791c4 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js @@ -49,12 +49,12 @@ add_task(async function test() { await testCase(dbg, { name: "expressions", - steps: [[40,2], [41,2], [41,8], [42,8], [43,0]] + steps: [[40,2], [41,2], [41,8], [42,12], [43,0]] }); await testCase(dbg, { name: "sequences", - steps: [[23,2], [25,8], [29,8], [31,4], [34,2], [37,0]] + steps: [[23,2], [25,12], [31,4], [34,2], [37,0]] }); await testCase(dbg, { @@ -63,7 +63,7 @@ add_task(async function test() { [16, 2], [17, 12], [17, 20], - [18, 6], + [18, 10], [19, 2], [19, 8], [19, 17], diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js index e03b1c9b609b..b024aa86809b 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js @@ -56,7 +56,7 @@ function testStepOverForOf(dbg) { "step-over-for-of", { line: 4, column: 2 }, [ - ["stepOver", { line: 6, column: 2 }], + ["stepOver", { line: 6, column: 20 }], ["stepOver", { line: 7, column: 4 }], ["stepOver", { line: 6, column: 2 }], ["stepOver", { line: 7, column: 4 }], @@ -96,6 +96,7 @@ function testStepOveForOfClosure(dbg) { "step-over-for-of-closure", { line: 6, column: 2 }, [ + ["stepOver", { line: 8, column: 20 }], ["stepOver", { line: 8, column: 2 }], ["stepOver", { line: 12, column: 2 }] ] diff --git a/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-line.js b/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-line.js index 53b902c35074..8439a81ca4dd 100644 --- a/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-line.js +++ b/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-line.js @@ -22,7 +22,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { const frame = packet.frame; Assert.equal(frame.where.actor, source.actor); Assert.equal(frame.where.line, location.line); - Assert.equal(frame.where.column, 6); + Assert.equal(frame.where.column, 10); const variables = frame.environment.bindings.variables; Assert.equal(variables.a.value.type, "undefined"); diff --git a/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-minified-fn.js b/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-minified-fn.js index 3ab71a5aa49b..043b7f4bb427 100644 --- a/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-minified-fn.js +++ b/devtools/server/tests/unit/test_setBreakpoint-at-the-beginning-of-a-minified-fn.js @@ -25,7 +25,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { const where = frame.where; Assert.equal(where.actor, source.actor); Assert.equal(where.line, location.line); - Assert.equal(where.column, 52); + Assert.equal(where.column, 56); const variables = frame.environment.bindings.variables; Assert.equal(variables.a.value.type, "undefined"); diff --git a/devtools/server/tests/unit/test_setBreakpoint-at-the-end-of-a-line.js b/devtools/server/tests/unit/test_setBreakpoint-at-the-end-of-a-line.js index 768d3c2e438d..16496e4a4497 100644 --- a/devtools/server/tests/unit/test_setBreakpoint-at-the-end-of-a-line.js +++ b/devtools/server/tests/unit/test_setBreakpoint-at-the-end-of-a-line.js @@ -23,7 +23,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { const where = frame.where; Assert.equal(where.actor, source.actor); Assert.equal(where.line, location.line); - Assert.equal(where.column, 28); + Assert.equal(where.column, 32); const variables = frame.environment.bindings.variables; Assert.equal(variables.a.value, 1); diff --git a/devtools/server/tests/unit/test_setBreakpoint-on-column-in-gcd-script.js b/devtools/server/tests/unit/test_setBreakpoint-on-column-in-gcd-script.js index 88240bc33226..6cecb27616b5 100644 --- a/devtools/server/tests/unit/test_setBreakpoint-on-column-in-gcd-script.js +++ b/devtools/server/tests/unit/test_setBreakpoint-on-column-in-gcd-script.js @@ -9,7 +9,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client, targetFront } const { source } = await promise; - const location = { sourceUrl: source.url, line: 6, column: 17 }; + const location = { sourceUrl: source.url, line: 6, column: 21 }; setBreakpoint(threadClient, location); const packet = await executeOnNextTickAndWaitForPause(function() { diff --git a/devtools/server/tests/unit/test_setBreakpoint-on-column.js b/devtools/server/tests/unit/test_setBreakpoint-on-column.js index 6fabfc3306ae..296ab5037543 100644 --- a/devtools/server/tests/unit/test_setBreakpoint-on-column.js +++ b/devtools/server/tests/unit/test_setBreakpoint-on-column.js @@ -7,7 +7,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { loadSubScript(SOURCE_URL, debuggee); const { source } = await promise; - const location = { sourceUrl: source.url, line: 4, column: 17 }; + const location = { sourceUrl: source.url, line: 4, column: 21 }; setBreakpoint(threadClient, location); const packet = await executeOnNextTickAndWaitForPause(function() { diff --git a/devtools/server/tests/unit/test_stepping-with-pause-points.js b/devtools/server/tests/unit/test_stepping-with-pause-points.js index 886d47bb2f0b..b405184d0626 100644 --- a/devtools/server/tests/unit/test_stepping-with-pause-points.js +++ b/devtools/server/tests/unit/test_stepping-with-pause-points.js @@ -35,7 +35,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { equal(step1.type, "paused"); equal(step1.why.type, "resumeLimit"); equal(step1.frame.where.line, 3); - equal(step1.frame.where.column, 8); + equal(step1.frame.where.column, 0); equal(debuggee.a, undefined); equal(debuggee.b, undefined); @@ -45,7 +45,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { equal(step2.type, "paused"); equal(step2.why.type, "resumeLimit"); equal(step2.frame.where.line, 4); - equal(step2.frame.where.column, 8); + equal(step2.frame.where.column, 0); equal(debuggee.a, 1); equal(debuggee.b, undefined); diff --git a/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js b/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js index 886d47bb2f0b..efd29962d932 100644 --- a/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js +++ b/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js @@ -35,7 +35,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { equal(step1.type, "paused"); equal(step1.why.type, "resumeLimit"); equal(step1.frame.where.line, 3); - equal(step1.frame.where.column, 8); + equal(step1.frame.where.column, 0); equal(debuggee.a, undefined); equal(debuggee.b, undefined); @@ -45,7 +45,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { equal(step2.type, "paused"); equal(step2.why.type, "resumeLimit"); equal(step2.frame.where.line, 4); - equal(step2.frame.where.column, 8); + equal(step2.frame.where.column, 0); equal(debuggee.a, 1); equal(debuggee.b, undefined); @@ -73,4 +73,4 @@ function evaluateTestCode(debuggee) { 1 ); /* eslint-disable */ -} +} \ No newline at end of file diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 6c8cd1a3530c..4d130de2bbdf 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -2009,7 +2009,7 @@ MOZ_NEVER_INLINE bool BytecodeEmitter::emitSwitch(SwitchStatement* switchStmt) { MOZ_ASSERT(cases->isKind(ParseNodeKind::StatementList)); SwitchEmitter se(this); - if (!se.emitDiscriminant(Some(switchStmt->pn_pos.begin))) { + if (!se.emitDiscriminant(Some(switchStmt->discriminant().pn_pos.begin))) { return false; } if (!emitTree(&switchStmt->discriminant())) { @@ -3930,10 +3930,6 @@ bool BytecodeEmitter::emitDeclarationList(ListNode* declList) { MOZ_ASSERT(declList->isOp(JSOP_NOP)); for (ParseNode* decl : declList->contents()) { - if (!updateSourceCoordNotes(decl->pn_pos.begin)) { - return false; - } - if (decl->isKind(ParseNodeKind::AssignExpr)) { MOZ_ASSERT(decl->isOp(JSOP_NOP)); @@ -3942,6 +3938,9 @@ bool BytecodeEmitter::emitDeclarationList(ListNode* declList) { MOZ_ASSERT(pattern->isKind(ParseNodeKind::ArrayExpr) || pattern->isKind(ParseNodeKind::ObjectExpr)); + if (!updateSourceCoordNotes(assignNode->right()->pn_pos.begin)) { + return false; + } if (!emitTree(assignNode->right())) { return false; } @@ -3989,6 +3988,10 @@ bool BytecodeEmitter::emitSingleDeclaration(ListNode* declList, NameNode* decl, } } else { MOZ_ASSERT(initializer); + + if (!updateSourceCoordNotes(initializer->pn_pos.begin)) { + return false; + } if (!emitInitializer(initializer, decl)) { // [stack] ENV? V return false; @@ -4643,7 +4646,7 @@ MOZ_MUST_USE bool BytecodeEmitter::emitGoSub(JumpList* jump) { bool BytecodeEmitter::emitIf(TernaryNode* ifNode) { IfEmitter ifThenElse(this); - if (!ifThenElse.emitIf(Some(ifNode->pn_pos.begin))) { + if (!ifThenElse.emitIf(Some(ifNode->kid1()->pn_pos.begin))) { return false; } @@ -4673,7 +4676,7 @@ if_again: if (elseNode->isKind(ParseNodeKind::IfStmt)) { ifNode = &elseNode->as(); - if (!ifThenElse.emitElseIf(Some(ifNode->pn_pos.begin))) { + if (!ifThenElse.emitElseIf(Some(ifNode->kid1()->pn_pos.begin))) { return false; } @@ -4812,7 +4815,7 @@ MOZ_NEVER_INLINE bool BytecodeEmitter::emitLexicalScope( bool BytecodeEmitter::emitWith(BinaryNode* withNode) { // Ensure that the column of the 'with' is set properly. - if (!updateSourceCoordNotes(withNode->pn_pos.begin)) { + if (!updateSourceCoordNotes(withNode->left()->pn_pos.begin)) { return false; } @@ -5270,6 +5273,9 @@ bool BytecodeEmitter::emitForOf(ForNode* forOfLoop, return false; } + if (!updateSourceCoordNotes(forHeadExpr->pn_pos.begin)) { + return false; + } if (!emitTree(forHeadExpr)) { // [stack] ITERABLE return false; @@ -5364,6 +5370,10 @@ bool BytecodeEmitter::emitForIn(ForNode* forInLoop, // Evaluate the expression being iterated. ParseNode* expr = forInHead->kid3(); + + if (!updateSourceCoordNotes(expr->pn_pos.begin)) { + return false; + } if (!emitTree(expr)) { // [stack] EXPR return false; @@ -5436,6 +5446,10 @@ bool BytecodeEmitter::emitCStyleFor( return false; } } else { + if (!updateSourceCoordNotes(init->pn_pos.begin)) { + return false; + } + // 'init' is an expression, not a declaration. emitTree left its // value on the stack. if (!emitTree(init, ValueUsage::IgnoreValue)) { @@ -5470,6 +5484,9 @@ bool BytecodeEmitter::emitCStyleFor( // Check for update code to do before the condition (if any). if (update) { + if (!updateSourceCoordNotes(update->pn_pos.begin)) { + return false; + } if (!emitTree(update, ValueUsage::IgnoreValue)) { // [stack] VAL return false; @@ -5484,6 +5501,9 @@ bool BytecodeEmitter::emitCStyleFor( } if (cond) { + if (!updateSourceCoordNotes(cond->pn_pos.begin)) { + return false; + } if (!emitTree(cond)) { // [stack] VAL return false; @@ -5845,6 +5865,9 @@ bool BytecodeEmitter::emitDo(BinaryNode* doNode) { } ParseNode* condNode = doNode->right(); + if (!updateSourceCoordNotes(condNode->pn_pos.begin)) { + return false; + } if (!emitTree(condNode)) { return false; } @@ -5874,6 +5897,9 @@ bool BytecodeEmitter::emitWhile(BinaryNode* whileNode) { return false; } + if (!updateSourceCoordNotes(condNode->pn_pos.begin)) { + return false; + } if (!emitTree(condNode)) { return false; } @@ -6002,6 +6028,10 @@ bool BytecodeEmitter::emitReturn(UnaryNode* returnNode) { } } + if (!updateSourceCoordNotes(returnNode->pn_pos.begin)) { + return false; + } + /* Push a return value */ if (ParseNode* expr = returnNode->kid()) { if (!emitTree(expr)) { @@ -8557,6 +8587,9 @@ bool BytecodeEmitter::emitClass( bool isDerived = !!heritageExpression; bool hasNameOnStack = nameKind == ClassNameKind::ComputedName; if (isDerived) { + if (!updateSourceCoordNotes(classNode->pn_pos.begin)) { + return false; + } if (!emitTree(heritageExpression)) { // [stack] HERITAGE return false; @@ -8901,6 +8934,10 @@ bool BytecodeEmitter::emitTree( break; case ParseNodeKind::ThrowStmt: + if (!updateSourceCoordNotes(pn->pn_pos.begin)) { + return false; + } + MOZ_FALLTHROUGH; case ParseNodeKind::VoidExpr: case ParseNodeKind::NotExpr: case ParseNodeKind::BitNotExpr: diff --git a/js/src/frontend/CallOrNewEmitter.cpp b/js/src/frontend/CallOrNewEmitter.cpp index ea9036526fbb..06d7173f345d 100644 --- a/js/src/frontend/CallOrNewEmitter.cpp +++ b/js/src/frontend/CallOrNewEmitter.cpp @@ -271,17 +271,17 @@ bool CallOrNewEmitter::emitEnd(uint32_t argc, const Maybe& beginPos) { } } } + if (beginPos) { + if (!bce_->updateSourceCoordNotes(*beginPos)) { + return false; + } + } if (!isSpread()) { - if (!bce_->emitCall(op_, argc, beginPos)) { + if (!bce_->emitCall(op_, argc)) { // [stack] RVAL return false; } } else { - if (beginPos) { - if (!bce_->updateSourceCoordNotes(*beginPos)) { - return false; - } - } if (!bce_->emit1(op_)) { // [stack] RVAL return false; diff --git a/js/src/jit-test/tests/debug/Script-getAllColumnOffsets.js b/js/src/jit-test/tests/debug/Script-getAllColumnOffsets.js index 70fb1626064c..568054684115 100644 --- a/js/src/jit-test/tests/debug/Script-getAllColumnOffsets.js +++ b/js/src/jit-test/tests/debug/Script-getAllColumnOffsets.js @@ -3,14 +3,14 @@ load(libdir + "assert-offset-columns.js"); // getColumnOffsets correctly places the various parts of a ForStatement. assertOffsetColumns( "function f(n) { for (var i = 0; i < n; ++i) hits.push('.'); hits.push('!'); }", - " ^ ^ ^ ^ ^ ^ ^ ^", + " ^ ^ ^ ^ ^ ^ ^ ^", "0 1 3 4 . 2 1 3 4 . 2 1 3 4 . 2 1 5 6 ! 7", ); // getColumnOffsets correctly places multiple variable declarations. assertOffsetColumns( "function f(n){var w0,x1=3,y2=4,z3=9}", - " ^ ^ ^ ^", + " ^ ^ ^^", ); // getColumnOffsets correctly places comma separated expressions. @@ -23,14 +23,14 @@ assertOffsetColumns( assertOffsetColumns( // Should hit each property in the object. "function f(n){var o={a:1,b:2,c:3}}", - " ^ ^ ^ ^ ^", + " ^^ ^ ^ ^", ); // getColumnOffsets correctly places array properties. assertOffsetColumns( // Should hit each item in the array. "function f(n){var a=[1,2,n]}", - " ^ ^ ^ ^ ^", + " ^^ ^ ^ ^", ); // getColumnOffsets correctly places function calls. @@ -44,44 +44,45 @@ assertOffsetColumns( // getColumnOffsets correctly places the various parts of a SwitchStatement. assertOffsetColumns( "function f(n) { switch(n) { default: print(n); } }", - " ^ ^ ^", + " ^ ^ ^", ); // getColumnOffsets correctly places the various parts of a BreakStatement. assertOffsetColumns( "function f(n) { do { print(n); break; } while(false); }", - " ^ ^ ^ ^", + " ^ ^ ^ ^ ^", + "0 1 2 4" ); // getColumnOffsets correctly places the various parts of a ContinueStatement. assertOffsetColumns( "function f(n) { do { print(n); continue; } while(false); }", - " ^ ^ ^ ^", + " ^ ^ ^ ^ ^", ); // getColumnOffsets correctly places the various parts of a WithStatement. assertOffsetColumns( "function f(n) { with({}) { print(n); } }", - " ^ ^ ^", + " ^ ^ ^", ); // getColumnOffsets correctly places the various parts of a IfStatement. assertOffsetColumns( "function f(n) { if (n == 3) print(n); }", - " ^ ^ ^", + " ^ ^ ^", ); // getColumnOffsets correctly places the various parts of a IfStatement // with an if/else assertOffsetColumns( "function f(n) { if (n == 2); else if (n === 3) print(n); }", - " ^ ^ ^ ^", + " ^ ^ ^ ^", ); // getColumnOffsets correctly places the various parts of a DoWhileStatement. assertOffsetColumns( "function f(n) { do { print(n); } while(false); }", - " ^ ^ ^", + " ^ ^ ^ ^", ); // getColumnOffsets correctly places the part of normal ::Dot node with identifier root. From 8e5638106584121bba80b96a8594405739e842f2 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 13 Feb 2019 02:31:00 +0000 Subject: [PATCH 47/79] Bug 1518661 - Part 5: Give SpiderMonkey well-defined sense of step and breakpoint locations. r=jimb,bhackett Until now, SpiderMonkey's debugger interfaces have generally relied on the implicitly-defined 'entrypoint' concept. This meant that assigning a given bytecode a position also automatically meant that it behaved like a breakpoint. This both made it hard to maintain, and hard to define user's expectations because there could potentially be many more breakpoints than users would actually want. This patch adds an official concept of recommended breakpoint and recommended step-next pause locations, and APIs for users to query for them. The expectation being that users would now use this metadata in debugging UIs. Differential Revision: https://phabricator.services.mozilla.com/D15994 --HG-- extra : moz-landing-system : lando --- js/src/doc/Debugger/Debugger.Script.md | 249 +++++---- js/src/frontend/BytecodeEmitter.cpp | 124 +++++ js/src/frontend/BytecodeEmitter.h | 7 + js/src/frontend/CallOrNewEmitter.cpp | 3 + js/src/frontend/SourceNotes.h | 4 +- .../tests/debug/Script-getOffsetMetadata.js | 36 ++ .../debug/Script-getPossibleBreakpoints-02.js | 63 +++ .../debug/Script-getPossibleBreakpoints.js | 391 ++++++++++++++ js/src/shell/js.cpp | 2 + js/src/vm/BytecodeUtil-inl.h | 25 + js/src/vm/CommonPropertyNames.h | 8 + js/src/vm/Debugger.cpp | 493 +++++++++++++++++- 12 files changed, 1296 insertions(+), 109 deletions(-) create mode 100644 js/src/jit-test/tests/debug/Script-getOffsetMetadata.js create mode 100644 js/src/jit-test/tests/debug/Script-getPossibleBreakpoints-02.js create mode 100644 js/src/jit-test/tests/debug/Script-getPossibleBreakpoints.js diff --git a/js/src/doc/Debugger/Debugger.Script.md b/js/src/doc/Debugger/Debugger.Script.md index 32db96f87f38..42dc6795a4fc 100644 --- a/js/src/doc/Debugger/Debugger.Script.md +++ b/js/src/doc/Debugger/Debugger.Script.md @@ -205,6 +205,154 @@ The functions described below may only be called with a `this` value referring to a `Debugger.Script` instance; they may not be used as methods of other kinds of objects. +`getChildScripts()` +: **If the instance refers to a `JSScript`**, return a new array whose + elements are Debugger.Script objects for each function + in this script. Only direct children are included; nested + children can be reached by walking the tree. + + **If the instance refers to WebAssembly code**, throw a `TypeError`. + +getPossibleBreakpoints(query) +: Query for the recommended breakpoint locations available in SpiderMonkey. + Returns a result array of objects with the following properties: + * `offset: number` - The offset the breakpoint. + * `lineNumber: number` - The line number of the breakpoint. + * `columnNumber: number` - The column number of the breakpoint. + * `isStepStart: boolean` - True if SpiderMonkey recommends that the + breakpoint be treated as a step location when users of debuggers + step to the next item. This _roughly_ translates to the start of + each statement, though not entirely. + + The `query` argument can be used to filter the set of breakpoints. + The `query` object can contain the following properties: + + * `minOffset: number` - The inclusive lower bound of `offset` values to include. + * `maxOffset: number` - The exclusive upper bound of `offset` values to include. + * `line: number` - Limit to breakpoints on the given line. + * `minLine: number` - The inclusive lower bound of lines to include. + * `minColumn: number` - The inclusive lower bound of the line/minLine column to include. + * `maxLine: number` - The exclusive upper bound of lines to include. + * `maxColumn: number` - The exclusive upper bound of the line/maxLine column to include. + +getPossibleBreakpointOffsets(query) +: Query for the recommended breakpoint locations available in SpiderMonkey. + Identical to getPossibleBreakpoints except this returns an array of `offset` + values instead of offset metadata objects. + +getOffsetMetadata(offset) +: Get metadata about a given bytecode offset. + Returns an object with the following properties: + * `lineNumber: number` - The line number of the breakpoint. + * `columnNumber: number` - The column number of the breakpoint. + * `isBreakpoint: boolean` - True if this offset qualifies as a breakpoint, + defined using the same semantics used for `getPossibleBreakpoints()`. + * `isStepStart: boolean` - True if SpiderMonkey recommends that the + breakpoint be treated as a step location when users of debuggers + step to the next item. This _roughly_ translates to the start of + each statement, though not entirely. + +setBreakpoint(offset, handler) +: **If the instance refers to a `JSScript`**, set a breakpoint at the + bytecode instruction at offset in this script, reporting hits to + the `hit` method of handler. If offset is not a valid offset + in this script, throw an error. + + When execution reaches the given instruction, SpiderMonkey calls the + `hit` method of handler, passing a [`Debugger.Frame`][frame] + instance representing the currently executing stack frame. The `hit` + method's return value should be a [resumption value][rv], determining + how execution should continue. + + Any number of breakpoints may be set at a single location; when control + reaches that point, SpiderMonkey calls their handlers in an unspecified + order. + + Any number of breakpoints may use the same handler object. + + Breakpoint handler method calls are cross-compartment, intra-thread + calls: the call takes place in the same thread that hit the breakpoint, + and in the compartment containing the handler function (typically the + debugger's compartment). + + The new breakpoint belongs to the [`Debugger`][debugger-object] instance to + which this script belongs. Disabling the [`Debugger`][debugger-object] + instance disables this breakpoint; and removing a global from the + [`Debugger`][debugger-object] instance's set of debuggees clears all the + breakpoints belonging to that [`Debugger`][debugger-object] instance in that + global's scripts. + +getBreakpoints([offset]) +: **If the instance refers to a `JSScript`**, return an array containing the + handler objects for all the breakpoints set at offset in this + script. If offset is omitted, return the handlers of all + breakpoints set anywhere in this script. If offset is present, but + not a valid offset in this script, throw an error. + + **If the instance refers to WebAssembly code**, throw a `TypeError`. + +clearBreakpoint(handler, [offset]) +: **If the instance refers to a `JSScript`**, remove all breakpoints set in + this [`Debugger`][debugger-object] instance that use handler as + their handler. If offset is given, remove only those breakpoints + set at offset that use handler; if offset is not a + valid offset in this script, throw an error. + + Note that, if breakpoints using other handler objects are set at the + same location(s) as handler, they remain in place. + +clearAllBreakpoints([offset]) +: **If the instance refers to a `JSScript`**, remove all breakpoints set in + this script. If offset is present, remove all breakpoints set at + that offset in this script; if offset is not a valid bytecode + offset in this script, throw an error. + +getSuccessorOffsets(offset) +: **If the instance refers to a `JSScript`**, return an array + containing the offsets of all bytecodes in the script which are + immediate successors of offset via non-exceptional control + flow paths. + +getPredecessorOffsets(offset) +: **If the instance refers to a `JSScript`**, return an array + containing the offsets of all bytecodes in the script for which + offset is an immediate successor via non-exceptional + control flow paths. + +`getOffsetsCoverage()`: +: **If the instance refers to a `JSScript`**, return `null` or an array which + contains information about the coverage of all opcodes. The elements of + the array are objects, each of which describes a single opcode, and + contains the following properties: + + * lineNumber: the line number of the current opcode. + + * columnNumber: the column number of the current opcode. + + * offset: the bytecode instruction offset of the current opcode. + + * count: the number of times the current opcode got executed. + + If this script has no coverage, or if it is not instrumented, then this + function will return `null`. To ensure that the debuggee is instrumented, + the flag `Debugger.collectCoverageInfo` should be set to `true`. + + **If the instance refers to WebAssembly code**, throw a `TypeError`. + +isInCatchScope([offset]) +: **If the instance refers to a `JSScript`**, this is `true` if this offset + falls within the scope of a try block, and `false` otherwise. + + **If the instance refers to WebAssembly code**, throw a `TypeError`. + + +### Deprecated Debugger.Script Prototype Functions + +The following functions have all been deprecated in favor of `getOffsetMetadata`, +`getPossibleBreakpoints`, and `getPossibleBreakpointOffsets`. These functions +all have an under-defined concept of what offsets are and are not included +in their results. + `getAllOffsets()` : **If the instance refers to a `JSScript`**, return an array L describing the relationship between bytecode instruction offsets and @@ -296,104 +444,3 @@ methods of other kinds of objects. * isEntryPoint: true if the offset is a column entry point, as would be reported by getAllColumnOffsets(); otherwise false. - -getSuccessorOffsets(offset) -: **If the instance refers to a `JSScript`**, return an array - containing the offsets of all bytecodes in the script which are - immediate successors of offset via non-exceptional control - flow paths. - -getPredecessorOffsets(offset) -: **If the instance refers to a `JSScript`**, return an array - containing the offsets of all bytecodes in the script for which - offset is an immediate successor via non-exceptional - control flow paths. - -`getOffsetsCoverage()`: -: **If the instance refers to a `JSScript`**, return `null` or an array which - contains information about the coverage of all opcodes. The elements of - the array are objects, each of which describes a single opcode, and - contains the following properties: - - * lineNumber: the line number of the current opcode. - - * columnNumber: the column number of the current opcode. - - * offset: the bytecode instruction offset of the current opcode. - - * count: the number of times the current opcode got executed. - - If this script has no coverage, or if it is not instrumented, then this - function will return `null`. To ensure that the debuggee is instrumented, - the flag `Debugger.collectCoverageInfo` should be set to `true`. - - **If the instance refers to WebAssembly code**, throw a `TypeError`. - -`getChildScripts()` -: **If the instance refers to a `JSScript`**, return a new array whose - elements are Debugger.Script objects for each function - in this script. Only direct children are included; nested - children can be reached by walking the tree. - - **If the instance refers to WebAssembly code**, throw a `TypeError`. - -setBreakpoint(offset, handler) -: **If the instance refers to a `JSScript`**, set a breakpoint at the - bytecode instruction at offset in this script, reporting hits to - the `hit` method of handler. If offset is not a valid offset - in this script, throw an error. - - When execution reaches the given instruction, SpiderMonkey calls the - `hit` method of handler, passing a [`Debugger.Frame`][frame] - instance representing the currently executing stack frame. The `hit` - method's return value should be a [resumption value][rv], determining - how execution should continue. - - Any number of breakpoints may be set at a single location; when control - reaches that point, SpiderMonkey calls their handlers in an unspecified - order. - - Any number of breakpoints may use the same handler object. - - Breakpoint handler method calls are cross-compartment, intra-thread - calls: the call takes place in the same thread that hit the breakpoint, - and in the compartment containing the handler function (typically the - debugger's compartment). - - The new breakpoint belongs to the [`Debugger`][debugger-object] instance to - which this script belongs. Disabling the [`Debugger`][debugger-object] - instance disables this breakpoint; and removing a global from the - [`Debugger`][debugger-object] instance's set of debuggees clears all the - breakpoints belonging to that [`Debugger`][debugger-object] instance in that - global's scripts. - -getBreakpoints([offset]) -: **If the instance refers to a `JSScript`**, return an array containing the - handler objects for all the breakpoints set at offset in this - script. If offset is omitted, return the handlers of all - breakpoints set anywhere in this script. If offset is present, but - not a valid offset in this script, throw an error. - - **If the instance refers to WebAssembly code**, throw a `TypeError`. - -clearBreakpoint(handler, [offset]) -: **If the instance refers to a `JSScript`**, remove all breakpoints set in - this [`Debugger`][debugger-object] instance that use handler as - their handler. If offset is given, remove only those breakpoints - set at offset that use handler; if offset is not a - valid offset in this script, throw an error. - - Note that, if breakpoints using other handler objects are set at the - same location(s) as handler, they remain in place. - -clearAllBreakpoints([offset]) -: **If the instance refers to a `JSScript`**, remove all breakpoints set in - this script. If offset is present, remove all breakpoints set at - that offset in this script; if offset is not a valid bytecode - offset in this script, throw an error. - -isInCatchScope([offset]) -: **If the instance refers to a `JSScript`**, this is `true` if this offset - falls within the scope of a try block, and `false` otherwise. - - **If the instance refers to WebAssembly code**, throw a `TypeError`. diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 4d130de2bbdf..99c2865ac808 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -102,6 +102,9 @@ BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent, SharedContext* sc, lastNoteOffset_(0), currentLine_(lineNum), lastColumn_(0), + lastSeparatorOffet_(0), + lastSeparatorLine_(0), + lastSeparatorColumn_(0), mainOffset_(), lastTarget{-1 - ptrdiff_t(JSOP_JUMPTARGET_LENGTH)}, parser(nullptr), @@ -194,6 +197,50 @@ Maybe BytecodeEmitter::locationOfNameBoundInFunctionScope( return source->locationBoundInScope(name, funScope); } +bool BytecodeEmitter::markStepBreakpoint() { + if (inPrologue()) { + return true; + } + + if (!newSrcNote(SRC_STEP_SEP)) { + return false; + } + + if (!newSrcNote(SRC_BREAKPOINT)) { + return false; + } + + // We track the location of the most recent separator for use in + // markSimpleBreakpoint. Note that this means that the position must already + // be set before markStepBreakpoint is called. + lastSeparatorOffet_ = code().length(); + lastSeparatorLine_ = currentLine_; + lastSeparatorColumn_ = lastColumn_; + + return true; +} + +bool BytecodeEmitter::markSimpleBreakpoint() { + if (inPrologue()) { + return true; + } + + // If a breakable call ends up being the same location as the most recent + // expression start, we need to skip marking it breakable in order to avoid + // having two breakpoints with the same line/column position. + // Note: This assumes that the position for the call has already been set. + bool isDuplicateLocation = + lastSeparatorLine_ == currentLine_ && lastSeparatorColumn_ == lastColumn_; + + if (!isDuplicateLocation) { + if (!newSrcNote(SRC_BREAKPOINT)) { + return false; + } + } + + return true; +} + bool BytecodeEmitter::emitCheck(JSOp op, ptrdiff_t delta, ptrdiff_t* offset) { *offset = code().length(); @@ -520,6 +567,8 @@ bool BytecodeEmitter::updateLineNumberNotes(uint32_t offset) { } } while (--delta != 0); } + + updateSeparatorPosition(); } return true; } @@ -550,10 +599,19 @@ bool BytecodeEmitter::updateSourceCoordNotes(uint32_t offset) { return false; } lastColumn_ = columnIndex; + updateSeparatorPosition(); } return true; } +/* Updates the last separator position, if present */ +void BytecodeEmitter::updateSeparatorPosition() { + if (!inPrologue() && lastSeparatorOffet_ == code().length()) { + lastSeparatorLine_ = currentLine_; + lastSeparatorColumn_ = lastColumn_; + } +} + Maybe BytecodeEmitter::getOffsetForLoop(ParseNode* nextpn) { if (!nextpn) { return Nothing(); @@ -2012,6 +2070,10 @@ MOZ_NEVER_INLINE bool BytecodeEmitter::emitSwitch(SwitchStatement* switchStmt) { if (!se.emitDiscriminant(Some(switchStmt->discriminant().pn_pos.begin))) { return false; } + + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(&switchStmt->discriminant())) { return false; } @@ -2392,6 +2454,9 @@ bool BytecodeEmitter::emitScript(ParseNode* body) { return false; } } + if (!markSimpleBreakpoint()) { + return false; + } if (!emit1(JSOP_RETRVAL)) { return false; @@ -2454,6 +2519,9 @@ bool BytecodeEmitter::emitFunctionScript(FunctionNode* funNode, if (!updateSourceCoordNotes(body->pn_pos.end)) { return false; } + if (!markSimpleBreakpoint()) { + return false; + } // Always end the script with a JSOP_RETRVAL. Some other parts of the // codebase depend on this opcode, @@ -3941,6 +4009,9 @@ bool BytecodeEmitter::emitDeclarationList(ListNode* declList) { if (!updateSourceCoordNotes(assignNode->right()->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(assignNode->right())) { return false; } @@ -3992,6 +4063,9 @@ bool BytecodeEmitter::emitSingleDeclaration(ListNode* declList, NameNode* decl, if (!updateSourceCoordNotes(initializer->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitInitializer(initializer, decl)) { // [stack] ENV? V return false; @@ -4651,6 +4725,10 @@ bool BytecodeEmitter::emitIf(TernaryNode* ifNode) { } if_again: + if (!markStepBreakpoint()) { + return false; + } + /* Emit code for the condition before pushing stmtInfo. */ if (!emitTree(ifNode->kid1())) { return false; @@ -4819,6 +4897,10 @@ bool BytecodeEmitter::emitWith(BinaryNode* withNode) { return false; } + if (!markStepBreakpoint()) { + return false; + } + if (!emitTree(withNode->left())) { return false; } @@ -5276,6 +5358,9 @@ bool BytecodeEmitter::emitForOf(ForNode* forOfLoop, if (!updateSourceCoordNotes(forHeadExpr->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(forHeadExpr)) { // [stack] ITERABLE return false; @@ -5374,6 +5459,9 @@ bool BytecodeEmitter::emitForIn(ForNode* forInLoop, if (!updateSourceCoordNotes(expr->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(expr)) { // [stack] EXPR return false; @@ -5449,6 +5537,9 @@ bool BytecodeEmitter::emitCStyleFor( if (!updateSourceCoordNotes(init->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } // 'init' is an expression, not a declaration. emitTree left its // value on the stack. @@ -5487,6 +5578,9 @@ bool BytecodeEmitter::emitCStyleFor( if (!updateSourceCoordNotes(update->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(update, ValueUsage::IgnoreValue)) { // [stack] VAL return false; @@ -5504,6 +5598,9 @@ bool BytecodeEmitter::emitCStyleFor( if (!updateSourceCoordNotes(cond->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(cond)) { // [stack] VAL return false; @@ -5868,6 +5965,9 @@ bool BytecodeEmitter::emitDo(BinaryNode* doNode) { if (!updateSourceCoordNotes(condNode->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(condNode)) { return false; } @@ -5900,6 +6000,9 @@ bool BytecodeEmitter::emitWhile(BinaryNode* whileNode) { if (!updateSourceCoordNotes(condNode->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(condNode)) { return false; } @@ -6031,6 +6134,9 @@ bool BytecodeEmitter::emitReturn(UnaryNode* returnNode) { if (!updateSourceCoordNotes(returnNode->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } /* Push a return value */ if (ParseNode* expr = returnNode->kid()) { @@ -6743,6 +6849,9 @@ bool BytecodeEmitter::emitExpressionStatement(UnaryNode* exprStmt) { if (!ese.prepareForExpr(Some(exprStmt->pn_pos.begin))) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(expr, valueUsage)) { return false; } @@ -8590,6 +8699,9 @@ bool BytecodeEmitter::emitClass( if (!updateSourceCoordNotes(classNode->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitTree(heritageExpression)) { // [stack] HERITAGE return false; @@ -8742,6 +8854,9 @@ bool BytecodeEmitter::emitTree( if (!updateSourceCoordNotes(pn->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitBreak(pn->as().label())) { return false; @@ -8753,6 +8868,9 @@ bool BytecodeEmitter::emitTree( if (!updateSourceCoordNotes(pn->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emitContinue(pn->as().label())) { return false; @@ -8937,6 +9055,9 @@ bool BytecodeEmitter::emitTree( if (!updateSourceCoordNotes(pn->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } MOZ_FALLTHROUGH; case ParseNodeKind::VoidExpr: case ParseNodeKind::NotExpr: @@ -9156,6 +9277,9 @@ bool BytecodeEmitter::emitTree( if (!updateSourceCoordNotes(pn->pn_pos.begin)) { return false; } + if (!markStepBreakpoint()) { + return false; + } if (!emit1(JSOP_DEBUGGER)) { return false; } diff --git a/js/src/frontend/BytecodeEmitter.h b/js/src/frontend/BytecodeEmitter.h index a13ddb0f3815..ebd5ef3f6b8b 100644 --- a/js/src/frontend/BytecodeEmitter.h +++ b/js/src/frontend/BytecodeEmitter.h @@ -137,6 +137,10 @@ struct MOZ_STACK_CLASS BytecodeEmitter { // we can get undefined behavior. uint32_t lastColumn_; + uint32_t lastSeparatorOffet_; + uint32_t lastSeparatorLine_; + uint32_t lastSeparatorColumn_; + // switchToMain sets this to the bytecode offset of the main section. mozilla::Maybe mainOffset_; @@ -488,8 +492,11 @@ struct MOZ_STACK_CLASS BytecodeEmitter { TopLevelFunction isTopLevel); void updateDepth(ptrdiff_t target); + MOZ_MUST_USE bool markStepBreakpoint(); + MOZ_MUST_USE bool markSimpleBreakpoint(); MOZ_MUST_USE bool updateLineNumberNotes(uint32_t offset); MOZ_MUST_USE bool updateSourceCoordNotes(uint32_t offset); + void updateSeparatorPosition(); JSOp strictifySetNameOp(JSOp op); diff --git a/js/src/frontend/CallOrNewEmitter.cpp b/js/src/frontend/CallOrNewEmitter.cpp index 06d7173f345d..8e324a594d97 100644 --- a/js/src/frontend/CallOrNewEmitter.cpp +++ b/js/src/frontend/CallOrNewEmitter.cpp @@ -276,6 +276,9 @@ bool CallOrNewEmitter::emitEnd(uint32_t argc, const Maybe& beginPos) { return false; } } + if (!bce_->markSimpleBreakpoint()) { + return false; + } if (!isSpread()) { if (!bce_->emitCall(op_, argc)) { // [stack] RVAL diff --git a/js/src/frontend/SourceNotes.h b/js/src/frontend/SourceNotes.h index 634469a10ed6..85fe9ecde899 100644 --- a/js/src/frontend/SourceNotes.h +++ b/js/src/frontend/SourceNotes.h @@ -187,8 +187,8 @@ class SrcNote { M(SRC_COLSPAN, "colspan", SrcNote::ColSpan::Count) \ M(SRC_NEWLINE, "newline", 0) /* Bytecode follows a source newline. */ \ M(SRC_SETLINE, "setline", SrcNote::SetLine::Count) \ - M(SRC_UNUSED22, "unused22", 0) /* Unused. */ \ - M(SRC_UNUSED23, "unused23", 0) /* Unused. */ \ + M(SRC_BREAKPOINT, "breakpoint", 0) /* Bytecode is a recommended breakpoint. */ \ + M(SRC_STEP_SEP, "step-sep", 0) /* Bytecode is the first in a new steppable area. */ \ M(SRC_XDELTA, "xdelta", 0) /* 24-31 are for extended delta notes. */ // clang-format on diff --git a/js/src/jit-test/tests/debug/Script-getOffsetMetadata.js b/js/src/jit-test/tests/debug/Script-getOffsetMetadata.js new file mode 100644 index 000000000000..be2f51650180 --- /dev/null +++ b/js/src/jit-test/tests/debug/Script-getOffsetMetadata.js @@ -0,0 +1,36 @@ +var global = newGlobal({newCompartment: true}); +var dbg = Debugger(global); +dbg.onDebuggerStatement = function(frame) { + const bps = frame.script.getPossibleBreakpoints(); + + const stepBps = []; + frame.onStep = function() { + assertOffset(this); + }; + + assertOffset(frame); + + function assertOffset(frame) { + const meta = frame.script.getOffsetMetadata(frame.offset); + + if (meta.isBreakpoint) { + assertEq(frame.offset, bps[0].offset); + const expectedData = bps.shift(); + + assertEq(meta.lineNumber, expectedData.lineNumber); + assertEq(meta.columnNumber, expectedData.columnNumber); + assertEq(meta.isStepStart, expectedData.isStepStart); + } else { + assertEq(meta.isStepStart, false); + } + }; +}; + +global.eval(` + function a() { return "str"; } + debugger; + + console.log("42" + a()); + a(); + a() + a(); +`); \ No newline at end of file diff --git a/js/src/jit-test/tests/debug/Script-getPossibleBreakpoints-02.js b/js/src/jit-test/tests/debug/Script-getPossibleBreakpoints-02.js new file mode 100644 index 000000000000..4b6d25399aa1 --- /dev/null +++ b/js/src/jit-test/tests/debug/Script-getPossibleBreakpoints-02.js @@ -0,0 +1,63 @@ + +var global = newGlobal({newCompartment: true}); +var dbg = Debugger(global); +dbg.onDebuggerStatement = onDebuggerStatement; + +global.eval(` + debugger; + function f() { + var o = {}; // 4 + + o.a; o.a; o.a; o.a; // 6 + o.a; o.a; // 7 + o.a; o.a; o.a; // 8 + o.a; // 9 + } // 10 +`); + +function onDebuggerStatement(frame) { + const fScript = frame.script.getChildScripts()[0]; + + const allBreakpoints = fScript.getPossibleBreakpoints(); + assertEq(allBreakpoints.length, 12); + + assertBPCount({ line: 4 }, 1); + assertBPCount({ line: 5 }, 0); + assertBPCount({ line: 6 }, 4); + assertBPCount({ line: 7 }, 2); + assertBPCount({ line: 8 }, 3); + assertBPCount({ line: 9 }, 1); + assertBPCount({ line: 10 }, 1); + + assertBPCount({ line: 6, minColumn: 7 }, 3); + assertBPCount({ line: 6, maxColumn: 16 }, 3); + assertBPCount({ line: 6, minColumn: 7, maxColumn: 16 }, 2); + + assertBPCount({ minLine: 9 }, 2); + assertBPCount({ minLine: 9, minColumn: 0 }, 2); + assertBPCount({ minLine: 9, minColumn: 8 }, 1); + + assertBPCount({ maxLine: 7 }, 5); + assertBPCount({ maxLine: 7, maxColumn: 0 }, 5); + assertBPCount({ maxLine: 7, maxColumn: 8 }, 6); + + assertBPCount({ minLine: 6, maxLine: 8 }, 6); + assertBPCount({ minLine: 6, minColumn: 8, maxLine: 8 }, 5); + assertBPCount({ minLine: 6, maxLine: 8, maxColumn: 8 }, 7); + assertBPCount({ minLine: 6, minColumn: 8, maxLine: 8, maxColumn: 8 }, 6); + + assertBPCount({ + minOffset: fScript.getPossibleBreakpoints({ line: 6 })[3].offset, + }, 8); + assertBPCount({ + maxOffset: fScript.getPossibleBreakpoints({ line: 6 })[3].offset, + }, 4); + assertBPCount({ + minOffset: fScript.getPossibleBreakpoints({ line: 6 })[2].offset, + maxOffset: fScript.getPossibleBreakpoints({ line: 7 })[1].offset, + }, 3); + + function assertBPCount(query, count) { + assertEq(fScript.getPossibleBreakpoints(query).length, count); + } +}; diff --git a/js/src/jit-test/tests/debug/Script-getPossibleBreakpoints.js b/js/src/jit-test/tests/debug/Script-getPossibleBreakpoints.js new file mode 100644 index 000000000000..e374fea241d7 --- /dev/null +++ b/js/src/jit-test/tests/debug/Script-getPossibleBreakpoints.js @@ -0,0 +1,391 @@ +// simple ExpressionStatement +assertBreakpoints(` + /*S*/a; + /*S*/obj.prop; +`); + +// ExpressionStatement with calls +assertBreakpoints(` + /*S*/a(); + /*S*/obj./*B*/prop(); +`); + +// ExpressionStatement with nested expression calls. +assertBreakpoints(` + "45"; + /*S*/"45" + /*B*/a(); + /*S*/b() + "45"; + /*S*/"45" + /*B*/a() + /*B*/b(); + /*S*/b() + "45" + /*B*/a(); + /*S*/b() + /*B*/a() + "45"; + + /*S*/"45" + o./*B*/a(); + /*S*/o./*B*/b() + "45"; + /*S*/"45" + o./*B*/a() + o./*B*/b(); + /*S*/o./*B*/b() + "45" + o./*B*/a(); + /*S*/o./*B*/b() + o./*B*/a() + "45"; +`); + +// var VariableStatement initializers +assertBreakpoints(` + var foo1 = /*S*/"" + o.a + "" + /*B*/b(), + foo2 = /*S*/"45", + foo3 = /*S*/"45" + /*B*/a(), + foo4 = /*S*/b() + "45", + foo5 = /*S*/"45" + /*B*/a() + /*B*/b(), + foo6 = /*S*/b() + "45" + /*B*/a(), + foo7 = /*S*/b() + /*B*/a() + "45", + foo8 = /*S*/"45" + o./*B*/a(), + foo9 = /*S*/o./*B*/b() + "45", + foo10 = /*S*/"45" + o./*B*/a() + o./*B*/b(), + foo11 = /*S*/o./*B*/b() + "45" + o./*B*/a(), + foo12 = /*S*/o./*B*/b() + o./*B*/a() + "45"; +`); + +// let VariableStatement initializers +assertBreakpoints(` + let foo1 = /*S*/"" + o.a + "" + /*B*/b(), + foo2 = /*S*/"45", + foo3 = /*S*/"45" + /*B*/a(), + foo4 = /*S*/b() + "45", + foo5 = /*S*/"45" + /*B*/a() + /*B*/b(), + foo6 = /*S*/b() + "45" + /*B*/a(), + foo7 = /*S*/b() + /*B*/a() + "45", + foo8 = /*S*/"45" + o./*B*/a(), + foo9 = /*S*/o./*B*/b() + "45", + foo10 = /*S*/"45" + o./*B*/a() + o./*B*/b(), + foo11 = /*S*/o./*B*/b() + "45" + o./*B*/a(), + foo12 = /*S*/o./*B*/b() + o./*B*/a() + "45"; +`); + +// const VariableStatement initializers +assertBreakpoints(` + const foo1 = /*S*/"" + o.a + "" + /*B*/b(), + foo2 = /*S*/"45", + foo3 = /*S*/"45" + /*B*/a(), + foo4 = /*S*/b() + "45", + foo5 = /*S*/"45" + /*B*/a() + /*B*/b(), + foo6 = /*S*/b() + "45" + /*B*/a(), + foo7 = /*S*/b() + /*B*/a() + "45", + foo8 = /*S*/"45" + o./*B*/a(), + foo9 = /*S*/o./*B*/b() + "45", + foo10 = /*S*/"45" + o./*B*/a() + o./*B*/b(), + foo11 = /*S*/o./*B*/b() + "45" + o./*B*/a(), + foo12 = /*S*/o./*B*/b() + o./*B*/a() + "45"; +`); + +// EmptyStatement +assertBreakpoints(` + ; + ; + ; + /*S*/a(); +`); + +// IfStatement +assertBreakpoints(` + if (/*S*/a) {} + if (/*S*/a()) {} + if (/*S*/obj.prop) {} + if (/*S*/obj./*B*/prop()) {} + if (/*S*/"42" + a) {} + if (/*S*/"42" + /*B*/a()) {} + if (/*S*/"42" + obj.prop) {} + if (/*S*/"42" + obj./*B*/prop()) {} +`); + +// DoWhile +assertBreakpoints(` + do { + /*S*/fn(); + } while(/*S*/a) + do { + /*S*/fn(); + } while(/*S*/"42" + /*B*/a()); +`); + +// While +assertBreakpoints(` + while(/*S*/a) { + /*S*/fn(); + } + while(/*S*/"42" + /*B*/a()) { + /*S*/fn(); + } +`); + +// ForExpr +assertBreakpoints(` + for (/*S*/b = 42; /*S*/c; /*S*/d) /*S*/fn(); +`); + +// ForVar +assertBreakpoints(` + for (var b = /*S*/42; /*S*/c; /*S*/d) /*S*/fn(); +`); + +// ForLet +assertBreakpoints(` + for (let b = /*S*/42; /*S*/c; /*S*/d) /*S*/fn(); +`); + +// ForConst +assertBreakpoints(` + for (const b = /*S*/42; /*S*/c; /*S*/d) /*S*/fn(); +`); + +// ForInExpr +assertBreakpoints(` + for (b in /*S*/d) /*S*/fn(); +`); +// ForInVar +assertBreakpoints(` + for (var b in /*S*/d) /*S*/fn(); +`); +// ForInLet +assertBreakpoints(` + for (let b in /*S*/d) /*S*/fn(); +`); +// ForInConst +assertBreakpoints(` + for (const b in /*S*/d) /*S*/fn(); +`); + +// ForOfExpr +assertBreakpoints(` + for (b of /*S*/d) /*S*/fn(); +`); +// ForOfVar +assertBreakpoints(` + for (var b of /*S*/d) /*S*/fn(); +`); +// ForOfLet +assertBreakpoints(` + for (let b of /*S*/d) /*S*/fn(); +`); +// ForOfConst +assertBreakpoints(` + for (const b of /*S*/d) /*S*/fn(); +`); + +// SwitchStatement +assertBreakpoints(` + switch (/*S*/d) { + case 42: + /*S*/fn(); + } +`); + +// ContinueStatement +assertBreakpoints(` + while (/*S*/a) { + /*S*/continue; + } +`); + +// BreakStatement +assertBreakpoints(` + while (/*S*/a) { + /*S*/break; + } +`); + +// ReturnStatement +assertBreakpoints(` + /*S*/return a + /*B*/b(); +`); + +// WithStatement +assertBreakpoints(` + with (/*S*/a) { + /*S*/fn(); + } +`); + +// ThrowStatement +assertBreakpoints(` + /*S*/throw /*B*/fn(); + /*S*/throw "42" + /*B*/fn(); +`); + +// DebuggerStatement +assertBreakpoints(` + /*S*/debugger; + /*S*/debugger; +`); + +// BlockStatent wrapper +assertBreakpoints(` + { + /*S*/a(); + } +`); + +// ClassDeclaration +assertBreakpoints(` + class Foo2 {} + /*S*/class Foo extends ("" + o.a + /*B*/a() + /*B*/b()) { } +`); + +// Misc examples +assertBreakpoints(` + /*S*/void /*B*/a(); +`); +assertBreakpoints(` + /*S*/a() + /*B*/b(); +`); +assertBreakpoints(` + for ( + var i = /*S*/0; + /*S*/i < n; // 4 + /*S*/++i + ) { + /*S*/console./*B*/log("omg"); + } +`); +assertBreakpoints(` + function * gen(){ + var foo = ( + (/*S*/console./*B*/log('before', /*B*/a())), + (yield console./*B*/log('mid', /*B*/b())), + (console./*B*/log('after', /*B*/a())) + ); + var foo2 = /*S*/a() + /*B*/b(); + /*S*/console./*B*/log(foo); + /*B*/} + var i = /*S*/0; + for (var foo of /*S*/gen()) { + /*S*/console./*B*/log(i++); + } +`); +assertBreakpoints(` + var fn /*S*/= () => { + /*S*/console./*B*/log("fn"); + /*S*/return /*B*/new Proxy({ prop: 42 }, { + deleteProperty() { + /*S*/console./*B*/log("delete"); + /*B*/} + }); + /*B*/}; +`); +assertBreakpoints(` + if ((/*S*/delete /*B*/fn().prop) + /*B*/b()) { + /*S*/console./*B*/log("foo"); + } +`); +assertBreakpoints(` + for (var j = /*S*/0; (/*S*/o.a) < 3; (/*S*/j++, /*B*/a(), /*B*/b())) { + /*S*/console./*B*/log(i); + } +`); +assertBreakpoints(` + function fn2( + [a, b] = (/*B*/a(), /*B*/b()) + ) { + /*S*/a(); + /*S*/b(); + /*B*/} + + ({ a, b } = (/*S*/a(), /*B*/b())); +`); +assertBreakpoints(` + /*S*/o.a + "42" + /*B*/a() + /*B*/b(); +`); +assertBreakpoints(` + /*S*/a(); + /*S*/o./*B*/a(/*B*/b()); +`); +assertBreakpoints(` + (/*S*/{}[obj.a] = 42 + /*B*/a()); +`); +assertBreakpoints(` + var { + foo = o.a + } = /*S*/{}; +`); +assertBreakpoints(` + var ack = /*S*/[ + o.a, + o.b, + /*B*/a(), + /*B*/a(), + /*B*/a(), + /*B*/a(), + /*B*/a(), + /*B*/a(), + /*B*/a(), + ]; +`); + +function assertBreakpoints(expected) { + const input = expected.replace(/\/\*[BS]\*\//g, ""); + + var global = newGlobal({newCompartment: true}); + var dbg = Debugger(global); + dbg.onDebuggerStatement = function(frame) { + const fScript = frame.environment.parent.getVariable("f").script; + + let positions = []; + (function recurse(script) { + const bps = script.getPossibleBreakpoints(); + const offsets = script.getPossibleBreakpointOffsets(); + + assertEq(offsets.length, bps.length); + for (let i = 0; i < bps.length; i++) { + assertEq(offsets[i], bps[i].offset); + } + + positions = positions.concat(bps); + script.getChildScripts().forEach(recurse); + })(fScript); + + const result = annotateOffsets(input, positions); + assertEq(result, expected + "/*B*/"); + }; + + global.eval(`function f(){${input}} debugger;`); +} + +function annotateOffsets(code, positions) { + const offsetLookup = createOffsetLookup(code); + + positions = positions.slice(); + positions.sort((a, b) => { + const lineDiff = a.lineNumber - b.lineNumber; + return lineDiff === 0 ? a.columnNumber - b.columnNumber : lineDiff; + }); + positions.reverse(); + + let output = ""; + let last = code.length; + for (const { lineNumber, columnNumber, isStepStart } of positions) { + const offset = offsetLookup(lineNumber, columnNumber); + + output = "/*" + (isStepStart ? "S" : "B") + "*/" + code.slice(offset, last) + output; + last = offset; + } + return code.slice(0, last) + output; +} + +function createOffsetLookup(code) { + const lines = code.split(/(\r?\n|\r|\u2028|\u2029)/g); + const lineOffsets = []; + + let count = 0; + for (const [i, str] of lines.entries()) { + if (i % 2 === 0) { + lineOffsets[i / 2] = count; + } + count += str.length; + } + + return function(line, column) { + // Lines from getAllColumnOffsets are 1-based. + line = line - 1; + + if (!lineOffsets.hasOwnProperty(line)) { + throw new Error("Unknown line " + line + " column " + column); + } + return lineOffsets[line] + column; + }; +} diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 19d3f04ef2aa..9c661db8e2eb 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -2969,6 +2969,8 @@ static MOZ_MUST_USE bool SrcNotes(JSContext* cx, HandleScript script, case SRC_BREAK2LABEL: case SRC_SWITCHBREAK: case SRC_ASSIGNOP: + case SRC_BREAKPOINT: + case SRC_STEP_SEP: case SRC_XDELTA: break; diff --git a/js/src/vm/BytecodeUtil-inl.h b/js/src/vm/BytecodeUtil-inl.h index e9c2d581679a..478bf71ccf48 100644 --- a/js/src/vm/BytecodeUtil-inl.h +++ b/js/src/vm/BytecodeUtil-inl.h @@ -118,6 +118,8 @@ class BytecodeRangeWithPosition : private BytecodeRange { sn(script->notes()), snpc(script->code()), isEntryPoint(false), + isBreakpoint(false), + seenStepSeparator(false), wasArtifactEntryPoint(false) { if (!SN_IS_TERMINATOR(sn)) { snpc += SN_DELTA(sn); @@ -168,8 +170,23 @@ class BytecodeRangeWithPosition : private BytecodeRange { // user) places to stop. bool frontIsEntryPoint() const { return isEntryPoint; } + // Breakable points are explicitly marked by the emitter as locations where + // the debugger may want to allow users to pause. + bool frontIsBreakablePoint() const { return isBreakpoint; } + + // Breakable step points are the first breakable point after a SRC_STEP_SEP + // note has been encountered. + bool frontIsBreakableStepPoint() const { + return isBreakpoint && seenStepSeparator; + } + private: void updatePosition() { + if (isBreakpoint) { + isBreakpoint = false; + seenStepSeparator = false; + } + // Determine the current line number by reading all source notes up to // and including the current offset. jsbytecode* lastLinePC = nullptr; @@ -189,6 +206,12 @@ class BytecodeRangeWithPosition : private BytecodeRange { lineno++; column = 0; lastLinePC = snpc; + } else if (type == SRC_BREAKPOINT) { + isBreakpoint = true; + lastLinePC = snpc; + } else if (type == SRC_STEP_SEP) { + seenStepSeparator = true; + lastLinePC = snpc; } sn = SN_NEXT(sn); @@ -202,6 +225,8 @@ class BytecodeRangeWithPosition : private BytecodeRange { jssrcnote* sn; jsbytecode* snpc; bool isEntryPoint; + bool isBreakpoint; + bool seenStepSeparator; bool wasArtifactEntryPoint; }; diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index d4786f218ae1..f571e8be95d3 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -217,11 +217,13 @@ MACRO(InterpretGeneratorResume, InterpretGeneratorResume, \ "InterpretGeneratorResume") \ MACRO(InvalidDate, InvalidDate, "Invalid Date") \ + MACRO(isBreakpoint, isBreakpoint, "isBreakpoint") \ MACRO(isEntryPoint, isEntryPoint, "isEntryPoint") \ MACRO(isExtensible, isExtensible, "isExtensible") \ MACRO(isFinite, isFinite, "isFinite") \ MACRO(isNaN, isNaN, "isNaN") \ MACRO(isPrototypeOf, isPrototypeOf, "isPrototypeOf") \ + MACRO(isStepStart, isStepStart, "isStepStart") \ MACRO(IterableToList, IterableToList, "IterableToList") \ MACRO(iterate, iterate, "iterate") \ MACRO(join, join, "join") \ @@ -241,16 +243,22 @@ MACRO(ltr, ltr, "ltr") \ MACRO(MapConstructorInit, MapConstructorInit, "MapConstructorInit") \ MACRO(MapIterator, MapIterator, "Map Iterator") \ + MACRO(maxColumn, maxColumn, "maxColumn") \ MACRO(maximumFractionDigits, maximumFractionDigits, "maximumFractionDigits") \ MACRO(maximumSignificantDigits, maximumSignificantDigits, \ "maximumSignificantDigits") \ + MACRO(maxLine, maxLine, "maxLine") \ + MACRO(maxOffset, maxOffset, "maxOffset") \ MACRO(message, message, "message") \ MACRO(meta, meta, "meta") \ + MACRO(minColumn, minColumn, "minColumn") \ MACRO(minDays, minDays, "minDays") \ MACRO(minimumFractionDigits, minimumFractionDigits, "minimumFractionDigits") \ MACRO(minimumIntegerDigits, minimumIntegerDigits, "minimumIntegerDigits") \ MACRO(minimumSignificantDigits, minimumSignificantDigits, \ "minimumSignificantDigits") \ + MACRO(minLine, minLine, "minLine") \ + MACRO(minOffset, minOffset, "minOffset") \ MACRO(minusSign, minusSign, "minusSign") \ MACRO(minute, minute, "minute") \ MACRO(missingArguments, missingArguments, "missingArguments") \ diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index e7973b76e0ce..dff5c9da0a85 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -6189,6 +6189,478 @@ static bool EnsureScriptOffsetIsValid(JSContext* cx, JSScript* script, return false; } +template +class DebuggerScriptGetPossibleBreakpointsMatcher { + JSContext* cx_; + MutableHandleObject result_; + + Maybe minOffset; + Maybe maxOffset; + + Maybe minLine; + size_t minColumn; + Maybe maxLine; + size_t maxColumn; + + bool passesQuery(size_t offset, size_t lineno, size_t colno) { + // [minOffset, maxOffset) - Inclusive minimum and exclusive maximum. + if ((minOffset && offset < *minOffset) || + (maxOffset && offset >= *maxOffset)) { + return false; + } + + if (minLine) { + if (lineno < *minLine || (lineno == *minLine && colno < minColumn)) { + return false; + } + } + + if (maxLine) { + if (lineno > *maxLine || (lineno == *maxLine && colno >= maxColumn)) { + return false; + } + } + + return true; + } + + bool maybeAppendEntry(size_t offset, size_t lineno, size_t colno, + bool isStepStart) { + if (!passesQuery(offset, lineno, colno)) { + return true; + } + + if (OnlyOffsets) { + if (!NewbornArrayPush(cx_, result_, NumberValue(offset))) { + return false; + } + + return true; + } + + RootedPlainObject entry(cx_, NewBuiltinClassInstance(cx_)); + if (!entry) { + return false; + } + + RootedValue value(cx_, NumberValue(offset)); + if (!DefineDataProperty(cx_, entry, cx_->names().offset, value)) { + return false; + } + + value = NumberValue(lineno); + if (!DefineDataProperty(cx_, entry, cx_->names().lineNumber, value)) { + return false; + } + + value = NumberValue(colno); + if (!DefineDataProperty(cx_, entry, cx_->names().columnNumber, value)) { + return false; + } + + value = BooleanValue(isStepStart); + if (!DefineDataProperty(cx_, entry, cx_->names().isStepStart, value)) { + return false; + } + + if (!NewbornArrayPush(cx_, result_, ObjectValue(*entry))) { + return false; + } + return true; + } + + bool parseIntValue(HandleValue value, size_t* result) { + if (!value.isNumber()) { + return false; + } + + double doubleOffset = value.toNumber(); + if (doubleOffset < 0 || (unsigned int)doubleOffset != doubleOffset) { + return false; + } + + *result = doubleOffset; + return true; + } + + bool parseIntValue(HandleValue value, Maybe* result) { + size_t result_; + if (!parseIntValue(value, &result_)) { + return false; + } + + *result = Some(result_); + return true; + } + + public: + explicit DebuggerScriptGetPossibleBreakpointsMatcher( + JSContext* cx, MutableHandleObject result) + : cx_(cx), + result_(result), + minOffset(), + maxOffset(), + minLine(), + minColumn(0), + maxLine(), + maxColumn(0) {} + + bool parseQuery(HandleObject query) { + RootedValue lineValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().line, &lineValue)) { + return false; + } + + RootedValue minLineValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().minLine, &minLineValue)) { + return false; + } + + RootedValue minColumnValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().minColumn, + &minColumnValue)) { + return false; + } + + RootedValue minOffsetValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().minOffset, + &minOffsetValue)) { + return false; + } + + RootedValue maxLineValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().maxLine, &maxLineValue)) { + return false; + } + + RootedValue maxColumnValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().maxColumn, + &maxColumnValue)) { + return false; + } + + RootedValue maxOffsetValue(cx_); + if (!GetProperty(cx_, query, query, cx_->names().maxOffset, + &maxOffsetValue)) { + return false; + } + + if (!minOffsetValue.isUndefined()) { + if (!parseIntValue(minOffsetValue, &minOffset)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'minOffset'", "not an integer"); + return false; + } + } + if (!maxOffsetValue.isUndefined()) { + if (!parseIntValue(maxOffsetValue, &maxOffset)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'maxOffset'", "not an integer"); + return false; + } + } + + if (!lineValue.isUndefined()) { + if (!minLineValue.isUndefined() || !maxLineValue.isUndefined()) { + JS_ReportErrorNumberASCII(cx_, GetErrorMessage, nullptr, + JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'line'", + "not allowed alongside 'minLine'/'maxLine'"); + } + + size_t line; + if (!parseIntValue(lineValue, &line)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'line'", "not an integer"); + return false; + } + + // If no end column is given, we use the default of 0 and wrap to + // the next line. + minLine = Some(line); + maxLine = Some(line + (maxColumnValue.isUndefined() ? 1 : 0)); + } + + if (!minLineValue.isUndefined()) { + if (!parseIntValue(minLineValue, &minLine)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'minLine'", "not an integer"); + return false; + } + } + + if (!minColumnValue.isUndefined()) { + if (!minLine) { + JS_ReportErrorNumberASCII(cx_, GetErrorMessage, nullptr, + JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'minColumn'", + "not allowed without 'line' or 'minLine'"); + return false; + } + + if (!parseIntValue(minColumnValue, &minColumn)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'minColumn'", "not an integer"); + return false; + } + } + + if (!maxLineValue.isUndefined()) { + if (!parseIntValue(maxLineValue, &maxLine)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'maxLine'", "not an integer"); + return false; + } + } + + if (!maxColumnValue.isUndefined()) { + if (!maxLine) { + JS_ReportErrorNumberASCII(cx_, GetErrorMessage, nullptr, + JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'maxColumn'", + "not allowed without 'line' or 'maxLine'"); + return false; + } + + if (!parseIntValue(maxColumnValue, &maxColumn)) { + JS_ReportErrorNumberASCII( + cx_, GetErrorMessage, nullptr, JSMSG_UNEXPECTED_TYPE, + "getPossibleBreakpoints' 'maxColumn'", "not an integer"); + return false; + } + } + + return true; + } + + using ReturnType = bool; + ReturnType match(HandleScript script) { + // Second pass: build the result array. + result_.set(NewDenseEmptyArray(cx_)); + if (!result_) { + return false; + } + + for (BytecodeRangeWithPosition r(cx_, script); !r.empty(); r.popFront()) { + if (!r.frontIsBreakablePoint()) { + continue; + } + + size_t offset = r.frontOffset(); + size_t lineno = r.frontLineNumber(); + size_t colno = r.frontColumnNumber(); + + if (!maybeAppendEntry(offset, lineno, colno, + r.frontIsBreakableStepPoint())) { + return false; + } + } + + return true; + } + ReturnType match(Handle lazyScript) { + RootedScript script(cx_, DelazifyScript(cx_, lazyScript)); + if (!script) { + return false; + } + return match(script); + } + ReturnType match(Handle instanceObj) { + wasm::Instance& instance = instanceObj->instance(); + + Vector offsets(cx_); + if (instance.debugEnabled() && + !instance.debug().getAllColumnOffsets(cx_, &offsets)) { + return false; + } + + result_.set(NewDenseEmptyArray(cx_)); + if (!result_) { + return false; + } + + for (uint32_t i = 0; i < offsets.length(); i++) { + size_t lineno = offsets[i].lineno; + size_t column = offsets[i].column; + size_t offset = offsets[i].offset; + if (!maybeAppendEntry(offset, lineno, column, true)) { + return false; + } + } + return true; + } +}; + +static bool DebuggerScript_getPossibleBreakpoints(JSContext* cx, unsigned argc, + Value* vp) { + THIS_DEBUGSCRIPT_REFERENT(cx, argc, vp, "getPossibleBreakpoints", args, obj, + referent); + + RootedObject result(cx); + DebuggerScriptGetPossibleBreakpointsMatcher matcher(cx, &result); + if (args.length() >= 1 && !args[0].isUndefined()) { + RootedObject queryObject(cx, NonNullObject(cx, args[0])); + if (!queryObject || !matcher.parseQuery(queryObject)) { + return false; + } + } + if (!referent.match(matcher)) { + return false; + } + + args.rval().setObject(*result); + return true; +} + +static bool DebuggerScript_getPossibleBreakpointOffsets(JSContext* cx, + unsigned argc, + Value* vp) { + THIS_DEBUGSCRIPT_REFERENT(cx, argc, vp, "getPossibleBreakpointOffsets", args, + obj, referent); + + RootedObject result(cx); + DebuggerScriptGetPossibleBreakpointsMatcher matcher(cx, &result); + if (args.length() >= 1 && !args[0].isUndefined()) { + RootedObject queryObject(cx, NonNullObject(cx, args[0])); + if (!queryObject || !matcher.parseQuery(queryObject)) { + return false; + } + } + if (!referent.match(matcher)) { + return false; + } + + args.rval().setObject(*result); + return true; +} + +class DebuggerScriptGetOffsetMetadataMatcher { + JSContext* cx_; + size_t offset_; + MutableHandlePlainObject result_; + + public: + explicit DebuggerScriptGetOffsetMetadataMatcher( + JSContext* cx, size_t offset, MutableHandlePlainObject result) + : cx_(cx), offset_(offset), result_(result) {} + using ReturnType = bool; + ReturnType match(HandleScript script) { + if (!EnsureScriptOffsetIsValid(cx_, script, offset_)) { + return false; + } + + result_.set(NewBuiltinClassInstance(cx_)); + if (!result_) { + return false; + } + + BytecodeRangeWithPosition r(cx_, script); + while (!r.empty() && r.frontOffset() < offset_) { + r.popFront(); + } + + RootedValue value(cx_, NumberValue(r.frontLineNumber())); + if (!DefineDataProperty(cx_, result_, cx_->names().lineNumber, value)) { + return false; + } + + value = NumberValue(r.frontColumnNumber()); + if (!DefineDataProperty(cx_, result_, cx_->names().columnNumber, value)) { + return false; + } + + value = BooleanValue(r.frontIsBreakablePoint()); + if (!DefineDataProperty(cx_, result_, cx_->names().isBreakpoint, value)) { + return false; + } + + value = BooleanValue(r.frontIsBreakableStepPoint()); + if (!DefineDataProperty(cx_, result_, cx_->names().isStepStart, value)) { + return false; + } + + return true; + } + ReturnType match(Handle lazyScript) { + RootedScript script(cx_, DelazifyScript(cx_, lazyScript)); + if (!script) { + return false; + } + return match(script); + } + ReturnType match(Handle instanceObj) { + wasm::Instance& instance = instanceObj->instance(); + if (!instance.debugEnabled()) { + JS_ReportErrorNumberASCII(cx_, GetErrorMessage, nullptr, + JSMSG_DEBUG_BAD_OFFSET); + return false; + } + + size_t lineno; + size_t column; + if (!instance.debug().getOffsetLocation(offset_, &lineno, &column)) { + JS_ReportErrorNumberASCII(cx_, GetErrorMessage, nullptr, + JSMSG_DEBUG_BAD_OFFSET); + return false; + } + + result_.set(NewBuiltinClassInstance(cx_)); + if (!result_) { + return false; + } + + RootedValue value(cx_, NumberValue(lineno)); + if (!DefineDataProperty(cx_, result_, cx_->names().lineNumber, value)) { + return false; + } + + value = NumberValue(column); + if (!DefineDataProperty(cx_, result_, cx_->names().columnNumber, value)) { + return false; + } + + value.setBoolean(true); + if (!DefineDataProperty(cx_, result_, cx_->names().isBreakpoint, value)) { + return false; + } + + value.setBoolean(true); + if (!DefineDataProperty(cx_, result_, cx_->names().isStepStart, value)) { + return false; + } + + return true; + } +}; + +static bool DebuggerScript_getOffsetMetadata(JSContext* cx, unsigned argc, + Value* vp) { + THIS_DEBUGSCRIPT_REFERENT(cx, argc, vp, "getOffsetMetadata", args, obj, + referent); + if (!args.requireAtLeast(cx, "Debugger.Script.getOffsetMetadata", 1)) { + return false; + } + size_t offset; + if (!ScriptOffset(cx, args[0], &offset)) { + return false; + } + + RootedPlainObject result(cx); + DebuggerScriptGetOffsetMetadataMatcher matcher(cx, offset, &result); + if (!referent.match(matcher)) { + return false; + } + + args.rval().setObject(*result); + return true; +} + namespace { /* @@ -7488,18 +7960,27 @@ static const JSPropertySpec DebuggerScript_properties[] = { static const JSFunctionSpec DebuggerScript_methods[] = { JS_FN("getChildScripts", DebuggerScript_getChildScripts, 0, 0), - JS_FN("getAllOffsets", DebuggerScript_getAllOffsets, 0, 0), - JS_FN("getAllColumnOffsets", DebuggerScript_getAllColumnOffsets, 0, 0), - JS_FN("getLineOffsets", DebuggerScript_getLineOffsets, 1, 0), - JS_FN("getOffsetLocation", DebuggerScript_getOffsetLocation, 0, 0), - JS_FN("getSuccessorOffsets", DebuggerScript_getSuccessorOffsets, 1, 0), - JS_FN("getPredecessorOffsets", DebuggerScript_getPredecessorOffsets, 1, 0), + JS_FN("getPossibleBreakpoints", DebuggerScript_getPossibleBreakpoints, 0, + 0), + JS_FN("getPossibleBreakpointOffsets", + DebuggerScript_getPossibleBreakpointOffsets, 0, 0), JS_FN("setBreakpoint", DebuggerScript_setBreakpoint, 2, 0), JS_FN("getBreakpoints", DebuggerScript_getBreakpoints, 1, 0), JS_FN("clearBreakpoint", DebuggerScript_clearBreakpoint, 1, 0), JS_FN("clearAllBreakpoints", DebuggerScript_clearAllBreakpoints, 0, 0), JS_FN("isInCatchScope", DebuggerScript_isInCatchScope, 1, 0), + JS_FN("getOffsetMetadata", DebuggerScript_getOffsetMetadata, 1, 0), JS_FN("getOffsetsCoverage", DebuggerScript_getOffsetsCoverage, 0, 0), + JS_FN("getSuccessorOffsets", DebuggerScript_getSuccessorOffsets, 1, 0), + JS_FN("getPredecessorOffsets", DebuggerScript_getPredecessorOffsets, 1, 0), + + // The following APIs are deprecated due to their reliance on the + // under-defined 'entrypoint' concept. Make use of getPossibleBreakpoints, + // getPossibleBreakpointOffsets, or getOffsetMetadata instead. + JS_FN("getAllOffsets", DebuggerScript_getAllOffsets, 0, 0), + JS_FN("getAllColumnOffsets", DebuggerScript_getAllColumnOffsets, 0, 0), + JS_FN("getLineOffsets", DebuggerScript_getLineOffsets, 1, 0), + JS_FN("getOffsetLocation", DebuggerScript_getOffsetLocation, 0, 0), JS_FS_END}; /*** Debugger.Source ********************************************************/ From b78439c9df9b72386320018f9282aa1c57130542 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 13 Feb 2019 02:31:02 +0000 Subject: [PATCH 48/79] Bug 1518661 - Part 6: Ensure that stepOut from inside onPop behaves properly. r=jlast The step-out logic currently has a special case to skip pausing onPop when stepping out of the current frame. This logic gets confused if you are already _in_ the onPop of the current frame though, and causes you to also fail to pause onPop in the parent frame. Differential Revision: https://phabricator.services.mozilla.com/D17663 --HG-- extra : moz-landing-system : lando --- devtools/server/actors/thread.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/devtools/server/actors/thread.js b/devtools/server/actors/thread.js index 6b1f2aa5d408..e41f29c8b619 100644 --- a/devtools/server/actors/thread.js +++ b/devtools/server/actors/thread.js @@ -785,7 +785,7 @@ const ThreadActor = ActorClassWithSpec(threadSpec, { * rejected with an error packet. */ _handleResumeLimit: async function(request) { - const steppingType = request.resumeLimit.type; + let steppingType = request.resumeLimit.type; const rewinding = request.rewind; if (!["break", "step", "next", "finish", "warp"].includes(steppingType)) { return Promise.reject({ @@ -799,6 +799,12 @@ const ThreadActor = ActorClassWithSpec(threadSpec, { return true; } + // If we are stepping out of the onPop handler, we want to use "next" mode + // so that the parent frame's handlers behave consistently. + if (steppingType === "finish" && this.youngestFrame.reportedPop) { + steppingType = "next"; + } + const generatedLocation = this.sources.getFrameLocation(this.youngestFrame); const { onEnterFrame, onPop, onStep } = this._makeSteppingHooks( generatedLocation, From 241f292283c2917667e14b2f501c8be5637d2b7b Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 13 Feb 2019 02:31:03 +0000 Subject: [PATCH 49/79] Bug 1518661 - Part 7: Update debugger server to use new getPossibleBreakpoints APIs. r=jlast Making use of the new SpiderMonkey APIs for available breakpoints means that the server needs to think a lot less about where it is pausing and allows us to drop the concept of a pause points from the server entirely. It is now up to SpiderMonkey to decide where it will and will not stop when it is stepping. Differential Revision: https://phabricator.services.mozilla.com/D17665 --HG-- extra : moz-landing-system : lando --- .../new/src/actions/ast/setPausePoints.js | 26 +------ .../browser_dbg-breakpoints-actions.js | 17 ++--- .../browser_dbg-keyboard-shortcuts.js | 3 + .../mochitest/browser_dbg-pause-points.js | 21 +---- .../browser_dbg-sourcemapped-stepping.js | 9 ++- .../test/mochitest/browser_dbg-sourcemaps.js | 1 - .../test/mochitest/browser_dbg-stepping.js | 2 +- .../mochitest/browser_dbg_rr_stepping-04.js | 2 - devtools/server/actors/replay/debugger.js | 7 ++ devtools/server/actors/replay/replay.js | 3 + devtools/server/actors/source.js | 24 +++--- devtools/server/actors/thread.js | 30 ++------ devtools/server/actors/utils/TabSources.js | 2 +- .../server/tests/unit/test_breakpoint-10.js | 18 ++++- .../server/tests/unit/test_breakpoint-11.js | 19 ++++- .../server/tests/unit/test_breakpoint-13.js | 6 -- .../server/tests/unit/test_breakpoint-14.js | 5 -- ...reakpoint-on-line-with-multiple-offsets.js | 7 +- devtools/server/tests/unit/test_source-02.js | 32 ++++++-- .../server/tests/unit/test_stepping-01.js | 8 +- .../server/tests/unit/test_stepping-06.js | 21 ++--- .../server/tests/unit/test_stepping-07.js | 7 +- .../server/tests/unit/test_stepping-08.js | 12 ++- .../server/tests/unit/test_stepping-09.js | 2 +- .../unit/test_stepping-with-pause-points.js | 76 ------------------- .../test_stepping-with-skip-breakpoints.js | 4 +- devtools/server/tests/unit/xpcshell.ini | 1 - 27 files changed, 139 insertions(+), 226 deletions(-) delete mode 100644 devtools/server/tests/unit/test_stepping-with-pause-points.js diff --git a/devtools/client/debugger/new/src/actions/ast/setPausePoints.js b/devtools/client/debugger/new/src/actions/ast/setPausePoints.js index 5bf71261b23f..9b84896d2983 100644 --- a/devtools/client/debugger/new/src/actions/ast/setPausePoints.js +++ b/devtools/client/debugger/new/src/actions/ast/setPausePoints.js @@ -14,19 +14,6 @@ import { getGeneratedLocation } from "../../utils/source-maps"; import type { SourceId } from "../../types"; import type { ThunkArgs, Action } from "../types"; -function compressPausePoints(pausePoints) { - const compressed = {}; - for (const line in pausePoints) { - compressed[line] = {}; - for (const col in pausePoints[line]) { - const { types } = pausePoints[line][col]; - compressed[line][col] = (types.break ? 1 : 0) | (types.step ? 2 : 0); - } - } - - return compressed; -} - async function mapLocations(pausePoints, state, source, sourceMaps) { const pausePointList = convertToList(pausePoints); const sourceId = source.id; @@ -58,17 +45,8 @@ export function setPausePoints(sourceId: SourceId) { return; } - let pausePoints = await parser.getPausePoints(sourceId); - - if (isGenerated(source)) { - const compressed = compressPausePoints(pausePoints); - for (const sourceActor of getSourceActors(getState(), sourceId)) { - await client.setPausePoints(sourceActor, compressed); - } - } - - pausePoints = await mapLocations( - pausePoints, + const pausePoints = await mapLocations( + await parser.getPausePoints(sourceId), getState(), source, sourceMaps diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-actions.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-actions.js index 53fcb9d9ddfe..749e1b8200c4 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-actions.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-actions.js @@ -28,7 +28,6 @@ add_task(async function() { await selectSource(dbg, "simple1"); await waitForSelectedSource(dbg, "simple1"); - await addBreakpoint(dbg, "simple1", 1); await addBreakpoint(dbg, "simple1", 4); await addBreakpoint(dbg, "simple1", 5); await addBreakpoint(dbg, "simple1", 6); @@ -40,14 +39,14 @@ add_task(async function() { // which promises get resolved. The problem seems to indicate a coverage gap // in waitUntilService(). Workaround this by only waiting for one dispatch, // though this is fragile and could break again in the future. - let dispatched = waitForDispatch(dbg, "DISABLE_BREAKPOINT", /*3*/ 1); + let dispatched = waitForDispatch(dbg, "DISABLE_BREAKPOINT", /*2*/ 1); selectContextMenuItem(dbg, selectors.breakpointContextMenu.disableOthers); await waitForState(dbg, state => dbg.selectors.getBreakpointsList(state) - .every(bp => (bp.location.line !== 1) === bp.disabled) + .every(bp => (bp.location.line !== 4) === bp.disabled) ); await dispatched; - ok("breakpoint at 1 is the only enabled breakpoint"); + ok("breakpoint at 4 is the only enabled breakpoint"); openFirstBreakpointContextMenu(dbg); // select "Disable All" @@ -61,23 +60,23 @@ add_task(async function() { openFirstBreakpointContextMenu(dbg); // select "Enable Others" - dispatched = waitForDispatch(dbg, "ENABLE_BREAKPOINT", 3); + dispatched = waitForDispatch(dbg, "ENABLE_BREAKPOINT", 2); selectContextMenuItem(dbg, selectors.breakpointContextMenu.enableOthers); await waitForState(dbg, state => dbg.selectors.getBreakpointsList(state) - .every(bp => (bp.location.line === 1) === bp.disabled) + .every(bp => (bp.location.line === 4) === bp.disabled) ); await dispatched; ok("all breakpoints except line 1 are enabled"); openFirstBreakpointContextMenu(dbg); // select "Remove Others" - dispatched = waitForDispatch(dbg, "REMOVE_BREAKPOINT", 3); + dispatched = waitForDispatch(dbg, "REMOVE_BREAKPOINT", 2); selectContextMenuItem(dbg, selectors.breakpointContextMenu.removeOthers); await waitForState(dbg, state => dbg.selectors.getBreakpointsList(state).length === 1 && - dbg.selectors.getBreakpointsList(state)[0].location.line === 1 + dbg.selectors.getBreakpointsList(state)[0].location.line === 4 ); await dispatched; - ok("remaining breakpoint should be on line 1"); + ok("remaining breakpoint should be on line 4"); }); diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-keyboard-shortcuts.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-keyboard-shortcuts.js index 817423a90243..aa2f5dbe97bb 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-keyboard-shortcuts.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-keyboard-shortcuts.js @@ -36,6 +36,9 @@ add_task(async function() { await pressResume(dbg); assertPausedLocation(dbg); + await pressStepOver(dbg); + assertPausedLocation(dbg); + await pressStepIn(dbg); assertPausedLocation(dbg); diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js index a3c2fbb791c4..7025d757b740 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-pause-points.js @@ -33,28 +33,17 @@ add_task(async function test() { await selectSource(dbg, "pause-points.js") await testCase(dbg, { name: "statements", - steps: [ - [9, 2], - [10, 4], - [10, 13], - [11, 2], - [11, 10], - [11, 21], - [11, 29], - [12, 2], - [12, 12], - [13, 0] - ] + steps: [[9,2], [10,4], [10,13], [11,2], [11,21], [12,2], [12,12], [13,0]] }); await testCase(dbg, { name: "expressions", - steps: [[40,2], [41,2], [41,8], [42,12], [43,0]] + steps: [[40,2], [41,2], [42,12], [43,0]] }); await testCase(dbg, { name: "sequences", - steps: [[23,2], [25,12], [31,4], [34,2], [37,0]] + steps: [[23,2], [25,12], [29,12], [34,2], [37,0]] }); await testCase(dbg, { @@ -62,15 +51,11 @@ add_task(async function test() { steps: [ [16, 2], [17, 12], - [17, 20], [18, 10], - [19, 2], [19, 8], [19, 17], - [19, 25], [19, 8], [19, 17], - [19, 25], [19, 8] ] }); diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js index b024aa86809b..5c5cc427a37e 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemapped-stepping.js @@ -57,6 +57,7 @@ function testStepOverForOf(dbg) { { line: 4, column: 2 }, [ ["stepOver", { line: 6, column: 20 }], + ["stepOver", { line: 6, column: 2 }], ["stepOver", { line: 7, column: 4 }], ["stepOver", { line: 6, column: 2 }], ["stepOver", { line: 7, column: 4 }], @@ -76,10 +77,10 @@ function testStepOverForOfArray(dbg) { { line: 3, column: 2 }, [ ["stepOver", { line: 5, column: 2 }], - ["stepOver", { line: 5, column: 7 }], + ["stepOver", { line: 5, column: 13 }], ["stepOver", { line: 6, column: 4 }], ["stepOver", { line: 5, column: 2 }], - ["stepOver", { line: 5, column: 7 }], + ["stepOver", { line: 5, column: 13 }], ["stepOver", { line: 6, column: 4 }], ["stepOver", { line: 5, column: 2 }], ["stepOver", { line: 9, column: 2 }] @@ -114,9 +115,9 @@ function testStepOverForOfArrayClosure(dbg) { { line: 3, column: 2 }, [ ["stepOver", { line: 5, column: 2 }], - ["stepOver", { line: 5, column: 7 }], + ["stepOver", { line: 5, column: 13 }], ["stepOver", { line: 5, column: 2 }], - ["stepOver", { line: 5, column: 7 }], + ["stepOver", { line: 5, column: 13 }], ["stepOver", { line: 5, column: 2 }], ["stepOver", { line: 9, column: 2 }] ] diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js index 1b32582b8142..ca527c725072 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js @@ -81,7 +81,6 @@ add_task(async function() { await waitForPaused(dbg); assertPausedLocation(dbg); - await stepIn(dbg); await stepIn(dbg); assertPausedLocation(dbg); diff --git a/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js b/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js index 7be3df86c25e..c856aca232da 100644 --- a/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js +++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-stepping.js @@ -24,6 +24,6 @@ add_task(async function test() { await stepIn(dbg); await stepIn(dbg); - assertDebugLine(dbg, 42267); + assertDebugLine(dbg, 42271); assertPausedLocation(dbg); }); diff --git a/devtools/client/webreplay/mochitest/browser_dbg_rr_stepping-04.js b/devtools/client/webreplay/mochitest/browser_dbg_rr_stepping-04.js index 28500312f90d..154351daff19 100644 --- a/devtools/client/webreplay/mochitest/browser_dbg_rr_stepping-04.js +++ b/devtools/client/webreplay/mochitest/browser_dbg_rr_stepping-04.js @@ -28,12 +28,10 @@ add_task(async function() { await reverseStepOverToLine(client, 21); await checkEvaluateInTopFrame(client, "number", 9); - await stepOverToLine(client, 21); await stepOverToLine(client, 22); await stepOverToLine(client, 23); await stepOverToLine(client, 13); await stepOverToLine(client, 17); - await stepOverToLine(client, 17); await stepOverToLine(client, 18); // After forward-stepping out of the topmost frame we should run forward to diff --git a/devtools/server/actors/replay/debugger.js b/devtools/server/actors/replay/debugger.js index 99c25aeb3437..c0b709da6f24 100644 --- a/devtools/server/actors/replay/debugger.js +++ b/devtools/server/actors/replay/debugger.js @@ -737,6 +737,13 @@ ReplayDebuggerScript.prototype = { getSuccessorOffsets(pc) { return this._forward("getSuccessorOffsets", pc); }, getPredecessorOffsets(pc) { return this._forward("getPredecessorOffsets", pc); }, getAllColumnOffsets() { return this._forward("getAllColumnOffsets"); }, + getOffsetMetadata(pc) { return this._forward("getOffsetMetadata", pc); }, + getPossibleBreakpoints(query) { + return this._forward("getPossibleBreakpoints", query); + }, + getPossibleBreakpointOffsets(query) { + return this._forward("getPossibleBreakpointOffsets", query); + }, setBreakpoint(offset, handler) { this._dbg._setBreakpoint(() => { handler.hit(this._dbg.getNewestFrame()); }, diff --git a/devtools/server/actors/replay/replay.js b/devtools/server/actors/replay/replay.js index fa762dda2373..74a0b593d4d3 100644 --- a/devtools/server/actors/replay/replay.js +++ b/devtools/server/actors/replay/replay.js @@ -783,6 +783,9 @@ const gRequestHandlers = { getSuccessorOffsets: forwardToScript("getSuccessorOffsets"), getPredecessorOffsets: forwardToScript("getPredecessorOffsets"), getAllColumnOffsets: forwardToScript("getAllColumnOffsets"), + getOffsetMetadata: forwardToScript("getOffsetMetadata"), + getPossibleBreakpoints: forwardToScript("getPossibleBreakpoints"), + getPossibleBreakpointOffsets: forwardToScript("getPossibleBreakpointOffsets"), frameEvaluate(request) { if (!RecordReplayControl.maybeDivergeFromRecording()) { diff --git a/devtools/server/actors/source.js b/devtools/server/actors/source.js index a99172a9f8d9..cad46030b90b 100644 --- a/devtools/server/actors/source.js +++ b/devtools/server/actors/source.js @@ -268,7 +268,7 @@ const SourceActor = ActorClassWithSpec(sourceSpec, { getExecutableLines: async function() { const offsetsLines = new Set(); for (const s of this._findDebuggeeScripts()) { - for (const offset of s.getAllColumnOffsets()) { + for (const offset of s.getPossibleBreakpoints()) { offsetsLines.add(offset.lineNumber); } } @@ -307,7 +307,7 @@ const SourceActor = ActorClassWithSpec(sourceSpec, { const positions = []; for (const script of scripts) { - const offsets = script.getAllColumnOffsets(); + const offsets = script.getPossibleBreakpoints(); for (const { lineNumber, columnNumber } of offsets) { if ( lineNumber < startLine || @@ -330,13 +330,7 @@ const SourceActor = ActorClassWithSpec(sourceSpec, { .sort((a, b) => { const lineDiff = a.line - b.line; return lineDiff === 0 ? a.column - b.column : lineDiff; - }) - // Filter out duplicate locations since they are useless in this context. - .filter((item, i, arr) => ( - i === 0 || - item.line !== arr[i - 1].line || - item.column !== arr[i - 1].column - )); + }); }, getBreakpointPositionsCompressed(query) { @@ -449,12 +443,13 @@ const SourceActor = ActorClassWithSpec(sourceSpec, { // Find all entry points that correspond to the given location. const entryPoints = []; if (column === undefined) { - // This is a line breakpoint, so we are interested in all offsets - // that correspond to the given line number. + // This is a line breakpoint, so we add a breakpoint on the first + // breakpoint on the line. for (const script of scripts) { - const offsets = script.getLineOffsets(line); + const offsets = script.getPossibleBreakpointOffsets({ line }); if (offsets.length > 0) { - entryPoints.push({ script, offsets }); + entryPoints.push({ script, offsets: [offsets[0]] }); + break; } } } else { @@ -463,8 +458,7 @@ const SourceActor = ActorClassWithSpec(sourceSpec, { const columnToOffsetMaps = scripts.map(script => [ script, - script.getAllColumnOffsets() - .filter(({ lineNumber }) => lineNumber === line), + script.getPossibleBreakpoints({ line }), ] ); diff --git a/devtools/server/actors/thread.js b/devtools/server/actors/thread.js index e41f29c8b619..7663a7903081 100644 --- a/devtools/server/actors/thread.js +++ b/devtools/server/actors/thread.js @@ -607,51 +607,37 @@ const ThreadActor = ActorClassWithSpec(threadSpec, { // "step" from another location. _intraFrameLocationIsStepTarget: function(startLocation, script, offset) { // Only allow stepping stops at entry points for the line. - if (!script.getOffsetLocation(offset).isEntryPoint) { + if (!script.getOffsetMetadata(offset).isBreakpoint) { return false; } - // Cases when we have executed enough within a frame to consider a "step" - // to have occured: - // - // 1. We change URLs (can happen without changing frames thanks to - // source mapping). - // 2. The source has pause points and we change locations. - // 3. The source does not have pause points and we change lines. - const generatedLocation = this.sources.getScriptOffsetLocation(script, offset); - // Case 1. if (startLocation.generatedUrl !== generatedLocation.generatedUrl) { return true; } - const pausePoints = generatedLocation.generatedSourceActor.pausePoints; + // TODO(logan): When we remove points points, this can be removed too as + // we assert that we're at a different frame offset from the last time + // we paused. const lineChanged = startLocation.generatedLine !== generatedLocation.generatedLine; const columnChanged = startLocation.generatedColumn !== generatedLocation.generatedColumn; - - if (!pausePoints) { - // Case 3. - return lineChanged; - } - - // Case 2. if (!lineChanged && !columnChanged) { return false; } // When pause points are specified for the source, // we should pause when we are at a stepOver pause point - const pausePoint = findPausePointForLocation(pausePoints, generatedLocation); + const pausePoints = generatedLocation.generatedSourceActor.pausePoints; + const pausePoint = pausePoints && + findPausePointForLocation(pausePoints, generatedLocation); if (pausePoint) { return pausePoint.step; } - // NOTE: if we do not find a pause point we want to - // fall back on the old behavior (Case 3) - return lineChanged; + return script.getOffsetMetadata(offset).isStepStart; }, _makeOnStep: function({ thread, pauseAndRespond, startFrame, diff --git a/devtools/server/actors/utils/TabSources.js b/devtools/server/actors/utils/TabSources.js index a5d68a2cac9f..f35ff071780e 100644 --- a/devtools/server/actors/utils/TabSources.js +++ b/devtools/server/actors/utils/TabSources.js @@ -273,7 +273,7 @@ TabSources.prototype = { * Returns an object of the form { source, line, column } */ getScriptOffsetLocation: function(script, offset) { - const {lineNumber, columnNumber} = script.getOffsetLocation(offset); + const {lineNumber, columnNumber} = script.getOffsetMetadata(offset); return new GeneratedLocation( this.createSourceActor(script.source), lineNumber, diff --git a/devtools/server/tests/unit/test_breakpoint-10.js b/devtools/server/tests/unit/test_breakpoint-10.js index 39d58d21194c..51521522e822 100644 --- a/devtools/server/tests/unit/test_breakpoint-10.js +++ b/devtools/server/tests/unit/test_breakpoint-10.js @@ -16,7 +16,11 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { threadClient, packet.frame.where.actor ); - const location = { sourceUrl: source.url, line: debuggee.line0 + 3 }; + const location = { + sourceUrl: source.url, + line: debuggee.line0 + 3, + column: 5, + }; threadClient.setBreakpoint(location, {}); @@ -27,6 +31,16 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { // Check that the breakpoint worked. Assert.equal(debuggee.i, 0); + // Remove the breakpoint. + threadClient.removeBreakpoint(location); + + const location2 = { + sourceUrl: source.url, + line: debuggee.line0 + 3, + column: 12, + }; + threadClient.setBreakpoint(location2, {}); + threadClient.addOneTimeListener("paused", function(event, packet) { // Check the return value. Assert.equal(packet.type, "paused"); @@ -35,7 +49,7 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { Assert.equal(debuggee.i, 1); // Remove the breakpoint. - threadClient.removeBreakpoint(location); + threadClient.removeBreakpoint(location2); threadClient.resume(resolve); }); diff --git a/devtools/server/tests/unit/test_breakpoint-11.js b/devtools/server/tests/unit/test_breakpoint-11.js index fd682cbc9a0d..86e8b1c8886c 100644 --- a/devtools/server/tests/unit/test_breakpoint-11.js +++ b/devtools/server/tests/unit/test_breakpoint-11.js @@ -16,7 +16,11 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { threadClient, packet.frame.where.actor ); - const location = { sourceUrl: source.url, line: debuggee.line0 + 2 }; + const location = { + sourceUrl: source.url, + line: debuggee.line0 + 2, + column: 8, + }; threadClient.setBreakpoint(location, {}); @@ -27,6 +31,17 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { // Check that the breakpoint worked. Assert.equal(debuggee.a, undefined); + // Remove the breakpoint. + threadClient.removeBreakpoint(location); + + const location2 = { + sourceUrl: source.url, + line: debuggee.line0 + 2, + column: 32, + }; + + threadClient.setBreakpoint(location2, {}); + threadClient.addOneTimeListener("paused", function(event, packet) { // Check the return value. Assert.equal(packet.type, "paused"); @@ -36,7 +51,7 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { Assert.equal(debuggee.res, undefined); // Remove the breakpoint. - threadClient.removeBreakpoint(location); + threadClient.removeBreakpoint(location2); threadClient.resume(resolve); }); diff --git a/devtools/server/tests/unit/test_breakpoint-13.js b/devtools/server/tests/unit/test_breakpoint-13.js index 243d7c26e317..3c90cfb4dc4e 100644 --- a/devtools/server/tests/unit/test_breakpoint-13.js +++ b/devtools/server/tests/unit/test_breakpoint-13.js @@ -32,12 +32,6 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { Assert.notEqual(packet.why.type, "breakpoint"); Assert.equal(packet.why.type, "resumeLimit"); }, - function(packet) { - // At the end of the foo function call frame. - Assert.equal(packet.frame.where.line, debuggee.line0 + 3); - Assert.notEqual(packet.why.type, "breakpoint"); - Assert.equal(packet.why.type, "resumeLimit"); - }, function(packet) { // Check that the breakpoint wasn't the reason for this pause, but // that the frame is about to be popped while stepping. diff --git a/devtools/server/tests/unit/test_breakpoint-14.js b/devtools/server/tests/unit/test_breakpoint-14.js index 22f1dcc24bdd..71f8ad4e5379 100644 --- a/devtools/server/tests/unit/test_breakpoint-14.js +++ b/devtools/server/tests/unit/test_breakpoint-14.js @@ -31,11 +31,6 @@ add_task(threadClientTest(({ threadClient, debuggee }) => { Assert.equal(packet.why.type, "breakpoint"); Assert.notEqual(packet.why.type, "resumeLimit"); }, - function(packet) { - // Stepped to the closing brace of the function. - Assert.equal(packet.frame.where.line, debuggee.line0 + 3); - Assert.equal(packet.why.type, "resumeLimit"); - }, function(packet) { // The frame is about to be popped while stepping. Assert.equal(packet.frame.where.line, debuggee.line0 + 3); diff --git a/devtools/server/tests/unit/test_setBreakpoint-on-line-with-multiple-offsets.js b/devtools/server/tests/unit/test_setBreakpoint-on-line-with-multiple-offsets.js index e02ff0bb8816..1ae7a201eed3 100644 --- a/devtools/server/tests/unit/test_setBreakpoint-on-line-with-multiple-offsets.js +++ b/devtools/server/tests/unit/test_setBreakpoint-on-line-with-multiple-offsets.js @@ -25,6 +25,9 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { let variables = frame.environment.bindings.variables; Assert.equal(variables.i.value.type, "undefined"); + const location2 = { sourceUrl: sourceClient.url, line: 7 }; + setBreakpoint(threadClient, location2); + packet = await executeOnNextTickAndWaitForPause( () => resume(threadClient), client @@ -36,9 +39,9 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { frame = packet.frame; where = frame.where; Assert.equal(where.actor, source.actor); - Assert.equal(where.line, location.line); + Assert.equal(where.line, location2.line); variables = frame.environment.bindings.variables; - Assert.equal(variables.i.value, 0); + Assert.equal(variables.i.value, 1); await resume(threadClient); }, { doNotRunWorker: true })); diff --git a/devtools/server/tests/unit/test_source-02.js b/devtools/server/tests/unit/test_source-02.js index c253150e2e9a..358c04cac3a3 100644 --- a/devtools/server/tests/unit/test_source-02.js +++ b/devtools/server/tests/unit/test_source-02.js @@ -37,7 +37,12 @@ function run_test() { } const SOURCE_URL = "http://example.com/foobar.js"; -const SOURCE_CONTENT = "stopMe()"; +const SOURCE_CONTENT = ` + stopMe(); + for(var i = 0; i < 2; i++) { + debugger; + } +`; function test_source() { DebuggerServer.LONG_STRING_LENGTH = 200; @@ -60,11 +65,23 @@ function test_source() { Assert.deepEqual( response.positions, [{ - line: 1, - column: 0, + line: 2, + column: 2, }, { - line: 1, - column: 8, + line: 3, + column: 14, + }, { + line: 3, + column: 17, + }, { + line: 3, + column: 24, + }, { + line: 4, + column: 4, + }, { + line: 6, + column: 0, }] ); @@ -74,7 +91,10 @@ function test_source() { Assert.deepEqual( response.positions, { - 1: [0, 8], + 2: [2], + 3: [14, 17, 24], + 4: [4], + 6: [0], } ); diff --git a/devtools/server/tests/unit/test_stepping-01.js b/devtools/server/tests/unit/test_stepping-01.js index 0a36754ca442..2fbe6672194d 100644 --- a/devtools/server/tests/unit/test_stepping-01.js +++ b/devtools/server/tests/unit/test_stepping-01.js @@ -61,7 +61,7 @@ async function stepOutOfA(dbg, func, expectedLocation) { async function stepOverInA(dbg, func, expectedLocation) { await invokeAndPause(dbg, `${func}()`); - await steps(dbg, [stepOver, stepIn, stepOver]); + await steps(dbg, [stepOver, stepIn]); let packet = await step(dbg, stepOver); dump(`>> stepOverInA hi\n`); @@ -82,9 +82,9 @@ function run_test() { return (async function() { const dbg = await setupTestFromUrl("stepping.js"); - await testStep(dbg, "arithmetic", {line: 16, column: 8}); - await testStep(dbg, "composition", {line: 21, column: 2}); - await testStep(dbg, "chaining", {line: 26, column: 6}); + await testStep(dbg, "arithmetic", {line: 17, column: 0}); + await testStep(dbg, "composition", {line: 22, column: 0}); + await testStep(dbg, "chaining", {line: 27, column: 0}); await testFinish(dbg); })(); diff --git a/devtools/server/tests/unit/test_stepping-06.js b/devtools/server/tests/unit/test_stepping-06.js index a18786200348..391893e5b1ff 100644 --- a/devtools/server/tests/unit/test_stepping-06.js +++ b/devtools/server/tests/unit/test_stepping-06.js @@ -49,7 +49,7 @@ async function testRet(dbg) { info(`1. Test returning from doRet via stepping over`); await invokeAndPause(dbg, `doRet()`); - await steps(dbg, [stepOver, stepIn, stepOver]); + await steps(dbg, [stepOver, stepIn]); packet = await step(dbg, stepOver); deepEqual( @@ -89,7 +89,7 @@ async function testThrow(dbg) { info(`3. Test leaving from doThrow via stepping over`); await invokeAndPause(dbg, `doThrow()`); - await steps(dbg, [stepOver, stepOver, stepIn]); + await steps(dbg, [stepOver, stepIn]); packet = await step(dbg, stepOver); deepEqual( @@ -113,24 +113,19 @@ async function testThrow(dbg) { info(`4. Test leaving from doThrow via stepping out`); await invokeAndPause(dbg, `doThrow()`); - await steps(dbg, [stepOver, stepOver, stepIn]); + await steps(dbg, [stepOver, stepIn]); packet = await step(dbg, stepOut); deepEqual( getPauseLocation(packet), - {line: 22, column: 14}, - `completion location in doThrow` + {line: 24, column: 0}, + `stepOut location in doThrow` ); deepEqual( - getFrameFinished(packet).throw.class, - "Error", - `completion completion value class` - ); - deepEqual( - getFrameFinished(packet).throw.preview.message, - "yo", - `completion completion value preview` + getFrameFinished(packet), + {return: {type: "undefined"}}, + `completion type` ); await resume(dbg.threadClient); } diff --git a/devtools/server/tests/unit/test_stepping-07.js b/devtools/server/tests/unit/test_stepping-07.js index 1ad3c1014ee5..0356e8801804 100644 --- a/devtools/server/tests/unit/test_stepping-07.js +++ b/devtools/server/tests/unit/test_stepping-07.js @@ -29,17 +29,14 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { dumpn("Continuing and waiting for second debugger statement"); const dbgStmt2 = await resumeAndWaitForPause(client, threadClient); equal(dbgStmt2.frame.where.line, 12, - "Should be at debugger statement on line 3"); + "Should be at debugger statement on line 12"); dumpn("Testing stepping with explicit return"); const step3 = await stepOver(client, threadClient); equal(step3.frame.where.line, 13, "Should step to line 13"); const step4 = await stepOver(client, threadClient); equal(step4.frame.where.line, 15, "Should step out of the function from line 15"); - // This step is a bit funny, see bug 1013219 for details. - const step5 = await stepOver(client, threadClient); - equal(step5.frame.where.line, 15, "Should step out of the function from line 15"); - ok(step5.why.frameFinished, "This should be the explicit function return"); + ok(step4.why.frameFinished, "This should be the explicit function return"); })); function evaluateTestCode(debuggee) { diff --git a/devtools/server/tests/unit/test_stepping-08.js b/devtools/server/tests/unit/test_stepping-08.js index 8f45a65f0a7c..3731444f5638 100644 --- a/devtools/server/tests/unit/test_stepping-08.js +++ b/devtools/server/tests/unit/test_stepping-08.js @@ -21,13 +21,17 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { await threadClient.setBreakpoint({ sourceUrl: source.url, line: 7 }, {}); dumpn("Step in to innerFunction"); - const step1 = await stepIn(client, threadClient); - equal(step1.frame.where.line, 7); + const step1 = await stepOver(client, threadClient); + equal(step1.frame.where.line, 3); + + dumpn("Step in to innerFunction"); + const step2 = await stepIn(client, threadClient); + equal(step2.frame.where.line, 7); dumpn("Step out of innerFunction"); - const step2 = await stepOut(client, threadClient); + const step3 = await stepOut(client, threadClient); // The bug was that we'd stop again at the breakpoint on line 7. - equal(step2.frame.where.line, 4); + equal(step3.frame.where.line, 4); })); function evaluateTestCode(debuggee) { diff --git a/devtools/server/tests/unit/test_stepping-09.js b/devtools/server/tests/unit/test_stepping-09.js index d70d8bdf69e9..9dee8a5d3f73 100644 --- a/devtools/server/tests/unit/test_stepping-09.js +++ b/devtools/server/tests/unit/test_stepping-09.js @@ -18,7 +18,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { const step2 = await stepOut(client, threadClient); // The bug was that we'd step right past the end of the function and never pause. equal(step2.frame.where.line, 2); - equal(step2.why.frameFinished.return, 42); + deepEqual(step2.why.frameFinished.return, { type: "undefined"}); })); function evaluateTestCode(debuggee) { diff --git a/devtools/server/tests/unit/test_stepping-with-pause-points.js b/devtools/server/tests/unit/test_stepping-with-pause-points.js deleted file mode 100644 index b405184d0626..000000000000 --- a/devtools/server/tests/unit/test_stepping-with-pause-points.js +++ /dev/null @@ -1,76 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ -/* eslint-disable no-shadow, max-nested-callbacks */ - -"use strict"; - -/** - * Check basic step-over functionality with pause points - * for the first statement and end of the last statement. - */ - -add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { - dumpn("Evaluating test code and waiting for first debugger statement"); - const dbgStmt = await executeOnNextTickAndWaitForPause( - () => evaluateTestCode(debuggee), client); - equal(dbgStmt.frame.where.line, 2, "Should be at debugger statement on line 2"); - equal(debuggee.a, undefined); - equal(debuggee.b, undefined); - - const source = await getSource(threadClient, "test_stepping-01-test-code.js"); - - // Add pause points for the first and end of the last statement. - // Note: we intentionally ignore the second statement. - source.setPausePoints([{ - location: {line: 3, column: 8}, - types: {breakpoint: true, stepOver: true}, - }, - { - location: {line: 4, column: 14}, - types: {breakpoint: true, stepOver: true}, - }]); - - dumpn("Step Over to line 3"); - const step1 = await stepOver(client, threadClient); - equal(step1.type, "paused"); - equal(step1.why.type, "resumeLimit"); - equal(step1.frame.where.line, 3); - equal(step1.frame.where.column, 0); - - equal(debuggee.a, undefined); - equal(debuggee.b, undefined); - - dumpn("Step Over to line 4"); - const step2 = await stepOver(client, threadClient); - equal(step2.type, "paused"); - equal(step2.why.type, "resumeLimit"); - equal(step2.frame.where.line, 4); - equal(step2.frame.where.column, 0); - - equal(debuggee.a, 1); - equal(debuggee.b, undefined); - - dumpn("Step Over to the end of line 4"); - const step3 = await stepOver(client, threadClient); - equal(step3.type, "paused"); - equal(step3.why.type, "resumeLimit"); - equal(step3.frame.where.line, 4); - equal(step3.frame.where.column, 14); - equal(debuggee.a, 1); - equal(debuggee.b, 2); -})); - -function evaluateTestCode(debuggee) { - /* eslint-disable */ - Cu.evalInSandbox( - ` // 1 - debugger; // 2 - var a = 1; // 3 - var b = 2;`, // 4 - debuggee, - "1.8", - "test_stepping-01-test-code.js", - 1 - ); - /* eslint-disable */ -} diff --git a/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js b/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js index efd29962d932..643786cd103e 100644 --- a/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js +++ b/devtools/server/tests/unit/test_stepping-with-skip-breakpoints.js @@ -35,7 +35,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { equal(step1.type, "paused"); equal(step1.why.type, "resumeLimit"); equal(step1.frame.where.line, 3); - equal(step1.frame.where.column, 0); + equal(step1.frame.where.column, 12); equal(debuggee.a, undefined); equal(debuggee.b, undefined); @@ -45,7 +45,7 @@ add_task(threadClientTest(async ({ threadClient, debuggee, client }) => { equal(step2.type, "paused"); equal(step2.why.type, "resumeLimit"); equal(step2.frame.where.line, 4); - equal(step2.frame.where.column, 0); + equal(step2.frame.where.column, 12); equal(debuggee.a, 1); equal(debuggee.b, undefined); diff --git a/devtools/server/tests/unit/xpcshell.ini b/devtools/server/tests/unit/xpcshell.ini index 04118fb2cc6a..f35b40a3a7a8 100644 --- a/devtools/server/tests/unit/xpcshell.ini +++ b/devtools/server/tests/unit/xpcshell.ini @@ -192,7 +192,6 @@ skip-if = true # breakpoint sliding is not supported bug 1525685 [test_stepping-07.js] [test_stepping-08.js] [test_stepping-09.js] -[test_stepping-with-pause-points.js] [test_stepping-with-skip-breakpoints.js] [test_framebindings-01.js] [test_framebindings-02.js] From d826634cd45a185d7127923afe01ff6de2d4f989 Mon Sep 17 00:00:00 2001 From: Shane Caraveo Date: Wed, 13 Feb 2019 15:20:04 +0000 Subject: [PATCH 50/79] Bug 1516709 support incognito in downloads api r=aswan Differential Revision: https://phabricator.services.mozilla.com/D17426 --HG-- extra : moz-landing-system : lando --- .../extensions/parent/ext-downloads.js | 137 ++++++++---------- .../xpcshell/test_ext_downloads_private.js | 102 ++++++++++++- 2 files changed, 160 insertions(+), 79 deletions(-) diff --git a/toolkit/components/extensions/parent/ext-downloads.js b/toolkit/components/extensions/parent/ext-downloads.js index f18ad9a948e7..5fdf910780e0 100644 --- a/toolkit/components/extensions/parent/ext-downloads.js +++ b/toolkit/components/extensions/parent/ext-downloads.js @@ -210,9 +210,9 @@ const DownloadMap = new class extends EventEmitter { return this.lazyInit().then(() => this.byId.values()); } - fromId(id) { + fromId(id, privateAllowed = true) { const download = this.byId.get(id); - if (!download) { + if (!download || (!privateAllowed && download.incognito)) { throw new Error(`Invalid download id ${id}`); } return download; @@ -332,7 +332,7 @@ const downloadQuery = query => { // todo: include danger const SIMPLE_ITEMS = ["id", "mime", "startTime", "endTime", "state", - "paused", "error", + "paused", "error", "incognito", "bytesReceived", "totalBytes", "fileSize", "exists"]; for (let field of SIMPLE_ITEMS) { if (query[field] != null && item[field] != query[field]) { @@ -397,6 +397,26 @@ const queryHelper = query => { }); }; +function downloadEventManagerAPI(context, name, event, listener) { + let register = fire => { + const handler = (what, item) => { + if (context.privateBrowsingAllowed || !item.incognito) { + listener(fire, what, item); + } + }; + let registerPromise = DownloadMap.getDownloadList().then(() => { + DownloadMap.on(event, handler); + }); + return () => { + registerPromise.then(() => { + DownloadMap.off(event, handler); + }); + }; + }; + + return new EventManager({context, name, register}).api(); +} + this.downloads = class extends ExtensionAPI { getAPI(context) { let {extension} = context; @@ -428,6 +448,10 @@ this.downloads = class extends ExtensionAPI { } } + if (options.incognito && !context.privateBrowsingAllowed) { + return Promise.reject({message: "private browsing access not allowed"}); + } + if (options.conflictAction == "prompt") { // TODO return Promise.reject({message: "conflictAction prompt not yet implemented"}); @@ -580,7 +604,7 @@ this.downloads = class extends ExtensionAPI { return DownloadMap.lazyInit().then(() => { let item; try { - item = DownloadMap.fromId(id); + item = DownloadMap.fromId(id, context.privateBrowsingAllowed); } catch (err) { return Promise.reject({message: `Invalid download id ${id}`}); } @@ -594,6 +618,9 @@ this.downloads = class extends ExtensionAPI { }, search(query) { + if (!context.privateBrowsingAllowed) { + query.incognito = false; + } return queryHelper(query) .then(items => items.map(item => item.serialize())); }, @@ -602,7 +629,7 @@ this.downloads = class extends ExtensionAPI { return DownloadMap.lazyInit().then(() => { let item; try { - item = DownloadMap.fromId(id); + item = DownloadMap.fromId(id, context.privateBrowsingAllowed); } catch (err) { return Promise.reject({message: `Invalid download id ${id}`}); } @@ -618,7 +645,7 @@ this.downloads = class extends ExtensionAPI { return DownloadMap.lazyInit().then(() => { let item; try { - item = DownloadMap.fromId(id); + item = DownloadMap.fromId(id, context.privateBrowsingAllowed); } catch (err) { return Promise.reject({message: `Invalid download id ${id}`}); } @@ -634,7 +661,7 @@ this.downloads = class extends ExtensionAPI { return DownloadMap.lazyInit().then(() => { let item; try { - item = DownloadMap.fromId(id); + item = DownloadMap.fromId(id, context.privateBrowsingAllowed); } catch (err) { return Promise.reject({message: `Invalid download id ${id}`}); } @@ -657,6 +684,9 @@ this.downloads = class extends ExtensionAPI { }, erase(query) { + if (!context.privateBrowsingAllowed) { + query.incognito = false; + } return queryHelper(query).then(items => { let results = []; let promises = []; @@ -670,7 +700,7 @@ this.downloads = class extends ExtensionAPI { open(downloadId) { return DownloadMap.lazyInit().then(() => { - let download = DownloadMap.fromId(downloadId).download; + let download = DownloadMap.fromId(downloadId, context.privateBrowsingAllowed).download; if (download.succeeded) { return download.launch(); } @@ -682,7 +712,7 @@ this.downloads = class extends ExtensionAPI { show(downloadId) { return DownloadMap.lazyInit().then(() => { - let download = DownloadMap.fromId(downloadId); + let download = DownloadMap.fromId(downloadId, context.privateBrowsingAllowed); return download.download.showContainingDirectory(); }).then(() => { return true; @@ -694,7 +724,7 @@ this.downloads = class extends ExtensionAPI { getFileIcon(downloadId, options) { return DownloadMap.lazyInit().then(() => { let size = options && options.size ? options.size : 32; - let download = DownloadMap.fromId(downloadId).download; + let download = DownloadMap.fromId(downloadId, context.privateBrowsingAllowed).download; let pathPrefix = ""; let path; @@ -759,73 +789,30 @@ this.downloads = class extends ExtensionAPI { // ... // } - onChanged: new EventManager({ - context, - name: "downloads.onChanged", - register: fire => { - const handler = (what, item) => { - let changes = {}; - const noundef = val => (val === undefined) ? null : val; - DOWNLOAD_ITEM_CHANGE_FIELDS.forEach(fld => { - if (item[fld] != item.prechange[fld]) { - changes[fld] = { - previous: noundef(item.prechange[fld]), - current: noundef(item[fld]), - }; - } - }); - if (Object.keys(changes).length > 0) { - changes.id = item.id; - fire.async(changes); - } - }; + onChanged: downloadEventManagerAPI(context, "downloads.onChanged", "change", (fire, what, item) => { + let changes = {}; + const noundef = val => (val === undefined) ? null : val; + DOWNLOAD_ITEM_CHANGE_FIELDS.forEach(fld => { + if (item[fld] != item.prechange[fld]) { + changes[fld] = { + previous: noundef(item.prechange[fld]), + current: noundef(item[fld]), + }; + } + }); + if (Object.keys(changes).length > 0) { + changes.id = item.id; + fire.async(changes); + } + }), - let registerPromise = DownloadMap.getDownloadList().then(() => { - DownloadMap.on("change", handler); - }); - return () => { - registerPromise.then(() => { - DownloadMap.off("change", handler); - }); - }; - }, - }).api(), + onCreated: downloadEventManagerAPI(context, "downloads.onCreated", "create", (fire, what, item) => { + fire.async(item.serialize()); + }), - onCreated: new EventManager({ - context, - name: "downloads.onCreated", - register: fire => { - const handler = (what, item) => { - fire.async(item.serialize()); - }; - let registerPromise = DownloadMap.getDownloadList().then(() => { - DownloadMap.on("create", handler); - }); - return () => { - registerPromise.then(() => { - DownloadMap.off("create", handler); - }); - }; - }, - }).api(), - - onErased: new EventManager({ - context, - name: "downloads.onErased", - register: fire => { - const handler = (what, item) => { - fire.async(item.id); - }; - let registerPromise = DownloadMap.getDownloadList().then(() => { - DownloadMap.on("erase", handler); - }); - return () => { - registerPromise.then(() => { - DownloadMap.off("erase", handler); - }); - }; - }, - }).api(), + onErased: downloadEventManagerAPI(context, "downloads.onErased", "erase", (fire, what, item) => { + fire.async(item.id); + }), onDeterminingFilename: ignoreEvent(context, "downloads.onDeterminingFilename"), }, diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js b/toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js index 0e63015f339b..76f5c6f7d6f1 100644 --- a/toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js +++ b/toolkit/components/extensions/test/xpcshell/test_ext_downloads_private.js @@ -14,10 +14,12 @@ function setup() { downloadDir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); info(`Using download directory ${downloadDir.path}`); + Services.prefs.setBoolPref("extensions.allowPrivateBrowsingByDefault", false); Services.prefs.setIntPref("browser.download.folderList", 2); Services.prefs.setComplexValue("browser.download.dir", Ci.nsIFile, downloadDir); registerCleanupFunction(() => { + Services.prefs.clearUserPref("extensions.allowPrivateBrowsingByDefault"); Services.prefs.clearUserPref("browser.download.folderList"); Services.prefs.clearUserPref("browser.download.dir"); @@ -35,7 +37,7 @@ function setup() { add_task(async function test_private_download() { setup(); - let extension = ExtensionTestUtils.loadExtension({ + let pb_extension = ExtensionTestUtils.loadExtension({ background: async function() { function promiseEvent(eventTarget, accept) { return new Promise(resolve => { @@ -49,6 +51,7 @@ add_task(async function test_private_download() { }); } let startTestPromise = promiseEvent(browser.test.onMessage); + let removeTestPromise = promiseEvent(browser.test.onMessage, msg => msg == "remove"); let onCreatedPromise = promiseEvent(browser.downloads.onCreated); let onDonePromise = promiseEvent( browser.downloads.onChanged, @@ -63,6 +66,7 @@ add_task(async function test_private_download() { filename, incognito: true, }); + browser.test.sendMessage("downloadId", downloadId); browser.test.log("Waiting for downloads.onCreated"); let createdItem = await onCreatedPromise; @@ -82,6 +86,7 @@ add_task(async function test_private_download() { browser.test.assertTrue(downloadItem.incognito, "stored download should be private"); + await removeTestPromise; browser.test.log("Removing downloaded file"); browser.test.assertTrue(downloadItem.exists, "downloaded file exists"); await browser.downloads.removeFile(downloadId); @@ -99,17 +104,106 @@ add_task(async function test_private_download() { browser.test.notifyPass("private download test done"); }, manifest: { + applications: {gecko: {id: "@spanning"}}, permissions: ["downloads"], }, + incognitoOverride: "spanning", + }); + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + applications: {gecko: {id: "@not_allowed"}}, + permissions: ["downloads", "downloads.open"], + }, + background: async function() { + browser.downloads.onCreated.addListener(() => { + browser.test.fail("download-onCreated"); + }); + browser.downloads.onChanged.addListener(() => { + browser.test.fail("download-onChanged"); + }); + browser.downloads.onErased.addListener(() => { + browser.test.fail("download-onErased"); + }); + browser.test.onMessage.addListener(async (msg, data) => { + if (msg == "download") { + let {url, filename, downloadId} = data; + await browser.test.assertRejects( + browser.downloads.download({ + url, + filename, + incognito: true, + }), + /private browsing access not allowed/, + "cannot download using incognito without permission."); + + let downloads = await browser.downloads.search({id: downloadId}); + browser.test.assertEq(downloads.length, 0, "cannot search for incognito downloads"); + let erasing = await browser.downloads.erase({id: downloadId}); + browser.test.assertEq(erasing.length, 0, "cannot erase incognito download"); + + await browser.test.assertRejects( + browser.downloads.removeFile(downloadId), + /Invalid download id/, + "cannot remove incognito download"); + await browser.test.assertRejects( + browser.downloads.pause(downloadId), + /Invalid download id/, + "cannot pause incognito download"); + await browser.test.assertRejects( + browser.downloads.resume(downloadId), + /Invalid download id/, + "cannot resume incognito download"); + await browser.test.assertRejects( + browser.downloads.cancel(downloadId), + /Invalid download id/, + "cannot cancel incognito download"); + await browser.test.assertRejects( + browser.downloads.removeFile(downloadId), + /Invalid download id/, + "cannot remove incognito download"); + await browser.test.assertRejects( + browser.downloads.show(downloadId), + /Invalid download id/, + "cannot show incognito download"); + await browser.test.assertRejects( + browser.downloads.getFileIcon(downloadId), + /Invalid download id/, + "cannot show incognito download"); + } + if (msg == "download.open") { + let {downloadId} = data; + await browser.test.assertRejects( + browser.downloads.open(downloadId), + /Invalid download id/, + "cannot open incognito download"); + } + browser.test.sendMessage("continue"); + }); + }, }); await extension.startup(); - await extension.awaitMessage("ready"); - extension.sendMessage({ + await pb_extension.startup(); + await pb_extension.awaitMessage("ready"); + pb_extension.sendMessage({ url: TXT_URL, filename: TXT_FILE, }); + let downloadId = await pb_extension.awaitMessage("downloadId"); + extension.sendMessage("download", { + url: TXT_URL, + filename: TXT_FILE, + downloadId, + }); + await extension.awaitMessage("continue"); + await withHandlingUserInput(extension, async () => { + extension.sendMessage("download.open", {downloadId}); + await extension.awaitMessage("continue"); + }); + pb_extension.sendMessage("remove"); - await extension.awaitFinish("private download test done"); + await pb_extension.awaitFinish("private download test done"); + await pb_extension.unload(); await extension.unload(); }); From cb0091487be5eb64691dec538e87fe1242d0c703 Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Mon, 11 Feb 2019 13:49:35 +0000 Subject: [PATCH 51/79] Bug 1472589 - Fix parent process crash reporting in the Snap package environment. r=ted,jlorenzo 1. The unsetting of LD_LIBRARY_PATH is removed, because it's no longer necessary and interferes with environments where it's necessary to find "system" libraries like GTK; see bug 1472589 comment #1 through #4. 2. The Snap package manifest adds a dependency on the libcurl package, so that the crash reporter can send the report. This uses the GnuTLS variant because we're already pulling in GnuTLS as a dependency of some other packages (FFmpeg and CUPS, but also the non-GnuTLS cURL packages depend on it anyway via OpenLDAP). Differential Revision: https://phabricator.services.mozilla.com/D18625 --HG-- extra : moz-landing-system : lando --- taskcluster/docker/firefox-snap/snapcraft.yaml.in | 1 + toolkit/crashreporter/nsExceptionHandler.cpp | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/taskcluster/docker/firefox-snap/snapcraft.yaml.in b/taskcluster/docker/firefox-snap/snapcraft.yaml.in index bea045e1542d..dcd87fa72477 100644 --- a/taskcluster/docker/firefox-snap/snapcraft.yaml.in +++ b/taskcluster/docker/firefox-snap/snapcraft.yaml.in @@ -54,6 +54,7 @@ parts: - ffmpeg - libc-bin - locales-all + - libcurl3-gnutls after: [desktop-gtk3] xdg-open: diff --git a/toolkit/crashreporter/nsExceptionHandler.cpp b/toolkit/crashreporter/nsExceptionHandler.cpp index 933da2955775..616123bd6aa6 100644 --- a/toolkit/crashreporter/nsExceptionHandler.cpp +++ b/toolkit/crashreporter/nsExceptionHandler.cpp @@ -754,10 +754,6 @@ static bool LaunchProgram(const XP_CHAR* aProgramPath, if (pid == -1) { return false; } else if (pid == 0) { - // need to clobber this, as libcurl might load NSS, - // and we want it to load the system NSS. - unsetenv("LD_LIBRARY_PATH"); - Unused << execl(aProgramPath, aProgramPath, aMinidumpPath, nullptr); _exit(1); } From 40d009a2a58bf0c52eafcd12742db8b79f9da223 Mon Sep 17 00:00:00 2001 From: Christian Holler Date: Wed, 13 Feb 2019 16:16:32 +0000 Subject: [PATCH 52/79] Bug 1526328 - Disable Telemetry recording in FUZZING builds. r=janerik Differential Revision: https://phabricator.services.mozilla.com/D19359 --HG-- extra : moz-landing-system : lando --- toolkit/components/telemetry/core/Telemetry.cpp | 6 ++++++ toolkit/xre/nsAppRunner.cpp | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/toolkit/components/telemetry/core/Telemetry.cpp b/toolkit/components/telemetry/core/Telemetry.cpp index b4528dd40385..48faab31930f 100644 --- a/toolkit/components/telemetry/core/Telemetry.cpp +++ b/toolkit/components/telemetry/core/Telemetry.cpp @@ -1106,12 +1106,14 @@ TelemetryImpl::SetCanRecordBase(bool canRecord) { if (recordreplay::IsRecordingOrReplaying()) { return NS_OK; } +#ifndef FUZZING if (canRecord != mCanRecordBase) { TelemetryHistogram::SetCanRecordBase(canRecord); TelemetryScalar::SetCanRecordBase(canRecord); TelemetryEvent::SetCanRecordBase(canRecord); mCanRecordBase = canRecord; } +#endif return NS_OK; } @@ -1133,12 +1135,14 @@ TelemetryImpl::SetCanRecordExtended(bool canRecord) { if (recordreplay::IsRecordingOrReplaying()) { return NS_OK; } +#ifndef FUZZING if (canRecord != mCanRecordExtended) { TelemetryHistogram::SetCanRecordExtended(canRecord); TelemetryScalar::SetCanRecordExtended(canRecord); TelemetryEvent::SetCanRecordExtended(canRecord); mCanRecordExtended = canRecord; } +#endif return NS_OK; } @@ -1171,6 +1175,7 @@ already_AddRefed TelemetryImpl::CreateTelemetryInstance() { "CreateTelemetryInstance may only be called once, via GetService()"); bool useTelemetry = false; +#ifndef FUZZING if ((XRE_IsParentProcess() || XRE_IsContentProcess() || XRE_IsGPUProcess() || XRE_IsSocketProcess()) && // Telemetry is never accumulated when recording or replaying, both @@ -1180,6 +1185,7 @@ already_AddRefed TelemetryImpl::CreateTelemetryInstance() { !recordreplay::IsRecordingOrReplaying()) { useTelemetry = true; } +#endif // Set current product (determines Fennec/GeckoView at runtime). SetCurrentProduct(); diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 7c1ba322e8da..e70e48b836cf 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -3787,7 +3787,9 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { SetShutdownChecks(); - // Enable Telemetry IO Reporting on DEBUG, nightly and local builds + // Enable Telemetry IO Reporting on DEBUG, nightly and local builds, + // but disable it on FUZZING builds. +#ifndef FUZZING #ifdef DEBUG mozilla::Telemetry::InitIOReporting(gAppData->xreDirectory); #else @@ -3799,6 +3801,7 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { } } #endif /* DEBUG */ +#endif /* FUZZING */ #if defined(XP_WIN) // Enable the HeapEnableTerminationOnCorruption exploit mitigation. We ignore From 7a39bec13fd736c34e2320ec83fab018b319cbf2 Mon Sep 17 00:00:00 2001 From: Junior Hsu Date: Wed, 13 Feb 2019 10:46:19 +0000 Subject: [PATCH 53/79] Bug 1524264 - move noproxy textbox lower to hint as a global effect r=ewright,flod Differential Revision: https://phabricator.services.mozilla.com/D18981 --HG-- extra : moz-landing-system : lando --- browser/components/preferences/connection.xul | 6 +++--- .../in-content/tests/browser_extension_controlled.js | 2 +- browser/locales/en-US/browser/preferences/connection.ftl | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/browser/components/preferences/connection.xul b/browser/components/preferences/connection.xul index a33760b5eae7..4936aade9c48 100644 --- a/browser/components/preferences/connection.xul +++ b/browser/components/preferences/connection.xul @@ -125,9 +125,6 @@ -