Source code

Revision control

Copy as Markdown

Other Tools

/* 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/. */
export class FormHandlerParent extends JSWindowActorParent {
receiveMessage(message) {
switch (message.name) {
case "FormHandler:EnsureParentExists": {
// This dummy message is sent to make sure that the parent exists,
// because we use the existence of the parent to determine whether to
// notify the corresponding child when a page navigation occurs.
break;
}
case "FormHandler:NotifyNavigatedSubtree": {
this.onPageNavigated(message.data);
break;
}
case "FormHandler:RegisterProgressListenerAtTopLevel": {
this.registerProgressListenerAtTopLevel();
break;
}
}
}
/**
* Go through the subtree of the navigated browsing context and
* let the existing FormHandler parents (same-origin and cross-origin)
* notify their corresponding children of the detected page navigation
* If the current browsing context is the navigated one, skip it,
* because the page navigation was processed directly in the child.
*
* @param {BrowsingContext} navigatedBrowsingContext
*/
onPageNavigated(navigatedBrowsingContext) {
const browsingContexts =
navigatedBrowsingContext.getAllBrowsingContextsInSubtree();
if (this.browsingContext === navigatedBrowsingContext) {
// Don't notify the child of the navigated process root,
// since the page navigation was already processed in that child
browsingContexts.shift();
}
for (const context of browsingContexts) {
const windowGlobal = context.currentWindowGlobal;
if (!windowGlobal) {
continue;
}
// This next step doesn't create the FormHandler actor pair. We only
// check whether the FormHandlerParent already exists.
// If it exists, somebody in that window context registered an interest
// in form submissions, so we send a message.
// If it doesn't exist, then nobody in that window context is interested
// in the form submissions, so we don't need to send a message.
const formHandlerActor = windowGlobal.getExistingActor("FormHandler");
formHandlerActor?.sendAsyncMessage(
"FormHandler:FormSubmissionByNavigation"
);
}
}
/**
* Send a dummy message to the FormHandlerChild of the top.
* This is to make sure that the top child is being created and has
* registered the progress listener that listens for page navigations.
*/
registerProgressListenerAtTopLevel() {
const topLevelFormHandler =
this.browsingContext.top.currentWindowGlobal.getActor("FormHandler");
topLevelFormHandler.sendAsyncMessage("FormHandler:EnsureChildExists");
}
}