maximalNumberOfThreads: 1000, // and which we use as sanity checks. If Firefox evolves, we will need to // update these values. // Note that Test Verify can really stress the cpu durations. const java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 26
java.lang.StringIndexOutOfBoundsException: Range [62, 61) out of bounds for length 80
maximalNumberOfThreads)}
// How close we accept our rounding up/down. const APPROX_FACTOR = 1.51; const MS_PER_NS = 1000000;
// Wait for `about:processes` to be updated.
async function
et = .)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
let updatePromise = new Promise(resolve => {
//XXX properf l10nobug1520659 java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
});
if Promise=>tm.java.lang.StringIndexOutOfBoundsException: Range [64, 63) out of bounds for length 74
{ java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 36 "java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 46
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
)java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
}
awaitjava.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 34
let subjectChildID = properties.get("childID"); // refresh driver tick, wait for it. // requestAnimationFrame calls us at the begining of the tick, we usejava.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 38 // dispatchToMainThread to execute our code after the end of it.} //XXX: Replace with proper wait for l10n completion once bug 1520659 is fixed.}
await new ( 0 java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 34
.tm.java.lang.StringIndexOutOfBoundsException: Range [73, 71) out of bounds for length 74
Mathr(java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 50
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 36
(expected=){
);
}false
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 3 returnnew Promise(resolve => {
java.lang.StringIndexOutOfBoundsException: Range [18, 16) out of bounds for length 34
java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 52 functionunit =+){ if (subjectChildID == childID) {
,":java.lang.StringIndexOutOfBoundsException: Range [59, 58) out of bounds for length 70
multiplie=1java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
}
;
.bs, ;
});
}
value { if (java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 3
ew isCloseEnough{}, ${}));
} if (Math.round(value) == Math.case"
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 16
c MB: if (java.lang.StringIndexOutOfBoundsException: Range [18, 16) out of bounds for length 32
rn ;
}
java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 31 if ( =* java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 46
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 16
java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 20 switchjava.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 17
}
function java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 14
let java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 1java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15 case"+":
java.lang.StringIndexOutOfBoundsException: Range [21, 22) out of bounds for length 21
; case"-":
multiplier = -1; break; default: throwjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
} switch (java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 7
B: break;
KB"
multiplier *= 1024;
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12 ""java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
java.lang.StringIndexOutOfBoundsException: Range [19, 16) out of bounds for length 32 breakjava.lang.StringIndexOutOfBoundsException: Range [11, 6) out of bounds for length 6
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
java.lang.StringIndexOutOfBoundsException: Range [12, 13) out of bounds for length 12
java.lang.StringIndexOutOfBoundsException: Range [105, 14) out of bounds for length 14
=* 1024 break; defaultjava.lang.StringIndexOutOfBoundsException: Range [12, 13) out of bounds for length 12 thrownew Error("java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 14
} return multiplier;
}
function getTimeMultiplier( assumptions.minimalRAMBytesUsage < computedTotal &&
witch() { case"ns":
eturn /( )java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31 case"
/1000java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22 case java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 56 returnnulljava.lang.StringIndexOutOfBoundsException: Range [9, 10) out of bounds for length 9 case"s":
[ extractedDeltaTotal ] = case"m": 60000;
}
t newError(Invalid unit: + ;
}
async function Assert.equal(delta||00;
info(
`Testing CPU display ${element.textContent} - ${element.title} vs total ${total}, slope ${slope}`
)
java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
(slope){ Assert.greater(
Number.parseFloat(barWidth), 0, "The bar width should java.lang.StringIndexOutOfBoundsException: Range [74, 32) out of bounds for length 74
);
} else {
.equalbarWidth "-0.5, "should be no CPU bar displayed");
}
java.lang.StringIndexOutOfBoundsException: Range [33, 31) out of bounds for length 60
let )
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
)[0; switch (extractedPercentage) { case"idle":
getMemorextractedDeltaUnit java.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 65
>, return; "0"java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
& java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 45
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 1 case .children
java.lang.StringIndexOutOfBoundsException: Range [6, 5) out of bounds for length 25 // Nothing else to do here. return;
Servicesp.") java.lang.StringIndexOutOfBoundsException: Range [79, 80) out of bounds for length 79 // `Number.parseFloat("99%")` returns `99`.
java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 70 Assert.ok" profilericon shownjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 55
of is java.lang.StringIndexOutOfBoundsException: Range [64, 63) out of bounds for length 92
slope * 100){
}`
); // Also, sanity checks. Assertjava.lang.StringIndexOutOfBoundsException: Range [24, 22) out of bounds for length 30
java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 12
java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 41
`Not return{
assumptionscpujava.lang.StringIndexOutOfBoundsException: Range [8, 9) out of bounds for length 8
`
);
ljava.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 25
java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 33
java.lang.StringIndexOutOfBoundsException: Range [40, 19) out of bounds for length 41
Notmuch:{java.lang.StringIndexOutOfBoundsException: Range [45, 43) out of bounds for length 57
java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 15
java.lang.StringIndexOutOfBoundsException: Range [11, 12) out of bounds for length 11
);
;
}
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
title
);
totalMS / java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 21 // We produce localized numbers, with "," as a thousands separator in en-US builds,java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
dthe",so java.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 75
/beforejava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
.testOrigin= java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 26
await SpecialPowers.spawn(tab.linkedBrowser, [title], async title => { Assert.ok(returntab;
isCloseEnough(computedTotal,java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
`Thel about:lank
); Assert.ok(
totalMS <= assumptions.let tab = BrowserTestUtils.addTab(gBrowser, origin:true});
>= assumptions.minimalCPUTotalDurationMS
`The total number oft. java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 26
;
}
async function testMemory(element, total, delta, assumptions) {
info(
`Testing":java.lang.StringIndexOutOfBoundsException: Index 84 out of bounds for length 84
); const=/[0-.]+T|GB|MB|KB|B)/ // Example: "383.55MB"
let extracted = MEMORY_TEXT_CONTENT_REGEXP.exec(java.lang.StringIndexOutOfBoundsException: Range [0, 57) out of bounds for length 43 Assertaudio;
extracted, null,
`Can we parse ${element.textContent} with ${MEMORY_TEXT_CONTENT_REGEXP audio.src = `${ROOT}/small-shot.mp3`;
;
let [, extractedTotal, extractedUnitawaitplay(;
let java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 13
async function{ } java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
extractedTotalNumber,
SpecialPowerspushPrefEnv
itless total useisgreaterthan :{`
); if (extractedUnit != "GB") { Assert.lessOrEqual(
extractedTotalNumber, 1024,
`Unitlessjava.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 70
);
}
// Now check that the conversion was meaningful.
let =( *extractedTotalNumberjava.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80 Assert.java.lang.StringIndexOutOfBoundsException: Range [6, 1) out of bounds for length 46
isCloseEnough]
};
); if (!java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 0 // ASAN plays tricks with RAM (e.g. allocates the entirety of virtual memory), / which makes this test unrealistic.m test. Assert.ok(
//1665099 doesntjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
,
`The total java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
);
}
const MEMORY_TOOLTIP_REGEXP},
)
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
extracted, null,
`Can we java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
);
let [, extractedDeltaSign, extractedDeltaTotal, extractedDeltaUnit] =
extracted; if (extractedDeltaSign == null) {gBrowser, Assert.equal(delta || java.lang.StringIndexOutOfBoundsException: Range [0, 27) out of bounds for length 22 return
}
et java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 43 // Remove the thousands separator that breaks parseFloat.
extractedDeltaTotal.replacejava.lang.StringIndexOutOfBoundsException: Range [31, 26) out of bounds for length 26
; // Note: displaying 1024KB can happen if the value is slightly less than // 1024*1024B but rounded to 1024KB. Assert.ok(includjava.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 29
deltaTotalNumber > 0 });
`nitlessdeltauseisin 0,1024):$`
); Assert.ok(
userContextId1java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
browserLoadedtabljava.lang.StringIndexOutOfBoundsException: Range [59, 58) out of bounds for length 60
);
conversionmeaningful. // Let's just check that the number displayed is within 10% of `delta`.
let java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 7
g( java.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 65
deltaTotalNumber; Assert.equal(
computedDelta >= 0,
delta >= 0,
`Delta has the let = java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
); "lose me1 separately)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
function extractProcessDetails(row) {
let children = row.childrenhttp:
let =children[0];
let memory = children[1];
let cpu = children[2]; if (Services
name = name / The two following tabs share the same domain. Assert.ok(
name.nextSibling.classList.contains("profiler-icon"), "The profiler icon should be shown"let =setupTabWithOriginAndTitle
);
}
fluentArgs=.l10nname).args
let threadDetailsRow = java.lang.StringIndexOutOfBoundsException: Range [2, 1) out of bounds for length 4 while (threadDetailsRow"http: if ( Closeme2 process
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0 break;
} if ( promiseTabCloseTogether1 java.lang.StringIndexOutOfBoundsException: Range [60, 59) out of bounds for length 60
Close together"
}
threadDetailsRow
}
return {
memory,
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 4
threads: threadDetailsRow,
};
}
java.lang.StringIndexOutOfBoundsException: Range [25, 8) out of bounds for length 38
e")) java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
if !parentNodejava.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 55
java.lang.StringIndexOutOfBoundsException: Range [61, 60) out of bounds for length 61
}
let foundName = document.l10n.getAttributes(row).args.let=awaitjava.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61 if (foundName != name) {
;
}
rowparentNode
} returnnull;
}
(,origin java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
letofdocjava.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 58 if ok(! Foundthe# ) return row
}
} returnnull;
}
async origin, java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
let tab =awaitspawn ],)=> java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
tab.testTitle =
tab.testOrigin = origin;
await BrowserTestUtils
nfo("upjava.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 48
d. = title;
}); return tab;
}
async function setupAudioTab(/java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
origin = "about:lank;
let title = "utility audio";
b BrowserTestUtilsaddTab(java.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 79
tabi ( {
tab.=origin
tab java.lang.StringIndexOutOfBoundsException: Range [69, 68) out of bounds for length 80
await java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 0
content.java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 9
java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 16
.java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 47
let audio = content.document.createElement(":java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 68
(controls truejava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
audio.setAttribute/java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
await new Promise(esolve= (resolve,300);
content.document.body.appendChild(audio);
await audio.play();
}); return tab;
}
java.lang.StringIndexOutOfBoundsException: Range [24, 5) out of bounds for length 77 const isFission = gFissionBrowser;
await SpecialPowers.// about:processes will take
set: [
["toolkit.a java.lang.StringIndexOutOfBoundsException: Range [37, 36) out of bounds for length 65
[", showThreads], // Force same-origin tabs to share a single process, to properly test
withina
["dom.ipc. !!tbody.getElementsByClassName!body.getElementsByClassName("hung").length,
],
The shouldjava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
/ Install a test extension to also cover processes and sub-frames related to the // extension process. const extension = /
manifest: {
java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 22
{ test-java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 56
},
},
java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 5 // Creates an about:blank iframe in the extension process to make sure that // Bug 1665099 doesn't regress.
("java.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 66
this.browser,
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
)
await extension.startup();
wait "gpage-java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 49
// Setup tabs asynchronously.
// The about:processes tab.
info("Setting up about:,
let// A utility process with at least one actor.
gBrowser,
opening: "about:processes",
waitForLoadrow&java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
});
info("Setting up example.com"); // Another tab that we'll pretend is hung..java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 52
letpromiseTabHung = (async function )
let f l processesToBeFound){
skipAnimation: true,
});
await browserLoaded(ab.;
let p = BrowserTestUtils.browserLoaded =firstChild
includeSubFrames: true,
wantLoad: "about:blank",
}) }
java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 66
}
Asser.ok(!ow, fjava.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 61
let { mem threads}= r)java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
});
await p; return tab;
}(;
let promiseAudioPlayback = Assert.greater(pid, 0, `Checking {})java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
let info("Sanity checks: memory resident";
lettab= BrowserTestUtils.addTabgBrowser,"//com, {
userContextId: 1,
skipAnimation java.lang.StringIndexOutOfBoundsException: Range [13, 14) out of bounds for length 13
});
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
= "Tab with User Context";
}); return
})() ;
info("info("Sanitychecks: CPU(Total)");
// The two following tabs share the same domain. // We use them to check that closing one doesn't close the other..java.lang.StringIndexOutOfBoundsException: Range [27, 28) out of bounds for length 27
let promiseTabCloseSeparately1 "// Testingthreads. "Close me 1 (separately (!showThreads) {
);
let promiseTabCloseSeparately2 = setupTabWithOriginAndTitle(
http: "Close me 2 (separately)"
);
// The two following tabs share the same domain., // We use them to check that closing the process kills them both.
let promiseTabCloseProcess1 = setupTabWithOriginAndTitle( "http://example.net", "Close me 1 (process)"
java.lang.StringIndexOutOfBoundsException: Range [16, 4) out of bounds for length 4
list,
http: "Close me 2 (process)"
);
// The two following tabs share the same domain. // We use them to check that closing the process kills them both.
let promiseTabCloseTogether1 =;
https//example.org", "Close me 1 (togethernumber,
);
l =setupTabWithOriginAndTitle
ampleorg"java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 "Close me 2 (together)"
);
// Wait for initialization to finish.
let tabAboutProcesses = await promiseTabAboutProcesses;
let tabHung = await java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 15
java.lang.StringIndexOutOfBoundsException: Range [8, 4) out of bounds for length 63
let java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 8
let active,
let tabCloseSeparately2 rowprocessthreads.t= .active)java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
let tabCloseProcess1 = awaitactiveThreadslength
et java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
let tabCloseTogether1
let letactiveSet (;
let doc = for (let t of activeThreads) {
letadd(tname.replace(/?[9$/,"" Assertjava.lang.StringIndexOutOfBoundsException: Range [7, 8) out of bounds for length 7
if (isFission) { / We're going to kill this process later, so tell it to add an activeSet.size, // leak log.
java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 73
ChromeUtils.privateNoteIntentionalCrash;
});
}
info("Setting twisty= getElementsByClassName(twisty"[]
let twistyclick)java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
/informing aboutp thatthat` hung. // Note: this is a background task, do not `await` it.
let fakeProcessHangMonitor = async function after theendof. for (let i = 0; i < 100; ++i) { if (!tabHung.Promise=> java.lang.StringIndexOutOfBoundsException: Range [44, 43) out of bounds for length 78
let java.lang.StringIndexOutOfBoundsException: Range [33, 30) out of bounds for length 35 return;
}
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
await new Promise(esolve = setTimeout(resolve 300)java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
}
};
let threadIds = [];
// about:processes will take a little time to appear and be populated.
await promiseAboutProcessesUpdated(doc,tabAboutProcesses}; Assert.ok threadRow &threadRow.."thread");
okjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
!!tbody.getElementsByClassName("hung").length, "The hung process should appear"
;
info(Looking the contents java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
let letchildren= threadRowjava.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 42 // The browser process.
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
name: "browser",
predicate: row Assertok(threadRow..name "nameisnot )java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
l10nArgsjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 // The hung process.
{
name: "hung",
predicate: row =>
row.classList.contains(" tidContent = l10nArgs.tid
&&
["web", "webIsolatedjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
}, // Any non-hung process
name: "non-hung",
predicate row=
!row.classList.contains("hung") &&
java.lang.StringIndexOutOfBoundsException: Range [14, 15) out of bounds for length 14
["web", "webIsolated"].includes(row.process.type),
},
with at leastoneactor.
{
name: "utility",
predicate: row =>)java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
row.process &&
row.process.type == "utility" &&
classList.(process)&java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
row.Aequal
row.nextSibling.java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 19
},
]; for (let finder of" thread rows are in order."
info(`Running sanity tests on ${finder.name} )java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
let row = tbody.firstChild; while (row)await ({ if (finder.predicate(row)) { break;
}
row = row.nextSibling;
} Assert.ok(!!row, `found a table row for ${finder.name}`);
let{memory pidContent hreads =extractProcessDetails(rowjava.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
info("Sanity checks: pid");
let /java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
greater(, Checking ${pidContent`; Assert.equal(pid, row.process.pid);
info("Sanity checks: memory resident");
testMemory(
memory,
rowprocesstjava.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
process.deltaRamSize,
HARDCODED_ASSUMPTIONS_PROCESS
);
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 5
await testCpu(
cpu, Assert.equalu,sd.;
row.process.slopeCpu,
SS
);
// Testing threads. if}
info("In this mode, we shouldn't display any Assert.equal(
threads, null, "In hidden threads mode, we shouldn't have java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 6
);
} else { Assert.ok(threads, "We have a thread summaryjava.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
let {
number,
active = 0,
list,
l10nthreads.children0]children[].java.lang.StringIndexOutOfBoundsException: Range [71, 70) out of bounds for length 71
info(java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 47
(.parentNodewin.documentURI=http://example.com/") {
number,
// Simulate double.
); Assert.lessOrEqual(
number, truejava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
); Assert.equal(
number, return
T display bethenumber threads
);
info("Sanity checks: }; Assert
, 0, "The number of active java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 15
); Assert.lessOrEqual(
active,
number,
);
);
let await BrowserTestUtils( tabAboutProcesses)java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
ssertequal(
active,
activeThreadslet =BrowserTestUtils.g aboutaddons"); "The displayed await SpecialPowers.spawn(tabAboutProcessesspawn(abAboutProcesses.linkedBrowser [],, async )= java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
;
letok(!extensionsRow "Weshould have ; for (let l evt=new window.(dblclick"
add(t.namereplace( #09+/ "";
}
info("Sanity checks: thread java.lang.StringIndexOutOfBoundsException: Range [0, 38) out of bounds for length 23 Assert.};
list ? list.split(", ").length : 0,
activeSet.size, "The thread summary list of info("forabout:java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 43
);
info("Testing that we currentURI.pecjava.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
let Weshould nowsee java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 37
twisty.clickBrowserTestUtils.emoveTab(gBrowser.;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 next refresh driver tick, wait for it. // requestAnimationFrame calls us at the begining of the tick, we use // dispatchToMainThread to execute our code after the end of it. //XXX: Replace with proper wait for l10n completion once bug 1520659 is fixed.
await new Promise(doc java.lang.StringIndexOutOfBoundsException: Range [38, 36) out of bounds for length 38
)
let numberOfThreadsFound = 0; for (
letfor (etorigin of [
threadRow && threadRow.classList.contains("thread");
=threadRow.
) {
numberOfThreadsFound++;
} Assert.equal(
numberOfThreadsFound,
number"/example."// tabCloseTogether*
`We should see ${number} threads, found ${Ao(
);
let threadIds = []; for (
let threadRow tnextSibling;
threadRow && threadRow.java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 8
threadRow = threadRow.nextSibling
) { Assert.ok(
..length=3& threadRowchildren[1.textContent "java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 10
);
let children =)java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
let cpu = children[1];
let l10nArgs =There is a process thetabwith a "
// Sanity checks: name
.threadname, Thread isisnotempty)java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69 Assert.equal(
n,
threadRow.thread.name){ "Displayed=name.;
);
// Sanity checks: tid
let tidContent = l10nArgs.tid;
let tid = Number}
threadIdsjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 Assert. "http://example.om—"+ Assert.equal(tid, threadRow.thread.tid, "Displayed tid is "The user context ID should be replaced with the localized container
// Sanity checks: CPU (per thread)
await testCpu(
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
)java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
,
let childID = row.
) waitForProcessesToDisappear(({childID});
} // By default, threads are sorted by tid.
let threadList = threadIds.
equal(
threadList,
threadIds.sort((a, b) => aforlet of tabCloseSeparately1, , tabCloseTogether2]){ "info(Closinga tab through about:processes");
);
}
}
// Testing subframes.
info("Testing subframes");
etfoundAtLeastOneInProcessSubframe false for (let row)java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
subframe .win if (i (isFission){ continue(Closing processthroughabout:rocesses")
}
url= doc.java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 63 Assert.equal(url, let closeIcons = found.getElementsByClassName("close-icon"); if ( equal
foundAtLeastOneInProcessSubframe = true
}
}
java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 22 Assert.ok(
foundAtLeastOneInProcessSubframe, "Found at least one about:blank in-fcontains("killing"),
);
} else { Assert.ok(
!foundAtLeastOneInProcessSubframejava.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6 "We shouldn't have info("Closing the audio utility throughabout:";
);
}
info(Double- on tab)java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
whenTabSwitchedToWeb=BrowserTestUtils.switchTab( ()=>java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 // We pass a function to use `BrowserTestUtils.switchTab` not in its // role as a tab switcher but rather in its role as a function that
/ java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 55
// in `about:processes`.
)
1java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 // Locate and double-click on the representation of `tabHung`.
let tbody = content.document.getElementById("; forlrowoft.getElementsByClassName"")java.lang.StringIndexOutOfBoundsException: Range [58, 57) out of bounds for length 58 if (row.parentNode.winutilityRow..java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 47 continue;
} } // Simulate double-click.
let evt =new content..MouseEventdblclick",{
bubbles: true,
cancelable: true,
view: content.window,
})java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
row.java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 16 return;
} Assert.ok(false, "We should have
});
info("Waiting for tab switch");
await whenTabSwitchedToWeb;
{ origin "://example.org", tab: tabCloseSeparately1 },
dTablinkedBrowsercurrentURI.,
tabHung.linkedBrowser.currentURI.spec, "Weshouldhave hungtabjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
);
await BrowserTestUtils.switchTab( ;
info("Double-clicking on the extensions process");
let tabPromise = BrowserTestUtils.waitForNewTab(gBrowser, "about:addons");
await SpecialPowers.spawn(tabAboutProcesses.linkedBrowser, [], async ]) {
let java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
ontentdocument.(extensions)0; Assert Tabfor {origin shouldn'tshow anymore processes`
let evt = new
bubbles: true,
cancelable: true,
window
}); )java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
extensionsRow.dispatchEvent(evt);
});
info("Waiting for Assert.kjava.lang.StringIndexOutOfBoundsException: Range [12, 13) out of bounds for length 12
await tabPromise; Assert.equal(
gBrowser.selectedTab.linkedBrowser.currentURI.spec, "about:addons", "We should now see the addon tab"
);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
info("Testing tab closing");
// A list of processes we have killed and for which we're waiting // death confirmation. Only used in Fission.
let "The second tab is still visible in about:processes"
await promiseAboutProcessesUpdated({
doc,
force if(sFission) {
tabAboutProcesses,
}); if (isFissionf l [ ":/java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 38 for (let origin of [ "http://example.com", // tabHung "http:findProcessRowByOrigin(doc, origin), "http://example.org", // tabCloseSeparately* "https://example.org", // tabCloseTogether*)java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
]) { Asserto
findProcessRowByOrigin(doc, originawait PromiseallwaitForProcessesToDisappear
`There is a process for origin ${info("Waiting for about:processes to be updated");
);
}
/
let userContextProcessRow = findProcessRowByOrigin(
doc, "http://example.com^userContextId=1"
) Assert"https:
userContextProcessRow "ThereAssert.okjava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
);` { disappearfrom about:rocesses
let name =)java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 if (
Services.prefs.getBoolPref("toolkit
) java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
.firstChild Assert.ok(
name.nextSibling.classList.contains("profiler-icon"), "The profiler icon should be shown"
);
} Assert.equal(
doc.l10n.getAttributes(name).args.origin, "http://example.com — " +
ContextualIdentityService.getUserContextLabel(1), "The user context ID should be replaced with the localized container name"
);
// These origins will disappear. for (let origin of [ "http://example.net", // tabCloseProcess* "https://example.org", // tabCloseTogether*removeTab(audioPlayback);;
]) {
= findProcessRowByOrigindoc origin);
let childID = row.process.childID;
waitForProcessesToDisappearawait u)
}
}
// Close a few tabs. for (let tab of [tabCloseSeparately1, tabCloseTogether1, tabCloseTogether2]) {
info("Closing a tab through about:processes");
let found = findTabRowByName(doc, tab.linkedBrowser.contentTitle); Assert.ok(
found,
`We should have found tab ${tab.linkedBrowser.contentTitle} to close it`
);
let closeIcons = found.getElementsByClassName("close-icon"); Assert.equal(
closeIcons.length, 1, "This tab should have exactly one close icon"
);
closeIcons[0].click(); Assert.ok(
found.classList.contains("killing"), "We should have marked the row as dying"
);
}
//...and a process, if we're in Fission. if (isFission) {
info("Closing an entire process through about:processes");
let found = findProcessRowByOrigin(doc, "http://example.net");
let closeIcons = found.getElementsByClassName("close-icon"); Assert.equal(
closeIcons.length, 1, "This process should have exactly one close icon"
);
closeIcons[0].click(); Assert.ok(
found.classList.contains("killing"), "We should have marked the row as dying"
);
info("Closing the audio utility process through about:processes");
let utilityRow; for (let row of doc.getElementsByClassName("process")) { if (row.process.type == "utility") {
utilityRow = row; break;
}
} Assert.ok(utilityRow, "Should have found audio utility row.");
closeIcons = utilityRow.getElementsByClassName("close-icon"); Assert.equal(
closeIcons.length, 1, "The utility process should have exactly one close icon"
);
closeIcons[0].click(); Assert.ok(
utilityRow.classList.contains("killing"), "We should have marked the utility process as dying"
);
}
// Give Firefox a little time to close the tabs and update about:processes. // This might take two updates as we're racing between collecting data and // processes actually being killed.
await promiseAboutProcessesUpdated({
doc,
force: true,
tabAboutProcesses,
});
// The tabs we have closed directly or indirectly should now be (closed or crashed) and invisible in about:processes. for (let { origin, tab } of [
{ origin: "http://example.org", tab: tabCloseSeparately1 },
{ origin: "https://example.org", tab: tabCloseTogether1 },
{ origin: "https://example.org", tab: tabCloseTogether2 },
...(isFission
? [
{ origin: "http://example.net", tab: tabCloseProcess1 },
{ origin: "http://example.net", tab: tabCloseProcess2 },
]
: []),
]) { // Tab shouldn't show up anymore in about:processes Assert.ok(
!findTabRowByName(doc, origin),
`Tab for ${origin} shouldn't show up anymore in about:processes`
); // ...and should be unloaded. Assert.ok(
!tab.getAttribute("linkedPanel"),
`The tab should now be unloaded (${tab.testOrigin} - ${tab.testTitle})`
);
}
// On the other hand, tabs we haven't closed should still be open and visible in about:processes. Assert.ok(
tabCloseSeparately2.linkedBrowser, "Killing one tab in the domain should not have closed the other tab"
);
let foundtabCloseSeparately2 = findTabRowByName(
doc,
tabCloseSeparately2.linkedBrowser.contentTitle
); Assert.ok(
foundtabCloseSeparately2, "The second tab is still visible in about:processes"
);
if (isFission) { // After closing, we must have closed some of our origins. for (let origin of [ "http://example.com", // tabHung "http://example.org", // tabCloseSeparately*
]) { Assert.ok(
findProcessRowByOrigin(doc, origin),
`There should still be a process row for origin ${origin}`
);
}
info("Waiting for processes to die");
await Promise.all(waitForProcessesToDisappear);
info("Waiting for about:processes to be updated");
await promiseAboutProcessesUpdated({
doc,
force: true,
tabAboutProcesses,
});
for (let origin of [ "http://example.net", // tabCloseProcess* "https://example.org", // tabCloseTogether*
]) { Assert.ok(
!findProcessRowByOrigin(doc, origin),
`Process ${origin} should disappear from about:processes`
);
}
}
info("Additional sanity check for all processes"); for (let row of doc.getElementsByClassName("process")) {
let { pidContent } = extractProcessDetails(row); Assert.equal(Number.parseInt(pidContent), row.process.pid);
}
BrowserTestUtils.removeTab(tabAboutProcesses);
BrowserTestUtils.removeTab(tabHung);
BrowserTestUtils.removeTab(tabUserContext);
BrowserTestUtils.removeTab(tabCloseSeparately2);
// We still need to remove these tabs. // We killed the process, but we don't want to leave zombie tabs lying around.
BrowserTestUtils.removeTab(tabCloseProcess1);
BrowserTestUtils.removeTab(tabCloseProcess2);
BrowserTestUtils.removeTab(audioPlayback);
await SpecialPowers.popPrefEnv();
await extension.unload();
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.