Backed out changeset a6d7efb82917 (bug 1772347) for causing devtools failres. CLOSED TREE

This commit is contained in:
Marian-Vasile Laza 2022-06-23 21:45:48 +03:00
Родитель 3a9047ca25
Коммит 1b4fa1555b
3 изменённых файлов: 47 добавлений и 107 удалений

Просмотреть файл

@ -214,17 +214,14 @@ const ContentProcessTargetActor = TargetActorMixin(
}, },
destroy: function() { destroy: function() {
// Avoid reentrancy. We will destroy the Transport when emitting "destroyed", if (this.isDestroyed()) {
// which will force destroying all actors.
if (this.destroying) {
return; return;
} }
this.destroying = true; Resources.unwatchAllResources(this);
this.emit("destroyed"); this.emit("destroyed");
Actor.prototype.destroy.call(this); Actor.prototype.destroy.call(this);
Resources.unwatchAllResources(this);
if (this.threadActor) { if (this.threadActor) {
this.threadActor = null; this.threadActor = null;

Просмотреть файл

@ -77,26 +77,6 @@ function onContentProcessActorCreated(msg) {
watcher.notifyTargetAvailable(actor); watcher.notifyTargetAvailable(actor);
} }
function onContentProcessActorDestroyed(msg) {
const { watcherActorID } = msg.data;
const watcher = WatcherRegistry.getWatcher(watcherActorID);
if (!watcher) {
throw new Error(
`Receiving a content process actor destruction without a watcher actor ${watcherActorID}`
);
}
// Ignore watchers of other connections.
// We may have two browser toolbox connected to the same process.
// This will spawn two distinct Watcher actor and two distinct process target helper module.
// Avoid processing the event many times, otherwise we will notify about the same target
// multiple times.
if (!watchers.has(watcher)) {
return;
}
const messageManager = msg.target;
unregisterWatcherForMessageManager(watcher, messageManager);
}
function onMessageManagerClose(messageManager, topic, data) { function onMessageManagerClose(messageManager, topic, data) {
const list = actors.get(messageManager); const list = actors.get(messageManager);
if (!list || list.length == 0) { if (!list || list.length == 0) {
@ -113,52 +93,38 @@ function onMessageManagerClose(messageManager, topic, data) {
actors.delete(messageManager); actors.delete(messageManager);
} }
/**
* Unregister everything created for a given watcher against a precise message manager:
* - clear up things from `actors` WeakMap,
* - notify all related target actors as being destroyed,
* - close all DevTools Transports being created for each Message Manager.
*/
function unregisterWatcherForMessageManager(watcher, messageManager) {
const targetActorDescriptions = actors.get(messageManager);
if (!targetActorDescriptions || targetActorDescriptions.length == 0) {
return;
}
// Destroy all transports related to this watcher and tells the client to purge all related actors
const matchingTargetActorDescriptions = targetActorDescriptions.filter(
item => item.watcher === watcher
);
for (const {
prefix,
childTransport,
actor,
} of matchingTargetActorDescriptions) {
watcher.notifyTargetDestroyed(actor);
childTransport.close();
watcher.conn.cancelForwarding(prefix);
}
// Then update global `actors` WeakMap by stripping all data about this watcher
const remainingTargetActorDescriptions = targetActorDescriptions.filter(
item => item.watcher !== watcher
);
if (remainingTargetActorDescriptions.length == 0) {
actors.delete(messageManager);
} else {
actors.set(messageManager, remainingTargetActorDescriptions);
}
}
/**
* Destroy everything related to a given watcher that has been created in this module:
* (See unregisterWatcherForMessageManager)
*/
function closeWatcherTransports(watcher) { function closeWatcherTransports(watcher) {
for (let i = 0; i < Services.ppmm.childCount; i++) { for (let i = 0; i < Services.ppmm.childCount; i++) {
const messageManager = Services.ppmm.getChildAt(i); const messageManager = Services.ppmm.getChildAt(i);
unregisterWatcherForMessageManager(watcher, messageManager); const targetActorDescriptions = actors.get(messageManager);
if (!targetActorDescriptions || targetActorDescriptions.length == 0) {
continue;
}
// Destroy all transports related to this watcher and tells the client to purge all related actors
const matchingTargetActorDescriptions = targetActorDescriptions.filter(
item => item.watcher === watcher
);
for (const {
prefix,
childTransport,
actor,
} of matchingTargetActorDescriptions) {
watcher.notifyTargetDestroyed(actor);
childTransport.close();
watcher.conn.cancelForwarding(prefix);
}
// Then update global `actors` WeakMap by stripping all data about this watcher
const remainingTargetActorDescriptions = targetActorDescriptions.filter(
item => item.watcher !== watcher
);
if (remainingTargetActorDescriptions.length == 0) {
actors.delete(messageManager);
} else {
actors.set(messageManager, remainingTargetActorDescriptions);
}
} }
} }
@ -170,10 +136,6 @@ function maybeRegisterMessageListeners(watcher) {
"debug:content-process-actor", "debug:content-process-actor",
onContentProcessActorCreated onContentProcessActorCreated
); );
Services.ppmm.addMessageListener(
"debug:content-process-actor-destroyed",
onContentProcessActorDestroyed
);
Services.obs.addObserver(onMessageManagerClose, "message-manager-close"); Services.obs.addObserver(onMessageManagerClose, "message-manager-close");
// Load the content process server startup script only once, // Load the content process server startup script only once,
@ -199,10 +161,6 @@ function maybeUnregisterMessageListeners(watcher) {
"debug:content-process-actor", "debug:content-process-actor",
onContentProcessActorCreated onContentProcessActorCreated
); );
Services.ppmm.removeMessageListener(
"debug:content-process-actor-destroyed",
onContentProcessActorDestroyed
);
Services.obs.removeObserver(onMessageManagerClose, "message-manager-close"); Services.obs.removeObserver(onMessageManagerClose, "message-manager-close");
// We inconditionally remove the process script, while we should only remove it // We inconditionally remove the process script, while we should only remove it

Просмотреть файл

@ -60,44 +60,29 @@ function initContentProcessTarget(msg) {
const response = { watcherActorID, prefix, actor: actor.form() }; const response = { watcherActorID, prefix, actor: actor.form() };
mm.sendAsyncMessage("debug:content-process-actor", response); mm.sendAsyncMessage("debug:content-process-actor", response);
function onDestroy() { // Clean up things when the client disconnects
mm.removeMessageListener( mm.addMessageListener("debug:content-process-disconnect", function onDestroy(
"debug:content-process-disconnect", message
onContentProcessDisconnect ) {
);
actor.off("destroyed", onDestroy);
// Notify the parent process that the actor is being destroyed
mm.sendAsyncMessage("debug:content-process-actor-destroyed", {
watcherActorID,
});
// Call DevToolsServerConnection.close to destroy all child actors. It should end up
// calling DevToolsServerConnection.onTransportClosed that would actually cleanup all actor
// pools.
conn.close();
// Destroy the related loader when the target is destroyed
// and we were the last user of the special loader
releaseDistinctSystemPrincipalLoader(loaderRequester);
}
function onContentProcessDisconnect(message) {
if (message.data.prefix != prefix) { if (message.data.prefix != prefix) {
// Several copies of this process script can be running for a single process if // Several copies of this process script can be running for a single process if
// we are debugging the same process from multiple clients. // we are debugging the same process from multiple clients.
// If this disconnect request doesn't match a connection known here, ignore it. // If this disconnect request doesn't match a connection known here, ignore it.
return; return;
} }
onDestroy(); mm.removeMessageListener("debug:content-process-disconnect", onDestroy);
}
// Clean up things when the client disconnects // Call DevToolsServerConnection.close to destroy all child actors. It should end up
mm.addMessageListener( // calling DevToolsServerConnection.onTransportClosed that would actually cleanup all actor
"debug:content-process-disconnect", // pools.
onContentProcessDisconnect conn.close();
); });
// And also when the target actor is destroyed
actor.on("destroyed", onDestroy); // Destroy the related loader when the target is destroyed
// and we were the last user of the special loader
actor.once("destroyed", () => {
releaseDistinctSystemPrincipalLoader(loaderRequester);
});
return { return {
actor, actor,