From 45af425486506f9c211a131532eff3f4d59ce01e Mon Sep 17 00:00:00 2001 From: Richard Marti Date: Sat, 23 May 2015 22:07:52 +0200 Subject: [PATCH 01/34] Bug 1166855 - Use a color instead of a variable in linear-gradient. r=dao --- toolkit/themes/shared/in-content/common.inc.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/toolkit/themes/shared/in-content/common.inc.css b/toolkit/themes/shared/in-content/common.inc.css index 06d86197ff1..92674af0a1d 100644 --- a/toolkit/themes/shared/in-content/common.inc.css +++ b/toolkit/themes/shared/in-content/common.inc.css @@ -20,6 +20,7 @@ --in-content-item-selected: #0095dd; --in-content-border-highlight: #ff9500; --in-content-border-focus: #0095dd; + --in-content-border-color: #c1c1c1; --in-content-category-text: #c1c1c1; --in-content-category-border-focus: 1px dotted #fff; --in-content-category-text-selected: #f2f2f2; @@ -34,7 +35,6 @@ --in-content-primary-button-background: #0095dd; --in-content-primary-button-background-hover: #008acb; --in-content-primary-button-background-active: #006b9d; - --in-content-table-border-color: #c1c1c1; --in-content-table-border-dark-color: #d1d1d1; --in-content-table-header-background: #0095dd; --in-content-help-button-background: #ffcb00; @@ -68,7 +68,7 @@ html|h1 { html|hr { border-style: solid none none none; - border-color: var(--in-content-table-border-color); + border-color: var(--in-content-border-color); } xul|caption { @@ -716,7 +716,7 @@ xul|listheader, xul|treecols { -moz-appearance: none; border: none; - border-bottom: 1px solid var(--in-content-table-border-color); + border-bottom: 1px solid var(--in-content-border-color); padding: 0; } @@ -739,7 +739,7 @@ xul|treecol:not([hideheader="true"]):not(:first-child), xul|treecolpicker { -moz-border-start-width: 1px; -moz-border-start-style: solid; - border-image: linear-gradient(transparent 0%, transparent 20%, var(--in-content-table-border-color) 20%, var(--in-content-table-border-color) 80%, transparent 80%, transparent 100%) 1 1; + border-image: linear-gradient(transparent 0%, transparent 20%, #c1c1c1 20%, #c1c1c1 80%, transparent 80%, transparent 100%) 1 1; } xul|treecol:not([hideheader="true"]) > xul|*.treecol-sortdirection[sortDirection] { From 22b317d32209dcbfb1593c4a339333b13d841465 Mon Sep 17 00:00:00 2001 From: aceman Date: Thu, 12 Mar 2015 11:21:00 -0400 Subject: [PATCH 02/34] Bug 1141703 - Make month buttons in datepicker do nothing if the widget is readonly and make the widget look disabled. r=Neil --- toolkit/content/widgets/datetimepicker.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/toolkit/content/widgets/datetimepicker.xml b/toolkit/content/widgets/datetimepicker.xml index 955872dc9a0..5bfb59ad339 100644 --- a/toolkit/content/widgets/datetimepicker.xml +++ b/toolkit/content/widgets/datetimepicker.xml @@ -27,7 +27,7 @@ + xbl:inherits="context,disabled,readonly"> + allowevents="true" xbl:inherits="context,disabled,readonly"> Date: Wed, 20 May 2015 13:32:00 -0400 Subject: [PATCH 03/34] Bug 1161515 - Add previousSessionId to Telemetry payloads. r=gfritzsche --- toolkit/components/telemetry/TelemetrySession.jsm | 10 ++++++++-- toolkit/components/telemetry/docs/main-ping.rst | 1 + .../tests/unit/test_SubsessionChaining.js | 14 ++++++++++++-- .../telemetry/tests/unit/test_TelemetrySession.js | 1 + 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/toolkit/components/telemetry/TelemetrySession.jsm b/toolkit/components/telemetry/TelemetrySession.jsm index ebb1bdfbe45..9004d10c104 100644 --- a/toolkit/components/telemetry/TelemetrySession.jsm +++ b/toolkit/components/telemetry/TelemetrySession.jsm @@ -744,6 +744,7 @@ this.TelemetrySession = Object.freeze({ reset: function() { Impl._sessionId = null; Impl._subsessionId = null; + Impl._previousSessionId = null; Impl._previousSubsessionId = null; Impl._subsessionCounter = 0; Impl._profileSubsessionCounter = 0; @@ -816,6 +817,8 @@ let Impl = { _sessionId: null, // Random subsession id. _subsessionId: null, + // Session id of the previous session, null on first run. + _previousSessionId: null, // Subsession id of the previous subsession (even if it was in a different session), // null on first run. _previousSubsessionId: null, @@ -1122,6 +1125,7 @@ let Impl = { sessionId: this._sessionId, subsessionId: this._subsessionId, + previousSessionId: this._previousSessionId, previousSubsessionId: this._previousSubsessionId, subsessionCounter: this._subsessionCounter, @@ -1916,13 +1920,14 @@ let Impl = { let dataFile = OS.Path.join(OS.Constants.Path.profileDir, DATAREPORTING_DIRECTORY, SESSION_STATE_FILE_NAME); - // Try to load the "profileSubsessionCounter" from the state file. + // Try to load info about the previous session from the state file. try { let data = yield CommonUtils.readJSON(dataFile); if (data && "profileSubsessionCounter" in data && typeof(data.profileSubsessionCounter) == "number" && - "subsessionId" in data) { + "subsessionId" in data && "sessionId" in data) { + this._previousSessionId = data.sessionId; this._previousSubsessionId = data.subsessionId; // Add |_subsessionCounter| to the |_profileSubsessionCounter| to account for // new subsession while loading still takes place. This will always be exactly @@ -1942,6 +1947,7 @@ let Impl = { */ _getSessionDataObject: function() { return { + sessionId: this._sessionId, subsessionId: this._subsessionId, profileSubsessionCounter: this._profileSubsessionCounter, }; diff --git a/toolkit/components/telemetry/docs/main-ping.rst b/toolkit/components/telemetry/docs/main-ping.rst index f3fe608373f..d700d42c381 100644 --- a/toolkit/components/telemetry/docs/main-ping.rst +++ b/toolkit/components/telemetry/docs/main-ping.rst @@ -30,6 +30,7 @@ Structure:: sessionId: , // random session id, shared by subsessions subsessionId: , // random subsession id + previousSessionId: , // session id of the previous session, null on first run. previousSubsessionId: , // subsession id of the previous subsession (even if it was in a different session), // null on first run. diff --git a/toolkit/components/telemetry/tests/unit/test_SubsessionChaining.js b/toolkit/components/telemetry/tests/unit/test_SubsessionChaining.js index 984c40cebdd..fe151f19afb 100644 --- a/toolkit/components/telemetry/tests/unit/test_SubsessionChaining.js +++ b/toolkit/components/telemetry/tests/unit/test_SubsessionChaining.js @@ -42,6 +42,8 @@ let promiseValidateArchivedPings = Task.async(function*(aExpectedReasons) { let previousPing = yield TelemetryArchive.promiseArchivedPingById(list[0].id); Assert.equal(aExpectedReasons.shift(), previousPing.payload.info.reason, "Telemetry should only get pings with expected reasons."); + Assert.equal(previousPing.payload.info.previousSessionId, null, + "The first session must report a null previous session id."); Assert.equal(previousPing.payload.info.previousSubsessionId, null, "The first subsession must report a null previous subsession id."); Assert.equal(previousPing.payload.info.profileSubsessionCounter, 1, @@ -50,6 +52,7 @@ let promiseValidateArchivedPings = Task.async(function*(aExpectedReasons) { "subsessionCounter must be 1 the first time."); let expectedSubsessionCounter = 1; + let expectedPreviousSessionId = previousPing.payload.info.sessionId; for (let i = 1; i < list.length; i++) { let currentPing = yield TelemetryArchive.promiseArchivedPingById(list[i].id); @@ -59,6 +62,8 @@ let promiseValidateArchivedPings = Task.async(function*(aExpectedReasons) { Assert.equal(aExpectedReasons.shift(), currentInfo.reason, "Telemetry should only get pings with expected reasons."); + Assert.equal(currentInfo.previousSessionId, expectedPreviousSessionId, + "Telemetry must correctly chain session identifiers."); Assert.equal(currentInfo.previousSubsessionId, previousInfo.subsessionId, "Telemetry must correctly chain subsession identifiers."); Assert.equal(currentInfo.profileSubsessionCounter, previousInfo.profileSubsessionCounter + 1, @@ -70,8 +75,13 @@ let promiseValidateArchivedPings = Task.async(function*(aExpectedReasons) { previousPing = currentPing; // Reset the expected subsession counter, if required. Otherwise increment the expected // subsession counter. - expectedSubsessionCounter = - SESSION_END_PING_REASONS.has(currentInfo.reason) ? 1 : (expectedSubsessionCounter + 1); + // If this is the final subsession of a session we need to update expected values accordingly. + if (SESSION_END_PING_REASONS.has(currentInfo.reason)) { + expectedSubsessionCounter = 1; + expectedPreviousSessionId = currentInfo.sessionId; + } else { + expectedSubsessionCounter++; + } } }); diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js index c31d082a7de..6448f0f5d73 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js @@ -1167,6 +1167,7 @@ add_task(function* test_savedSessionData() { // Write test data to the session data file. const dataFilePath = OS.Path.join(DATAREPORTING_PATH, "session-state.json"); const sessionState = { + sessionId: null, subsessionId: null, profileSubsessionCounter: 3785, }; From bb0383aa67faeb41dca07ee753e6edd27265953b Mon Sep 17 00:00:00 2001 From: Qeole Date: Tue, 26 May 2015 05:50:00 -0400 Subject: [PATCH 04/34] Bug 1161515 - Extend test coverage. r=gfritzsche --- .../tests/unit/test_TelemetrySession.js | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js index 6448f0f5d73..fb8d3148143 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js @@ -235,7 +235,8 @@ function checkPayloadInfo(data) { timezoneOffset: numberCheck, sessionId: uuidCheck, subsessionId: uuidCheck, - // Special case: previousSubsessionId is null on first run. + // Special cases: previousSessionId and previousSubsessionId are null on first run. + previousSessionId: (arg) => { return (arg) ? uuidCheck(arg) : true; }, previousSubsessionId: (arg) => { return (arg) ? uuidCheck(arg) : true; }, subsessionCounter: positiveNumberCheck, profileSubsessionCounter: positiveNumberCheck, @@ -1182,8 +1183,9 @@ add_task(function* test_savedSessionData() { // We expect one new subsession when starting TelemetrySession and one after triggering // an environment change. const expectedSubsessions = sessionState.profileSubsessionCounter + 2; - const expectedUUID = "009fd1ad-b85e-4817-b3e5-000000003785"; - fakeGenerateUUID(generateUUID, () => expectedUUID); + const expectedSessionUUID = "ff602e52-47a1-b7e8-4c1a-ffffffffc87a"; + const expectedSubsessionUUID = "009fd1ad-b85e-4817-b3e5-000000003785"; + fakeGenerateUUID(() => expectedSessionUUID, () => expectedSubsessionUUID); if (gIsAndroid) { // We don't support subsessions yet on Android, so skip the next checks. @@ -1210,7 +1212,8 @@ add_task(function* test_savedSessionData() { // Load back the serialised session data. let data = yield CommonUtils.readJSON(dataFilePath); Assert.equal(data.profileSubsessionCounter, expectedSubsessions); - Assert.equal(data.subsessionId, expectedUUID); + Assert.equal(data.sessionId, expectedSessionUUID); + Assert.equal(data.subsessionId, expectedSubsessionUUID); }); add_task(function* test_sessionData_ShortSession() { @@ -1225,8 +1228,9 @@ add_task(function* test_sessionData_ShortSession() { yield TelemetrySession.shutdown(); yield OS.File.remove(SESSION_STATE_PATH, { ignoreAbsent: true }); - const expectedUUID = "009fd1ad-b85e-4817-b3e5-000000003785"; - fakeGenerateUUID(generateUUID, () => expectedUUID); + const expectedSessionUUID = "ff602e52-47a1-b7e8-4c1a-ffffffffc87a"; + const expectedSubsessionUUID = "009fd1ad-b85e-4817-b3e5-000000003785"; + fakeGenerateUUID(() => expectedSessionUUID, () => expectedSubsessionUUID); // We intentionally don't wait for the setup to complete and shut down to simulate // short sessions. We expect the profile subsession counter to be 1. @@ -1243,7 +1247,8 @@ add_task(function* test_sessionData_ShortSession() { // We expect 2 profile subsession counter updates. let payload = TelemetrySession.getPayload(); Assert.equal(payload.info.profileSubsessionCounter, 2); - Assert.equal(payload.info.previousSubsessionId, expectedUUID); + Assert.equal(payload.info.previousSessionId, expectedSessionUUID); + Assert.equal(payload.info.previousSubsessionId, expectedSubsessionUUID); }); add_task(function* test_invalidSessionData() { @@ -1261,8 +1266,9 @@ add_task(function* test_invalidSessionData() { // The session data file should not load. Only expect the current subsession. const expectedSubsessions = 1; - const expectedUUID = "009fd1ad-b85e-4817-b3e5-000000003785"; - fakeGenerateUUID(() => expectedUUID, () => expectedUUID); + const expectedSessionUUID = "ff602e52-47a1-b7e8-4c1a-ffffffffc87a"; + const expectedSubsessionUUID = "009fd1ad-b85e-4817-b3e5-000000003785"; + fakeGenerateUUID(() => expectedSessionUUID, () => expectedSubsessionUUID); // Start TelemetrySession so that it loads the session data file. yield TelemetrySession.reset(); let payload = TelemetrySession.getPayload(); @@ -1272,7 +1278,8 @@ add_task(function* test_invalidSessionData() { // Load back the serialised session data. let data = yield CommonUtils.readJSON(dataFilePath); Assert.equal(data.profileSubsessionCounter, expectedSubsessions); - Assert.equal(data.subsessionId, expectedUUID); + Assert.equal(data.sessionId, expectedSessionUUID); + Assert.equal(data.subsessionId, expectedSubsessionUUID); }); add_task(function* test_abortedSession() { From 96a0b14ab43ddc8387bf60046333c2999747e2c0 Mon Sep 17 00:00:00 2001 From: Qeole Date: Tue, 26 May 2015 05:51:00 -0400 Subject: [PATCH 05/34] Bug 1161515 - Reset UUID generator with fakeGenerateUUID(). r=gfritzsche --- .../telemetry/tests/unit/test_TelemetrySession.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js index fb8d3148143..b55b3e3253b 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js @@ -1209,6 +1209,9 @@ add_task(function* test_savedSessionData() { Assert.equal(payload.info.profileSubsessionCounter, expectedSubsessions); yield TelemetrySession.shutdown(); + // Restore the UUID generator so we don't mess with other tests. + fakeGenerateUUID(generateUUID, generateUUID); + // Load back the serialised session data. let data = yield CommonUtils.readJSON(dataFilePath); Assert.equal(data.profileSubsessionCounter, expectedSubsessions); @@ -1275,6 +1278,9 @@ add_task(function* test_invalidSessionData() { Assert.equal(payload.info.profileSubsessionCounter, expectedSubsessions); yield TelemetrySession.shutdown(); + // Restore the UUID generator so we don't mess with other tests. + fakeGenerateUUID(generateUUID, generateUUID); + // Load back the serialised session data. let data = yield CommonUtils.readJSON(dataFilePath); Assert.equal(data.profileSubsessionCounter, expectedSubsessions); From 04918c48d09d751992494688a4759f32f6c546d3 Mon Sep 17 00:00:00 2001 From: Alexandre Poirot Date: Mon, 25 May 2015 20:11:59 +0200 Subject: [PATCH 06/34] Bug 1023386 - Split and filter properties remotely for objects. r=past --- ...r_dbg_variables-view-large-array-buffer.js | 110 ++++---- .../devtools/shared/widgets/VariablesView.jsm | 95 ++----- .../widgets/VariablesViewController.jsm | 234 ++++++++++++++++-- toolkit/components/telemetry/Histograms.json | 14 ++ toolkit/devtools/client/dbg-client.jsm | 101 ++++++++ toolkit/devtools/server/actors/script.js | 195 ++++++++++++++- 6 files changed, 586 insertions(+), 163 deletions(-) diff --git a/browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js b/browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js index 407f01b6b8f..7dd27c71241 100644 --- a/browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js +++ b/browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js @@ -70,10 +70,7 @@ function initialChecks() { is(objectVar.expanded, false, "The 'largeObject' variable shouldn't be expanded."); - let finished = waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES, 2); - arrayVar.expand(); - objectVar.expand(); - return finished; + return promise.all([arrayVar.expand(),objectVar.expand()]); } function verifyFirstLevel() { @@ -96,55 +93,56 @@ function verifyFirstLevel() { "The 'largeObject' should contain all the created non-enumerable elements."); is(arrayVar.target.querySelectorAll(".variables-view-property .name")[0].getAttribute("value"), - 0 + gEllipsis + 1999, "The first page in the 'largeArray' is named correctly."); + "[0" + gEllipsis + "2499]", "The first page in the 'largeArray' is named correctly."); is(arrayVar.target.querySelectorAll(".variables-view-property .value")[0].getAttribute("value"), "", "The first page in the 'largeArray' should not have a corresponding value."); is(arrayVar.target.querySelectorAll(".variables-view-property .name")[1].getAttribute("value"), - 2000 + gEllipsis + 3999, "The second page in the 'largeArray' is named correctly."); + "[2500" + gEllipsis + "4999]", "The second page in the 'largeArray' is named correctly."); is(arrayVar.target.querySelectorAll(".variables-view-property .value")[1].getAttribute("value"), "", "The second page in the 'largeArray' should not have a corresponding value."); is(arrayVar.target.querySelectorAll(".variables-view-property .name")[2].getAttribute("value"), - 4000 + gEllipsis + 5999, "The third page in the 'largeArray' is named correctly."); + "[5000" + gEllipsis + "7499]", "The third page in the 'largeArray' is named correctly."); is(arrayVar.target.querySelectorAll(".variables-view-property .value")[2].getAttribute("value"), "", "The third page in the 'largeArray' should not have a corresponding value."); is(arrayVar.target.querySelectorAll(".variables-view-property .name")[3].getAttribute("value"), - 6000 + gEllipsis + 9999, "The fourth page in the 'largeArray' is named correctly."); + "[7500" + gEllipsis + "9999]", "The fourth page in the 'largeArray' is named correctly."); is(arrayVar.target.querySelectorAll(".variables-view-property .value")[3].getAttribute("value"), "", "The fourth page in the 'largeArray' should not have a corresponding value."); is(objectVar.target.querySelectorAll(".variables-view-property .name")[0].getAttribute("value"), - 0 + gEllipsis + 1999, "The first page in the 'largeObject' is named correctly."); + "[0" + gEllipsis + "2499]", "The first page in the 'largeObject' is named correctly."); is(objectVar.target.querySelectorAll(".variables-view-property .value")[0].getAttribute("value"), "", "The first page in the 'largeObject' should not have a corresponding value."); is(objectVar.target.querySelectorAll(".variables-view-property .name")[1].getAttribute("value"), - 2000 + gEllipsis + 3999, "The second page in the 'largeObject' is named correctly."); + "[2500" + gEllipsis + "4999]", "The second page in the 'largeObject' is named correctly."); is(objectVar.target.querySelectorAll(".variables-view-property .value")[1].getAttribute("value"), "", "The second page in the 'largeObject' should not have a corresponding value."); is(objectVar.target.querySelectorAll(".variables-view-property .name")[2].getAttribute("value"), - 4000 + gEllipsis + 5999, "The thrid page in the 'largeObject' is named correctly."); + "[5000" + gEllipsis + "7499]", "The thrid page in the 'largeObject' is named correctly."); is(objectVar.target.querySelectorAll(".variables-view-property .value")[2].getAttribute("value"), "", "The thrid page in the 'largeObject' should not have a corresponding value."); is(objectVar.target.querySelectorAll(".variables-view-property .name")[3].getAttribute("value"), - 6000 + gEllipsis + 9999, "The fourth page in the 'largeObject' is named correctly."); + "[7500" + gEllipsis + "9999]", "The fourth page in the 'largeObject' is named correctly."); is(objectVar.target.querySelectorAll(".variables-view-property .value")[3].getAttribute("value"), "", "The fourth page in the 'largeObject' should not have a corresponding value."); is(arrayVar.target.querySelectorAll(".variables-view-property .name")[4].getAttribute("value"), - "length", "The other properties 'largeArray' are named correctly."); - is(arrayVar.target.querySelectorAll(".variables-view-property .value")[4].getAttribute("value"), - "10000", "The other properties 'largeArray' have the correct value."); - is(arrayVar.target.querySelectorAll(".variables-view-property .name")[5].getAttribute("value"), "buffer", "The other properties 'largeArray' are named correctly."); - is(arrayVar.target.querySelectorAll(".variables-view-property .value")[5].getAttribute("value"), + is(arrayVar.target.querySelectorAll(".variables-view-property .value")[4].getAttribute("value"), "ArrayBuffer", "The other properties 'largeArray' have the correct value."); - is(arrayVar.target.querySelectorAll(".variables-view-property .name")[6].getAttribute("value"), + is(arrayVar.target.querySelectorAll(".variables-view-property .name")[5].getAttribute("value"), "byteLength", "The other properties 'largeArray' are named correctly."); - is(arrayVar.target.querySelectorAll(".variables-view-property .value")[6].getAttribute("value"), + is(arrayVar.target.querySelectorAll(".variables-view-property .value")[5].getAttribute("value"), "10000", "The other properties 'largeArray' have the correct value."); - is(arrayVar.target.querySelectorAll(".variables-view-property .name")[7].getAttribute("value"), + is(arrayVar.target.querySelectorAll(".variables-view-property .name")[6].getAttribute("value"), "byteOffset", "The other properties 'largeArray' are named correctly."); - is(arrayVar.target.querySelectorAll(".variables-view-property .value")[7].getAttribute("value"), + is(arrayVar.target.querySelectorAll(".variables-view-property .value")[6].getAttribute("value"), "0", "The other properties 'largeArray' have the correct value."); + is(arrayVar.target.querySelectorAll(".variables-view-property .name")[7].getAttribute("value"), + "length", "The other properties 'largeArray' are named correctly."); + is(arrayVar.target.querySelectorAll(".variables-view-property .value")[7].getAttribute("value"), + "10000", "The other properties 'largeArray' have the correct value."); + is(arrayVar.target.querySelectorAll(".variables-view-property .name")[8].getAttribute("value"), "__proto__", "The other properties 'largeArray' are named correctly."); is(arrayVar.target.querySelectorAll(".variables-view-property .value")[8].getAttribute("value"), @@ -160,10 +158,13 @@ function verifyNextLevels() { let localScope = gVariables.getScopeAtIndex(0); let objectVar = localScope.get("largeObject"); - let lastPage1 = objectVar.get(6000 + gEllipsis + 9999); + let lastPage1 = objectVar.get("[7500" + gEllipsis + "9999]"); ok(lastPage1, "The last page in the first level was retrieved successfully."); - lastPage1.expand(); + return lastPage1.expand() + .then(verifyNextLevels2.bind(null, lastPage1)); +} +function verifyNextLevels2(lastPage1) { let pageEnums1 = lastPage1.target.querySelector(".variables-view-element-details.enum").childNodes; let pageNonEnums1 = lastPage1.target.querySelector(".variables-view-element-details.nonenum").childNodes; is(pageEnums1.length, 0, @@ -172,61 +173,44 @@ function verifyNextLevels() { "The last page in the first level should contain all the created non-enumerable elements."); is(lastPage1._nonenum.querySelectorAll(".variables-view-property .name")[0].getAttribute("value"), - 6000 + gEllipsis + 6999, "The first page in this level named correctly (1)."); + "[7500" + gEllipsis + "8124]", "The first page in this level named correctly (1)."); is(lastPage1._nonenum.querySelectorAll(".variables-view-property .name")[1].getAttribute("value"), - 7000 + gEllipsis + 7999, "The second page in this level named correctly (1)."); + "[8125" + gEllipsis + "8749]", "The second page in this level named correctly (1)."); is(lastPage1._nonenum.querySelectorAll(".variables-view-property .name")[2].getAttribute("value"), - 8000 + gEllipsis + 8999, "The third page in this level named correctly (1)."); + "[8750" + gEllipsis + "9374]", "The third page in this level named correctly (1)."); is(lastPage1._nonenum.querySelectorAll(".variables-view-property .name")[3].getAttribute("value"), - 9000 + gEllipsis + 9999, "The fourth page in this level named correctly (1)."); + "[9375" + gEllipsis + "9999]", "The fourth page in this level named correctly (1)."); - let lastPage2 = lastPage1.get(9000 + gEllipsis + 9999); + let lastPage2 = lastPage1.get("[9375" + gEllipsis + "9999]"); ok(lastPage2, "The last page in the second level was retrieved successfully."); - lastPage2.expand(); + return lastPage2.expand() + .then(verifyNextLevels3.bind(null, lastPage2)); +} +function verifyNextLevels3(lastPage2) { let pageEnums2 = lastPage2.target.querySelector(".variables-view-element-details.enum").childNodes; let pageNonEnums2 = lastPage2.target.querySelector(".variables-view-element-details.nonenum").childNodes; - is(pageEnums2.length, 0, - "The last page in the second level shouldn't contain any enumerable elements."); - is(pageNonEnums2.length, 4, - "The last page in the second level should contain all the created non-enumerable elements."); - - is(lastPage2._nonenum.querySelectorAll(".variables-view-property .name")[0].getAttribute("value"), - 9000 + gEllipsis + 9199, "The first page in this level named correctly (2)."); - is(lastPage2._nonenum.querySelectorAll(".variables-view-property .name")[1].getAttribute("value"), - 9200 + gEllipsis + 9399, "The second page in this level named correctly (2)."); - is(lastPage2._nonenum.querySelectorAll(".variables-view-property .name")[2].getAttribute("value"), - 9400 + gEllipsis + 9599, "The third page in this level named correctly (2)."); - is(lastPage2._nonenum.querySelectorAll(".variables-view-property .name")[3].getAttribute("value"), - 9600 + gEllipsis + 9999, "The fourth page in this level named correctly (2)."); - - let lastPage3 = lastPage2.get(9600 + gEllipsis + 9999); - ok(lastPage3, "The last page in the third level was retrieved successfully."); - lastPage3.expand(); - - let pageEnums3 = lastPage3.target.querySelector(".variables-view-element-details.enum").childNodes; - let pageNonEnums3 = lastPage3.target.querySelector(".variables-view-element-details.nonenum").childNodes; - is(pageEnums3.length, 400, + is(pageEnums2.length, 625, "The last page in the third level should contain all the created enumerable elements."); - is(pageNonEnums3.length, 0, + is(pageNonEnums2.length, 0, "The last page in the third level shouldn't contain any non-enumerable elements."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .name")[0].getAttribute("value"), - 9600, "The properties in this level are named correctly (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .name")[1].getAttribute("value"), - 9601, "The properties in this level are named correctly (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .name")[398].getAttribute("value"), + is(lastPage2._enum.querySelectorAll(".variables-view-property .name")[0].getAttribute("value"), + 9375, "The properties in this level are named correctly (3)."); + is(lastPage2._enum.querySelectorAll(".variables-view-property .name")[1].getAttribute("value"), + 9376, "The properties in this level are named correctly (3)."); + is(lastPage2._enum.querySelectorAll(".variables-view-property .name")[623].getAttribute("value"), 9998, "The properties in this level are named correctly (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .name")[399].getAttribute("value"), + is(lastPage2._enum.querySelectorAll(".variables-view-property .name")[624].getAttribute("value"), 9999, "The properties in this level are named correctly (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .value")[0].getAttribute("value"), - 399, "The properties in this level have the correct value (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .value")[1].getAttribute("value"), - 398, "The properties in this level have the correct value (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .value")[398].getAttribute("value"), + is(lastPage2._enum.querySelectorAll(".variables-view-property .value")[0].getAttribute("value"), + 624, "The properties in this level have the correct value (3)."); + is(lastPage2._enum.querySelectorAll(".variables-view-property .value")[1].getAttribute("value"), + 623, "The properties in this level have the correct value (3)."); + is(lastPage2._enum.querySelectorAll(".variables-view-property .value")[623].getAttribute("value"), 1, "The properties in this level have the correct value (3)."); - is(lastPage3._enum.querySelectorAll(".variables-view-property .value")[399].getAttribute("value"), + is(lastPage2._enum.querySelectorAll(".variables-view-property .value")[624].getAttribute("value"), 0, "The properties in this level have the correct value (3)."); } diff --git a/browser/devtools/shared/widgets/VariablesView.jsm b/browser/devtools/shared/widgets/VariablesView.jsm index c0e4d671f00..1e0bad06765 100644 --- a/browser/devtools/shared/widgets/VariablesView.jsm +++ b/browser/devtools/shared/widgets/VariablesView.jsm @@ -12,7 +12,6 @@ const DBG_STRINGS_URI = "chrome://browser/locale/devtools/debugger.properties"; const LAZY_EMPTY_DELAY = 150; // ms const LAZY_EXPAND_DELAY = 50; // ms const SCROLL_PAGE_SIZE_DEFAULT = 0; -const APPEND_PAGE_SIZE_DEFAULT = 500; const PAGE_SIZE_SCROLL_HEIGHT_RATIO = 100; const PAGE_SIZE_MAX_JUMPS = 30; const SEARCH_ACTION_MAX_DELAY = 300; // ms @@ -246,12 +245,6 @@ VariablesView.prototype = { */ scrollPageSize: SCROLL_PAGE_SIZE_DEFAULT, - /** - * The maximum number of elements allowed in a scope, variable or property - * that allows pagination when appending children. - */ - appendPageSize: APPEND_PAGE_SIZE_DEFAULT, - /** * Function called each time a variable or property's value is changed via * user interaction. If null, then value changes are disabled. @@ -556,6 +549,14 @@ VariablesView.prototype = { * The variable or property to search for. */ _doSearch: function(aToken) { + if (this.controller.supportsSearch()) { + this.empty(); + let scope = this.addScope(aToken); + scope.expanded = true; // Expand the scope by default. + scope.locked = true; // Prevent collapsing the scope. + this.controller.performSearch(scope, aToken); + return; + } for (let scope of this._store) { switch (aToken) { case "": @@ -1214,7 +1215,6 @@ function Scope(aView, aName, aFlags = {}) { // Inherit properties and flags from the parent view. You can override // each of these directly onto any scope, variable or property instance. this.scrollPageSize = aView.scrollPageSize; - this.appendPageSize = aView.appendPageSize; this.eval = aView.eval; this.switch = aView.switch; this.delete = aView.delete; @@ -1320,81 +1320,12 @@ Scope.prototype = { * Additional options for adding the properties. Supported options: * - sorted: true to sort all the properties before adding them * - callback: function invoked after each item is added - * @param string aKeysType [optional] - * Helper argument in the case of paginated items. Can be either - * "just-strings" or "just-numbers". Humans shouldn't use this argument. */ - addItems: function(aItems, aOptions = {}, aKeysType = "") { + addItems: function(aItems, aOptions = {}) { let names = Object.keys(aItems); - // Building the view when inspecting an object with a very large number of - // properties may take a long time. To avoid blocking the UI, group - // the items into several lazily populated pseudo-items. - let exceedsThreshold = names.length >= this.appendPageSize; - let shouldPaginate = exceedsThreshold && aKeysType != "just-strings"; - if (shouldPaginate && this.allowPaginate) { - // Group the items to append into two separate arrays, one containing - // number-like keys, the other one containing string keys. - if (aKeysType == "just-numbers") { - var numberKeys = names; - var stringKeys = []; - } else { - var numberKeys = []; - var stringKeys = []; - for (let name of names) { - // Be very careful. Avoid Infinity, NaN and non Natural number keys. - let coerced = +name; - if (Number.isInteger(coerced) && coerced > -1) { - numberKeys.push(name); - } else { - stringKeys.push(name); - } - } - } - - // This object contains a very large number of properties, but they're - // almost all strings that can't be coerced to numbers. Don't paginate. - if (numberKeys.length < this.appendPageSize) { - this.addItems(aItems, aOptions, "just-strings"); - return; - } - - // Slices a section of the { name: descriptor } data properties. - let paginate = (aArray, aBegin = 0, aEnd = aArray.length) => { - let store = {} - for (let i = aBegin; i < aEnd; i++) { - let name = aArray[i]; - store[name] = aItems[name]; - } - return store; - }; - - // Creates a pseudo-item that populates itself with the data properties - // from the corresponding page range. - let createRangeExpander = (aArray, aBegin, aEnd, aOptions, aKeyTypes) => { - let rangeVar = this.addItem(aArray[aBegin] + Scope.ellipsis + aArray[aEnd - 1]); - rangeVar.onexpand = () => { - let pageItems = paginate(aArray, aBegin, aEnd); - rangeVar.addItems(pageItems, aOptions, aKeyTypes); - } - rangeVar.showArrow(); - rangeVar.target.setAttribute("pseudo-item", ""); - }; - - // Divide the number keys into quarters. - let page = +Math.round(numberKeys.length / 4).toPrecision(1); - createRangeExpander(numberKeys, 0, page, aOptions, "just-numbers"); - createRangeExpander(numberKeys, page, page * 2, aOptions, "just-numbers"); - createRangeExpander(numberKeys, page * 2, page * 3, aOptions, "just-numbers"); - createRangeExpander(numberKeys, page * 3, numberKeys.length, aOptions, "just-numbers"); - - // Append all the string keys together. - this.addItems(paginate(stringKeys), aOptions, "just-strings"); - return; - } - // Sort all of the properties before adding them, if preferred. - if (aOptions.sorted && aKeysType != "just-numbers") { + if (aOptions.sorted) { names.sort(this._naturalSort); } @@ -1536,7 +1467,11 @@ Scope.prototype = { this._isExpanded = true; if (this.onexpand) { - this.onexpand(this); + // We return onexpand as it sometimes returns a promise + // (up to the user of VariableView to do it) + // that can indicate when the view is done expanding + // and attributes are available. (Mostly used for tests) + return this.onexpand(this); } }, diff --git a/browser/devtools/shared/widgets/VariablesViewController.jsm b/browser/devtools/shared/widgets/VariablesViewController.jsm index 0b773b574be..670d16ea929 100644 --- a/browser/devtools/shared/widgets/VariablesViewController.jsm +++ b/browser/devtools/shared/widgets/VariablesViewController.jsm @@ -32,8 +32,11 @@ XPCOMUtils.defineLazyModuleGetter(this, "console", "resource://gre/modules/devtools/Console.jsm"); const MAX_LONG_STRING_LENGTH = 200000; +const MAX_PROPERTY_ITEMS = 2000; const DBG_STRINGS_URI = "chrome://browser/locale/devtools/debugger.properties"; +const ELLIPSIS = Services.prefs.getComplexValue("intl.ellipsis", Ci.nsIPrefLocalizedString).data + this.EXPORTED_SYMBOLS = ["VariablesViewController", "StackFrameUtils"]; @@ -158,6 +161,166 @@ VariablesViewController.prototype = { return deferred.promise; }, + /** + * Adds pseudo items in case there is too many properties to display. + * Each item can expand into property slices. + * + * @param Scope aTarget + * The Scope where the properties will be placed into. + * @param object aGrip + * The property iterator grip. + * @param object aIterator + * The property iterator client. + */ + _populatePropertySlices: function(aTarget, aGrip, aIterator) { + if (aGrip.count < MAX_PROPERTY_ITEMS) { + return this._populateFromPropertyIterator(aTarget, aGrip); + } + + // Divide the keys into quarters. + let items = Math.ceil(aGrip.count / 4); + + let promises = []; + for(let i = 0; i < 4; i++) { + let start = aGrip.start + i * items; + let count = i != 3 ? items : aGrip.count - i * items; + + // Create a new kind of grip, with additional fields to define the slice + let sliceGrip = { + type: "property-iterator", + propertyIterator: aIterator, + start: start, + count: count + }; + + // Query the name of the first and last items for this slice + let deferred = promise.defer(); + aIterator.names([start, start + count - 1], ({ names }) => { + let label = "[" + names[0] + ELLIPSIS + names[1] + "]"; + let item = aTarget.addItem(label); + item.showArrow(); + this.addExpander(item, sliceGrip); + deferred.resolve(); + }); + promises.push(deferred.promise); + } + + return promise.all(promises); + }, + + /** + * Adds a property slice for a Variable in the view using the already + * property iterator + * + * @param Scope aTarget + * The Scope where the properties will be placed into. + * @param object aGrip + * The property iterator grip. + */ + _populateFromPropertyIterator: function(aTarget, aGrip) { + if (aGrip.count >= MAX_PROPERTY_ITEMS) { + // We already started to split, but there is still too many properties, split again. + return this._populatePropertySlices(aTarget, aGrip, aGrip.propertyIterator); + } + // We started slicing properties, and the slice is now small enough to be displayed + let deferred = promise.defer(); + aGrip.propertyIterator.slice(aGrip.start, aGrip.count, + ({ ownProperties }) => { + // Add all the variable properties. + if (Object.keys(ownProperties).length > 0) { + aTarget.addItems(ownProperties, { + sorted: true, + // Expansion handlers must be set after the properties are added. + callback: this.addExpander + }); + } + deferred.resolve(); + }); + return deferred.promise; + }, + + /** + * Adds the properties for a Variable in the view using a new feature in FF40+ + * that allows iteration over properties in slices. + * + * @param Scope aTarget + * The Scope where the properties will be placed into. + * @param object aGrip + * The grip to use to populate the target. + * @param string aQuery [optional] + * The query string used to fetch only a subset of properties + */ + _populateFromObjectWithIterator: function(aTarget, aGrip, aQuery) { + // FF40+ starts exposing `ownPropertyLength` on ObjectActor's grip, + // as well as `enumProperties` request. + let deferred = promise.defer(); + let objectClient = this._getObjectClient(aGrip); + let isArray = aGrip.preview && aGrip.preview.kind === "ArrayLike"; + if (isArray) { + // First enumerate array items, e.g. properties from `0` to `array.length`. + let options = { + ignoreNonIndexedProperties: true, + ignoreSafeGetters: true, + query: aQuery + }; + objectClient.enumProperties(options, ({ iterator }) => { + let sliceGrip = { + type: "property-iterator", + propertyIterator: iterator, + start: 0, + count: iterator.count + }; + this._populatePropertySlices(aTarget, sliceGrip, iterator) + .then(() => { + // Then enumerate the rest of the properties, like length, buffer, etc. + let options = { + ignoreIndexedProperties: true, + sort: true, + query: aQuery + }; + objectClient.enumProperties(options, ({ iterator }) => { + let sliceGrip = { + type: "property-iterator", + propertyIterator: iterator, + start: 0, + count: iterator.count + }; + deferred.resolve(this._populatePropertySlices(aTarget, sliceGrip, iterator)); + }); + }); + }); + } else { + // For objects, we just enumerate all the properties sorted by name. + objectClient.enumProperties({ sort: true, query: aQuery }, ({ iterator }) => { + let sliceGrip = { + type: "property-iterator", + propertyIterator: iterator, + start: 0, + count: iterator.count + }; + deferred.resolve(this._populatePropertySlices(aTarget, sliceGrip, iterator)); + }); + + } + return deferred.promise; + }, + + /** + * Adds the given prototype in the view. + * + * @param Scope aTarget + * The Scope where the properties will be placed into. + * @param object aProtype + * The prototype grip. + */ + _populateObjectPrototype: function(aTarget, aPrototype) { + // Add the variable's __proto__. + if (aPrototype && aPrototype.type != "null") { + let proto = aTarget.addItem("__proto__", { value: aPrototype }); + this.addExpander(proto, aPrototype); + } + }, + /** * Adds properties to a Scope, Variable, or Property in the view. Triggered * when a scope is expanded or certain variables are hovered. @@ -168,7 +331,19 @@ VariablesViewController.prototype = { * The grip to use to populate the target. */ _populateFromObject: function(aTarget, aGrip) { - let deferred = promise.defer(); + // Fetch properties by slices if there is too many in order to prevent UI freeze. + if ("ownPropertyLength" in aGrip && aGrip.ownPropertyLength >= MAX_PROPERTY_ITEMS) { + return this._populateFromObjectWithIterator(aTarget, aGrip) + .then(() => { + let deferred = promise.defer(); + let objectClient = this._getObjectClient(aGrip); + objectClient.getPrototype(({ prototype }) => { + this._populateObjectPrototype(aTarget, prototype); + deferred.resolve(); + }); + return deferred.promise; + }); + } if (aGrip.class === "Promise" && aGrip.promiseState) { const { state, value, reason } = aGrip.promiseState; @@ -179,10 +354,16 @@ VariablesViewController.prototype = { this.addExpander(aTarget.addItem("", { value: reason }), reason); } } + return this._populateProperties(aTarget, aGrip); + }, + + _populateProperties: function(aTarget, aGrip, aOptions) { + let deferred = promise.defer(); let objectClient = this._getObjectClient(aGrip); objectClient.getPrototypeAndProperties(aResponse => { - let { ownProperties, prototype } = aResponse; + let ownProperties = aResponse.ownProperties || {}; + let prototype = aResponse.prototype || null; // 'safeGetterValues' is new and isn't necessary defined on old actors. let safeGetterValues = aResponse.safeGetterValues || {}; let sortable = VariablesView.isSortable(aGrip.class); @@ -200,21 +381,15 @@ VariablesViewController.prototype = { } // Add all the variable properties. - if (ownProperties) { - aTarget.addItems(ownProperties, { - // Not all variables need to force sorted properties. - sorted: sortable, - // Expansion handlers must be set after the properties are added. - callback: this.addExpander - }); - } + aTarget.addItems(ownProperties, { + // Not all variables need to force sorted properties. + sorted: sortable, + // Expansion handlers must be set after the properties are added. + callback: this.addExpander + }); // Add the variable's __proto__. - if (prototype && prototype.type != "null") { - let proto = aTarget.addItem("__proto__", { value: prototype }); - // Expansion handlers must be set after the properties are added. - this.addExpander(proto, prototype); - } + this._populateObjectPrototype(aTarget, prototype); // If the object is a function we need to fetch its scope chain // to show them as closures for the respective function. @@ -389,6 +564,10 @@ VariablesViewController.prototype = { let deferred = promise.defer(); aTarget._fetched = deferred.promise; + if (aSource.type === "property-iterator") { + return this._populateFromPropertyIterator(aTarget, aSource); + } + // If the target is a Variable or Property then we're fetching properties. if (VariablesView.isVariable(aTarget)) { this._populateFromObject(aTarget, aSource).then(() => { @@ -438,6 +617,29 @@ VariablesViewController.prototype = { return deferred.promise; }, + /** + * Indicates to the view if the targeted actor supports properties search + * + * @return boolean True, if the actor supports enumProperty request + */ + supportsSearch: function () { + // FF40+ starts exposing ownPropertyLength on object actor's grip + // as well as enumProperty which allows to query a subset of properties. + return this.objectActor && ("ownPropertyLength" in this.objectActor); + }, + + /** + * Try to use the actor to perform an attribute search. + * + * @param Scope aScope + * The Scope instance to populate with properties + * @param string aToken + * The query string + */ + performSearch: function(aScope, aToken) { + this._populateFromObjectWithIterator(aScope, this.objectActor, aToken); + }, + /** * Release an actor from the controller. * @@ -497,6 +699,8 @@ VariablesViewController.prototype = { let populated; if (aOptions.objectActor) { + // Save objectActor for properties filtering + this.objectActor = aOptions.objectActor; populated = this.populate(variable, aOptions.objectActor); variable.expand(); } else if (aOptions.rawObject) { diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index c5ae06edc1f..155fc42d50f 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -5345,6 +5345,20 @@ "n_buckets": "1000", "description": "The time (in milliseconds) that it took a 'prototypeAndProperties' request to go round trip." }, + "DEVTOOLS_DEBUGGER_RDP_LOCAL_ENUMPROPERTIES_MS": { + "expires_in_version": "never", + "kind": "exponential", + "high": "10000", + "n_buckets": "1000", + "description": "The time (in milliseconds) that it took a 'enumProperties' request to go round trip." + }, + "DEVTOOLS_DEBUGGER_RDP_REMOTE_ENUMPROPERTIES_MS": { + "expires_in_version": "never", + "kind": "exponential", + "high": "10000", + "n_buckets": "1000", + "description": "The time (in milliseconds) that it took a 'enumProperties' request to go round trip." + }, "DEVTOOLS_DEBUGGER_RDP_LOCAL_PROTOTYPESANDPROPERTIES_MS": { "expires_in_version": "never", "kind": "exponential", diff --git a/toolkit/devtools/client/dbg-client.jsm b/toolkit/devtools/client/dbg-client.jsm index 43ebf59d3b7..3422ba0f0ec 100644 --- a/toolkit/devtools/client/dbg-client.jsm +++ b/toolkit/devtools/client/dbg-client.jsm @@ -2327,6 +2327,39 @@ ObjectClient.prototype = { telemetry: "PROTOTYPEANDPROPERTIES" }), + /** + * Request a PropertyIteratorClient instance to ease listing + * properties for this object. + * + * @param options Object + * A dictionary object with various boolean attributes: + * - ignoreSafeGetters Boolean + * If true, do not iterate over safe getters. + * - ignoreIndexedProperties Boolean + * If true, filters out Array items. + * e.g. properties names between `0` and `object.length`. + * - ignoreNonIndexedProperties Boolean + * If true, filters out items that aren't array items + * e.g. properties names that are not a number between `0` + * and `object.length`. + * - sort Boolean + * If true, the iterator will sort the properties by name + * before dispatching them. + * @param aOnResponse function Called with the client instance. + */ + enumProperties: DebuggerClient.requester({ + type: "enumProperties", + options: args(0) + }, { + after: function(aResponse) { + if (aResponse.iterator) { + return { iterator: new PropertyIteratorClient(this._client, aResponse.iterator) }; + } + return aResponse; + }, + telemetry: "ENUMPROPERTIES" + }), + /** * Request the property descriptor of the object's specified property. * @@ -2380,6 +2413,74 @@ ObjectClient.prototype = { }) }; +/** + * A PropertyIteratorClient provides a way to access to property names and + * values of an object efficiently, slice by slice. + * Note that the properties can be sorted in the backend, + * this is controled while creating the PropertyIteratorClient + * from ObjectClient.enumProperties. + * + * @param aClient DebuggerClient + * The debugger client parent. + * @param aGrip Object + * A PropertyIteratorActor grip returned by the protocol via + * TabActor.enumProperties request. + */ +function PropertyIteratorClient(aClient, aGrip) { + this._grip = aGrip; + this._client = aClient; + this.request = this._client.request; +} + +PropertyIteratorClient.prototype = { + get actor() { return this._grip.actor; }, + + /** + * Get the total number of properties available in the iterator. + */ + get count() { return this._grip.count; }, + + /** + * Get one or more property names that correspond to the positions in the + * indexes parameter. + * + * @param indexes Array + * An array of property indexes. + * @param aCallback Function + * The function called when we receive the property names. + */ + names: DebuggerClient.requester({ + type: "names", + indexes: args(0) + }, {}), + + /** + * Get a set of following property value(s). + * + * @param start Number + * The index of the first property to fetch. + * @param count Number + * The number of properties to fetch. + * @param aCallback Function + * The function called when we receive the property values. + */ + slice: DebuggerClient.requester({ + type: "slice", + start: args(0), + count: args(1) + }, {}), + + /** + * Get all the property values. + * + * @param aCallback Function + * The function called when we receive the property values. + */ + all: DebuggerClient.requester({ + type: "all" + }, {}), +}; + /** * A LongStringClient provides a way to access "very long" strings from the * debugger server. diff --git a/toolkit/devtools/server/actors/script.js b/toolkit/devtools/server/actors/script.js index 0f3056206a5..865b150a4be 100644 --- a/toolkit/devtools/server/actors/script.js +++ b/toolkit/devtools/server/actors/script.js @@ -3247,6 +3247,163 @@ let stringifiers = { }, }; + +/** + * Creates an actor to iterate over an object's property names and values. + * + * @param aObjectActor ObjectActor + * The object actor. + * @param aOptions Object + * A dictionary object with various boolean attributes: + * - ignoreSafeGetters Boolean + * If true, do not iterate over safe getters. + * - ignoreIndexedProperties Boolean + * If true, filters out Array items. + * e.g. properties names between `0` and `object.length`. + * - ignoreNonIndexedProperties Boolean + * If true, filters out items that aren't array items + * e.g. properties names that are not a number between `0` + * and `object.length`. + * - sort Boolean + * If true, the iterator will sort the properties by name + * before dispatching them. + * - query String + * If non-empty, will filter the properties by names containing + * this query string. The match is not case-sensitive. + */ +function PropertyIteratorActor(aObjectActor, aOptions) +{ + this.objectActor = aObjectActor; + + let ownProperties = Object.create(null); + let names = []; + try { + names = this.objectActor.obj.getOwnPropertyNames(); + } catch (ex) {} + + + let safeGetterValues = {}; + let safeGetterNames = []; + if (!aOptions.ignoreSafeGetters) { + // Merge the safe getter values into the existing properties list. + safeGetterValues = this.objectActor._findSafeGetterValues(names); + safeGetterNames = Object.keys(safeGetterValues); + for (let name of safeGetterNames) { + if (names.indexOf(name) === -1) { + names.push(name); + } + } + } + + if (aOptions.ignoreIndexedProperties || aOptions.ignoreNonIndexedProperties) { + let length = DevToolsUtils.getProperty(this.objectActor.obj, "length"); + if (typeof(length) !== "number") { + // Pseudo arrays are flagged as ArrayLike if they have + // subsequent indexed properties without having any length attribute. + length = 0; + for (let key of names) { + if (isNaN(key) || key != length++) { + break; + } + } + } + + if (aOptions.ignoreIndexedProperties) { + names = names.filter(i => { + // Use parseFloat in order to reject floats... + // (parseInt converts floats to integer) + // (Number(str) converts spaces to 0) + i = parseFloat(i); + return !Number.isInteger(i) || i < 0 || i >= length; + }); + } + + if (aOptions.ignoreNonIndexedProperties) { + names = names.filter(i => { + i = parseFloat(i); + return Number.isInteger(i) && i >= 0 && i < length; + }); + } + } + + if (aOptions.query) { + let { query } = aOptions; + query = query.toLowerCase(); + names = names.filter(name => { + return name.toLowerCase().includes(query); + }); + } + + if (aOptions.sort) { + names.sort(); + } + + // Now build the descriptor list + for (let name of names) { + let desc = this.objectActor._propertyDescriptor(name); + if (!desc) { + desc = safeGetterValues[name]; + } + else if (name in safeGetterValues) { + // Merge the safe getter values into the existing properties list. + let { getterValue, getterPrototypeLevel } = safeGetterValues[name]; + desc.getterValue = getterValue; + desc.getterPrototypeLevel = getterPrototypeLevel; + } + ownProperties[name] = desc; + } + + this.names = names; + this.ownProperties = ownProperties; +} + +PropertyIteratorActor.prototype = { + actorPrefix: "propertyIterator", + + grip: function () { + return { + type: "propertyIterator", + actor: this.actorID, + count: this.names.length + }; + }, + + names: function ({ indexes }) { + let list = []; + for (let idx of indexes) { + list.push(this.names[idx]); + } + return { + names: list + }; + }, + + slice: function ({ start, count }) { + let names = this.names.slice(start, start + count); + let props = Object.create(null); + for (let name of names) { + props[name] = this.ownProperties[name]; + } + return { + ownProperties: props + }; + }, + + all: function () { + return { + ownProperties: this.ownProperties + }; + } +}; + +PropertyIteratorActor.prototype.requestTypes = { + "names": PropertyIteratorActor.prototype.names, + "slice": PropertyIteratorActor.prototype.slice, + "all": PropertyIteratorActor.prototype.all, +}; + +exports.PropertyIteratorActor = PropertyIteratorActor; + /** * Creates an actor for the specified object. * @@ -3260,6 +3417,7 @@ function ObjectActor(aObj, aThreadActor) dbg_assert(!aObj.optimizedOut, "Should not create object actors for optimized out values!"); this.obj = aObj; this.threadActor = aThreadActor; + this.iterators = new Set(); } ObjectActor.prototype = { @@ -3292,6 +3450,16 @@ ObjectActor.prototype = { } } + // FF40+: Allow to know how many properties an object has + // to lazily display them when there is a bunch. + // Throws on some MouseEvent object in tests. + try { + // Bug 1163520: Assert on internal functions + if (this.obj.class != "Function") { + g.ownPropertyLength = this.obj.getOwnPropertyNames().length; + } + } catch(e) {} + let raw = this.obj.unsafeDereference(); // If Cu is not defined, we are running on a worker thread, where xrays @@ -3328,6 +3496,8 @@ ObjectActor.prototype = { if (this.registeredPool.objectActors) { this.registeredPool.objectActors.delete(this.obj); } + this.iterators.forEach(actor => this.registeredPool.removeActor(actor)); + this.iterators.clear(); this.registeredPool.removeActor(this); }, @@ -3380,6 +3550,20 @@ ObjectActor.prototype = { ownPropertyNames: this.obj.getOwnPropertyNames() }; }, + /** + * Creates an actor to iterate over an object property names and values. + * See PropertyIteratorActor constructor for more info about options param. + * + * @param aRequest object + * The protocol request object. + */ + onEnumProperties: function (aRequest) { + let actor = new PropertyIteratorActor(this, aRequest.options); + this.registeredPool.addActor(actor); + this.iterators.add(actor); + return { iterator: actor.grip() }; + }, + /** * Handle a protocol request to provide the prototype and own properties of * the object. @@ -3406,15 +3590,15 @@ ObjectActor.prototype = { return { from: this.actorID, prototype: this.threadActor.createValueGrip(this.obj.proto), ownProperties: ownProperties, - safeGetterValues: this._findSafeGetterValues(ownProperties) }; + safeGetterValues: this._findSafeGetterValues(names) }; }, /** * Find the safe getter values for the current Debugger.Object, |this.obj|. * * @private - * @param object aOwnProperties - * The object that holds the list of known ownProperties for + * @param array aOwnProperties + * The array that holds the list of known ownProperties names for * |this.obj|. * @param number [aLimit=0] * Optional limit of getter values to find. @@ -3435,7 +3619,7 @@ ObjectActor.prototype = { // avoid providing safeGetterValues from prototypes if property |name| // is already defined as an own property. if (name in safeGetterValues || - (obj != this.obj && name in aOwnProperties)) { + (obj != this.obj && aOwnProperties.indexOf(name) !== -1)) { continue; } @@ -3702,6 +3886,7 @@ ObjectActor.prototype.requestTypes = { "definitionSite": ObjectActor.prototype.onDefinitionSite, "parameterNames": ObjectActor.prototype.onParameterNames, "prototypeAndProperties": ObjectActor.prototype.onPrototypeAndProperties, + "enumProperties": ObjectActor.prototype.onEnumProperties, "prototype": ObjectActor.prototype.onPrototype, "property": ObjectActor.prototype.onProperty, "displayString": ObjectActor.prototype.onDisplayString, @@ -4423,7 +4608,7 @@ DebuggerServer.ObjectActorPreviewers.Object = [ if (i < OBJECT_PREVIEW_MAX_ITEMS) { preview.safeGetterValues = aObjectActor. - _findSafeGetterValues(preview.ownProperties, + _findSafeGetterValues(Object.keys(preview.ownProperties), OBJECT_PREVIEW_MAX_ITEMS - i); } From 6cef80d2be75121dce6ca760390823eb2ad05b16 Mon Sep 17 00:00:00 2001 From: Alexandre Poirot Date: Mon, 25 May 2015 20:14:01 +0200 Subject: [PATCH 07/34] Bug 1166774 - Wait for rule-view modifications before proceeding to next tests. r=pbrosset --- browser/devtools/styleinspector/rule-view.js | 6 +++- ...browser_ruleview_add-property-cancel_01.js | 2 +- ...browser_ruleview_add-property-cancel_02.js | 19 +++++------ ...browser_ruleview_add-property-cancel_03.js | 4 +-- .../test/browser_ruleview_add-property-svg.js | 2 +- .../test/browser_ruleview_add-property_01.js | 2 +- .../test/browser_ruleview_add-property_02.js | 2 +- .../test/browser_ruleview_add-rule_01.js | 6 ++-- .../test/browser_ruleview_add-rule_03.js | 2 +- ...leview_colorpicker-and-image-tooltip_01.js | 2 +- ...leview_colorpicker-and-image-tooltip_02.js | 2 +- ...er_ruleview_colorpicker-commit-on-ENTER.js | 2 +- ...wser_ruleview_colorpicker-edit-gradient.js | 4 +-- ...r_ruleview_colorpicker-multiple-changes.js | 6 ++-- ...eview_colorpicker-release-outside-frame.js | 3 ++ ...wser_ruleview_colorpicker-revert-on-ESC.js | 2 +- ...uleview_completion-existing-property_01.js | 2 +- ...uleview_completion-existing-property_02.js | 2 +- ...ser_ruleview_completion-new-property_01.js | 2 +- ...ser_ruleview_completion-new-property_02.js | 2 +- .../browser_ruleview_edit-property-commit.js | 8 +++-- ...owser_ruleview_edit-property-increments.js | 11 +++--- .../test/browser_ruleview_edit-property_01.js | 4 +-- .../test/browser_ruleview_edit-property_02.js | 2 +- .../test/browser_ruleview_edit-property_03.js | 15 ++++---- .../browser_ruleview_edit-selector-commit.js | 2 +- .../test/browser_ruleview_edit-selector_01.js | 2 +- .../test/browser_ruleview_edit-selector_02.js | 2 +- .../test/browser_ruleview_eyedropper.js | 34 ++++++++----------- ...ew_filtereditor-appears-on-swatch-click.js | 4 +++ .../test/browser_ruleview_keybindings.js | 6 ++++ .../test/browser_ruleview_livepreview.js | 2 +- ...eview_multiple-properties-unfinished_01.js | 18 ++++++++++ .../browser_ruleview_user-property-reset.js | 2 +- ...yleinspector_context-menu-copy-color_02.js | 4 +-- ...styleinspector_tooltip-background-image.js | 2 +- .../browser_styleinspector_tooltip-size.js | 2 ++ browser/devtools/styleinspector/test/head.js | 29 +++++++++++++--- 38 files changed, 140 insertions(+), 83 deletions(-) diff --git a/browser/devtools/styleinspector/rule-view.js b/browser/devtools/styleinspector/rule-view.js index b8193624aeb..2dbe9fc599c 100644 --- a/browser/devtools/styleinspector/rule-view.js +++ b/browser/devtools/styleinspector/rule-view.js @@ -712,7 +712,11 @@ Rule.prototype = { let modifications = this.style.startModifyingProperties(); modifications.setProperty(aProperty.name, aValue, aPriority); - modifications.apply(); + modifications.apply().then(() => { + // Ensure dispatching a ruleview-changed event + // also for previews + this.elementStyle._changed(); + }); }, /** diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_01.js b/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_01.js index 215c1e9c867..cb5780284b4 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_01.js @@ -40,7 +40,7 @@ function* testCancelNew(view) { let elementRuleEditor = getRuleViewRuleEditor(view, 0); info("Focusing a new property name in the rule-view"); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(view, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "The new property editor got focused"); info("Bluring the editor input"); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_02.js b/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_02.js index 6346284c7c4..103c071690a 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_02.js @@ -33,22 +33,19 @@ add_task(function*() { let elementRuleEditor = getRuleViewRuleEditor(view, 1); info("Focusing a new property name in the rule-view"); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(view, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "The new property editor got focused."); - let input = editor.input; info("Entering a value in the property name editor"); - let onModifications = elementRuleEditor.rule._applyingModifications; - input.value = "color"; - yield onModifications; + editor.input.value = "color"; info("Pressing return to commit and focus the new value field"); let onValueFocus = once(elementRuleEditor.element, "focus", true); - onModifications = elementRuleEditor.rule._applyingModifications; + let onRuleViewChanged = view.once("ruleview-changed"); EventUtils.synthesizeKey("VK_RETURN", {}, view.doc.defaultView); yield onValueFocus; - yield onModifications; + yield onRuleViewChanged; // Getting the new value editor after focus editor = inplaceEditor(view.doc.activeElement); @@ -62,17 +59,17 @@ add_task(function*() { editor.input.value = "red"; info("Escaping out of the field"); - onModifications = elementRuleEditor.rule._applyingModifications; + onRuleViewChanged = view.once("ruleview-changed"); EventUtils.synthesizeKey("VK_ESCAPE", {}, view.doc.defaultView); - yield onModifications; + yield onRuleViewChanged; info("Checking that the previous field is focused"); let focusedElement = inplaceEditor(elementRuleEditor.rule.textProps[0].editor.valueSpan).input; is(focusedElement, focusedElement.ownerDocument.activeElement, "Correct element has focus"); - onModifications = elementRuleEditor.rule._applyingModifications; + onRuleViewChanged = view.once("ruleview-changed"); EventUtils.synthesizeKey("VK_ESCAPE", {}, view.doc.defaultView); - yield onModifications; + yield onRuleViewChanged; is(elementRuleEditor.rule.textProps.length, 1, "Removed the new text property."); is(elementRuleEditor.propertyList.children.length, 1, "Removed the property editor."); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_03.js b/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_03.js index 59ed8b93ca7..3f38fcadb8f 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_03.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-property-cancel_03.js @@ -27,7 +27,7 @@ function* testCancelNew(inspector, ruleView) { // declaration, but leave it empty. let elementRuleEditor = getRuleViewRuleEditor(ruleView, 0); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(ruleView, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "Property editor is focused"); @@ -46,7 +46,7 @@ function* testCancelNewOnEscape(inspector, ruleView) { // declaration, add some text, then press escape. let elementRuleEditor = getRuleViewRuleEditor(ruleView, 0); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(ruleView, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "Next focused editor should be the new property editor."); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-property-svg.js b/browser/devtools/styleinspector/test/browser_ruleview_add-property-svg.js index 35e93b3a881..8dcffe767e6 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-property-svg.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-property-svg.js @@ -27,7 +27,7 @@ function* testCreateNew(ruleView) { let elementRuleEditor = getRuleViewRuleEditor(ruleView, 0); info("Focusing a new property name in the rule-view"); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(ruleView, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "Next focused editor should be the new property editor."); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-property_01.js b/browser/devtools/styleinspector/test/browser_ruleview_add-property_01.js index a7f2a6d9a6b..6c40bd4f242 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-property_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-property_01.js @@ -42,7 +42,7 @@ function* testCreateNew(view) { let elementRuleEditor = getRuleViewRuleEditor(view, 0); info("Focusing a new property name in the rule-view"); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(view, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "The new property editor got focused"); let input = editor.input; diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-property_02.js b/browser/devtools/styleinspector/test/browser_ruleview_add-property_02.js index 4eca66e3adb..7b49cb2ff4f 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-property_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-property_02.js @@ -29,7 +29,7 @@ add_task(function*() { function* testCreateNew(inspector, ruleView) { // Create a new property. let elementRuleEditor = getRuleViewRuleEditor(ruleView, 0); - let editor = yield focusEditableField(elementRuleEditor.closeBrace); + let editor = yield focusEditableField(ruleView, elementRuleEditor.closeBrace); is(inplaceEditor(elementRuleEditor.newPropSpan), editor, "Next focused editor should be the new property editor."); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-rule_01.js b/browser/devtools/styleinspector/test/browser_ruleview_add-rule_01.js index 21fe13a0027..8dae16fe67e 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-rule_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-rule_01.js @@ -73,8 +73,7 @@ function* addNewRule(inspector, view, method) { view.addRuleButton.click(); } info("Waiting for rule view to change"); - let onRuleViewChanged = once(view, "ruleview-changed"); - yield onRuleViewChanged; + yield view.once("ruleview-changed"); } function* testNewRule(view, expected, index) { @@ -90,7 +89,10 @@ function* testNewRule(view, expected, index) { "Selector text value is as expected: " + expected); info("Adding new properties to new rule: " + expected) + let onRuleViewChanged = view.once("ruleview-changed"); idRuleEditor.addProperty("font-weight", "bold", ""); + yield onRuleViewChanged; + let textProps = idRuleEditor.rule.textProps; let lastRule = textProps[textProps.length - 1]; is(lastRule.name, "font-weight", "Last rule name is font-weight"); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_add-rule_03.js b/browser/devtools/styleinspector/test/browser_ruleview_add-rule_03.js index 0854e7d731e..534b917d826 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_add-rule_03.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_add-rule_03.js @@ -71,7 +71,7 @@ function* testEditSelector(view, name) { let idRuleEditor = getRuleViewRuleEditor(view, 1); info("Focusing an existing selector name in the rule-view"); - let editor = yield focusEditableField(idRuleEditor.selectorText); + let editor = yield focusEditableField(view, idRuleEditor.selectorText); is(inplaceEditor(idRuleEditor.selectorText), editor, "The selector editor got focused"); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js index 0d30f024663..07df4d89830 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_01.js @@ -39,7 +39,7 @@ function* testImageTooltipAfterColorChange(swatch, url, ruleView) { let onShown = picker.tooltip.once("shown"); swatch.click(); yield onShown; - yield simulateColorPickerChange(picker, [0, 0, 0, 1], { + yield simulateColorPickerChange(ruleView, picker, [0, 0, 0, 1], { element: content.document.body, name: "backgroundImage", value: 'url("chrome://global/skin/icons/warning-64.png"), linear-gradient(rgb(0, 0, 0), rgb(255, 0, 102) 400px)' diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_02.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_02.js index 62b51e52e07..9a017edcef4 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-and-image-tooltip_02.js @@ -36,7 +36,7 @@ function* testColorChangeIsntRevertedWhenOtherTooltipIsShown(ruleView) { swatch.click(); yield onShown; - yield simulateColorPickerChange(picker, [0, 0, 0, 1], { + yield simulateColorPickerChange(ruleView, picker, [0, 0, 0, 1], { element: content.document.body, name: "backgroundColor", value: "rgb(0, 0, 0)" diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-commit-on-ENTER.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-commit-on-ENTER.js index f866714e354..cfa5233e560 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-commit-on-ENTER.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-commit-on-ENTER.js @@ -32,7 +32,7 @@ function* testPressingEnterCommitsChanges(swatch, ruleView) { swatch.click(); yield onShown; - yield simulateColorPickerChange(cPicker, [0, 255, 0, .5], { + yield simulateColorPickerChange(ruleView, cPicker, [0, 255, 0, .5], { element: content.document.body, name: "borderLeftColor", value: "rgba(0, 255, 0, 0.5)" diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-edit-gradient.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-edit-gradient.js index 7046369a63c..a625d04756a 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-edit-gradient.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-edit-gradient.js @@ -62,13 +62,13 @@ function* testPickingNewColor(view) { swatchEl.click(); yield onShown; - yield simulateColorPickerChange(cPicker, [1, 1, 1, 1]); + yield simulateColorPickerChange(view, cPicker, [1, 1, 1, 1]); is(swatchEl.style.backgroundColor, "rgb(1, 1, 1)", "The color swatch's background was updated"); is(colorEl.textContent, "#010101", "The color text was updated"); is(content.getComputedStyle(content.document.body).backgroundImage, - "linear-gradient(to left, rgb(255, 0, 102) 25%, rgb(51, 51, 51) 95%, rgb(0, 0, 0) 100%)", + "linear-gradient(to left, rgb(1, 1, 1) 25%, rgb(51, 51, 51) 95%, rgb(0, 0, 0) 100%)", "The gradient has been updated correctly"); cPicker.hide(); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-multiple-changes.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-multiple-changes.js index 24bef27ed97..d52c03a73e7 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-multiple-changes.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-multiple-changes.js @@ -54,7 +54,7 @@ function* testSimpleMultipleColorChanges(inspector, ruleView) { {rgba: [200, 200, 200, 1], computed: "rgb(200, 200, 200)"} ]; for (let {rgba, computed} of colors) { - yield simulateColorPickerChange(picker, rgba, { + yield simulateColorPickerChange(ruleView, picker, rgba, { element: content.document.querySelector("p"), name: "color", value: computed @@ -82,7 +82,7 @@ function* testComplexMultipleColorChanges(inspector, ruleView) { {rgba: [200, 200, 200, 1], computed: "rgb(200, 200, 200)"} ]; for (let {rgba, computed} of colors) { - yield simulateColorPickerChange(picker, rgba, { + yield simulateColorPickerChange(ruleView, picker, rgba, { element: content.document.body, name: "backgroundColor", value: computed @@ -115,7 +115,7 @@ function* testOverriddenMultipleColorChanges(inspector, ruleView) { {rgba: [200, 200, 200, 1], computed: "rgb(200, 200, 200)"} ]; for (let {rgba, computed} of colors) { - yield simulateColorPickerChange(picker, rgba, { + yield simulateColorPickerChange(ruleView, picker, rgba, { element: content.document.body, name: "color", value: computed diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-release-outside-frame.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-release-outside-frame.js index 995ef4330b3..b86428280f2 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-release-outside-frame.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-release-outside-frame.js @@ -22,9 +22,11 @@ add_task(function*() { let change = spectrum.once("changed"); info("Pressing mouse down over color picker."); + let onRuleViewChanged = view.once("ruleview-changed"); EventUtils.synthesizeMouseAtCenter(spectrum.dragger, { type: "mousedown", }, spectrum.dragger.ownerDocument.defaultView); + yield onRuleViewChanged; let value = yield change; info(`Color changed to ${value} on mousedown.`); @@ -41,6 +43,7 @@ add_task(function*() { // i.e. the buttons that were pressed down between events. info("Moving mouse over color picker without any buttons pressed."); + EventUtils.synthesizeMouse(spectrum.dragger, 10, 10, { button: -1, // -1 = no buttons are pressed down type: "mousemove", diff --git a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-revert-on-ESC.js b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-revert-on-ESC.js index f2b4e6c2a0c..3a16a4aed8b 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-revert-on-ESC.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_colorpicker-revert-on-ESC.js @@ -32,7 +32,7 @@ function* testPressingEscapeRevertsChanges(swatch, ruleView) { swatch.click(); yield onShown; - yield simulateColorPickerChange(cPicker, [0, 0, 0, 1], { + yield simulateColorPickerChange(ruleView, cPicker, [0, 0, 0, 1], { element: content.document.body, name: "backgroundColor", value: "rgb(0, 0, 0)" diff --git a/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_01.js b/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_01.js index fbca6f20a61..2d149087c22 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_01.js @@ -66,7 +66,7 @@ add_task(function*() { info("Focusing the css property editable field"); let propertyName = view.doc.querySelectorAll(".ruleview-propertyname")[0]; - let editor = yield focusEditableField(propertyName); + let editor = yield focusEditableField(view, propertyName); info("Starting to test for css property completion"); for (let i = 0; i < testData.length; i ++) { diff --git a/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_02.js b/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_02.js index 439d51c693a..62c5c592b40 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_completion-existing-property_02.js @@ -48,7 +48,7 @@ add_task(function*() { info("Focusing the css property editable value"); let value = view.doc.querySelectorAll(".ruleview-propertyvalue")[0]; - let editor = yield focusEditableField(value); + let editor = yield focusEditableField(view, value); info("Starting to test for css property completion"); for (let i = 0; i < testData.length; i ++) { diff --git a/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_01.js b/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_01.js index 13b7becb94c..b425075a3d2 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_01.js @@ -49,7 +49,7 @@ add_task(function*() { info("Focusing the css property editable field"); let brace = view.doc.querySelector(".ruleview-ruleclose"); - let editor = yield focusEditableField(brace); + let editor = yield focusEditableField(view, brace); info("Starting to test for css property completion"); for (let i = 0; i < testData.length; i ++) { diff --git a/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_02.js b/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_02.js index f26eaec168c..0aa2f45e39e 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_completion-new-property_02.js @@ -51,7 +51,7 @@ add_task(function*() { info("Focusing a new css property editable property"); let brace = view.doc.querySelectorAll(".ruleview-ruleclose")[1]; - let editor = yield focusEditableField(brace); + let editor = yield focusEditableField(view, brace); info("Starting to test for css property completion"); for (let i = 0; i < testData.length; i ++) { diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-property-commit.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-property-commit.js index 9044412dfea..033e138e5b5 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-property-commit.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-property-commit.js @@ -60,10 +60,12 @@ function* runTestData(view, {value, commitKey, modifiers, expected}) { let propEditor = idRuleEditor.rule.textProps[0].editor; info("Focusing the inplace editor field"); - let editor = yield focusEditableField(propEditor.valueSpan); + + let editor = yield focusEditableField(view, propEditor.valueSpan); is(inplaceEditor(propEditor.valueSpan), editor, "Focused editor should be the value span."); info("Entering test data " + value); + let onRuleViewChanged = view.once("ruleview-changed"); EventUtils.sendString(value, view.doc.defaultView); info("Waiting for focus on the field"); @@ -72,11 +74,13 @@ function* runTestData(view, {value, commitKey, modifiers, expected}) { info("Entering the commit key " + commitKey + " " + modifiers); EventUtils.synthesizeKey(commitKey, modifiers); yield onBlur; + // No matter if we escape or commit the change, the preview throttle is going + // to update the property value + yield onRuleViewChanged; if (commitKey === "VK_ESCAPE") { is(propEditor.valueSpan.textContent, expected, "Value is as expected: " + expected); } else { - yield once(view, "ruleview-changed"); is(propEditor.valueSpan.textContent, expected, "Value is as expected: " + expected); } } diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-property-increments.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-property-increments.js index 78dc7a165f1..c39ae4c226f 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-property-increments.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-property-increments.js @@ -148,7 +148,7 @@ function* testOddCases(view) { }; function* runIncrementTest(propertyEditor, view, tests) { - let editor = yield focusEditableField(propertyEditor.valueSpan); + let editor = yield focusEditableField(view, propertyEditor.valueSpan); for(let test in tests) { yield testIncrement(editor, tests[test], view, propertyEditor); @@ -167,7 +167,7 @@ function* testIncrement(editor, options, view, {ruleEditor}) { is(input.value, options.start, "Value initialized at " + options.start); - let onModifications = ruleEditor.rule._applyingModifications; + let onRuleViewChanged = view.once("ruleview-changed"); let onKeyUp = once(input, "keyup"); let key; key = options.down ? "VK_DOWN" : "VK_UP"; @@ -175,7 +175,10 @@ function* testIncrement(editor, options, view, {ruleEditor}) { EventUtils.synthesizeKey(key, {altKey: options.alt, shiftKey: options.shift}, view.doc.defaultView); yield onKeyUp; - yield onModifications; + // Only expect a change if the value actually changed! + if (options.start !== options.end) { + yield onRuleViewChanged; + } - is(editor.input.value, options.end, "Value changed to " + options.end); + is(input.value, options.end, "Value changed to " + options.end); } diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-property_01.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-property_01.js index 6b95f07bbad..5517e212d4f 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-property_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-property_01.js @@ -52,7 +52,7 @@ function* testEditProperty(ruleEditor, name, value, isValid) { let propEditor = ruleEditor.rule.textProps[0].editor; info("Focusing an existing property name in the rule-view"); - let editor = yield focusEditableField(propEditor.nameSpan, 32, 1); + let editor = yield focusEditableField(ruleEditor.ruleView, propEditor.nameSpan, 32, 1); is(inplaceEditor(propEditor.nameSpan), editor, "The property name editor got focused"); let input = editor.input; @@ -90,4 +90,4 @@ function* testEditProperty(ruleEditor, name, value, isValid) { } else { isnot(propValue, value, name + " shouldn't have been set."); } -} \ No newline at end of file +} diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-property_02.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-property_02.js index a2c79f1ba27..a4bccf2e4ae 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-property_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-property_02.js @@ -34,7 +34,7 @@ function* testEditProperty(inspector, ruleView) { let idRuleEditor = getRuleViewRuleEditor(ruleView, 1); let propEditor = idRuleEditor.rule.textProps[0].editor; - let editor = yield focusEditableField(propEditor.nameSpan); + let editor = yield focusEditableField(ruleView, propEditor.nameSpan); let input = editor.input; is(inplaceEditor(propEditor.nameSpan), editor, "Next focused editor should be the name editor."); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-property_03.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-property_03.js index 37a18df80fc..7b2e568b34e 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-property_03.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-property_03.js @@ -35,26 +35,25 @@ add_task(function*() { let doc = ruleEditor.doc; let propEditor = ruleEditor.rule.textProps[1].editor; - let editor = yield focusEditableField(propEditor.valueSpan); + let editor = yield focusEditableField(view, propEditor.valueSpan); info("Deleting all the text out of a value field"); - yield sendCharsAndWaitForFocus(ruleEditor.element, ["VK_DELETE", "VK_RETURN"]); - yield ruleEditor.rule._applyingModifications; + yield sendCharsAndWaitForFocus(view, ruleEditor.element, ["VK_DELETE", "VK_RETURN"]); info("Pressing enter a couple times to cycle through editors"); - yield sendCharsAndWaitForFocus(ruleEditor.element, ["VK_RETURN"]); - yield sendCharsAndWaitForFocus(ruleEditor.element, ["VK_RETURN"]); - - yield ruleEditor.rule._applyingModifications; + yield sendCharsAndWaitForFocus(view, ruleEditor.element, ["VK_RETURN"]); + yield sendCharsAndWaitForFocus(view, ruleEditor.element, ["VK_RETURN"]); isnot (ruleEditor.rule.textProps[1].editor.nameSpan.style.display, "none", "The name span is visible"); is (ruleEditor.rule.textProps.length, 2, "Correct number of props"); }); -function* sendCharsAndWaitForFocus(element, chars) { +function* sendCharsAndWaitForFocus(view, element, chars) { let onFocus = once(element, "focus", true); for (let ch of chars) { + let onRuleViewChanged = view.once("ruleview-changed"); EventUtils.sendChar(ch, element.ownerDocument.defaultView); + yield onRuleViewChanged; } yield onFocus; } diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-selector-commit.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-selector-commit.js index 0939cd2b65a..7645f6d455f 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-selector-commit.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-selector-commit.js @@ -73,7 +73,7 @@ function* runTestData(inspector, view, data) { let idRuleEditor = getRuleViewRuleEditor(view, 1); info("Focusing an existing selector name in the rule-view"); - let editor = yield focusEditableField(idRuleEditor.selectorText); + let editor = yield focusEditableField(view, idRuleEditor.selectorText); is(inplaceEditor(idRuleEditor.selectorText), editor, "The selector editor got focused"); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_01.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_01.js index 0496f165fba..b2f817faf7f 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_01.js @@ -40,7 +40,7 @@ function* testEditSelector(view, name) { let idRuleEditor = getRuleViewRuleEditor(view, 1); info("Focusing an existing selector name in the rule-view"); - let editor = yield focusEditableField(idRuleEditor.selectorText); + let editor = yield focusEditableField(view, idRuleEditor.selectorText); is(inplaceEditor(idRuleEditor.selectorText), editor, "The selector editor got focused"); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_02.js b/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_02.js index 494a2eff8e3..f0c8d4cff53 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_02.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_edit-selector_02.js @@ -55,7 +55,7 @@ function* testEditSelector(view, name) { getRuleViewRuleEditor(view, 1, 0); info("Focusing an existing selector name in the rule-view"); - let editor = yield focusEditableField(idRuleEditor.selectorText); + let editor = yield focusEditableField(view, idRuleEditor.selectorText); is(inplaceEditor(idRuleEditor.selectorText), editor, "The selector editor got focused"); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_eyedropper.js b/browser/devtools/styleinspector/test/browser_ruleview_eyedropper.js index 71d90ac4ead..495c75d0de7 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_eyedropper.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_eyedropper.js @@ -72,7 +72,7 @@ add_task(function*() { ok(dropper, "dropper opened"); - yield testSelect(swatch, dropper); + yield testSelect(view, swatch, dropper); checkTelemetry(); }); @@ -92,27 +92,23 @@ function testESC(swatch, dropper) { return deferred.promise; } -function testSelect(swatch, dropper) { - let deferred = promise.defer(); - - dropper.once("destroy", () => { - let color = swatch.style.backgroundColor; - is(color, EXPECTED_COLOR, "swatch changed colors"); - - // the change to the content is done async after rule view change - executeSoon(() => { - let element = content.document.querySelector("div"); - is(content.window.getComputedStyle(element).backgroundColor, - EXPECTED_COLOR, - "div's color set to body color after dropper"); - - deferred.resolve(); - }); - }); +function* testSelect(view, swatch, dropper) { + let onDestroyed = dropper.once("destroy"); + // the change to the content is done async after rule view change + let onRuleViewChanged = view.once("ruleview-changed"); inspectPage(dropper); - return deferred.promise; + yield onDestroyed; + yield onRuleViewChanged; + + let color = swatch.style.backgroundColor; + is(color, EXPECTED_COLOR, "swatch changed colors"); + + let element = content.document.querySelector("div"); + is(content.window.getComputedStyle(element).backgroundColor, + EXPECTED_COLOR, + "div's color set to body color after dropper"); } function clearTelemetry() { diff --git a/browser/devtools/styleinspector/test/browser_ruleview_filtereditor-appears-on-swatch-click.js b/browser/devtools/styleinspector/test/browser_ruleview_filtereditor-appears-on-swatch-click.js index a5d93ce7e36..140848ffa7e 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_filtereditor-appears-on-swatch-click.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_filtereditor-appears-on-swatch-click.js @@ -18,8 +18,12 @@ add_task(function*() { let filterTooltip = view.tooltips.filterEditor; let onShow = filterTooltip.tooltip.once("shown"); + let onRuleViewChanged = view.once("ruleview-changed"); swatch.click(); yield onShow; + // Clicking on swatch runs a preview of the current value + // and updates the rule-view + yield onRuleViewChanged; ok(true, "The shown event was emitted after clicking on swatch"); ok(!inplaceEditor(swatch.parentNode), diff --git a/browser/devtools/styleinspector/test/browser_ruleview_keybindings.js b/browser/devtools/styleinspector/test/browser_ruleview_keybindings.js index 9ffb85b3c7c..a4444bf175c 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_keybindings.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_keybindings.js @@ -28,8 +28,12 @@ add_task(function*() { info("Typing ENTER to focus the next field: property value"); onFocus = once(brace.parentNode, "focus", true); + // The rule view changes twice, once for the first field to loose focus + // and a second time for the second field to gain focus + let onRuleViewChanged = view.once("ruleview-changed").then(() => view.once("ruleview-changed")); EventUtils.sendKey("return"); yield onFocus; + yield onRuleViewChanged; ok(true, "The value field was focused"); info("Entering a property value"); @@ -38,8 +42,10 @@ add_task(function*() { info("Typing ENTER again should focus a new property name"); onFocus = once(brace.parentNode, "focus", true); + onRuleViewChanged = view.once("ruleview-changed"); EventUtils.sendKey("return"); yield onFocus; + yield onRuleViewChanged; ok(true, "The new property name field was focused"); getCurrentInplaceEditor(view).input.blur(); }); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_livepreview.js b/browser/devtools/styleinspector/test/browser_ruleview_livepreview.js index e726cbb1999..90a34383dcb 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_livepreview.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_livepreview.js @@ -43,7 +43,7 @@ function* testLivePreviewData(data, ruleView, selector) { let propEditor = idRuleEditor.rule.textProps[0].editor; info("Focusing the property value inplace-editor"); - let editor = yield focusEditableField(propEditor.valueSpan); + let editor = yield focusEditableField(ruleView, propEditor.valueSpan); is(inplaceEditor(propEditor.valueSpan), editor, "The focused editor is the value"); info("Enter a value in the editor") diff --git a/browser/devtools/styleinspector/test/browser_ruleview_multiple-properties-unfinished_01.js b/browser/devtools/styleinspector/test/browser_ruleview_multiple-properties-unfinished_01.js index 8ba2134a14c..aa8441f7804 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_multiple-properties-unfinished_01.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_multiple-properties-unfinished_01.js @@ -22,17 +22,35 @@ add_task(function*() { yield testCreateNewMultiUnfinished(inspector, ruleEditor, view); }); +function waitRuleViewChanged(view, n) { + let deferred = promise.defer(); + let count = 0; + let listener = function () { + if (++count == n) { + view.off("ruleview-changed", listener); + deferred.resolve(); + } + } + view.on("ruleview-changed", listener); + return deferred.promise; +} function* testCreateNewMultiUnfinished(inspector, ruleEditor, view) { let onMutation = inspector.once("markupmutation"); + // There is 6 rule-view updates, one for the rule view creation, + // one for each new property and one last for throttle update. + let onRuleViewChanged = waitRuleViewChanged(view, 6); yield createNewRuleViewProperty(ruleEditor, "color:blue;background : orange ; text-align:center; border-color: "); yield onMutation; + yield onRuleViewChanged; is(ruleEditor.rule.textProps.length, 4, "Should have created new text properties."); is(ruleEditor.propertyList.children.length, 4, "Should have created property editors."); EventUtils.sendString("red", view.doc.defaultView); + onRuleViewChanged = view.once("ruleview-changed"); EventUtils.synthesizeKey("VK_RETURN", {}, view.doc.defaultView); + yield onRuleViewChanged; is(ruleEditor.rule.textProps.length, 4, "Should have the same number of text properties."); is(ruleEditor.propertyList.children.length, 5, "Should have added the changed value editor."); diff --git a/browser/devtools/styleinspector/test/browser_ruleview_user-property-reset.js b/browser/devtools/styleinspector/test/browser_ruleview_user-property-reset.js index cbc8ca8624b..81ab1171785 100644 --- a/browser/devtools/styleinspector/test/browser_ruleview_user-property-reset.js +++ b/browser/devtools/styleinspector/test/browser_ruleview_user-property-reset.js @@ -43,7 +43,7 @@ function* modifyRuleViewWidth(value, ruleView, inspector) { let valueSpan = getStyleRule(ruleView).querySelector(".ruleview-propertyvalue"); info("Focusing the property value to set it to edit mode"); - let editor = yield focusEditableField(valueSpan.parentNode); + let editor = yield focusEditableField(ruleView, valueSpan.parentNode); ok(editor.input, "The inplace-editor field is ready"); info("Setting the new value"); diff --git a/browser/devtools/styleinspector/test/browser_styleinspector_context-menu-copy-color_02.js b/browser/devtools/styleinspector/test/browser_styleinspector_context-menu-copy-color_02.js index e814a98213c..3de665ac2ee 100644 --- a/browser/devtools/styleinspector/test/browser_styleinspector_context-menu-copy-color_02.js +++ b/browser/devtools/styleinspector/test/browser_styleinspector_context-menu-copy-color_02.js @@ -53,7 +53,7 @@ function* testManualEdit(inspector, view) { let {valueSpan} = getRuleViewProperty(view, "div", "color"); let newColor = "#C9184E" - let editor = yield focusEditableField(valueSpan); + let editor = yield focusEditableField(view, valueSpan); info("Typing new value"); let input = editor.input; @@ -86,7 +86,7 @@ function* testColorPickerEdit(inspector, view) { let rgbaColor = [83, 183, 89, 1]; let rgbaColorText = "rgba(83, 183, 89, 1)"; - yield simulateColorPickerChange(picker, rgbaColor); + yield simulateColorPickerChange(view, picker, rgbaColor); is(swatch.parentNode.dataset.color, rgbaColorText, "data-color was updated"); view.doc.popupNode = swatch; diff --git a/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-background-image.js b/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-background-image.js index 7a46bea58c2..1fa7a72af3d 100644 --- a/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-background-image.js +++ b/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-background-image.js @@ -101,7 +101,7 @@ function* testTooltipAppearsEvenInEditMode(view) { function turnToEditMode(ruleView) { let brace = ruleView.doc.querySelector(".ruleview-ruleclose"); - return focusEditableField(brace); + return focusEditableField(ruleView, brace); } function* testComputedView(view) { diff --git a/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-size.js b/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-size.js index 5b97e94347c..ecdc1b969aa 100644 --- a/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-size.js +++ b/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-size.js @@ -81,6 +81,8 @@ function* testPickerDimension(ruleView) { ok(panelRect.height >= h, "The panel is high enough to show the picker"); let onHidden = cPicker.tooltip.once("hidden"); + let onRuleViewChanged = ruleView.once("ruleview-changed"); cPicker.hide(); yield onHidden; + yield onRuleViewChanged; } diff --git a/browser/devtools/styleinspector/test/head.js b/browser/devtools/styleinspector/test/head.js index f9f6646855e..5d437ba98eb 100644 --- a/browser/devtools/styleinspector/test/head.js +++ b/browser/devtools/styleinspector/test/head.js @@ -412,16 +412,31 @@ function* waitForComputedStyleProperty(selector, pseudo, name, expected) { * focus * @return a promise that resolves to the inplace-editor element when ready */ -let focusEditableField = Task.async(function*(editable, xOffset=1, yOffset=1, options={}) { - let onFocus = once(editable.parentNode, "focus", true); +let focusEditableField = Task.async(function*(ruleView, editable, xOffset=1, yOffset=1, options={}) { + // Focusing the name or value input is going to fire a preview and update the rule view + let expectRuleViewUpdate = + editable.classList.contains("ruleview-propertyname") || + editable.classList.contains("ruleview-propertyvalue"); + let onRuleViewChanged; + if (expectRuleViewUpdate) { + onRuleViewChanged = ruleView.once("ruleview-changed"); + } + let onFocus = once(editable.parentNode, "focus", true); info("Clicking on editable field to turn to edit mode"); EventUtils.synthesizeMouse(editable, xOffset, yOffset, options, editable.ownerDocument.defaultView); let event = yield onFocus; info("Editable field gained focus, returning the input field now"); - return inplaceEditor(editable.ownerDocument.activeElement); + let onEdit = inplaceEditor(editable.ownerDocument.activeElement); + + if (expectRuleViewUpdate) { + info("Waiting for rule view update"); + yield onRuleViewChanged; + } + + return onEdit; }); /** @@ -708,6 +723,7 @@ function getRuleViewSelectorHighlighterIcon(view, selectorText) { /** * Simulate a color change in a given color picker tooltip, and optionally wait * for a given element in the page to have its style changed as a result + * @param {RuleView} ruleView The related rule view instance * @param {SwatchColorPickerTooltip} colorPicker * @param {Array} newRgba The new color to be set [r, g, b, a] * @param {Object} expectedChange Optional object that needs the following props: @@ -717,7 +733,8 @@ function getRuleViewSelectorHighlighterIcon(view, selectorText) { * - {String} value The expected style value * The style will be checked like so: getComputedStyle(element)[name] === value */ -let simulateColorPickerChange = Task.async(function*(colorPicker, newRgba, expectedChange) { +let simulateColorPickerChange = Task.async(function*(ruleView, colorPicker, newRgba, expectedChange) { + let onRuleViewChanged = ruleView.once("ruleview-changed"); info("Getting the spectrum colorpicker object"); let spectrum = yield colorPicker.spectrum; info("Setting the new color"); @@ -725,6 +742,8 @@ let simulateColorPickerChange = Task.async(function*(colorPicker, newRgba, expec info("Applying the change"); spectrum.updateUI(); spectrum.onChange(); + info("Waiting for rule-view to update"); + yield onRuleViewChanged; if (expectedChange) { info("Waiting for the style to be applied on the page"); @@ -780,7 +799,7 @@ function getRuleViewRuleEditor(view, childrenIndex, nodeIndex) { let focusNewRuleViewProperty = Task.async(function*(ruleEditor) { info("Clicking on a close ruleEditor brace to start editing a new property"); ruleEditor.closeBrace.scrollIntoView(); - let editor = yield focusEditableField(ruleEditor.closeBrace); + let editor = yield focusEditableField(ruleEditor.ruleView, ruleEditor.closeBrace); is(inplaceEditor(ruleEditor.newPropSpan), editor, "Focused editor is the new property editor."); is(ruleEditor.rule.textProps.length, 0, "Starting with one new text property."); From f163b82946a0669500387ef45b67fb3ecd809d6e Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Tue, 26 May 2015 12:37:00 -0400 Subject: [PATCH 08/34] Backed out changeset 5dcf471886e6 (bug 1141703) for test_datepicker.xul failures. --- toolkit/content/widgets/datetimepicker.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/toolkit/content/widgets/datetimepicker.xml b/toolkit/content/widgets/datetimepicker.xml index 5bfb59ad339..955872dc9a0 100644 --- a/toolkit/content/widgets/datetimepicker.xml +++ b/toolkit/content/widgets/datetimepicker.xml @@ -27,7 +27,7 @@ + xbl:inherits="context"> + allowevents="true" xbl:inherits="context"> Date: Tue, 26 May 2015 10:52:52 -0700 Subject: [PATCH 09/34] Bug 1050500 - add fields to ProfileTimelineStackFrame; r=smaug --- docshell/base/nsDocShell.cpp | 2 +- dom/webidl/ProfileTimelineMarker.webidl | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index bd8c0e3d9a4..769bce84813 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -13931,7 +13931,7 @@ public: aMarker.mCauseName.Construct(GetCause()); if (!mFunctionName.IsEmpty() || !mFileName.IsEmpty()) { - ProfileTimelineStackFrame stackFrame; + RootedDictionary stackFrame(aCx); stackFrame.mLine.Construct(mLineNumber); stackFrame.mSource.Construct(mFileName); stackFrame.mFunctionDisplayName.Construct(mFunctionName); diff --git a/dom/webidl/ProfileTimelineMarker.webidl b/dom/webidl/ProfileTimelineMarker.webidl index 03ffb804d66..e520b9f34b0 100644 --- a/dom/webidl/ProfileTimelineMarker.webidl +++ b/dom/webidl/ProfileTimelineMarker.webidl @@ -13,6 +13,9 @@ dictionary ProfileTimelineStackFrame { long column = 0; DOMString source; DOMString functionDisplayName; + object? parent = null; + object? asyncParent = null; + object? asyncCause = null; }; dictionary ProfileTimelineLayerRect { From d76a348b9de91269263160c503abb1ab587d455c Mon Sep 17 00:00:00 2001 From: Abdelrhman Ahmed Date: Sun, 24 May 2015 07:05:00 -0400 Subject: [PATCH 10/34] Bug 1167224 - Remove getMostRecentBrowserWindow() from nsIBrowserGlue and use RecentWindow in nsBrowserGlue.js. r=mak --- browser/components/nsBrowserGlue.js | 30 +++++++++++---------------- browser/components/nsIBrowserGlue.idl | 7 +------ 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index d8cf249da2e..bad04cf3811 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -375,7 +375,7 @@ BrowserGlue.prototype = { case "handle-xul-text-link": let linkHandled = subject.QueryInterface(Ci.nsISupportsPRBool); if (!linkHandled.data) { - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); if (win) { win.openUILinkIn(data, "tab"); linkHandled.data = true; @@ -393,7 +393,7 @@ BrowserGlue.prototype = { // browser.js:BrowserSearch.recordSearchInHealthReport(). The code could // be consolidated if there is will. We need the observer in // nsBrowserGlue to prevent double counting. - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); BrowserUITelemetry.countSearchEvent("urlbar", win.gURLBar.value); let engine = null; @@ -813,7 +813,7 @@ BrowserGlue.prototype = { }, _showSlowStartupNotification: function () { - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); if (!win) return; @@ -847,7 +847,7 @@ BrowserGlue.prototype = { * Show a notification bar offering a reset if the profile has been unused for some time. */ _resetUnusedProfileNotification: function () { - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); if (!win) return; @@ -877,7 +877,7 @@ BrowserGlue.prototype = { }, _notifyUnsignedAddonsDisabled: function () { - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); if (!win) return; @@ -1075,7 +1075,7 @@ BrowserGlue.prototype = { // them to the user. let changedIDs = AddonManager.getStartupChanges(AddonManager.STARTUP_CHANGE_INSTALLED); if (changedIDs.length > 0) { - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); AddonManager.getAddonsByIDs(changedIDs, function(aAddons) { aAddons.forEach(function(aAddon) { // If the add-on isn't user disabled or can't be enabled then skip it. @@ -1115,7 +1115,7 @@ BrowserGlue.prototype = { if (shouldCheck && !isDefault && !willRecoverSession) { Services.tm.mainThread.dispatch(function() { - DefaultBrowserCheck.prompt(this.getMostRecentBrowserWindow()); + DefaultBrowserCheck.prompt(RecentWindow.getMostRecentBrowserWindow()); }.bind(this), Ci.nsIThread.DISPATCH_NORMAL); } } @@ -1339,7 +1339,7 @@ BrowserGlue.prototype = { let key = getNotifyString({propName: "notificationButtonAccessKey", stringName: "pu.notifyButton.accesskey"}); - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); let notifyBox = win.document.getElementById("high-priority-global-notificationbox"); let buttons = [ @@ -1380,12 +1380,11 @@ BrowserGlue.prototype = { let url = getNotifyString({propName: "alertURL", prefName: "startup.homepage_override_url"}); - var self = this; function clickCallback(subject, topic, data) { // This callback will be called twice but only once with this topic if (topic != "alertclickcallback") return; - let win = self.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); win.openUILinkIn(data, "tab"); } @@ -1406,7 +1405,7 @@ BrowserGlue.prototype = { getService(Ci.nsIURLFormatter); var updateUrl = formatter.formatURLPref(PREF_PLUGINS_UPDATEURL); - var win = this.getMostRecentBrowserWindow(); + var win = RecentWindow.getMostRecentBrowserWindow(); win.openUILinkIn(updateUrl, "tab"); }, @@ -1655,7 +1654,7 @@ BrowserGlue.prototype = { formatURLPref("app.support.baseURL"); url += helpTopic; - var win = this.getMostRecentBrowserWindow(); + var win = RecentWindow.getMostRecentBrowserWindow(); var buttons = [ { @@ -2201,11 +2200,6 @@ BrowserGlue.prototype = { } }), - // this returns the most recent non-popup browser window - getMostRecentBrowserWindow: function BG_getMostRecentBrowserWindow() { - return RecentWindow.getMostRecentBrowserWindow(); - }, - #ifdef MOZ_SERVICES_SYNC /** * Called as an observer when Sync's "display URI" notification is fired. @@ -2252,7 +2246,7 @@ BrowserGlue.prototype = { Services.prefs.setBoolPref("dom.ipc.plugins.flash.disable-protected-mode", true); Services.prefs.setBoolPref("browser.flash-protected-mode-flip.done", true); - let win = this.getMostRecentBrowserWindow(); + let win = RecentWindow.getMostRecentBrowserWindow(); if (!win) { return; } diff --git a/browser/components/nsIBrowserGlue.idl b/browser/components/nsIBrowserGlue.idl index 211cffc362a..01f164f5b98 100644 --- a/browser/components/nsIBrowserGlue.idl +++ b/browser/components/nsIBrowserGlue.idl @@ -23,7 +23,7 @@ interface nsIDOMWindow; * */ -[scriptable, uuid(ea083cb7-6b9d-4695-8b34-2e8f6ce2a860)] +[scriptable, uuid(b0e7c156-d00c-4605-a77d-27c7418f23ae)] interface nsIBrowserGlue : nsISupports { /** @@ -34,9 +34,4 @@ interface nsIBrowserGlue : nsISupports * */ void sanitize(in nsIDOMWindow aParentWindow); - - /** - * Gets the most recent window that's a browser (but not a popup) - */ - nsIDOMWindow getMostRecentBrowserWindow(); }; From 624cf4e992321de5e3ad1b06ac0e7c4930ffd917 Mon Sep 17 00:00:00 2001 From: Ian Moody Date: Mon, 25 May 2015 15:41:34 +0100 Subject: [PATCH 11/34] Bug 1141350 - Use a message to get search field bookmark data for 'Add a Keyword for this Search...'. r=gabor --- browser/base/content/browser.js | 113 +++++++------------------------- browser/base/content/content.js | 70 ++++++++++++++++++++ 2 files changed, 94 insertions(+), 89 deletions(-) diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 112d9d86154..60c1a4498cf 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -6414,97 +6414,32 @@ function BrowserOpenApps() { switchToTabHavingURI(appsURL, true) } -function GetSearchFieldBookmarkData(node) { - var charset = node.ownerDocument.characterSet; - - var formBaseURI = makeURI(node.form.baseURI, - charset); - - var formURI = makeURI(node.form.getAttribute("action"), - charset, - formBaseURI); - - var spec = formURI.spec; - - var isURLEncoded = - (node.form.method.toUpperCase() == "POST" - && (node.form.enctype == "application/x-www-form-urlencoded" || - node.form.enctype == "")); - - var title = gNavigatorBundle.getFormattedString("addKeywordTitleAutoFill", - [node.ownerDocument.title]); - var description = PlacesUIUtils.getDescriptionFromDocument(node.ownerDocument); - - var formData = []; - - function escapeNameValuePair(aName, aValue, aIsFormUrlEncoded) { - if (aIsFormUrlEncoded) - return escape(aName + "=" + aValue); - else - return escape(aName) + "=" + escape(aValue); - } - - for (let el of node.form.elements) { - if (!el.type) // happens with fieldsets - continue; - - if (el == node) { - formData.push((isURLEncoded) ? escapeNameValuePair(el.name, "%s", true) : - // Don't escape "%s", just append - escapeNameValuePair(el.name, "", false) + "%s"); - continue; - } - - let type = el.type.toLowerCase(); - - if (((el instanceof HTMLInputElement && el.mozIsTextField(true)) || - type == "hidden" || type == "textarea") || - ((type == "checkbox" || type == "radio") && el.checked)) { - formData.push(escapeNameValuePair(el.name, el.value, isURLEncoded)); - } else if (el instanceof HTMLSelectElement && el.selectedIndex >= 0) { - for (var j=0; j < el.options.length; j++) { - if (el.options[j].selected) - formData.push(escapeNameValuePair(el.name, el.options[j].value, - isURLEncoded)); - } - } - } - - var postData; - - if (isURLEncoded) - postData = formData.join("&"); - else { - let separator = spec.includes("?") ? "&" : "?"; - spec += separator + formData.join("&"); - } - - return { - spec: spec, - title: title, - description: description, - postData: postData, - charSet: charset - }; -} - - function AddKeywordForSearchField() { - let bookmarkData = GetSearchFieldBookmarkData(gContextMenu.target); + let mm = gBrowser.selectedBrowser.messageManager; - PlacesUIUtils.showBookmarkDialog({ action: "add" - , type: "bookmark" - , uri: makeURI(bookmarkData.spec) - , title: bookmarkData.title - , description: bookmarkData.description - , keyword: "" - , postData: bookmarkData.postData - , charSet: bookmarkData.charset - , hiddenRows: [ "location" - , "description" - , "tags" - , "loadInSidebar" ] - }, window); + let onMessage = (message) => { + mm.removeMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage); + + let bookmarkData = message.data; + let title = gNavigatorBundle.getFormattedString("addKeywordTitleAutoFill", + [bookmarkData.title]); + PlacesUIUtils.showBookmarkDialog({ action: "add" + , type: "bookmark" + , uri: makeURI(bookmarkData.spec) + , title: title + , description: bookmarkData.description + , keyword: "" + , postData: bookmarkData.postData + , charSet: bookmarkData.charset + , hiddenRows: [ "location" + , "description" + , "tags" + , "loadInSidebar" ] + }, window); + } + mm.addMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage); + + mm.sendAsyncMessage("ContextMenu:SearchFieldBookmarkData", {}, { target: gContextMenu.target }); } function convertFromUnicode(charset, str) diff --git a/browser/base/content/content.js b/browser/base/content/content.js index b0ba6362732..61f17691cc3 100644 --- a/browser/base/content/content.js +++ b/browser/base/content/content.js @@ -664,3 +664,73 @@ addMessageListener("ContextMenu:BookmarkFrame", (message) => { { title: frame.title, description: PlacesUIUtils.getDescriptionFromDocument(frame) }); }); + +addMessageListener("ContextMenu:SearchFieldBookmarkData", (message) => { + let node = message.objects.target; + + let charset = node.ownerDocument.characterSet; + + let formBaseURI = BrowserUtils.makeURI(node.form.baseURI, + charset); + + let formURI = BrowserUtils.makeURI(node.form.getAttribute("action"), + charset, + formBaseURI); + + let spec = formURI.spec; + + let isURLEncoded = + (node.form.method.toUpperCase() == "POST" + && (node.form.enctype == "application/x-www-form-urlencoded" || + node.form.enctype == "")); + + let title = node.ownerDocument.title; + let description = PlacesUIUtils.getDescriptionFromDocument(node.ownerDocument); + + let formData = []; + + function escapeNameValuePair(aName, aValue, aIsFormUrlEncoded) { + if (aIsFormUrlEncoded) + return escape(aName + "=" + aValue); + else + return escape(aName) + "=" + escape(aValue); + } + + for (let el of node.form.elements) { + if (!el.type) // happens with fieldsets + continue; + + if (el == node) { + formData.push((isURLEncoded) ? escapeNameValuePair(el.name, "%s", true) : + // Don't escape "%s", just append + escapeNameValuePair(el.name, "", false) + "%s"); + continue; + } + + let type = el.type.toLowerCase(); + + if (((el instanceof content.HTMLInputElement && el.mozIsTextField(true)) || + type == "hidden" || type == "textarea") || + ((type == "checkbox" || type == "radio") && el.checked)) { + formData.push(escapeNameValuePair(el.name, el.value, isURLEncoded)); + } else if (el instanceof content.HTMLSelectElement && el.selectedIndex >= 0) { + for (let j=0; j < el.options.length; j++) { + if (el.options[j].selected) + formData.push(escapeNameValuePair(el.name, el.options[j].value, + isURLEncoded)); + } + } + } + + let postData; + + if (isURLEncoded) + postData = formData.join("&"); + else { + let separator = spec.includes("?") ? "&" : "?"; + spec += separator + formData.join("&"); + } + + sendAsyncMessage("ContextMenu:SearchFieldBookmarkData:Result", + { spec, title, description, postData, charset }); +}); From e8c40ce81daf0217611fb6bae59ee3ca5cb6ed82 Mon Sep 17 00:00:00 2001 From: Ian Moody Date: Sun, 26 Apr 2015 11:42:53 +0100 Subject: [PATCH 12/34] Bug 1141350 - Fix browser_addKeywordSearch.js test to work with the new message-based approach. r=gabor --- .../test/general/browser_addKeywordSearch.js | 109 ++++++++++++------ 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/browser/base/content/test/general/browser_addKeywordSearch.js b/browser/base/content/test/general/browser_addKeywordSearch.js index d52cb34a32d..670feedfb64 100644 --- a/browser/base/content/test/general/browser_addKeywordSearch.js +++ b/browser/base/content/test/general/browser_addKeywordSearch.js @@ -1,49 +1,82 @@ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ -function test() { - waitForExplicitFinish(); +let testData = [ + /* baseURI, field name, expected */ + [ 'http://example.com/', 'q', 'http://example.com/?q=%s' ], + [ 'http://example.com/new-path-here/', 'q', 'http://example.com/new-path-here/?q=%s' ], + [ '', 'q', 'http://example.org/browser/browser/base/content/test/general/dummy_page.html?q=%s' ], + // Tests for proper behaviour when called on a form whose action contains a question mark. + [ 'http://example.com/search?oe=utf-8', 'q', 'http://example.com/search?oe=utf-8&q=%s' ], +]; - gBrowser.selectedTab = gBrowser.addTab("http://example.org/browser/browser/base/content/test/general/dummy_page.html"); +let mm = gBrowser.selectedBrowser.messageManager; - gBrowser.selectedBrowser.addEventListener("load", function runTests() { - gBrowser.selectedBrowser.removeEventListener("load", runTests, true); +add_task(function*() { + yield BrowserTestUtils.withNewTab({ + gBrowser, + url: "http://example.org/browser/browser/base/content/test/general/dummy_page.html", + }, function* (browser) { + yield ContentTask.spawn(browser, null, function* () { + let doc = content.document; + let base = doc.createElement("base"); + doc.head.appendChild(base); + }); - let doc = gBrowser.contentDocument; - let base = doc.createElement("base"); - doc.head.appendChild(base); + for (let [baseURI, fieldName, expected] of testData) { + let popupShownPromise = BrowserTestUtils.waitForEvent(document.getElementById("contentAreaContextMenu"), + "popupshown"); - let check = function (baseURI, fieldName, expected) { - base.href = baseURI; + yield ContentTask.spawn(browser, { baseURI, fieldName }, function* (args) { + let doc = content.document; - let form = doc.createElement("form"); - let element = doc.createElement("input"); - element.setAttribute("type", "text"); - element.setAttribute("name", fieldName); - form.appendChild(element); - doc.body.appendChild(form); + let base = doc.querySelector('head > base'); + base.href = args.baseURI; - let data = GetSearchFieldBookmarkData(element); - is(data.spec, expected, "Bookmark spec for search field named " + fieldName + " and baseURI " + baseURI + " incorrect"); + let form = doc.createElement("form"); + form.id = "keyword-form"; + let element = doc.createElement("input"); + element.setAttribute("type", "text"); + element.setAttribute("name", args.fieldName); + form.appendChild(element); + doc.body.appendChild(form); - doc.body.removeChild(form); + /* Open context menu so chrome can access the element */ + const domWindowUtils = + content.QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIDOMWindowUtils); + let rect = element.getBoundingClientRect(); + let left = rect.left + rect.width / 2; + let top = rect.top + rect.height / 2; + domWindowUtils.sendMouseEvent("contextmenu", left, top, 2, + 1, 0, false, 0, 0, true); + }); + + yield popupShownPromise; + + let target = gContextMenuContentData.popupNode; + + let urlCheck = new Promise((resolve, reject) => { + let onMessage = (message) => { + mm.removeMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage); + + is(message.data.spec, expected, + `Bookmark spec for search field named ${fieldName} and baseURI ${baseURI} incorrect`); + resolve(); + }; + mm.addMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage); + + mm.sendAsyncMessage("ContextMenu:SearchFieldBookmarkData", null, { target }); + }); + + yield urlCheck; + + document.getElementById("contentAreaContextMenu").hidePopup(); + + yield ContentTask.spawn(browser, null, function* () { + let doc = content.document; + doc.body.removeChild(doc.getElementById("keyword-form")); + }); } - - let testData = [ - /* baseURI, field name, expected */ - [ 'http://example.com/', 'q', 'http://example.com/?q=%s' ], - [ 'http://example.com/new-path-here/', 'q', 'http://example.com/new-path-here/?q=%s' ], - [ '', 'q', 'http://example.org/browser/browser/base/content/test/general/dummy_page.html?q=%s' ], - // Tests for proper behaviour when called on a form whose action contains a question mark. - [ 'http://example.com/search?oe=utf-8', 'q', 'http://example.com/search?oe=utf-8&q=%s' ], - ] - - for (let data of testData) { - check(data[0], data[1], data[2]); - } - - // cleanup - gBrowser.removeCurrentTab(); - finish(); - }, true); -} + }); +}); From 27372f59182f973a94d9c02a7587611aa2381944 Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Sun, 24 May 2015 19:41:58 +0200 Subject: [PATCH 13/34] Bug 1167979 - Remove spidermonkey specific JS from webconsole; r=bgrins --- browser/devtools/webconsole/hudservice.js | 5 ++++- browser/devtools/webconsole/panel.js | 10 ++++++++-- ...ont_sort_non_sortable_classes_properties.js | 4 ++-- ...owser_console_variables_view_highlighter.js | 3 ++- .../test/browser_netpanel_longstring_expand.js | 2 +- ...e-properties-with-non-alphanumeric-names.js | 2 +- ...sole_autocomplete_in_debugger_stackframe.js | 2 +- ...rowser_webconsole_bug_578437_page_reload.js | 2 +- .../test/browser_webconsole_cd_iframe.js | 2 +- .../test/browser_webconsole_history.js | 2 +- .../test/browser_webconsole_jsterm.js | 2 +- .../test/browser_webconsole_network_panel.js | 2 +- .../test/browser_webconsole_split.js | 2 +- .../browser_webconsole_split_escape_key.js | 4 ++-- browser/devtools/webconsole/webconsole.js | 18 ++++++++++++++---- 15 files changed, 41 insertions(+), 21 deletions(-) diff --git a/browser/devtools/webconsole/hudservice.js b/browser/devtools/webconsole/hudservice.js index a38f997c2c7..58e025c24ca 100644 --- a/browser/devtools/webconsole/hudservice.js +++ b/browser/devtools/webconsole/hudservice.js @@ -320,7 +320,10 @@ WebConsole.prototype = { * * @type function */ - get lastFinishedRequestCallback() HUDService.lastFinishedRequest.callback, + get lastFinishedRequestCallback() + { + return HUDService.lastFinishedRequest.callback; + }, /** * Getter for the window that can provide various utilities that the web diff --git a/browser/devtools/webconsole/panel.js b/browser/devtools/webconsole/panel.js index f5c0e0cfd51..1b57889a445 100644 --- a/browser/devtools/webconsole/panel.js +++ b/browser/devtools/webconsole/panel.js @@ -103,10 +103,16 @@ WebConsolePanel.prototype = { }); }, - get target() this._toolbox.target, + get target() + { + return this._toolbox.target; + }, _isReady: false, - get isReady() this._isReady, + get isReady() + { + return this._isReady; + }, destroy: function WCP_destroy() { diff --git a/browser/devtools/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js b/browser/devtools/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js index 5cc65e7507a..7e490bbaa51 100644 --- a/browser/devtools/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js +++ b/browser/devtools/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js @@ -80,7 +80,7 @@ function test() { * A string that, once executed, creates and returns the object to * inspect. */ - function testNotSorted(aObject) { + function* testNotSorted(aObject) { info("Testing " + aObject); let deferred = promise.defer(); jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar)); @@ -106,7 +106,7 @@ function test() { * A string that, once executed, creates and returns the object to * inspect. */ - function testSorted(aObject) { + function* testSorted(aObject) { info("Testing " + aObject); let deferred = promise.defer(); jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar)); diff --git a/browser/devtools/webconsole/test/browser_console_variables_view_highlighter.js b/browser/devtools/webconsole/test/browser_console_variables_view_highlighter.js index 6c7087a94b1..3593df69b2d 100644 --- a/browser/devtools/webconsole/test/browser_console_variables_view_highlighter.js +++ b/browser/devtools/webconsole/test/browser_console_variables_view_highlighter.js @@ -46,7 +46,8 @@ function onNodeListVviewFetched(aEvent, aVar) ok(gVariablesView, "variables view object"); // Transform the vview into an array we can filter properties from - let props = [[id, prop] for([id, prop] of aVar)]; + let props = [...aVar].map(([id, prop]) => [id, prop]); + // These properties are the DOM nodes ones props = props.filter(v => v[0].match(/[0-9]+/)); diff --git a/browser/devtools/webconsole/test/browser_netpanel_longstring_expand.js b/browser/devtools/webconsole/test/browser_netpanel_longstring_expand.js index d19c393a7a4..fe64ca495b0 100644 --- a/browser/devtools/webconsole/test/browser_netpanel_longstring_expand.js +++ b/browser/devtools/webconsole/test/browser_netpanel_longstring_expand.js @@ -67,7 +67,7 @@ function checkNodeKeyValue(aPanel, aId, aKey, aValue) { ok(false, "content check failed for " + aId + ", key " + aKey); } -function testGen() { +function* testGen() { let hud = HUDService.getHudByWindow(content); let filterBox = hud.ui.filterBox; diff --git a/browser/devtools/webconsole/test/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js b/browser/devtools/webconsole/test/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js index 0577b8cc2b3..5fc8520285a 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js +++ b/browser/devtools/webconsole/test/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js @@ -14,7 +14,7 @@ let test = asyncTest(function*() { const TEST_URI = "data:text/html;charset=utf8,test autocompletion with $ or _"; yield loadTab(TEST_URI); - function autocomplete(term) { + function* autocomplete(term) { let deferred = promise.defer(); jsterm.setInputValue(term); diff --git a/browser/devtools/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js b/browser/devtools/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js index c3c838cb100..8c055643342 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js +++ b/browser/devtools/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js @@ -27,7 +27,7 @@ function testNext() { }); } -function testCompletion(hud) { +function* testCompletion(hud) { let jsterm = hud.jsterm; let input = jsterm.inputNode; let popup = jsterm.autocompletePopup; diff --git a/browser/devtools/webconsole/test/browser_webconsole_bug_578437_page_reload.js b/browser/devtools/webconsole/test/browser_webconsole_bug_578437_page_reload.js index f396259a5af..b69f740c5bb 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_bug_578437_page_reload.js +++ b/browser/devtools/webconsole/test/browser_webconsole_bug_578437_page_reload.js @@ -9,7 +9,7 @@ const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/te let browser; function test() { - loadTab(TEST_URI).then({ + loadTab(TEST_URI).then(() => { openConsole().then((tab) => { browser = tab.browser; diff --git a/browser/devtools/webconsole/test/browser_webconsole_cd_iframe.js b/browser/devtools/webconsole/test/browser_webconsole_cd_iframe.js index bc919a258fb..ca77b205305 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_cd_iframe.js +++ b/browser/devtools/webconsole/test/browser_webconsole_cd_iframe.js @@ -102,7 +102,7 @@ function test() { yield closeConsole(tab); } - function executeWindowTest() { + function* executeWindowTest() { yield hud.jsterm.execute("document.title"); yield hud.jsterm.execute("'p: ' + document.querySelector('p').textContent"); yield hud.jsterm.execute("'obj: ' + window.foobarBug609872"); diff --git a/browser/devtools/webconsole/test/browser_webconsole_history.js b/browser/devtools/webconsole/test/browser_webconsole_history.js index 42d957afbb2..20c575f5ced 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_history.js +++ b/browser/devtools/webconsole/test/browser_webconsole_history.js @@ -23,7 +23,7 @@ let test = asyncTest(function*() { let executeList = ["document", "window", "window.location"]; - for each (var item in executeList) { + for (var item of executeList) { input.value = item; yield jsterm.execute(); } diff --git a/browser/devtools/webconsole/test/browser_webconsole_jsterm.js b/browser/devtools/webconsole/test/browser_webconsole_jsterm.js index 8b9100d0ebe..fded6a0e6d7 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_jsterm.js +++ b/browser/devtools/webconsole/test/browser_webconsole_jsterm.js @@ -38,7 +38,7 @@ function checkResult(msg, desc) { return def.promise; } -function testJSTerm(hud) +function* testJSTerm(hud) { const HELP_URL = "https://developer.mozilla.org/docs/Tools/Web_Console/Helpers"; diff --git a/browser/devtools/webconsole/test/browser_webconsole_network_panel.js b/browser/devtools/webconsole/test/browser_webconsole_network_panel.js index 0cea84fea65..534e33e6cb2 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_network_panel.js +++ b/browser/devtools/webconsole/test/browser_webconsole_network_panel.js @@ -69,7 +69,7 @@ function checkNodeKeyValue(aPanel, aId, aKey, aValue) { ok(false, "content check failed for " + aId + ", key " + aKey); } -function testGen() { +function* testGen() { let filterBox = hud.ui.filterBox; let httpActivity = { diff --git a/browser/devtools/webconsole/test/browser_webconsole_split.js b/browser/devtools/webconsole/test/browser_webconsole_split.js index 1c7e6c8600d..8da38848e12 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_split.js +++ b/browser/devtools/webconsole/test/browser_webconsole_split.js @@ -49,7 +49,7 @@ function test() { info("About to check split console with each panel individually."); - Task.spawn(function() { + Task.spawn(function*() { yield openAndCheckPanel("jsdebugger"); yield openAndCheckPanel("inspector"); yield openAndCheckPanel("styleeditor"); diff --git a/browser/devtools/webconsole/test/browser_webconsole_split_escape_key.js b/browser/devtools/webconsole/test/browser_webconsole_split_escape_key.js index 2b8b8e4e75f..ed1de272b91 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_split_escape_key.js +++ b/browser/devtools/webconsole/test/browser_webconsole_split_escape_key.js @@ -110,7 +110,7 @@ function test() { "Split console is open after editing."); } - function executeJS() { + function* executeJS() { jsterm.execute("var foo = { bar: \"baz\" }; foo;"); hudMessages = yield waitForMessages({ webconsole: hud, @@ -133,7 +133,7 @@ function test() { return result; } - function startPropertyEditor() { + function* startPropertyEditor() { let results = yield findVariableViewProperties(variablesView, [ {name: "bar", value: "baz"} ], {webconsole: hud}); diff --git a/browser/devtools/webconsole/webconsole.js b/browser/devtools/webconsole/webconsole.js index 9b2ebf567e7..e8f8ef381df 100644 --- a/browser/devtools/webconsole/webconsole.js +++ b/browser/devtools/webconsole/webconsole.js @@ -243,7 +243,9 @@ WebConsoleFrame.prototype = { * Getter for the xul:popupset that holds any popups we open. * @type nsIDOMElement */ - get popupset() this.owner.mainPopupSet, + get popupset() { + return this.owner.mainPopupSet; + }, /** * Holds the initialization promise object. @@ -356,7 +358,9 @@ WebConsoleFrame.prototype = { * Getter for the debugger WebConsoleClient. * @type object */ - get webConsoleClient() this.proxy ? this.proxy.webConsoleClient : null, + get webConsoleClient() { + return this.proxy ? this.proxy.webConsoleClient : null; + }, _destroyer: null, @@ -3200,13 +3204,19 @@ JSTerm.prototype = { * Getter for the element that holds the messages we display. * @type nsIDOMElement */ - get outputNode() this.hud.outputNode, + get outputNode() + { + return this.hud.outputNode; + }, /** * Getter for the debugger WebConsoleClient. * @type object */ - get webConsoleClient() this.hud.webConsoleClient, + get webConsoleClient() + { + return this.hud.webConsoleClient; + }, COMPLETE_FORWARD: 0, COMPLETE_BACKWARD: 1, From 4d6421c61407baca5b339f9ce22f38d429e444fa Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Mon, 25 May 2015 14:42:51 +0200 Subject: [PATCH 14/34] Bug 1168077 - Remove remaining spidermonkey js specific syntax from browser/devtools; r=miker --- .../test/browser_manifest_editor.js | 10 +- browser/devtools/app-manager/test/head.js | 6 +- .../test/browser_cmd_screenshot.js | 2 +- .../netmonitor/netmonitor-controller.js | 17 +- .../devtools/netmonitor/netmonitor-view.js | 147 ++++++++++-------- browser/devtools/netmonitor/panel.js | 4 +- .../test/browser_net_complex-params.js | 2 +- .../browser_net_simple-request-details.js | 4 +- browser/devtools/netmonitor/test/head.js | 2 +- browser/devtools/performance/panel.js | 4 +- .../test/browser_aaa-run-first-leaktest.js | 2 +- .../performance/test/browser_marker-utils.js | 2 +- .../browser_perf-categories-js-calltree.js | 2 +- .../test/browser_perf-columns-js-calltree.js | 2 +- .../browser_perf-columns-memory-calltree.js | 2 +- .../test/browser_perf-compatibility-01.js | 2 +- .../test/browser_perf-compatibility-03.js | 2 +- .../test/browser_perf-compatibility-05.js | 2 +- .../test/browser_perf-compatibility-06.js | 2 +- .../test/browser_perf-compatibility-07.js | 2 +- .../test/browser_perf-console-record-01.js | 2 +- .../test/browser_perf-console-record-02.js | 2 +- .../test/browser_perf-console-record-03.js | 2 +- .../test/browser_perf-console-record-04.js | 2 +- .../test/browser_perf-console-record-05.js | 2 +- .../test/browser_perf-console-record-06.js | 2 +- .../test/browser_perf-console-record-07.js | 2 +- .../test/browser_perf-console-record-08.js | 2 +- .../test/browser_perf-console-record-09.js | 2 +- .../test/browser_perf-data-massaging-01.js | 2 +- .../test/browser_perf-data-samples.js | 2 +- .../test/browser_perf-details-01.js | 2 +- .../test/browser_perf-details-02.js | 2 +- .../test/browser_perf-details-03.js | 2 +- .../test/browser_perf-details-04.js | 2 +- .../test/browser_perf-details-05.js | 2 +- .../test/browser_perf-details-06.js | 2 +- .../browser_perf-details-calltree-render.js | 2 +- .../browser_perf-details-flamegraph-render.js | 2 +- ...ser_perf-details-memory-calltree-render.js | 2 +- ...r_perf-details-memory-flamegraph-render.js | 2 +- .../browser_perf-details-waterfall-render.js | 2 +- .../test/browser_perf-events-calltree.js | 2 +- .../performance/test/browser_perf-front-01.js | 2 +- .../performance/test/browser_perf-front-02.js | 2 +- .../browser_perf-front-basic-profiler-01.js | 2 +- .../browser_perf-front-basic-timeline-01.js | 2 +- .../test/browser_perf-highlighted.js | 2 +- .../test/browser_perf-jit-view-01.js | 2 +- .../test/browser_perf-jit-view-02.js | 2 +- .../test/browser_perf-options-01.js | 2 +- .../test/browser_perf-options-02.js | 2 +- .../test/browser_perf-options-03.js | 2 +- .../test/browser_perf-options-allocations.js | 2 +- .../browser_perf-options-enable-framerate.js | 2 +- .../browser_perf-options-enable-memory-01.js | 2 +- .../browser_perf-options-enable-memory-02.js | 2 +- ..._perf-options-flatten-tree-recursion-01.js | 2 +- ..._perf-options-flatten-tree-recursion-02.js | 2 +- ...rowser_perf-options-invert-call-tree-01.js | 2 +- ...rowser_perf-options-invert-call-tree-02.js | 2 +- ...wser_perf-options-invert-flame-graph-01.js | 2 +- ...wser_perf-options-invert-flame-graph-02.js | 2 +- .../test/browser_perf-options-profiler.js | 2 +- ...rowser_perf-options-show-idle-blocks-01.js | 2 +- ...rowser_perf-options-show-idle-blocks-02.js | 2 +- ...wser_perf-options-show-platform-data-01.js | 2 +- ...wser_perf-options-show-platform-data-02.js | 2 +- .../test/browser_perf-overview-render-01.js | 2 +- .../test/browser_perf-overview-render-02.js | 2 +- .../test/browser_perf-overview-render-03.js | 2 +- .../test/browser_perf-overview-render-04.js | 2 +- .../browser_perf-overview-selection-01.js | 2 +- .../browser_perf-overview-selection-02.js | 2 +- .../browser_perf-overview-selection-03.js | 2 +- .../browser_perf-overview-time-interval.js | 2 +- .../test/browser_perf-range-changed-render.js | 2 +- .../test/browser_perf-recording-model-01.js | 2 +- .../test/browser_perf-recording-model-02.js | 2 +- .../test/browser_perf-recording-notices-01.js | 2 +- .../test/browser_perf-recording-notices-02.js | 2 +- .../test/browser_perf-recording-notices-03.js | 2 +- .../test/browser_perf-recording-notices-04.js | 2 +- .../test/browser_perf-recording-notices-05.js | 2 +- .../performance/test/browser_perf-refresh.js | 2 +- .../test/browser_perf-shared-connection-02.js | 2 +- .../test/browser_perf-shared-connection-03.js | 2 +- .../performance/test/browser_perf-states.js | 2 +- .../test/browser_perf-theme-toggle-01.js | 2 +- .../test/browser_perf-ui-recording.js | 2 +- .../test/browser_profiler_tree-abstract-01.js | 2 +- .../test/browser_profiler_tree-abstract-02.js | 2 +- .../test/browser_profiler_tree-abstract-03.js | 2 +- .../test/browser_profiler_tree-abstract-04.js | 2 +- .../test/browser_profiler_tree-view-06.js | 2 +- .../test/browser_profiler_tree-view-07.js | 2 +- .../test/browser_timeline-blueprint.js | 2 +- .../test/browser_timeline-filters.js | 2 +- .../browser_timeline-waterfall-background.js | 2 +- .../browser_timeline-waterfall-generic.js | 2 +- .../browser_timeline-waterfall-sidebar.js | 2 +- browser/devtools/projecteditor/lib/project.js | 2 +- .../browser_projecteditor_contextmenu_02.js | 4 +- .../test/browser_projecteditor_delete_file.js | 2 +- .../test/browser_projecteditor_editing_01.js | 2 +- .../browser_projecteditor_editors_image.js | 2 +- .../browser_projecteditor_external_change.js | 4 +- .../test/browser_projecteditor_menubar_02.js | 2 +- ...browser_projecteditor_tree_selection_01.js | 4 +- ...browser_projecteditor_tree_selection_02.js | 2 +- .../projecteditor/test/helper_edits.js | 2 +- browser/devtools/shadereditor/panel.js | 4 +- browser/devtools/shadereditor/shadereditor.js | 2 +- .../test/browser_se_aaa_run_first_leaktest.js | 2 +- .../shadereditor/test/browser_se_bfcache.js | 2 +- .../test/browser_se_editors-contents.js | 2 +- .../test/browser_se_editors-error-gutter.js | 2 +- .../test/browser_se_editors-error-tooltip.js | 2 +- .../test/browser_se_editors-lazy-init.js | 2 +- .../shadereditor/test/browser_se_first-run.js | 2 +- .../test/browser_se_navigation.js | 2 +- .../test/browser_se_programs-blackbox-01.js | 2 +- .../test/browser_se_programs-blackbox-02.js | 2 +- .../test/browser_se_programs-cache.js | 2 +- .../test/browser_se_programs-highlight-01.js | 2 +- .../test/browser_se_programs-highlight-02.js | 2 +- .../test/browser_se_programs-list.js | 2 +- .../test/browser_se_shaders-edit-01.js | 2 +- .../test/browser_se_shaders-edit-02.js | 2 +- .../test/browser_se_shaders-edit-03.js | 2 +- .../test/browser_webgl-actor-test-01.js | 2 +- .../test/browser_webgl-actor-test-02.js | 2 +- .../test/browser_webgl-actor-test-03.js | 2 +- .../test/browser_webgl-actor-test-04.js | 2 +- .../test/browser_webgl-actor-test-05.js | 2 +- .../test/browser_webgl-actor-test-06.js | 4 +- .../test/browser_webgl-actor-test-07.js | 2 +- .../test/browser_webgl-actor-test-08.js | 2 +- .../test/browser_webgl-actor-test-09.js | 2 +- .../test/browser_webgl-actor-test-10.js | 4 +- .../test/browser_webgl-actor-test-11.js | 2 +- .../test/browser_webgl-actor-test-12.js | 2 +- .../test/browser_webgl-actor-test-13.js | 2 +- .../test/browser_webgl-actor-test-14.js | 2 +- .../test/browser_webgl-actor-test-15.js | 10 +- .../test/browser_webgl-actor-test-16.js | 6 +- .../test/browser_webgl-actor-test-17.js | 2 +- .../test/browser_webgl-actor-test-18.js | 2 +- browser/devtools/sourceeditor/editor.js | 2 +- browser/devtools/storage/panel.js | 8 +- browser/devtools/tilt/tilt-gl.js | 8 +- browser/devtools/webaudioeditor/panel.js | 4 +- .../browser_wa_properties-view-edit-01.js | 2 +- browser/devtools/webide/test/browser_tabs.js | 2 +- .../webide/test/sidebars/browser_tabs.js | 2 +- 155 files changed, 286 insertions(+), 240 deletions(-) diff --git a/browser/devtools/app-manager/test/browser_manifest_editor.js b/browser/devtools/app-manager/test/browser_manifest_editor.js index 1dfc09a36cd..51d271bac13 100644 --- a/browser/devtools/app-manager/test/browser_manifest_editor.js +++ b/browser/devtools/app-manager/test/browser_manifest_editor.js @@ -48,7 +48,7 @@ function waitForUpdate() { } function changeManifestValue(key, value) { - return Task.spawn(function() { + return Task.spawn(function*() { let propElem = gManifestWindow.document .querySelector("[id ^= '" + key + "']"); is(propElem.querySelector(".name").value, key, @@ -74,7 +74,7 @@ function changeManifestValue(key, value) { } function changeManifestValueBad(key, value) { - return Task.spawn(function() { + return Task.spawn(function*() { let propElem = gManifestWindow.document .querySelector("[id ^= '" + key + "']"); is(propElem.querySelector(".name").value, key, @@ -102,7 +102,7 @@ function changeManifestValueBad(key, value) { function addNewManifestProperty(parent, key, value) { info("Adding new property - parent: " + parent + "; key: " + key + "; value: " + value + "\n\n"); - return Task.spawn(function() { + return Task.spawn(function*() { let parentElem = gManifestWindow.document .querySelector("[id ^= '" + parent + "']"); ok(parentElem, "Found parent element: " + parentElem.id); @@ -143,7 +143,7 @@ function addNewManifestProperty(parent, key, value) { } function addNewManifestPropertyBad(parent, key, value) { - return Task.spawn(function() { + return Task.spawn(function*() { let parentElem = gManifestWindow.document .querySelector("[id ^= '" + parent + "']"); ok(parentElem, @@ -176,7 +176,7 @@ function addNewManifestPropertyBad(parent, key, value) { function removeManifestProperty(parent, key) { info("*** Remove property test ***"); - return Task.spawn(function() { + return Task.spawn(function*() { let parentElem = gManifestWindow.document .querySelector("[id ^= '" + parent + "']"); ok(parentElem, "Found parent element"); diff --git a/browser/devtools/app-manager/test/head.js b/browser/devtools/app-manager/test/head.js index a8cb422141f..1d557c9b0a9 100644 --- a/browser/devtools/app-manager/test/head.js +++ b/browser/devtools/app-manager/test/head.js @@ -127,7 +127,7 @@ function waitForProjectsPanel(deferred = promise.defer()) { } function selectProjectsPanel() { - return Task.spawn(function() { + return Task.spawn(function*() { let projectsButton = content.document.querySelector(".projects-button"); EventUtils.sendMouseEvent({ type: "click" }, projectsButton, content); @@ -144,7 +144,7 @@ function waitForProjectSelection() { } function selectFirstProject() { - return Task.spawn(function() { + return Task.spawn(function*() { let projectsFrame = content.document.querySelector(".projects-panel"); let projectsWindow = projectsFrame.contentWindow; let projectsDoc = projectsWindow.document; @@ -156,7 +156,7 @@ function selectFirstProject() { } function showSampleProjectDetails() { - return Task.spawn(function() { + return Task.spawn(function*() { yield selectProjectsPanel(); yield selectFirstProject(); }); diff --git a/browser/devtools/commandline/test/browser_cmd_screenshot.js b/browser/devtools/commandline/test/browser_cmd_screenshot.js index 68689b97fe0..0480bacf832 100644 --- a/browser/devtools/commandline/test/browser_cmd_screenshot.js +++ b/browser/devtools/commandline/test/browser_cmd_screenshot.js @@ -25,7 +25,7 @@ function* spawnTest() { pbWin.close(); } -function addTabWithToolbarRunTests(win) { +function* addTabWithToolbarRunTests(win) { let options = yield helpers.openTab(TEST_URI, { chromeWindow: win }); yield helpers.openToolbar(options); diff --git a/browser/devtools/netmonitor/netmonitor-controller.js b/browser/devtools/netmonitor/netmonitor-controller.js index aaafaf87417..753caff3921 100644 --- a/browser/devtools/netmonitor/netmonitor-controller.js +++ b/browser/devtools/netmonitor/netmonitor-controller.js @@ -368,7 +368,9 @@ function TargetEventsHandler() { } TargetEventsHandler.prototype = { - get target() NetMonitorController._target, + get target() { + return NetMonitorController._target; + }, /** * Listen for events emitted by the current tab target. @@ -448,8 +450,13 @@ function NetworkEventsHandler() { } NetworkEventsHandler.prototype = { - get client() NetMonitorController._target.client, - get webConsoleClient() NetMonitorController.webConsoleClient, + get client() { + return NetMonitorController._target.client; + }, + + get webConsoleClient() { + return NetMonitorController.webConsoleClient; + }, /** * Connect to the current target client. @@ -763,7 +770,9 @@ NetMonitorController.NetworkEventsHandler = new NetworkEventsHandler(); */ Object.defineProperties(window, { "gNetwork": { - get: function() NetMonitorController.NetworkEventsHandler, + get: function() { + return NetMonitorController.NetworkEventsHandler; + }, configurable: true } }); diff --git a/browser/devtools/netmonitor/netmonitor-view.js b/browser/devtools/netmonitor/netmonitor-view.js index f1d3e8400f4..eab8725e23f 100644 --- a/browser/devtools/netmonitor/netmonitor-view.js +++ b/browser/devtools/netmonitor/netmonitor-view.js @@ -948,19 +948,21 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, { /** * Returns an object with all the filter predicates as [key: function] pairs. */ - get _allFilterPredicates() ({ - all: () => true, - html: this.isHtml, - css: this.isCss, - js: this.isJs, - xhr: this.isXHR, - fonts: this.isFont, - images: this.isImage, - media: this.isMedia, - flash: this.isFlash, - other: this.isOther, - freetext: this.isFreetextMatch - }), + get _allFilterPredicates() { + return { + all: () => true, + html: this.isHtml, + css: this.isCss, + js: this.isJs, + xhr: this.isXHR, + fonts: this.isFont, + images: this.isImage, + media: this.isMedia, + flash: this.isFlash, + other: this.isOther, + freetext: this.isFreetextMatch + }; + }, /** * Sorts all network requests in this container by a specified detail. @@ -1074,52 +1076,72 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, { * @return boolean * True if the item should be visible, false otherwise. */ - isHtml: function({ attachment: { mimeType } }) - mimeType && mimeType.includes("/html"), + isHtml: function({ attachment: { mimeType } }) { + return mimeType && mimeType.includes("/html"); + }, - isCss: function({ attachment: { mimeType } }) - mimeType && mimeType.includes("/css"), + isCss: function({ attachment: { mimeType } }) { + return mimeType && mimeType.includes("/css"); + }, - isJs: function({ attachment: { mimeType } }) - mimeType && ( + isJs: function({ attachment: { mimeType } }) { + return mimeType && ( mimeType.includes("/ecmascript") || mimeType.includes("/javascript") || - mimeType.includes("/x-javascript")), + mimeType.includes("/x-javascript")); + }, - isXHR: function({ attachment: { isXHR } }) - isXHR, + isXHR: function({ attachment: { isXHR } }) { + return isXHR; + }, - isFont: function({ attachment: { url, mimeType } }) // Fonts are a mess. - (mimeType && ( - mimeType.includes("font/") || - mimeType.includes("/font"))) || - url.includes(".eot") || - url.includes(".ttf") || - url.includes(".otf") || - url.includes(".woff"), + isFont: function({ attachment: { url, mimeType } }) { + // Fonts are a mess. + return (mimeType && ( + mimeType.includes("font/") || + mimeType.includes("/font"))) || + url.includes(".eot") || + url.includes(".ttf") || + url.includes(".otf") || + url.includes(".woff"); + }, - isImage: function({ attachment: { mimeType } }) - mimeType && mimeType.includes("image/"), + isImage: function({ attachment: { mimeType } }) { + return mimeType && mimeType.includes("image/"); + }, - isMedia: function({ attachment: { mimeType } }) // Not including images. - mimeType && ( + isMedia: function({ attachment: { mimeType } }) { + // Not including images. + return mimeType && ( mimeType.includes("audio/") || mimeType.includes("video/") || - mimeType.includes("model/")), + mimeType.includes("model/")); + }, - isFlash: function({ attachment: { url, mimeType } }) // Flash is a mess. - (mimeType && ( - mimeType.includes("/x-flv") || - mimeType.includes("/x-shockwave-flash"))) || - url.includes(".swf") || - url.includes(".flv"), + isFlash: function({ attachment: { url, mimeType } }) { + // Flash is a mess. + return (mimeType && ( + mimeType.includes("/x-flv") || + mimeType.includes("/x-shockwave-flash"))) || + url.includes(".swf") || + url.includes(".flv"); + }, - isOther: function(e) - !this.isHtml(e) && !this.isCss(e) && !this.isJs(e) && !this.isXHR(e) && - !this.isFont(e) && !this.isImage(e) && !this.isMedia(e) && !this.isFlash(e), + isOther: function(e) { + return !this.isHtml(e) && + !this.isCss(e) && + !this.isJs(e) && + !this.isXHR(e) && + !this.isFont(e) && + !this.isImage(e) && + !this.isMedia(e) && + !this.isFlash(e); + }, - isFreetextMatch: function({ attachment: { url } }, text) //no text is a positive match - !text || url.includes(text), + isFreetextMatch: function({ attachment: { url } }, text) { + //no text is a positive match + return !text || url.includes(text); + }, /** * Predicates used when sorting items. @@ -1133,18 +1155,21 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, { * 0 to leave aFirst and aSecond unchanged with respect to each other * 1 to sort aSecond to a lower index than aFirst */ - _byTiming: function({ attachment: first }, { attachment: second }) - first.startedMillis > second.startedMillis, + _byTiming: function({ attachment: first }, { attachment: second }) { + return first.startedMillis > second.startedMillis; + }, - _byStatus: function({ attachment: first }, { attachment: second }) - first.status == second.status - ? first.startedMillis > second.startedMillis - : first.status > second.status, + _byStatus: function({ attachment: first }, { attachment: second }) { + return first.status == second.status + ? first.startedMillis > second.startedMillis + : first.status > second.status; + }, - _byMethod: function({ attachment: first }, { attachment: second }) - first.method == second.method - ? first.startedMillis > second.startedMillis - : first.method > second.method, + _byMethod: function({ attachment: first }, { attachment: second }) { + return first.method == second.method + ? first.startedMillis > second.startedMillis + : first.method > second.method; + }, _byFile: function({ attachment: first }, { attachment: second }) { let firstUrl = this._getUriNameWithQuery(first.url).toLowerCase(); @@ -3256,8 +3281,8 @@ PerformanceStatisticsView.prototype = { /** * DOM query helper. */ -function $(aSelector, aTarget = document) aTarget.querySelector(aSelector); -function $all(aSelector, aTarget = document) aTarget.querySelectorAll(aSelector); +let $ = (aSelector, aTarget = document) => aTarget.querySelector(aSelector); +let $all = (aSelector, aTarget = document) => aTarget.querySelectorAll(aSelector); /** * Helper for getting an nsIURL instance out of a string. @@ -3352,7 +3377,7 @@ function parseRequestText(aText, aName, aDivider) { * List of headers in text format */ function writeHeaderText(aHeaders) { - return [(name + ": " + value) for ({name, value} of aHeaders)].join("\n"); + return aHeaders.map(({name, value}) => name + ": " + value).join("\n"); } /** @@ -3364,7 +3389,7 @@ function writeHeaderText(aHeaders) { * List of query params in text format */ function writeQueryText(aParams) { - return [(name + "=" + value) for ({name, value} of aParams)].join("\n"); + return aParams.map(({name, value}) => name + "=" + value).join("\n"); } /** @@ -3376,7 +3401,7 @@ function writeQueryText(aParams) { * Query string that can be appended to a url. */ function writeQueryString(aParams) { - return [(name + "=" + value) for ({name, value} of aParams)].join("&"); + return aParams.map(({name, value}) => name + "=" + value).join("&"); } /** diff --git a/browser/devtools/netmonitor/panel.js b/browser/devtools/netmonitor/panel.js index ff513e9d05f..d6775598b40 100644 --- a/browser/devtools/netmonitor/panel.js +++ b/browser/devtools/netmonitor/panel.js @@ -56,7 +56,9 @@ NetMonitorPanel.prototype = { // DevToolPanel API - get target() this._toolbox.target, + get target() { + return this._toolbox.target; + }, destroy: function() { // Make sure this panel is not already destroyed. diff --git a/browser/devtools/netmonitor/test/browser_net_complex-params.js b/browser/devtools/netmonitor/test/browser_net_complex-params.js index f081835df7f..f728878e8df 100644 --- a/browser/devtools/netmonitor/test/browser_net_complex-params.js +++ b/browser/devtools/netmonitor/test/browser_net_complex-params.js @@ -16,7 +16,7 @@ function test() { RequestsMenu.lazyUpdate = false; NetworkDetails._params.lazyEmpty = false; - Task.spawn(function () { + Task.spawn(function*() { yield waitForNetworkEvents(aMonitor, 1, 6); EventUtils.sendMouseEvent({ type: "mousedown" }, diff --git a/browser/devtools/netmonitor/test/browser_net_simple-request-details.js b/browser/devtools/netmonitor/test/browser_net_simple-request-details.js index a008179df95..54d3e5d6a57 100644 --- a/browser/devtools/netmonitor/test/browser_net_simple-request-details.js +++ b/browser/devtools/netmonitor/test/browser_net_simple-request-details.js @@ -14,7 +14,7 @@ function test() { let TAB_UPDATED = aMonitor.panelWin.EVENTS.TAB_UPDATED; RequestsMenu.lazyUpdate = false; - Task.spawn(function () { + Task.spawn(function*() { yield waitForNetworkEvents(aMonitor, 1); is(RequestsMenu.selectedItem, null, "There shouldn't be any selected item in the requests menu."); @@ -174,7 +174,7 @@ function test() { EventUtils.sendMouseEvent({ type: "mousedown" }, document.querySelectorAll("#details-pane tab")[3]); - return Task.spawn(function () { + return Task.spawn(function*() { yield waitFor(aMonitor.panelWin, TAB_UPDATED); let tab = document.querySelectorAll("#details-pane tab")[3]; diff --git a/browser/devtools/netmonitor/test/head.js b/browser/devtools/netmonitor/test/head.js index 6fe4461ab91..75e30b3cfab 100644 --- a/browser/devtools/netmonitor/test/head.js +++ b/browser/devtools/netmonitor/test/head.js @@ -404,7 +404,7 @@ function testFilterButtons(aMonitor, aFilterType) { let buttons = doc.querySelectorAll(".requests-menu-footer-button"); // Only target should be checked. - let checkStatus = [(button == target) ? 1 : 0 for (button of buttons)] + let checkStatus = [...buttons].map(button => button == target ? 1 : 0); testFilterButtonsCustom(aMonitor, checkStatus); } diff --git a/browser/devtools/performance/panel.js b/browser/devtools/performance/panel.js index cf4f008460a..ead6533a669 100644 --- a/browser/devtools/performance/panel.js +++ b/browser/devtools/performance/panel.js @@ -56,7 +56,9 @@ PerformancePanel.prototype = { // DevToolPanel API - get target() this._toolbox.target, + get target() { + return this._toolbox.target; + }, destroy: Task.async(function*() { // Make sure this panel is not already destroyed. diff --git a/browser/devtools/performance/test/browser_aaa-run-first-leaktest.js b/browser/devtools/performance/test/browser_aaa-run-first-leaktest.js index dae34d62fcb..964ca4f2c6b 100644 --- a/browser/devtools/performance/test/browser_aaa-run-first-leaktest.js +++ b/browser/devtools/performance/test/browser_aaa-run-first-leaktest.js @@ -6,7 +6,7 @@ * You can also use this initialization format as a template for other tests. */ -function spawnTest () { +function* spawnTest() { let { target, panel, toolbox } = yield initPerformance(SIMPLE_URL); ok(target, "Should have a target available."); diff --git a/browser/devtools/performance/test/browser_marker-utils.js b/browser/devtools/performance/test/browser_marker-utils.js index 575635233d9..9e0e07b0ca9 100644 --- a/browser/devtools/performance/test/browser_marker-utils.js +++ b/browser/devtools/performance/test/browser_marker-utils.js @@ -5,7 +5,7 @@ * Tests the marker utils methods. */ -function spawnTest () { +function* spawnTest() { let { TIMELINE_BLUEPRINT } = devtools.require("devtools/performance/global"); let Utils = devtools.require("devtools/performance/marker-utils"); diff --git a/browser/devtools/performance/test/browser_perf-categories-js-calltree.js b/browser/devtools/performance/test/browser_perf-categories-js-calltree.js index a651c3a6488..5c97c16e5e8 100644 --- a/browser/devtools/performance/test/browser_perf-categories-js-calltree.js +++ b/browser/devtools/performance/test/browser_perf-categories-js-calltree.js @@ -5,7 +5,7 @@ * Tests that the categories are shown in the js call tree when platform data * is enabled. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-columns-js-calltree.js b/browser/devtools/performance/test/browser_perf-columns-js-calltree.js index a4dc65f56f2..f898656f988 100644 --- a/browser/devtools/performance/test/browser_perf-columns-js-calltree.js +++ b/browser/devtools/performance/test/browser_perf-columns-js-calltree.js @@ -4,7 +4,7 @@ /** * Tests that the js call tree view renders the correct columns. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, $$, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-columns-memory-calltree.js b/browser/devtools/performance/test/browser_perf-columns-memory-calltree.js index 70908f4c1b2..ce0122a0878 100644 --- a/browser/devtools/performance/test/browser_perf-columns-memory-calltree.js +++ b/browser/devtools/performance/test/browser_perf-columns-memory-calltree.js @@ -4,7 +4,7 @@ /** * Tests that the memory call tree view renders the correct columns. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, $$, DetailsView, MemoryCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-compatibility-01.js b/browser/devtools/performance/test/browser_perf-compatibility-01.js index 32b44e5bd0d..88549fa7fe9 100644 --- a/browser/devtools/performance/test/browser_perf-compatibility-01.js +++ b/browser/devtools/performance/test/browser_perf-compatibility-01.js @@ -7,7 +7,7 @@ let WAIT_TIME = 100; -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL, { TEST_MOCK_MEMORY_ACTOR: true, TEST_MOCK_TIMELINE_ACTOR: true diff --git a/browser/devtools/performance/test/browser_perf-compatibility-03.js b/browser/devtools/performance/test/browser_perf-compatibility-03.js index 064268c5f5a..6a14ace4195 100644 --- a/browser/devtools/performance/test/browser_perf-compatibility-03.js +++ b/browser/devtools/performance/test/browser_perf-compatibility-03.js @@ -7,7 +7,7 @@ let WAIT_TIME = 100; -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL, { TEST_MOCK_MEMORY_ACTOR: true }); diff --git a/browser/devtools/performance/test/browser_perf-compatibility-05.js b/browser/devtools/performance/test/browser_perf-compatibility-05.js index 9135f532ced..724c00a4761 100644 --- a/browser/devtools/performance/test/browser_perf-compatibility-05.js +++ b/browser/devtools/performance/test/browser_perf-compatibility-05.js @@ -9,7 +9,7 @@ const WAIT_TIME = 1000; // ms -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { gFront: front, gTarget: target } = panel.panelWin; let connection = getPerformanceActorsConnection(target); diff --git a/browser/devtools/performance/test/browser_perf-compatibility-06.js b/browser/devtools/performance/test/browser_perf-compatibility-06.js index 78b518e7bf3..66039b991de 100644 --- a/browser/devtools/performance/test/browser_perf-compatibility-06.js +++ b/browser/devtools/performance/test/browser_perf-compatibility-06.js @@ -7,7 +7,7 @@ * `getBufferUsage()` values. */ -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL, { TEST_MOCK_PROFILER_CHECK_TIMER: 10, TEST_PROFILER_FILTER_STATUS: ["position", "totalSize", "generation"] diff --git a/browser/devtools/performance/test/browser_perf-compatibility-07.js b/browser/devtools/performance/test/browser_perf-compatibility-07.js index ba243000a2d..3a0a02e0e0c 100644 --- a/browser/devtools/performance/test/browser_perf-compatibility-07.js +++ b/browser/devtools/performance/test/browser_perf-compatibility-07.js @@ -5,7 +5,7 @@ * Tests that recording notices does not display any buffer * status on servers that do not support buffer statuses. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL, void 0, { TEST_MOCK_PROFILER_CHECK_TIMER: 10, TEST_PROFILER_FILTER_STATUS: ["position", "totalSize", "generation"] diff --git a/browser/devtools/performance/test/browser_perf-console-record-01.js b/browser/devtools/performance/test/browser_perf-console-record-01.js index 57524388a32..529273f5e1c 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-01.js +++ b/browser/devtools/performance/test/browser_perf-console-record-01.js @@ -9,7 +9,7 @@ let { getPerformanceActorsConnection } = devtools.require("devtools/performance/front"); let WAIT_TIME = 10; -function spawnTest () { +function* spawnTest() { let profilerConnected = waitForProfilerConnection(); let { target, toolbox, console } = yield initConsole(SIMPLE_URL); yield profilerConnected; diff --git a/browser/devtools/performance/test/browser_perf-console-record-02.js b/browser/devtools/performance/test/browser_perf-console-record-02.js index f5693f06868..3f04703c5fa 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-02.js +++ b/browser/devtools/performance/test/browser_perf-console-record-02.js @@ -9,7 +9,7 @@ let { getPerformanceActorsConnection } = devtools.require("devtools/performance/front"); let WAIT_TIME = 10; -function spawnTest () { +function* spawnTest() { let profilerConnected = waitForProfilerConnection(); let { target, toolbox, console } = yield initConsole(SIMPLE_URL); yield profilerConnected; diff --git a/browser/devtools/performance/test/browser_perf-console-record-03.js b/browser/devtools/performance/test/browser_perf-console-record-03.js index 00686d53350..965630052cd 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-03.js +++ b/browser/devtools/performance/test/browser_perf-console-record-03.js @@ -9,7 +9,7 @@ let { getPerformanceActorsConnection } = devtools.require("devtools/performance/front"); let WAIT_TIME = 10; -function spawnTest () { +function* spawnTest() { let profilerConnected = waitForProfilerConnection(); let { target, toolbox, console } = yield initConsole(SIMPLE_URL); yield profilerConnected; diff --git a/browser/devtools/performance/test/browser_perf-console-record-04.js b/browser/devtools/performance/test/browser_perf-console-record-04.js index 01958871f82..3436bae4c4d 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-04.js +++ b/browser/devtools/performance/test/browser_perf-console-record-04.js @@ -6,7 +6,7 @@ * after being opened. */ -function spawnTest () { +function* spawnTest() { loadFrameScripts(); let { target, toolbox, panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, gFront, PerformanceController, OverviewView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-console-record-05.js b/browser/devtools/performance/test/browser_perf-console-record-05.js index 07fb5009a65..5abcdda3c36 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-05.js +++ b/browser/devtools/performance/test/browser_perf-console-record-05.js @@ -6,7 +6,7 @@ * in the recording list. */ -function spawnTest () { +function* spawnTest() { loadFrameScripts(); let { target, toolbox, panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, gFront, PerformanceController, OverviewView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-console-record-06.js b/browser/devtools/performance/test/browser_perf-console-record-06.js index d3e3254d7a3..263a16e2852 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-06.js +++ b/browser/devtools/performance/test/browser_perf-console-record-06.js @@ -5,7 +5,7 @@ * Tests that console recordings can overlap (not completely nested). */ -function spawnTest () { +function* spawnTest() { loadFrameScripts(); let { target, toolbox, panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, gFront, PerformanceController, OverviewView, RecordingsView, WaterfallView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-console-record-07.js b/browser/devtools/performance/test/browser_perf-console-record-07.js index 9e210237c55..9e04cf826cc 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-07.js +++ b/browser/devtools/performance/test/browser_perf-console-record-07.js @@ -7,7 +7,7 @@ * match any pending recordings does nothing. */ -function spawnTest () { +function* spawnTest() { loadFrameScripts(); let { target, toolbox, panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, gFront, PerformanceController, OverviewView, RecordingsView, WaterfallView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-console-record-08.js b/browser/devtools/performance/test/browser_perf-console-record-08.js index 255cdf5a38e..438a145f7b4 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-08.js +++ b/browser/devtools/performance/test/browser_perf-console-record-08.js @@ -21,7 +21,7 @@ function testRecordings (win, expected) { }); } -function spawnTest () { +function* spawnTest() { loadFrameScripts(); let { target, toolbox, panel } = yield initPerformance(SIMPLE_URL); let win = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-console-record-09.js b/browser/devtools/performance/test/browser_perf-console-record-09.js index ece63f95a9c..35a4522d114 100644 --- a/browser/devtools/performance/test/browser_perf-console-record-09.js +++ b/browser/devtools/performance/test/browser_perf-console-record-09.js @@ -6,7 +6,7 @@ * an in-progress console profile. */ -function spawnTest () { +function* spawnTest() { loadFrameScripts(); let { target, toolbox, panel } = yield initPerformance(SIMPLE_URL); let win = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-data-massaging-01.js b/browser/devtools/performance/test/browser_perf-data-massaging-01.js index 96a712b91a0..a568d06567f 100644 --- a/browser/devtools/performance/test/browser_perf-data-massaging-01.js +++ b/browser/devtools/performance/test/browser_perf-data-massaging-01.js @@ -8,7 +8,7 @@ const WAIT_TIME = 1000; // ms -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let front = panel.panelWin.gFront; diff --git a/browser/devtools/performance/test/browser_perf-data-samples.js b/browser/devtools/performance/test/browser_perf-data-samples.js index f6d8fda5b53..49dc52901ea 100644 --- a/browser/devtools/performance/test/browser_perf-data-samples.js +++ b/browser/devtools/performance/test/browser_perf-data-samples.js @@ -9,7 +9,7 @@ const WAIT_TIME = 1000; // ms -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let front = panel.panelWin.gFront; diff --git a/browser/devtools/performance/test/browser_perf-details-01.js b/browser/devtools/performance/test/browser_perf-details-01.js index 78d2c64e759..83880b51fe1 100644 --- a/browser/devtools/performance/test/browser_perf-details-01.js +++ b/browser/devtools/performance/test/browser_perf-details-01.js @@ -4,7 +4,7 @@ /** * Tests that the details view toggles subviews. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, DetailsView, document: doc } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-02.js b/browser/devtools/performance/test/browser_perf-details-02.js index 9e677d0f659..bb91f90a1c9 100644 --- a/browser/devtools/performance/test/browser_perf-details-02.js +++ b/browser/devtools/performance/test/browser_perf-details-02.js @@ -4,7 +4,7 @@ /** * Tests that the details view utility functions work as advertised. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView } = panel.panelWin; let { WaterfallView, JsCallTreeView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-03.js b/browser/devtools/performance/test/browser_perf-details-03.js index 8e54aefd2d1..dd1ff3ceb4f 100644 --- a/browser/devtools/performance/test/browser_perf-details-03.js +++ b/browser/devtools/performance/test/browser_perf-details-03.js @@ -6,7 +6,7 @@ * have memory data (withMemory: false), and that when a memory panel is selected, * switching to a panel that does not have memory goes to a default panel instead. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, OverviewView, DetailsView } = panel.panelWin; let { $, RecordingsView, WaterfallView, MemoryCallTreeView, MemoryFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-04.js b/browser/devtools/performance/test/browser_perf-details-04.js index c919f41dec0..f5af138a52e 100644 --- a/browser/devtools/performance/test/browser_perf-details-04.js +++ b/browser/devtools/performance/test/browser_perf-details-04.js @@ -5,7 +5,7 @@ * Tests that the details view hides the toolbar buttons when a recording * doesn't exist or is in progress. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, $$, PerformanceController, RecordingsView, WaterfallView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-05.js b/browser/devtools/performance/test/browser_perf-details-05.js index 2a2ecd54a30..ccd3979c570 100644 --- a/browser/devtools/performance/test/browser_perf-details-05.js +++ b/browser/devtools/performance/test/browser_perf-details-05.js @@ -4,7 +4,7 @@ /** * Tests that the details view utility functions work as advertised. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView } = panel.panelWin; let { PerformanceController, WaterfallView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-06.js b/browser/devtools/performance/test/browser_perf-details-06.js index 0a33bb2aa1e..258bd1366fb 100644 --- a/browser/devtools/performance/test/browser_perf-details-06.js +++ b/browser/devtools/performance/test/browser_perf-details-06.js @@ -4,7 +4,7 @@ /** * Tests that the views with `shouldUpdateWhileMouseIsActive` works as intended. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, OverviewView, DetailsView, WaterfallView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-calltree-render.js b/browser/devtools/performance/test/browser_perf-details-calltree-render.js index cd5d86a0a6b..5999be07e0d 100644 --- a/browser/devtools/performance/test/browser_perf-details-calltree-render.js +++ b/browser/devtools/performance/test/browser_perf-details-calltree-render.js @@ -4,7 +4,7 @@ /** * Tests that the call tree view renders content after recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-flamegraph-render.js b/browser/devtools/performance/test/browser_perf-details-flamegraph-render.js index 9067af65f50..4efde98c829 100644 --- a/browser/devtools/performance/test/browser_perf-details-flamegraph-render.js +++ b/browser/devtools/performance/test/browser_perf-details-flamegraph-render.js @@ -4,7 +4,7 @@ /** * Tests that the flamegraph view renders content after recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-memory-calltree-render.js b/browser/devtools/performance/test/browser_perf-details-memory-calltree-render.js index 20af219cfd1..78d7ea4d355 100644 --- a/browser/devtools/performance/test/browser_perf-details-memory-calltree-render.js +++ b/browser/devtools/performance/test/browser_perf-details-memory-calltree-render.js @@ -4,7 +4,7 @@ /** * Tests that the memory call tree view renders content after recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, MemoryCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-memory-flamegraph-render.js b/browser/devtools/performance/test/browser_perf-details-memory-flamegraph-render.js index ca79d7cc366..fafac98b3d1 100644 --- a/browser/devtools/performance/test/browser_perf-details-memory-flamegraph-render.js +++ b/browser/devtools/performance/test/browser_perf-details-memory-flamegraph-render.js @@ -4,7 +4,7 @@ /** * Tests that the memory flamegraph view renders content after recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, MemoryFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-details-waterfall-render.js b/browser/devtools/performance/test/browser_perf-details-waterfall-render.js index 133b7d89545..04707c84a1f 100644 --- a/browser/devtools/performance/test/browser_perf-details-waterfall-render.js +++ b/browser/devtools/performance/test/browser_perf-details-waterfall-render.js @@ -4,7 +4,7 @@ /** * Tests that the waterfall view renders content after recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, DetailsView, WaterfallView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-events-calltree.js b/browser/devtools/performance/test/browser_perf-events-calltree.js index ed6c38ce17e..ee5f4c7a39d 100644 --- a/browser/devtools/performance/test/browser_perf-events-calltree.js +++ b/browser/devtools/performance/test/browser_perf-events-calltree.js @@ -7,7 +7,7 @@ const { ThreadNode } = devtools.require("devtools/performance/tree-model"); const RecordingUtils = devtools.require("devtools/performance/recording-utils") -function spawnTest () { +function* spawnTest() { let focus = 0; let focusEvent = () => focus++; diff --git a/browser/devtools/performance/test/browser_perf-front-01.js b/browser/devtools/performance/test/browser_perf-front-01.js index 5509471b88e..dcc2ec7869d 100644 --- a/browser/devtools/performance/test/browser_perf-front-01.js +++ b/browser/devtools/performance/test/browser_perf-front-01.js @@ -7,7 +7,7 @@ let WAIT_TIME = 1000; -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL); let recording = yield front.startRecording({ diff --git a/browser/devtools/performance/test/browser_perf-front-02.js b/browser/devtools/performance/test/browser_perf-front-02.js index c8547522635..def219ecd29 100644 --- a/browser/devtools/performance/test/browser_perf-front-02.js +++ b/browser/devtools/performance/test/browser_perf-front-02.js @@ -8,7 +8,7 @@ let WAIT_TIME = 1000; -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL); let config = { withMarkers: true, withMemory: true, withTicks: true }; diff --git a/browser/devtools/performance/test/browser_perf-front-basic-profiler-01.js b/browser/devtools/performance/test/browser_perf-front-basic-profiler-01.js index fc9850734c6..abd1994ed83 100644 --- a/browser/devtools/performance/test/browser_perf-front-basic-profiler-01.js +++ b/browser/devtools/performance/test/browser_perf-front-basic-profiler-01.js @@ -7,7 +7,7 @@ let WAIT_TIME = 1000; -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL); let startModel = yield front.startRecording(); diff --git a/browser/devtools/performance/test/browser_perf-front-basic-timeline-01.js b/browser/devtools/performance/test/browser_perf-front-basic-timeline-01.js index 08f6a444a1a..eb85fa884ca 100644 --- a/browser/devtools/performance/test/browser_perf-front-basic-timeline-01.js +++ b/browser/devtools/performance/test/browser_perf-front-basic-timeline-01.js @@ -5,7 +5,7 @@ * Test basic functionality of PerformanceFront, retrieving timeline data. */ -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL); let lastMemoryDelta = 0; diff --git a/browser/devtools/performance/test/browser_perf-highlighted.js b/browser/devtools/performance/test/browser_perf-highlighted.js index f4dcfc515a5..7a36081c3ed 100644 --- a/browser/devtools/performance/test/browser_perf-highlighted.js +++ b/browser/devtools/performance/test/browser_perf-highlighted.js @@ -8,7 +8,7 @@ let { getPerformanceActorsConnection } = devtools.require("devtools/performance/front"); -function spawnTest () { +function* spawnTest() { let profilerConnected = waitForProfilerConnection(); let { target, toolbox, console } = yield initConsole(SIMPLE_URL); yield profilerConnected; diff --git a/browser/devtools/performance/test/browser_perf-jit-view-01.js b/browser/devtools/performance/test/browser_perf-jit-view-01.js index 2792839605e..02f69ded426 100644 --- a/browser/devtools/performance/test/browser_perf-jit-view-01.js +++ b/browser/devtools/performance/test/browser_perf-jit-view-01.js @@ -10,7 +10,7 @@ const RecordingUtils = devtools.require("devtools/performance/recording-utils"); Services.prefs.setBoolPref(INVERT_PREF, false); -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, $$, window, PerformanceController } = panel.panelWin; let { OverviewView, DetailsView, JITOptimizationsView, JsCallTreeView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-jit-view-02.js b/browser/devtools/performance/test/browser_perf-jit-view-02.js index 68fdf47cb83..7b0edd95b46 100644 --- a/browser/devtools/performance/test/browser_perf-jit-view-02.js +++ b/browser/devtools/performance/test/browser_perf-jit-view-02.js @@ -12,7 +12,7 @@ const RecordingUtils = devtools.require("devtools/performance/recording-utils"); Services.prefs.setBoolPref(INVERT_PREF, false); Services.prefs.setBoolPref(PLATFORM_DATA_PREF, false); -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, $$, window, PerformanceController } = panel.panelWin; let { OverviewView, DetailsView, JITOptimizationsView, JsCallTreeView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-01.js b/browser/devtools/performance/test/browser_perf-options-01.js index df0f1a5f23c..d6e4c63666a 100644 --- a/browser/devtools/performance/test/browser_perf-options-01.js +++ b/browser/devtools/performance/test/browser_perf-options-01.js @@ -4,7 +4,7 @@ /** * Tests that toggling preferences before there are any recordings does not throw. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-02.js b/browser/devtools/performance/test/browser_perf-options-02.js index 8f2db1eceec..e2327c24f9e 100644 --- a/browser/devtools/performance/test/browser_perf-options-02.js +++ b/browser/devtools/performance/test/browser_perf-options-02.js @@ -4,7 +4,7 @@ /** * Tests that toggling preferences during a recording does not throw. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-03.js b/browser/devtools/performance/test/browser_perf-options-03.js index 394ea2dd406..8a6281948c9 100644 --- a/browser/devtools/performance/test/browser_perf-options-03.js +++ b/browser/devtools/performance/test/browser_perf-options-03.js @@ -7,7 +7,7 @@ Services.prefs.setBoolPref(EXPERIMENTAL_PREF, false); -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, PerformanceController } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-allocations.js b/browser/devtools/performance/test/browser_perf-options-allocations.js index f2f13bb6e0d..4cb12a86e38 100644 --- a/browser/devtools/performance/test/browser_perf-options-allocations.js +++ b/browser/devtools/performance/test/browser_perf-options-allocations.js @@ -5,7 +5,7 @@ /** * Tests that setting the `devtools.performance.memory.` prefs propagate to the memory actor. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, $, gFront } = panel.panelWin; Services.prefs.setBoolPref(MEMORY_PREF, true); diff --git a/browser/devtools/performance/test/browser_perf-options-enable-framerate.js b/browser/devtools/performance/test/browser_perf-options-enable-framerate.js index 6fa1d377571..aef78fc87f7 100644 --- a/browser/devtools/performance/test/browser_perf-options-enable-framerate.js +++ b/browser/devtools/performance/test/browser_perf-options-enable-framerate.js @@ -5,7 +5,7 @@ * Tests that `enable-framerate` toggles the visibility of the fps graph, * as well as enabling ticks data on the PerformanceFront. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, $ } = panel.panelWin; Services.prefs.setBoolPref(FRAMERATE_PREF, false); diff --git a/browser/devtools/performance/test/browser_perf-options-enable-memory-01.js b/browser/devtools/performance/test/browser_perf-options-enable-memory-01.js index ed2067ee8a1..17802a51ed2 100644 --- a/browser/devtools/performance/test/browser_perf-options-enable-memory-01.js +++ b/browser/devtools/performance/test/browser_perf-options-enable-memory-01.js @@ -5,7 +5,7 @@ * Tests that `enable-memory` toggles the visibility of the memory graph, * as well as enabling memory data on the PerformanceFront. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, $ } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-enable-memory-02.js b/browser/devtools/performance/test/browser_perf-options-enable-memory-02.js index 5bf36e64ca1..dd287dac91f 100644 --- a/browser/devtools/performance/test/browser_perf-options-enable-memory-02.js +++ b/browser/devtools/performance/test/browser_perf-options-enable-memory-02.js @@ -5,7 +5,7 @@ * Tests that toggling `enable-memory` during a recording doesn't change that * recording's state and does not break. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, $ } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-01.js b/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-01.js index ca89287348e..ff5a875f69d 100644 --- a/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-01.js +++ b/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-01.js @@ -4,7 +4,7 @@ /** * Tests that the js flamegraphs get rerendered when toggling `flatten-tree-recursion` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, DetailsView, JsFlameGraphView, FlameGraphUtils } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-02.js b/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-02.js index 310e8a51ad8..46a846e3e7f 100644 --- a/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-02.js +++ b/browser/devtools/performance/test/browser_perf-options-flatten-tree-recursion-02.js @@ -4,7 +4,7 @@ /** * Tests that the memory flamegraphs get rerendered when toggling `flatten-tree-recursion` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, DetailsView, MemoryFlameGraphView, RecordingUtils, FlameGraphUtils } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-invert-call-tree-01.js b/browser/devtools/performance/test/browser_perf-options-invert-call-tree-01.js index c75d5490f81..3fca0f8e817 100644 --- a/browser/devtools/performance/test/browser_perf-options-invert-call-tree-01.js +++ b/browser/devtools/performance/test/browser_perf-options-invert-call-tree-01.js @@ -4,7 +4,7 @@ /** * Tests that the js call tree views get rerendered when toggling `invert-call-tree` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-invert-call-tree-02.js b/browser/devtools/performance/test/browser_perf-options-invert-call-tree-02.js index f734b7e7ee7..e7d8ac2d803 100644 --- a/browser/devtools/performance/test/browser_perf-options-invert-call-tree-02.js +++ b/browser/devtools/performance/test/browser_perf-options-invert-call-tree-02.js @@ -4,7 +4,7 @@ /** * Tests that the memory call tree views get rerendered when toggling `invert-call-tree` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, MemoryCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-01.js b/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-01.js index e4064b82969..ff68c6451cf 100644 --- a/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-01.js +++ b/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-01.js @@ -4,7 +4,7 @@ /** * Tests that the js Flamegraphs gets rerendered when toggling `invert-flame-graph` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-02.js b/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-02.js index 8254e73d649..12a5a3b4101 100644 --- a/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-02.js +++ b/browser/devtools/performance/test/browser_perf-options-invert-flame-graph-02.js @@ -4,7 +4,7 @@ /** * Tests that the memory Flamegraphs gets rerendered when toggling `invert-flame-graph` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, MemoryFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-profiler.js b/browser/devtools/performance/test/browser_perf-options-profiler.js index 48d39685d25..7f6845c620f 100644 --- a/browser/devtools/performance/test/browser_perf-options-profiler.js +++ b/browser/devtools/performance/test/browser_perf-options-profiler.js @@ -5,7 +5,7 @@ /** * Tests that setting the `devtools.performance.profiler.` prefs propagate to the profiler actor. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { gFront } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-01.js b/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-01.js index bcb016976a0..e8124223aaf 100644 --- a/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-01.js +++ b/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-01.js @@ -4,7 +4,7 @@ /** * Tests that the js flamegraphs get rerendered when toggling `show-idle-blocks` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-02.js b/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-02.js index 94853f291cc..01962794124 100644 --- a/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-02.js +++ b/browser/devtools/performance/test/browser_perf-options-show-idle-blocks-02.js @@ -4,7 +4,7 @@ /** * Tests that the memory flamegraphs get rerendered when toggling `show-idle-blocks` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, MemoryFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-show-platform-data-01.js b/browser/devtools/performance/test/browser_perf-options-show-platform-data-01.js index efaa9cbc284..251a8b40bc3 100644 --- a/browser/devtools/performance/test/browser_perf-options-show-platform-data-01.js +++ b/browser/devtools/performance/test/browser_perf-options-show-platform-data-01.js @@ -4,7 +4,7 @@ /** * Tests that the js call tree views get rerendered when toggling `show-platform-data` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsCallTreeView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-options-show-platform-data-02.js b/browser/devtools/performance/test/browser_perf-options-show-platform-data-02.js index 2c4564f97ea..efa2ad8ba7b 100644 --- a/browser/devtools/performance/test/browser_perf-options-show-platform-data-02.js +++ b/browser/devtools/performance/test/browser_perf-options-show-platform-data-02.js @@ -4,7 +4,7 @@ /** * Tests that the js flamegraphs get rerendered when toggling `show-platform-data` */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, DetailsView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-render-01.js b/browser/devtools/performance/test/browser_perf-overview-render-01.js index 81a37f0a4a9..f0bf44ba056 100644 --- a/browser/devtools/performance/test/browser_perf-overview-render-01.js +++ b/browser/devtools/performance/test/browser_perf-overview-render-01.js @@ -4,7 +4,7 @@ /** * Tests that the overview continuously renders content when recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, OverviewView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-render-02.js b/browser/devtools/performance/test/browser_perf-overview-render-02.js index 602c015aace..6731c7b92bb 100644 --- a/browser/devtools/performance/test/browser_perf-overview-render-02.js +++ b/browser/devtools/performance/test/browser_perf-overview-render-02.js @@ -5,7 +5,7 @@ * Tests that the overview graphs cannot be selected during recording * and that they're cleared upon rerecording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, OverviewView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-render-03.js b/browser/devtools/performance/test/browser_perf-overview-render-03.js index f1366ec3c97..c36f3a6b58b 100644 --- a/browser/devtools/performance/test/browser_perf-overview-render-03.js +++ b/browser/devtools/performance/test/browser_perf-overview-render-03.js @@ -4,7 +4,7 @@ /** * Tests that the overview graphs share the exact same width and scaling. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, OverviewView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-render-04.js b/browser/devtools/performance/test/browser_perf-overview-render-04.js index fd4b967b41e..8afcd44be99 100644 --- a/browser/devtools/performance/test/browser_perf-overview-render-04.js +++ b/browser/devtools/performance/test/browser_perf-overview-render-04.js @@ -5,7 +5,7 @@ * Tests that the overview graphs do not render when realtime rendering is off * due to lack of e10s. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, PerformanceController, OverviewView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-selection-01.js b/browser/devtools/performance/test/browser_perf-overview-selection-01.js index 72b3ce660e2..16ba93e85d1 100644 --- a/browser/devtools/performance/test/browser_perf-overview-selection-01.js +++ b/browser/devtools/performance/test/browser_perf-overview-selection-01.js @@ -4,7 +4,7 @@ /** * Tests that events are fired from OverviewView from selection manipulation. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, OverviewView } = panel.panelWin; let startTime, endTime, params, _; diff --git a/browser/devtools/performance/test/browser_perf-overview-selection-02.js b/browser/devtools/performance/test/browser_perf-overview-selection-02.js index 85a68062543..3f5541f4740 100644 --- a/browser/devtools/performance/test/browser_perf-overview-selection-02.js +++ b/browser/devtools/performance/test/browser_perf-overview-selection-02.js @@ -4,7 +4,7 @@ /** * Tests that the graphs' selection is correctly disabled or enabled. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, OverviewView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-selection-03.js b/browser/devtools/performance/test/browser_perf-overview-selection-03.js index e8892a6946d..283c1e96bf6 100644 --- a/browser/devtools/performance/test/browser_perf-overview-selection-03.js +++ b/browser/devtools/performance/test/browser_perf-overview-selection-03.js @@ -4,7 +4,7 @@ /** * Tests that the graphs' selections are linked. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, OverviewView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-overview-time-interval.js b/browser/devtools/performance/test/browser_perf-overview-time-interval.js index f2e53a479cc..00d5bc9d267 100644 --- a/browser/devtools/performance/test/browser_perf-overview-time-interval.js +++ b/browser/devtools/performance/test/browser_perf-overview-time-interval.js @@ -5,7 +5,7 @@ * Tests that the `setTimeInterval` and `getTimeInterval` functions * work properly. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, OverviewView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-range-changed-render.js b/browser/devtools/performance/test/browser_perf-range-changed-render.js index 1b57dfd03a4..19fa107cc3f 100644 --- a/browser/devtools/performance/test/browser_perf-range-changed-render.js +++ b/browser/devtools/performance/test/browser_perf-range-changed-render.js @@ -4,7 +4,7 @@ /** * Tests that the detail views are rerendered after the range changes. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController, OverviewView, DetailsView } = panel.panelWin; let { WaterfallView, JsCallTreeView, JsFlameGraphView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-recording-model-01.js b/browser/devtools/performance/test/browser_perf-recording-model-01.js index 16529905a92..fe3e7a30f59 100644 --- a/browser/devtools/performance/test/browser_perf-recording-model-01.js +++ b/browser/devtools/performance/test/browser_perf-recording-model-01.js @@ -6,7 +6,7 @@ * completed, and rec data. */ -function spawnTest () { +function* spawnTest() { let { target, panel, toolbox } = yield initPerformance(SIMPLE_URL); let { EVENTS, gFront: front, PerformanceController } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-recording-model-02.js b/browser/devtools/performance/test/browser_perf-recording-model-02.js index 1ff0e405586..237aefb39ac 100644 --- a/browser/devtools/performance/test/browser_perf-recording-model-02.js +++ b/browser/devtools/performance/test/browser_perf-recording-model-02.js @@ -7,7 +7,7 @@ let BUFFER_SIZE = 20000; -function spawnTest () { +function* spawnTest() { let { target, front } = yield initBackend(SIMPLE_URL, { TEST_MOCK_PROFILER_CHECK_TIMER: 10 }); let config = { bufferSize: BUFFER_SIZE }; diff --git a/browser/devtools/performance/test/browser_perf-recording-notices-01.js b/browser/devtools/performance/test/browser_perf-recording-notices-01.js index 2cd5ac60b5a..5db7e37128e 100644 --- a/browser/devtools/performance/test/browser_perf-recording-notices-01.js +++ b/browser/devtools/performance/test/browser_perf-recording-notices-01.js @@ -5,7 +5,7 @@ * Tests that the recording notice panes are toggled in correct scenarios * for initialization and a single recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, PerformanceView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-recording-notices-02.js b/browser/devtools/performance/test/browser_perf-recording-notices-02.js index 63edeb2559e..3cf4069da33 100644 --- a/browser/devtools/performance/test/browser_perf-recording-notices-02.js +++ b/browser/devtools/performance/test/browser_perf-recording-notices-02.js @@ -5,7 +5,7 @@ * Tests that the recording notice panes are toggled when going between * a completed recording and an in-progress recording. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, PerformanceController, PerformanceView, RecordingsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-recording-notices-03.js b/browser/devtools/performance/test/browser_perf-recording-notices-03.js index 311a1cf0b5b..a3e52f135e9 100644 --- a/browser/devtools/performance/test/browser_perf-recording-notices-03.js +++ b/browser/devtools/performance/test/browser_perf-recording-notices-03.js @@ -6,7 +6,7 @@ * and can switch between different recordings with the correct buffer information * displayed. */ -function spawnTest () { +function* spawnTest() { loadFrameScripts(); // Keep it large, but still get to 1% relatively quick Services.prefs.setIntPref(PROFILER_BUFFER_SIZE_PREF, 1000000); diff --git a/browser/devtools/performance/test/browser_perf-recording-notices-04.js b/browser/devtools/performance/test/browser_perf-recording-notices-04.js index 0b9ba309623..3fbf41cd401 100644 --- a/browser/devtools/performance/test/browser_perf-recording-notices-04.js +++ b/browser/devtools/performance/test/browser_perf-recording-notices-04.js @@ -5,7 +5,7 @@ * Tests that when a recording overlaps the circular buffer, that * a class is assigned to the recording notices. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL, void 0, { TEST_MOCK_PROFILER_CHECK_TIMER: 10 }); let { EVENTS, $, PerformanceController, PerformanceView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-recording-notices-05.js b/browser/devtools/performance/test/browser_perf-recording-notices-05.js index 70a2276523c..46d21cf5d98 100644 --- a/browser/devtools/performance/test/browser_perf-recording-notices-05.js +++ b/browser/devtools/performance/test/browser_perf-recording-notices-05.js @@ -5,7 +5,7 @@ * Tests that when a recording overlaps the circular buffer, that * a class is assigned to the recording notices. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL, void 0, { TEST_MOCK_PROFILER_CHECK_TIMER: 10 }); let { EVENTS, $, PerformanceController, PerformanceView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-refresh.js b/browser/devtools/performance/test/browser_perf-refresh.js index 33076afcf33..345d9e096d3 100644 --- a/browser/devtools/performance/test/browser_perf-refresh.js +++ b/browser/devtools/performance/test/browser_perf-refresh.js @@ -4,7 +4,7 @@ /** * Rough test that the recording still continues after a refresh. */ -function spawnTest () { +function* spawnTest() { let { panel, target } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-shared-connection-02.js b/browser/devtools/performance/test/browser_perf-shared-connection-02.js index 7e2c9edc362..9b987dafcab 100644 --- a/browser/devtools/performance/test/browser_perf-shared-connection-02.js +++ b/browser/devtools/performance/test/browser_perf-shared-connection-02.js @@ -8,7 +8,7 @@ let gProfilerConnectionsOpened = 0; Services.obs.addObserver(profilerConnectionObserver, "performance-actors-connection-opened", false); -function spawnTest () { +function* spawnTest() { let { target, panel } = yield initPerformance(SIMPLE_URL); is(gProfilerConnectionsOpened, 1, diff --git a/browser/devtools/performance/test/browser_perf-shared-connection-03.js b/browser/devtools/performance/test/browser_perf-shared-connection-03.js index e0d0ddeb493..f975b15ef56 100644 --- a/browser/devtools/performance/test/browser_perf-shared-connection-03.js +++ b/browser/devtools/performance/test/browser_perf-shared-connection-03.js @@ -5,7 +5,7 @@ * Tests if the shared PerformanceActorsConnection can properly send requests. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let front = panel.panelWin.gFront; diff --git a/browser/devtools/performance/test/browser_perf-states.js b/browser/devtools/performance/test/browser_perf-states.js index 4bbcf2acd10..ec602dff497 100644 --- a/browser/devtools/performance/test/browser_perf-states.js +++ b/browser/devtools/performance/test/browser_perf-states.js @@ -4,7 +4,7 @@ /** * Tests that view states and lazy component intialization works. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceView, OverviewView, DetailsView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-theme-toggle-01.js b/browser/devtools/performance/test/browser_perf-theme-toggle-01.js index 46a267bf3a6..e440644e883 100644 --- a/browser/devtools/performance/test/browser_perf-theme-toggle-01.js +++ b/browser/devtools/performance/test/browser_perf-theme-toggle-01.js @@ -12,7 +12,7 @@ const DARK_BG = "#14171a"; setTheme("dark"); Services.prefs.setBoolPref(MEMORY_PREF, false); -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, $, OverviewView, document: doc } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_perf-ui-recording.js b/browser/devtools/performance/test/browser_perf-ui-recording.js index 4513cd682c9..eaada1a926d 100644 --- a/browser/devtools/performance/test/browser_perf-ui-recording.js +++ b/browser/devtools/performance/test/browser_perf-ui-recording.js @@ -7,7 +7,7 @@ */ let WAIT_TIME = 10; -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { EVENTS, PerformanceController } = panel.panelWin; let front = panel.panelWin.gFront; diff --git a/browser/devtools/performance/test/browser_profiler_tree-abstract-01.js b/browser/devtools/performance/test/browser_profiler_tree-abstract-01.js index fbd8c381d62..c507b7746c2 100644 --- a/browser/devtools/performance/test/browser_profiler_tree-abstract-01.js +++ b/browser/devtools/performance/test/browser_profiler_tree-abstract-01.js @@ -9,7 +9,7 @@ let { AbstractTreeItem } = Cu.import("resource:///modules/devtools/AbstractTreeItem.jsm", {}); let { Heritage } = Cu.import("resource:///modules/devtools/ViewHelpers.jsm", {}); -function spawnTest () { +function* spawnTest() { let container = document.createElement("vbox"); gBrowser.selectedBrowser.parentNode.appendChild(container); diff --git a/browser/devtools/performance/test/browser_profiler_tree-abstract-02.js b/browser/devtools/performance/test/browser_profiler_tree-abstract-02.js index f31b208365c..fb2d5125f49 100644 --- a/browser/devtools/performance/test/browser_profiler_tree-abstract-02.js +++ b/browser/devtools/performance/test/browser_profiler_tree-abstract-02.js @@ -9,7 +9,7 @@ let { AbstractTreeItem } = Cu.import("resource:///modules/devtools/AbstractTreeItem.jsm", {}); let { Heritage } = Cu.import("resource:///modules/devtools/ViewHelpers.jsm", {}); -function spawnTest () { +function* spawnTest() { let container = document.createElement("vbox"); gBrowser.selectedBrowser.parentNode.appendChild(container); diff --git a/browser/devtools/performance/test/browser_profiler_tree-abstract-03.js b/browser/devtools/performance/test/browser_profiler_tree-abstract-03.js index 89c5c431109..7fc155852bb 100644 --- a/browser/devtools/performance/test/browser_profiler_tree-abstract-03.js +++ b/browser/devtools/performance/test/browser_profiler_tree-abstract-03.js @@ -9,7 +9,7 @@ let { AbstractTreeItem } = Cu.import("resource:///modules/devtools/AbstractTreeItem.jsm", {}); let { Heritage } = Cu.import("resource:///modules/devtools/ViewHelpers.jsm", {}); -function spawnTest () { +function* spawnTest() { let container = document.createElement("vbox"); gBrowser.selectedBrowser.parentNode.appendChild(container); diff --git a/browser/devtools/performance/test/browser_profiler_tree-abstract-04.js b/browser/devtools/performance/test/browser_profiler_tree-abstract-04.js index c3f0636c811..adf9725d61c 100644 --- a/browser/devtools/performance/test/browser_profiler_tree-abstract-04.js +++ b/browser/devtools/performance/test/browser_profiler_tree-abstract-04.js @@ -8,7 +8,7 @@ let { AbstractTreeItem } = Cu.import("resource:///modules/devtools/AbstractTreeItem.jsm", {}); let { Heritage } = Cu.import("resource:///modules/devtools/ViewHelpers.jsm", {}); -function spawnTest () { +function* spawnTest() { let container = document.createElement("vbox"); gBrowser.selectedBrowser.parentNode.appendChild(container); diff --git a/browser/devtools/performance/test/browser_profiler_tree-view-06.js b/browser/devtools/performance/test/browser_profiler_tree-view-06.js index 181f1b4efb5..e064593cf89 100644 --- a/browser/devtools/performance/test/browser_profiler_tree-view-06.js +++ b/browser/devtools/performance/test/browser_profiler_tree-view-06.js @@ -6,7 +6,7 @@ * correctly emits events when certain DOM nodes are clicked. */ -function spawnTest () { +function* spawnTest() { let { ThreadNode } = devtools.require("devtools/performance/tree-model"); let { CallView } = devtools.require("devtools/performance/tree-view"); diff --git a/browser/devtools/performance/test/browser_profiler_tree-view-07.js b/browser/devtools/performance/test/browser_profiler_tree-view-07.js index dcec4b0f39b..4b997361224 100644 --- a/browser/devtools/performance/test/browser_profiler_tree-view-07.js +++ b/browser/devtools/performance/test/browser_profiler_tree-view-07.js @@ -6,7 +6,7 @@ * has the correct 'root', 'parent', 'level' etc. accessors on child nodes. */ -function spawnTest () { +function* spawnTest() { let { ThreadNode } = devtools.require("devtools/performance/tree-model"); let { CallView } = devtools.require("devtools/performance/tree-view"); diff --git a/browser/devtools/performance/test/browser_timeline-blueprint.js b/browser/devtools/performance/test/browser_timeline-blueprint.js index 3d4ffa27ec5..7eed359e80b 100644 --- a/browser/devtools/performance/test/browser_timeline-blueprint.js +++ b/browser/devtools/performance/test/browser_timeline-blueprint.js @@ -5,7 +5,7 @@ * Tests if the timeline blueprint has a correct structure. */ -function spawnTest () { +function* spawnTest() { let { TIMELINE_BLUEPRINT } = devtools.require("devtools/performance/global"); ok(TIMELINE_BLUEPRINT, diff --git a/browser/devtools/performance/test/browser_timeline-filters.js b/browser/devtools/performance/test/browser_timeline-filters.js index 23892d2b076..d6a45211deb 100644 --- a/browser/devtools/performance/test/browser_timeline-filters.js +++ b/browser/devtools/performance/test/browser_timeline-filters.js @@ -5,7 +5,7 @@ * Tests markers filtering mechanism. */ -function spawnTest () { +function* spawnTest() { let { panel } = yield initPerformance(SIMPLE_URL); let { $, $$, PerformanceController, OverviewView, WaterfallView } = panel.panelWin; let { TimelineGraph } = devtools.require("devtools/performance/graphs"); diff --git a/browser/devtools/performance/test/browser_timeline-waterfall-background.js b/browser/devtools/performance/test/browser_timeline-waterfall-background.js index f0f29b2c686..4a447c195ac 100644 --- a/browser/devtools/performance/test/browser_timeline-waterfall-background.js +++ b/browser/devtools/performance/test/browser_timeline-waterfall-background.js @@ -6,7 +6,7 @@ * the container bounds. */ -function spawnTest () { +function* spawnTest() { let { target, panel } = yield initPerformance(SIMPLE_URL); let { $, EVENTS, PerformanceController, OverviewView, DetailsView, WaterfallView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_timeline-waterfall-generic.js b/browser/devtools/performance/test/browser_timeline-waterfall-generic.js index c279be915e0..03b73d8d700 100644 --- a/browser/devtools/performance/test/browser_timeline-waterfall-generic.js +++ b/browser/devtools/performance/test/browser_timeline-waterfall-generic.js @@ -5,7 +5,7 @@ * Tests if the waterfall is properly built after finishing a recording. */ -function spawnTest () { +function* spawnTest() { let { target, panel } = yield initPerformance(SIMPLE_URL); let { $, $$, EVENTS, PerformanceController, OverviewView, WaterfallView } = panel.panelWin; diff --git a/browser/devtools/performance/test/browser_timeline-waterfall-sidebar.js b/browser/devtools/performance/test/browser_timeline-waterfall-sidebar.js index 2acb944f0c3..4f2f1e54f1d 100644 --- a/browser/devtools/performance/test/browser_timeline-waterfall-sidebar.js +++ b/browser/devtools/performance/test/browser_timeline-waterfall-sidebar.js @@ -5,7 +5,7 @@ * Tests if the sidebar is properly updated when a marker is selected. */ -function spawnTest () { +function* spawnTest() { let { target, panel } = yield initPerformance(SIMPLE_URL); let { $, $$, EVENTS, PerformanceController, OverviewView } = panel.panelWin; let { L10N, TIMELINE_BLUEPRINT } = devtools.require("devtools/performance/global"); diff --git a/browser/devtools/projecteditor/lib/project.js b/browser/devtools/projecteditor/lib/project.js index 283ba64b38b..5b62c6834f6 100644 --- a/browser/devtools/projecteditor/lib/project.js +++ b/browser/devtools/projecteditor/lib/project.js @@ -149,7 +149,7 @@ var Project = Class({ * A list of all file paths */ allPaths: function() { - return [path for (path of this.localStores.keys())]; + return [...this.localStores.keys()]; }, /** diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_contextmenu_02.js b/browser/devtools/projecteditor/test/browser_projecteditor_contextmenu_02.js index dd0a086b5ef..ee413767b52 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_contextmenu_02.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_contextmenu_02.js @@ -47,14 +47,14 @@ add_task(function*() { is (cmdPaste.getAttribute("disabled"), "", "cmdPaste is enabled"); }); -function openContextMenuForEditor(editor, contextMenu) { +function* openContextMenuForEditor(editor, contextMenu) { let editorDoc = editor.editor.container.contentDocument; let shown = onPopupShow(contextMenu); EventUtils.synthesizeMouse(editorDoc.body, 2, 2, {type: "contextmenu", button: 2}, editorDoc.defaultView); yield shown; } -function closeContextMenuForEditor(editor, contextMenu) { +function* closeContextMenuForEditor(editor, contextMenu) { let editorDoc = editor.editor.container.contentDocument; let hidden = onPopupHidden(contextMenu); contextMenu.hidePopup(); diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_delete_file.js b/browser/devtools/projecteditor/test/browser_projecteditor_delete_file.js index e4212314256..bece440d329 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_delete_file.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_delete_file.js @@ -28,7 +28,7 @@ function openContextMenuOn(node) { ); } -function testDeleteOnRoot(projecteditor, container) { +function* testDeleteOnRoot(projecteditor, container) { let popup = projecteditor.contextMenuPopup; let oncePopupShown = onPopupShow(popup); openContextMenuOn(container.label); diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_editing_01.js b/browser/devtools/projecteditor/test/browser_projecteditor_editing_01.js index a0433197151..9f903539404 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_editing_01.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_editing_01.js @@ -31,7 +31,7 @@ add_task(function*() { } }); -function testEditFile(projecteditor, filePath, newData) { +function* testEditFile(projecteditor, filePath, newData) { info ("Testing file editing for: " + filePath); let initialData = yield getFileData(filePath); diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_editors_image.js b/browser/devtools/projecteditor/test/browser_projecteditor_editors_image.js index 62592d16c00..a04352c36da 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_editors_image.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_editors_image.js @@ -46,7 +46,7 @@ add_task(function*() { } }); -function testEditor(projecteditor, filePath) { +function* testEditor(projecteditor, filePath) { info ("Testing file editing for: " + filePath); let editor = projecteditor.currentEditor; diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_external_change.js b/browser/devtools/projecteditor/test/browser_projecteditor_external_change.js index a6ff18fd4f0..28657889a61 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_external_change.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_external_change.js @@ -26,7 +26,7 @@ add_task(function*() { } }); -function testChangeUnsavedFileExternally(projecteditor, filePath, newData) { +function* testChangeUnsavedFileExternally(projecteditor, filePath, newData) { info ("Testing file external changes for: " + filePath); let editor = projecteditor.currentEditor; @@ -57,7 +57,7 @@ function testChangeUnsavedFileExternally(projecteditor, filePath, newData) { info ("Finished checking saving for " + filePath); } -function testChangeFileExternally(projecteditor, filePath, newData) { +function* testChangeFileExternally(projecteditor, filePath, newData) { info ("Testing file external changes for: " + filePath); let editor = projecteditor.currentEditor; diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_menubar_02.js b/browser/devtools/projecteditor/test/browser_projecteditor_menubar_02.js index ad8448376f7..a8e0079129a 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_menubar_02.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_menubar_02.js @@ -109,7 +109,7 @@ add_task(function*() { is (cmdPaste.getAttribute("disabled"), "", "Edit menu item is enabled"); }); -function openAndCloseMenu(menu) { +function* openAndCloseMenu(menu) { let shown = onPopupShow(menu); EventUtils.synthesizeMouseAtCenter(menu, {}, menu.ownerDocument.defaultView); yield shown; diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js index 563c7477394..686c85301b9 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js @@ -32,7 +32,7 @@ add_task(function*() { } }); -function selectFileFirstLoad(projecteditor, resource) { +function* selectFileFirstLoad(projecteditor, resource) { ok (resource && resource.path, "A valid resource has been passed in for selection " + (resource && resource.path)); projecteditor.projectTree.selectResource(resource); let container = projecteditor.projectTree.getViewContainer(resource); @@ -63,7 +63,7 @@ function selectFileFirstLoad(projecteditor, resource) { is (editorLoaded, projecteditor.currentEditor, "Editor has been loaded for " + resource.path); } -function selectFileSubsequentLoad(projecteditor, resource) { +function* selectFileSubsequentLoad(projecteditor, resource) { ok (resource && resource.path, "A valid resource has been passed in for selection " + (resource && resource.path)); projecteditor.projectTree.selectResource(resource); diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js index 94b8dc17a95..8c7ac4a9af5 100644 --- a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js +++ b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js @@ -34,7 +34,7 @@ add_task(function*() { } }); -function selectAndRefocusFile(projecteditor, resource) { +function* selectAndRefocusFile(projecteditor, resource) { ok (resource && resource.path, "A valid resource has been passed in for selection " + (resource && resource.path)); projecteditor.projectTree.selectResource(resource); diff --git a/browser/devtools/projecteditor/test/helper_edits.js b/browser/devtools/projecteditor/test/helper_edits.js index de9bf5f7ae2..54991a285fa 100644 --- a/browser/devtools/projecteditor/test/helper_edits.js +++ b/browser/devtools/projecteditor/test/helper_edits.js @@ -37,7 +37,7 @@ let helperEditData = [ }, ]; -function selectFile (projecteditor, resource) { +function* selectFile(projecteditor, resource) { ok (resource && resource.path, "A valid resource has been passed in for selection " + (resource && resource.path)); projecteditor.projectTree.selectResource(resource); diff --git a/browser/devtools/shadereditor/panel.js b/browser/devtools/shadereditor/panel.js index cdc1b1d2905..2376a47034a 100644 --- a/browser/devtools/shadereditor/panel.js +++ b/browser/devtools/shadereditor/panel.js @@ -57,7 +57,9 @@ ShaderEditorPanel.prototype = { // DevToolPanel API - get target() this._toolbox.target, + get target() { + return this._toolbox.target; + }, destroy: function() { // Make sure this panel is not already destroyed. diff --git a/browser/devtools/shadereditor/shadereditor.js b/browser/devtools/shadereditor/shadereditor.js index 93019876eb2..8b6da4d2ca0 100644 --- a/browser/devtools/shadereditor/shadereditor.js +++ b/browser/devtools/shadereditor/shadereditor.js @@ -622,4 +622,4 @@ EventEmitter.decorate(this); /** * DOM query helper. */ -function $(selector, target = document) target.querySelector(selector); +let $ = (selector, target = document) => target.querySelector(selector); diff --git a/browser/devtools/shadereditor/test/browser_se_aaa_run_first_leaktest.js b/browser/devtools/shadereditor/test/browser_se_aaa_run_first_leaktest.js index 5e2f3bd191f..6efe510913e 100644 --- a/browser/devtools/shadereditor/test/browser_se_aaa_run_first_leaktest.js +++ b/browser/devtools/shadereditor/test/browser_se_aaa_run_first_leaktest.js @@ -6,7 +6,7 @@ * You can also use this initialization format as a template for other tests. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); ok(target, "Should have a target available."); diff --git a/browser/devtools/shadereditor/test/browser_se_bfcache.js b/browser/devtools/shadereditor/test/browser_se_bfcache.js index 7e8434c15cc..2b568e3fe64 100644 --- a/browser/devtools/shadereditor/test/browser_se_bfcache.js +++ b/browser/devtools/shadereditor/test/browser_se_bfcache.js @@ -4,7 +4,7 @@ /** * Tests if the shader editor works with bfcache. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, $, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_editors-contents.js b/browser/devtools/shadereditor/test/browser_se_editors-contents.js index b3f85f8c079..fdf2612ed9e 100644 --- a/browser/devtools/shadereditor/test/browser_se_editors-contents.js +++ b/browser/devtools/shadereditor/test/browser_se_editors-contents.js @@ -6,7 +6,7 @@ * becomes available. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, ShadersEditorsView, EVENTS } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js b/browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js index 6b6920090e3..439d6074fd8 100644 --- a/browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js +++ b/browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js @@ -6,7 +6,7 @@ * when there's a shader compilation error. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, EVENTS, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js b/browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js index 489849fd6b1..1ce31bebf49 100644 --- a/browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js +++ b/browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js @@ -6,7 +6,7 @@ * a shader compilation error. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, EVENTS, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_editors-lazy-init.js b/browser/devtools/shadereditor/test/browser_se_editors-lazy-init.js index 4f31ac6f572..b2d9d888e82 100644 --- a/browser/devtools/shadereditor/test/browser_se_editors-lazy-init.js +++ b/browser/devtools/shadereditor/test/browser_se_editors-lazy-init.js @@ -5,7 +5,7 @@ * Tests if source editors are lazily initialized. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_first-run.js b/browser/devtools/shadereditor/test/browser_se_first-run.js index bc02546dee8..33239bcbee9 100644 --- a/browser/devtools/shadereditor/test/browser_se_first-run.js +++ b/browser/devtools/shadereditor/test/browser_se_first-run.js @@ -5,7 +5,7 @@ * Tests if the shader editor shows the appropriate UI when opened. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, $ } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_navigation.js b/browser/devtools/shadereditor/test/browser_se_navigation.js index 5336744c9f0..f1adc3e76e3 100644 --- a/browser/devtools/shadereditor/test/browser_se_navigation.js +++ b/browser/devtools/shadereditor/test/browser_se_navigation.js @@ -5,7 +5,7 @@ * Tests target navigations are handled correctly in the UI. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, $, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_programs-blackbox-01.js b/browser/devtools/shadereditor/test/browser_se_programs-blackbox-01.js index 4cdfed7ccb3..4c8199c22f9 100644 --- a/browser/devtools/shadereditor/test/browser_se_programs-blackbox-01.js +++ b/browser/devtools/shadereditor/test/browser_se_programs-blackbox-01.js @@ -5,7 +5,7 @@ * Tests if blackboxing a program works properly. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, debuggee, panel } = yield initShaderEditor(MULTIPLE_CONTEXTS_URL); let { gFront, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_programs-blackbox-02.js b/browser/devtools/shadereditor/test/browser_se_programs-blackbox-02.js index c2fdd38ee39..391a272c854 100644 --- a/browser/devtools/shadereditor/test/browser_se_programs-blackbox-02.js +++ b/browser/devtools/shadereditor/test/browser_se_programs-blackbox-02.js @@ -6,7 +6,7 @@ * overlapping geometry. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, debuggee, panel } = yield initShaderEditor(BLENDED_GEOMETRY_CANVAS_URL); let { gFront, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_programs-cache.js b/browser/devtools/shadereditor/test/browser_se_programs-cache.js index fd0b676c1f4..5e5708e446a 100644 --- a/browser/devtools/shadereditor/test/browser_se_programs-cache.js +++ b/browser/devtools/shadereditor/test/browser_se_programs-cache.js @@ -5,7 +5,7 @@ * Tests that program and shader actors are cached in the frontend. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, debuggee, panel } = yield initShaderEditor(MULTIPLE_CONTEXTS_URL); let { EVENTS, gFront, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_programs-highlight-01.js b/browser/devtools/shadereditor/test/browser_se_programs-highlight-01.js index c19094b7a5f..863dc2672c6 100644 --- a/browser/devtools/shadereditor/test/browser_se_programs-highlight-01.js +++ b/browser/devtools/shadereditor/test/browser_se_programs-highlight-01.js @@ -5,7 +5,7 @@ * Tests if highlighting a program works properly. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(MULTIPLE_CONTEXTS_URL); let { gFront, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_programs-highlight-02.js b/browser/devtools/shadereditor/test/browser_se_programs-highlight-02.js index 3d55416f157..c6cbd796b63 100644 --- a/browser/devtools/shadereditor/test/browser_se_programs-highlight-02.js +++ b/browser/devtools/shadereditor/test/browser_se_programs-highlight-02.js @@ -6,7 +6,7 @@ * overlapping geometry. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, debuggee, panel } = yield initShaderEditor(BLENDED_GEOMETRY_CANVAS_URL); let { gFront, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_programs-list.js b/browser/devtools/shadereditor/test/browser_se_programs-list.js index 5900a8e3a16..fd96e6bc2a8 100644 --- a/browser/devtools/shadereditor/test/browser_se_programs-list.js +++ b/browser/devtools/shadereditor/test/browser_se_programs-list.js @@ -6,7 +6,7 @@ * shaders are linked. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(MULTIPLE_CONTEXTS_URL); let { gFront, EVENTS, L10N, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_shaders-edit-01.js b/browser/devtools/shadereditor/test/browser_se_shaders-edit-01.js index c7e932c98f9..0cb52ac1964 100644 --- a/browser/devtools/shadereditor/test/browser_se_shaders-edit-01.js +++ b/browser/devtools/shadereditor/test/browser_se_shaders-edit-01.js @@ -5,7 +5,7 @@ * Tests if editing a vertex and a fragment shader works properly. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, $, EVENTS, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js b/browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js index 272ed795966..0bb72c461b7 100644 --- a/browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js +++ b/browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js @@ -6,7 +6,7 @@ * gets malformed after being edited. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(SIMPLE_CANVAS_URL); let { gFront, EVENTS, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_se_shaders-edit-03.js b/browser/devtools/shadereditor/test/browser_se_shaders-edit-03.js index a73afed6c4e..05d0dcaa684 100644 --- a/browser/devtools/shadereditor/test/browser_se_shaders-edit-03.js +++ b/browser/devtools/shadereditor/test/browser_se_shaders-edit-03.js @@ -6,7 +6,7 @@ * their new source on the backend and reshow it in the frontend when required. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, panel } = yield initShaderEditor(MULTIPLE_CONTEXTS_URL); let { gFront, EVENTS, ShadersListView, ShadersEditorsView } = panel.panelWin; diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-01.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-01.js index e866c5346bb..242018a7682 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-01.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-01.js @@ -5,7 +5,7 @@ * Tests if a WebGL front can be created for a remote tab target. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); ok(target, "Should have a target available."); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-02.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-02.js index 836514aa4b9..addec87ca00 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-02.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-02.js @@ -6,7 +6,7 @@ * if the front wasn't set up first. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); once(front, "program-linked").then(() => { diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-03.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-03.js index 7d1274a859a..0381973ec72 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-03.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-03.js @@ -6,7 +6,7 @@ * after a target navigation. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); let navigated = once(target, "navigate"); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-04.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-04.js index 4814e9ce8da..88faa122888 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-04.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-04.js @@ -6,7 +6,7 @@ * and that the corresponding vertex and fragment actors can be retrieved. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js index b0635949f0f..96e445e01b2 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js @@ -6,7 +6,7 @@ * shader actors. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js index 34e61be93a2..aac9ed012aa 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js @@ -6,7 +6,7 @@ * program actors work as expected. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); @@ -44,7 +44,7 @@ function ifWebGLSupported() { ok(true, "The corner pixel colors are correct after unblackboxing."); function checkShaderSource(aMessage) { - return Task.spawn(function() { + return Task.spawn(function*() { let newVertexShader = yield programActor.getVertexShader(); let newFragmentShader = yield programActor.getFragmentShader(); is(vertexShader, newVertexShader, diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js index 5be39a22dd4..a7634de4435 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js @@ -5,7 +5,7 @@ * Tests that vertex and fragment shader sources can be changed. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js index 9cf1bb7267c..8025bc7039a 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js @@ -6,7 +6,7 @@ * changed in one shader. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js index 7274198c4de..2054140a61b 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js @@ -6,7 +6,7 @@ * defective shader source. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-10.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-10.js index 3d7b468c3a3..0d6f17d365f 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-10.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-10.js @@ -6,7 +6,7 @@ * target navigates. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: true }); @@ -25,7 +25,7 @@ function ifWebGLSupported() { finish(); function testHighlighting(programActor) { - return Task.spawn(function() { + return Task.spawn(function*() { yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true); yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true); ok(true, "The corner pixel colors are correct before highlighting."); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-11.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-11.js index 5bc2843d77f..28663057ed0 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-11.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-11.js @@ -6,7 +6,7 @@ * finalize method is called. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); let linked = once(front, "program-linked"); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js index cc40ed05049..f69d5e403fa 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js @@ -6,7 +6,7 @@ * regardless of the order in which they were compiled and attached. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SHADER_ORDER_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-13.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-13.js index 4efdcab35cc..f4730ba39fd 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-13.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-13.js @@ -5,7 +5,7 @@ * Tests if multiple WebGL contexts are correctly handled. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(MULTIPLE_CONTEXTS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-14.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-14.js index f0c4fa74dde..342bba382b3 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-14.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-14.js @@ -6,7 +6,7 @@ * changed in one shader of a page with multiple WebGL contexts. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(MULTIPLE_CONTEXTS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-15.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-15.js index 2a0c39b42c3..080fd0ecb07 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-15.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-15.js @@ -5,7 +5,7 @@ * Tests if program actors are cached when navigating in the bfcache. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: false }); @@ -53,7 +53,7 @@ function ifWebGLSupported() { finish(); function checkFirstCachedPrograms(programActor) { - return Task.spawn(function() { + return Task.spawn(function*() { let programs = yield front.getPrograms(); is(programs.length, 1, @@ -64,7 +64,7 @@ function ifWebGLSupported() { } function checkSecondCachedPrograms(oldProgramActor, newProgramActors) { - return Task.spawn(function() { + return Task.spawn(function*() { let programs = yield front.getPrograms(); is(programs.length, 2, @@ -82,7 +82,7 @@ function ifWebGLSupported() { } function checkHighlightingInTheFirstPage(programActor) { - return Task.spawn(function() { + return Task.spawn(function*() { yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true); yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true); ok(true, "The corner pixel colors are correct before highlighting."); @@ -100,7 +100,7 @@ function ifWebGLSupported() { } function checkHighlightingInTheSecondPage(firstProgramActor, secondProgramActor) { - return Task.spawn(function() { + return Task.spawn(function*() { yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 255, b: 0, a: 255 }, true, "#canvas1"); yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 0, g: 255, b: 255, a: 255 }, true, "#canvas2"); yield ensurePixelIs(front, { x: 127, y: 127 }, { r: 255, g: 255, b: 0, a: 255 }, true, "#canvas1"); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-16.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-16.js index 7c28537d226..78f32b118dd 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-16.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-16.js @@ -6,7 +6,7 @@ * removed from the bfcache. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(SIMPLE_CANVAS_URL); front.setup({ reload: false }); @@ -90,7 +90,7 @@ function ifWebGLSupported() { finish(); function checkHighlightingInTheFirstPage(programActor) { - return Task.spawn(function() { + return Task.spawn(function*() { yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true); yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true); ok(true, "The corner pixel colors are correct before highlighting."); @@ -108,7 +108,7 @@ function ifWebGLSupported() { } function checkHighlightingInTheSecondPage(firstProgramActor, secondProgramActor) { - return Task.spawn(function() { + return Task.spawn(function*() { yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 255, b: 0, a: 255 }, true, "#canvas1"); yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 0, g: 255, b: 255, a: 255 }, true, "#canvas2"); yield ensurePixelIs(front, { x: 127, y: 127 }, { r: 255, g: 255, b: 0, a: 255 }, true, "#canvas1"); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-17.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-17.js index b45bf34e85a..92b940d4ab0 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-17.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-17.js @@ -6,7 +6,7 @@ * overlapping geometry. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(OVERLAPPING_GEOMETRY_CANVAS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/shadereditor/test/browser_webgl-actor-test-18.js b/browser/devtools/shadereditor/test/browser_webgl-actor-test-18.js index 90ee5550b75..f6816717793 100644 --- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-18.js +++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-18.js @@ -5,7 +5,7 @@ * Tests the `getPixel` actor method works across threads. */ -function ifWebGLSupported() { +function* ifWebGLSupported() { let { target, front } = yield initBackend(MULTIPLE_CONTEXTS_URL); front.setup({ reload: true }); diff --git a/browser/devtools/sourceeditor/editor.js b/browser/devtools/sourceeditor/editor.js index d01a230032e..2d809639c0d 100644 --- a/browser/devtools/sourceeditor/editor.js +++ b/browser/devtools/sourceeditor/editor.js @@ -82,7 +82,7 @@ const CM_IFRAME = " body { margin: 0; overflow: hidden; }" + " .CodeMirror { width: 100%; height: 100% !important; line-height: 1.25 !important;}" + " " + -[ " " for (style of CM_STYLES) ].join("\n") + + CM_STYLES.map(style => "").join("\n") + " " + " " + ""; diff --git a/browser/devtools/storage/panel.js b/browser/devtools/storage/panel.js index e1885e7511d..f2becfadb7b 100644 --- a/browser/devtools/storage/panel.js +++ b/browser/devtools/storage/panel.js @@ -31,9 +31,13 @@ this.StoragePanel = function StoragePanel(panelWin, toolbox) { exports.StoragePanel = StoragePanel; StoragePanel.prototype = { - get target() this._toolbox.target, + get target() { + return this._toolbox.target; + }, - get panelWindow() this._panelWin, + get panelWindow() { + return this._panelWin; + }, /** * open is effectively an asynchronous constructor diff --git a/browser/devtools/tilt/tilt-gl.js b/browser/devtools/tilt/tilt-gl.js index 31f89f35f66..e63828bc941 100644 --- a/browser/devtools/tilt/tilt-gl.js +++ b/browser/devtools/tilt/tilt-gl.js @@ -835,9 +835,9 @@ TiltGL.Program.prototype = { this.cleanupVertexAttrib(); // enable any necessary vertex attributes using the cache - for each (let attribute in this._attributes) { - this._context.enableVertexAttribArray(attribute); - utils._enabledAttributes.push(attribute); + for (let key in this._attributes) { + this._context.enableVertexAttribArray(this._attributes[key]); + utils._enabledAttributes.push(this._attributes[key]); } } }, @@ -849,7 +849,7 @@ TiltGL.Program.prototype = { { let utils = TiltGL.ProgramUtils; - for each (let attribute in utils._enabledAttributes) { + for (let attribute of utils._enabledAttributes) { this._context.disableVertexAttribArray(attribute); } utils._enabledAttributes = []; diff --git a/browser/devtools/webaudioeditor/panel.js b/browser/devtools/webaudioeditor/panel.js index c2da91a9c28..8562a2e37fc 100644 --- a/browser/devtools/webaudioeditor/panel.js +++ b/browser/devtools/webaudioeditor/panel.js @@ -52,7 +52,9 @@ WebAudioEditorPanel.prototype = { // DevToolPanel API - get target() this._toolbox.target, + get target() { + return this._toolbox.target; + }, destroy: function() { // Make sure this panel is not already destroyed. diff --git a/browser/devtools/webaudioeditor/test/browser_wa_properties-view-edit-01.js b/browser/devtools/webaudioeditor/test/browser_wa_properties-view-edit-01.js index bebcbc32d63..76d115eed76 100644 --- a/browser/devtools/webaudioeditor/test/browser_wa_properties-view-edit-01.js +++ b/browser/devtools/webaudioeditor/test/browser_wa_properties-view-edit-01.js @@ -56,7 +56,7 @@ add_task(function*() { }); function setAndCheckVariable (panelWin, gVars) { - return Task.async(function (varNum, prop, value, expected, desc) { + return Task.async(function*(varNum, prop, value, expected, desc) { yield modifyVariableView(panelWin, gVars, varNum, prop, value); var props = {}; props[prop] = expected; diff --git a/browser/devtools/webide/test/browser_tabs.js b/browser/devtools/webide/test/browser_tabs.js index ee306ac666e..1860b778e94 100644 --- a/browser/devtools/webide/test/browser_tabs.js +++ b/browser/devtools/webide/test/browser_tabs.js @@ -60,7 +60,7 @@ function connectToLocal(win) { } function selectTabProject(win) { - return Task.spawn(function() { + return Task.spawn(function*() { yield win.Cmds.showProjectPanel(); yield waitForUpdate(win, "runtime-targets"); let tabsNode = win.document.querySelector("#project-panel-tabs"); diff --git a/browser/devtools/webide/test/sidebars/browser_tabs.js b/browser/devtools/webide/test/sidebars/browser_tabs.js index d4158d889e5..cccba60b165 100644 --- a/browser/devtools/webide/test/sidebars/browser_tabs.js +++ b/browser/devtools/webide/test/sidebars/browser_tabs.js @@ -64,7 +64,7 @@ function connectToLocal(win, docRuntime) { } function selectTabProject(win, docProject) { - return Task.spawn(function() { + return Task.spawn(function*() { yield waitForUpdate(win, "runtime-targets"); let tabsNode = docProject.querySelector("#project-panel-tabs"); let tabNode = tabsNode.querySelectorAll(".panel-item")[1]; From 9273663bb10cf05e35fe02e54915f106a9e9b0df Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Tue, 26 May 2015 14:55:45 -0400 Subject: [PATCH 15/34] Bug 1168125 - Cleanup performance xul and css, r=jsantell --- browser/devtools/performance/performance.xul | 129 ++++---- .../shared/devtools/performance.inc.css | 277 +++++++----------- 2 files changed, 189 insertions(+), 217 deletions(-) diff --git a/browser/devtools/performance/performance.xul b/browser/devtools/performance/performance.xul index 5b842189d3d..3b7f24c0c6c 100644 --- a/browser/devtools/performance/performance.xul +++ b/browser/devtools/performance/performance.xul @@ -73,6 +73,8 @@ + + @@ -92,15 +94,21 @@ + - - + + + + - + - + + + + + + + + + + + + - + - - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + +