forked from mirrors/gecko-dev
Bug 1868778 - Mark extensions process crashes as occurring in a background process. r=gsvelto,amejiamarmol,geckoview-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D195773
This commit is contained in:
parent
4de3612bbf
commit
2c6088f94a
2 changed files with 49 additions and 8 deletions
|
|
@ -60,8 +60,9 @@ export var ChildCrashHandler = {
|
|||
return;
|
||||
}
|
||||
|
||||
// If dumpID is empty the process was likely killed by the system and we therefore do not
|
||||
// want to report the crash.
|
||||
// If dumpID is empty the process was likely killed by the system and
|
||||
// we therefore do not want to report the crash. This includes most
|
||||
// "expected" extensions process crashes on Android.
|
||||
const dumpID = aSubject.get("dumpID");
|
||||
if (!dumpID) {
|
||||
Services.telemetry
|
||||
|
|
@ -73,12 +74,6 @@ export var ChildCrashHandler = {
|
|||
debug`Notifying child process crash, dump ID ${dumpID}`;
|
||||
const [minidumpPath, extrasPath] = getPendingMinidump(dumpID);
|
||||
|
||||
// Report GPU process crashes as occuring in a background process, and others as foreground.
|
||||
const processType =
|
||||
aTopic === "compositor:process-aborted"
|
||||
? "BACKGROUND_CHILD"
|
||||
: "FOREGROUND_CHILD";
|
||||
|
||||
let remoteType = this.childMap.get(childID);
|
||||
this.childMap.delete(childID);
|
||||
|
||||
|
|
@ -88,6 +83,13 @@ export var ChildCrashHandler = {
|
|||
remoteType = remoteType.split("=")[0];
|
||||
}
|
||||
|
||||
// Report GPU and extension process crashes as occuring in a background
|
||||
// process, and others as foreground.
|
||||
const processType =
|
||||
aTopic === "compositor:process-aborted" || remoteType === "extension"
|
||||
? "BACKGROUND_CHILD"
|
||||
: "FOREGROUND_CHILD";
|
||||
|
||||
lazy.EventDispatcher.instance.sendRequest({
|
||||
type: "GeckoView:ChildCrashReport",
|
||||
minidumpPath,
|
||||
|
|
|
|||
|
|
@ -61,3 +61,42 @@ add_task(async function test_remoteType() {
|
|||
);
|
||||
Assert.equal("webIsolated", aData?.remoteType, "expected remote type prefix");
|
||||
});
|
||||
|
||||
add_task(async function test_extensions_process_crash() {
|
||||
const childID = 123;
|
||||
const remoteType = "extension";
|
||||
// Force-set a remote type for the process that we are going to "crash" next.
|
||||
lazy.ChildCrashHandler.childMap.set(childID, remoteType);
|
||||
|
||||
// Mock a process crash being notified.
|
||||
const propertyBag = Cc["@mozilla.org/hash-property-bag;1"].createInstance(
|
||||
Ci.nsIWritablePropertyBag2
|
||||
);
|
||||
propertyBag.setPropertyAsBool("abnormal", true);
|
||||
propertyBag.setPropertyAsAString("dumpID", "a-dump-id");
|
||||
|
||||
// Set up a listener to receive the crash report event emitted by the handler.
|
||||
let listener;
|
||||
const crashReportPromise = new Promise(resolve => {
|
||||
listener = {
|
||||
onEvent(aEvent, aData, aCallback) {
|
||||
resolve([aEvent, aData]);
|
||||
},
|
||||
};
|
||||
});
|
||||
lazy.EventDispatcher.instance.registerListener(listener, [
|
||||
"GeckoView:ChildCrashReport",
|
||||
]);
|
||||
|
||||
// Simulate a crash.
|
||||
lazy.ChildCrashHandler.observe(propertyBag, "ipc:content-shutdown", childID);
|
||||
|
||||
const [aEvent, aData] = await crashReportPromise;
|
||||
Assert.equal(
|
||||
"GeckoView:ChildCrashReport",
|
||||
aEvent,
|
||||
"expected a child crash report"
|
||||
);
|
||||
Assert.equal("extension", aData?.remoteType, "expected remote type");
|
||||
Assert.equal("BACKGROUND_CHILD", aData?.processType, "expected process type");
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue