mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-27 13:28:42 +00:00
98894236c9
- Bug 1171200 - Add means of checking if a document links to a manifest. r=billm (066ddad20) - Bug 1167300 - Consolidate the performance tool directory, r=jsantell (c7dd7dc34) - Bug 1167300 - Create a way to get strings from multiple localization files, r=jsantell (0973b8d3e) - modules not in gre (914e4080e) - Bug 1153011 - Remove zoom button from call tree. r=vporof (797b8f91d) - Bug 1151973 - Inverted call tree should be ordered by 'self cost', not 'total cost', r=jsantell (f2800b272) - more gre removal (27aed87a0) - Bug 1144034 - Flamegraph text is barely readable on non-retina display, r=jsantell (cb19fd9f2) - Bug 1151973 - Inverted call tree should be ordered by 'self cost', not 'total cost', r=jsantell (9c579599e) - Bug 1167300 - Fix all performance tool imports to work with the new file locations, r=jsantell (70b2995c4) - Bug 1167298 - Remove the ordinal property on categories, r=jsantell (00b3f5830) - Bug 1167733 - Consolidate prefs access and usage in the new performance tool, r=jsantell (4dab15e7f) - Bug 1167006 - part 3 fully revert merge from 780e1f999f54. (8aaa33c9c) - Bug 1167961 - Task is incorrectly used in compatibility.js, r=jsantell (7291f68d1) - Bug 1138641 - Updated remaining callsites to use newChannel2 in browser/devtools (r=vporof) (60ac4b2c8) - Bug 1164130 - Correctly include RecordingUtils when importing older version 2 profiler data. r=vp (8169d0398) - Bug 1167962 - Keep exports at bottom of modules, r=jsantell (7426919db) - Bug 1167962 - Fix import in synthesizeProfileForTest, r=orange (cc7fab771) - fix merge of later patch Bug 1167006 (c0b57b0e2) - Bug 1157523 - Fix intermittent where markers are selected in the waterfall views when there is no recording selected. r=vp (35cec0bd1) - Bug 1196253 - update in-tree psutil to 3.1.1. r=gps (80f243738)
191 lines
5.8 KiB
JavaScript
191 lines
5.8 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
let {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
|
|
let {TargetFactory, require} = devtools;
|
|
let {console} = Cu.import("resource://gre/modules/devtools/Console.jsm", {});
|
|
let {gDevTools} = Cu.import("resource://gre/modules/devtools/gDevTools.jsm", {});
|
|
const {DOMHelpers} = Cu.import("resource://gre/modules/devtools/DOMHelpers.jsm", {});
|
|
const {Hosts} = require("devtools/framework/toolbox-hosts");
|
|
const {defer} = require("sdk/core/promise");
|
|
|
|
gDevTools.testing = true;
|
|
SimpleTest.registerCleanupFunction(() => {
|
|
gDevTools.testing = false;
|
|
});
|
|
|
|
const TEST_URI_ROOT = "http://example.com/browser/browser/devtools/shared/test/";
|
|
const OPTIONS_VIEW_URL = TEST_URI_ROOT + "doc_options-view.xul";
|
|
|
|
/**
|
|
* Open a new tab at a URL and call a callback on load
|
|
*/
|
|
function addTab(aURL, aCallback)
|
|
{
|
|
waitForExplicitFinish();
|
|
|
|
gBrowser.selectedTab = gBrowser.addTab();
|
|
content.location = aURL;
|
|
|
|
let tab = gBrowser.selectedTab;
|
|
let browser = gBrowser.getBrowserForTab(tab);
|
|
|
|
function onTabLoad() {
|
|
browser.removeEventListener("load", onTabLoad, true);
|
|
aCallback(browser, tab, browser.contentDocument);
|
|
}
|
|
|
|
browser.addEventListener("load", onTabLoad, true);
|
|
}
|
|
|
|
function promiseTab(aURL) {
|
|
return new Promise(resolve =>
|
|
addTab(aURL, resolve));
|
|
}
|
|
|
|
registerCleanupFunction(function tearDown() {
|
|
while (gBrowser.tabs.length > 1) {
|
|
gBrowser.removeCurrentTab();
|
|
}
|
|
|
|
console = undefined;
|
|
});
|
|
|
|
function catchFail(func) {
|
|
return function() {
|
|
try {
|
|
return func.apply(null, arguments);
|
|
}
|
|
catch (ex) {
|
|
ok(false, ex);
|
|
console.error(ex);
|
|
finish();
|
|
throw ex;
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Polls a given function waiting for the given value.
|
|
*
|
|
* @param object aOptions
|
|
* Options object with the following properties:
|
|
* - validator
|
|
* A validator function that should return the expected value. This is
|
|
* called every few milliseconds to check if the result is the expected
|
|
* one. When the returned result is the expected one, then the |success|
|
|
* function is called and polling stops. If |validator| never returns
|
|
* the expected value, then polling timeouts after several tries and
|
|
* a failure is recorded - the given |failure| function is invoked.
|
|
* - success
|
|
* A function called when the validator function returns the expected
|
|
* value.
|
|
* - failure
|
|
* A function called if the validator function timeouts - fails to return
|
|
* the expected value in the given time.
|
|
* - name
|
|
* Name of test. This is used to generate the success and failure
|
|
* messages.
|
|
* - timeout
|
|
* Timeout for validator function, in milliseconds. Default is 5000 ms.
|
|
* - value
|
|
* The expected value. If this option is omitted then the |validator|
|
|
* function must return a trueish value.
|
|
* Each of the provided callback functions will receive two arguments:
|
|
* the |aOptions| object and the last value returned by |validator|.
|
|
*/
|
|
function waitForValue(aOptions)
|
|
{
|
|
let start = Date.now();
|
|
let timeout = aOptions.timeout || 5000;
|
|
let lastValue;
|
|
|
|
function wait(validatorFn, successFn, failureFn)
|
|
{
|
|
if ((Date.now() - start) > timeout) {
|
|
// Log the failure.
|
|
ok(false, "Timed out while waiting for: " + aOptions.name);
|
|
let expected = "value" in aOptions ?
|
|
"'" + aOptions.value + "'" :
|
|
"a trueish value";
|
|
info("timeout info :: got '" + lastValue + "', expected " + expected);
|
|
failureFn(aOptions, lastValue);
|
|
return;
|
|
}
|
|
|
|
lastValue = validatorFn(aOptions, lastValue);
|
|
let successful = "value" in aOptions ?
|
|
lastValue == aOptions.value :
|
|
lastValue;
|
|
if (successful) {
|
|
ok(true, aOptions.name);
|
|
successFn(aOptions, lastValue);
|
|
} else {
|
|
setTimeout(function() wait(validatorFn, successFn, failureFn), 100);
|
|
}
|
|
}
|
|
|
|
wait(aOptions.validator, aOptions.success, aOptions.failure);
|
|
}
|
|
|
|
function oneTimeObserve(name, callback) {
|
|
let func = function() {
|
|
Services.obs.removeObserver(func, name);
|
|
callback();
|
|
};
|
|
Services.obs.addObserver(func, name, false);
|
|
}
|
|
|
|
let createHost = Task.async(function*(type = "bottom", src = "data:text/html;charset=utf-8,") {
|
|
let host = new Hosts[type](gBrowser.selectedTab);
|
|
let iframe = yield host.create();
|
|
|
|
yield new Promise(resolve => {
|
|
let domHelper = new DOMHelpers(iframe.contentWindow);
|
|
iframe.setAttribute("src", src);
|
|
domHelper.onceDOMReady(resolve);
|
|
});
|
|
|
|
return [host, iframe.contentWindow, iframe.contentDocument];
|
|
});
|
|
|
|
/**
|
|
* Synthesize a profile for testing.
|
|
*/
|
|
function synthesizeProfileForTest(samples) {
|
|
const RecordingUtils = devtools.require("devtools/performance/recording-utils");
|
|
|
|
samples.unshift({
|
|
time: 0,
|
|
frames: []
|
|
});
|
|
|
|
let uniqueStacks = new RecordingUtils.UniqueStacks();
|
|
return RecordingUtils.deflateThread({
|
|
samples: samples,
|
|
markers: []
|
|
}, uniqueStacks);
|
|
}
|
|
|
|
/**
|
|
* Open and close the toolbox in the current browser tab, several times, waiting
|
|
* some amount of time in between.
|
|
* @param {Number} nbOfTimes
|
|
* @param {Number} usageTime in milliseconds
|
|
* @param {String} toolId
|
|
*/
|
|
function* openAndCloseToolbox(nbOfTimes, usageTime, toolId) {
|
|
for (let i = 0; i < nbOfTimes; i++) {
|
|
info("Opening toolbox " + (i + 1));
|
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
|
yield gDevTools.showToolbox(target, toolId);
|
|
|
|
// We use a timeout to check the toolbox's active time
|
|
yield new Promise(resolve => setTimeout(resolve, usageTime));
|
|
|
|
info("Closing toolbox " + (i + 1));
|
|
yield gDevTools.closeToolbox(target);
|
|
}
|
|
}
|