mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-07 09:54:42 +00:00
Bug 1725111 - [remote] Use contextDescriptor as broadcasting argument for MessageHandler commands r=webdriver-reviewers,whimboo
Instead of using a broadcast boolean flag in the CommandDestination, use a contextDescriptor. The only context descriptor type supported here is CONTEXT_DESCRIPTOR_TYPES.ALL, and the behavior is unchanged. Differential Revision: https://phabricator.services.mozilla.com/D131439
This commit is contained in:
parent
81698c54eb
commit
db1ebd69a8
@ -169,9 +169,14 @@ class MessageHandler extends EventEmitter {
|
|||||||
* @typedef {Object} CommandDestination
|
* @typedef {Object} CommandDestination
|
||||||
* @property {String} type
|
* @property {String} type
|
||||||
* One of MessageHandler.type.
|
* One of MessageHandler.type.
|
||||||
* @property {String} id
|
* @property {String=} id
|
||||||
* Unique context identifier. The format depends on the type.
|
* Unique context identifier. The format depends on the type.
|
||||||
* For WINDOW_GLOBAL destinations, this is a browsing context id.
|
* For WINDOW_GLOBAL destinations, this is a browsing context id.
|
||||||
|
* Optional, should only be provided if `contextDescriptor` is missing.
|
||||||
|
* @property {ContextDescriptor=} contextDescriptor
|
||||||
|
* Descriptor used to match several contexts, which will all receive the
|
||||||
|
* command.
|
||||||
|
* Optional, should only be provided if `id` is missing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,6 +31,9 @@ function sendTestBroadcastCommand(module, command, params, rootMessageHandler) {
|
|||||||
const { WindowGlobalMessageHandler } = ChromeUtils.import(
|
const { WindowGlobalMessageHandler } = ChromeUtils.import(
|
||||||
"chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.jsm"
|
"chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.jsm"
|
||||||
);
|
);
|
||||||
|
const { CONTEXT_DESCRIPTOR_TYPES } = ChromeUtils.import(
|
||||||
|
"chrome://remote/content/shared/messagehandler/MessageHandler.jsm"
|
||||||
|
);
|
||||||
|
|
||||||
info("Send a test broadcast command");
|
info("Send a test broadcast command");
|
||||||
return rootMessageHandler.handleCommand({
|
return rootMessageHandler.handleCommand({
|
||||||
@ -38,8 +41,10 @@ function sendTestBroadcastCommand(module, command, params, rootMessageHandler) {
|
|||||||
commandName: command,
|
commandName: command,
|
||||||
params,
|
params,
|
||||||
destination: {
|
destination: {
|
||||||
|
contextDescriptor: {
|
||||||
|
type: CONTEXT_DESCRIPTOR_TYPES.ALL,
|
||||||
|
},
|
||||||
type: WindowGlobalMessageHandler.type,
|
type: WindowGlobalMessageHandler.type,
|
||||||
broadcast: true,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ const { XPCOMUtils } = ChromeUtils.import(
|
|||||||
XPCOMUtils.defineLazyModuleGetters(this, {
|
XPCOMUtils.defineLazyModuleGetters(this, {
|
||||||
Services: "resource://gre/modules/Services.jsm",
|
Services: "resource://gre/modules/Services.jsm",
|
||||||
|
|
||||||
|
CONTEXT_DESCRIPTOR_TYPES:
|
||||||
|
"chrome://remote/content/shared/messagehandler/MessageHandler.jsm",
|
||||||
MessageHandlerFrameActor:
|
MessageHandlerFrameActor:
|
||||||
"chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameActor.jsm",
|
"chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameActor.jsm",
|
||||||
});
|
});
|
||||||
@ -46,9 +48,9 @@ class FrameTransport {
|
|||||||
* being processed by WINDOW_GLOBAL MessageHandlers.
|
* being processed by WINDOW_GLOBAL MessageHandlers.
|
||||||
*/
|
*/
|
||||||
forwardCommand(command) {
|
forwardCommand(command) {
|
||||||
if (command.destination.id && command.destination.broadcast) {
|
if (command.destination.id && command.destination.contextDescriptor) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Invalid command destination with both 'id' and 'broadcast' properties"
|
"Invalid command destination with both 'id' and 'contextDescriptor' properties"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,18 +65,21 @@ class FrameTransport {
|
|||||||
return this._sendCommandToBrowsingContext(command, browsingContext);
|
return this._sendCommandToBrowsingContext(command, browsingContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ... otherwise broadcast to all registered destinations.
|
// ... otherwise broadcast to destinations matching the contextDescriptor.
|
||||||
if (command.destination.broadcast) {
|
if (command.destination.contextDescriptor) {
|
||||||
return this._broadcastCommand(command);
|
return this._broadcastCommand(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Unrecognized command destination, missing 'id' or 'broadcast' properties"
|
"Unrecognized command destination, missing 'id' or 'contextDescriptor' properties"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
_broadcastCommand(command) {
|
_broadcastCommand(command) {
|
||||||
const browsingContexts = this._getAllBrowsingContexts();
|
const { contextDescriptor } = command.destination;
|
||||||
|
const browsingContexts = this._getBrowsingContextsForDescriptor(
|
||||||
|
contextDescriptor
|
||||||
|
);
|
||||||
|
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
browsingContexts.map(async browsingContext => {
|
browsingContexts.map(async browsingContext => {
|
||||||
@ -104,6 +109,18 @@ class FrameTransport {
|
|||||||
return `[object ${this.constructor.name} ${this._messageHandler.name}]`;
|
return `[object ${this.constructor.name} ${this._messageHandler.name}]`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getBrowsingContextsForDescriptor(contextDescriptor) {
|
||||||
|
const { type } = contextDescriptor;
|
||||||
|
if (type === CONTEXT_DESCRIPTOR_TYPES.ALL) {
|
||||||
|
return this._getAllBrowsingContexts();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Handle other types of context descriptors.
|
||||||
|
throw new Error(
|
||||||
|
`Unsupported contextDescriptor type for broadcasting: ${type}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
_getAllBrowsingContexts() {
|
_getAllBrowsingContexts() {
|
||||||
let browsingContexts = [];
|
let browsingContexts = [];
|
||||||
// Fetch all top level window's browsing contexts
|
// Fetch all top level window's browsing contexts
|
||||||
|
@ -11,6 +11,8 @@ const { XPCOMUtils } = ChromeUtils.import(
|
|||||||
);
|
);
|
||||||
|
|
||||||
XPCOMUtils.defineLazyModuleGetters(this, {
|
XPCOMUtils.defineLazyModuleGetters(this, {
|
||||||
|
CONTEXT_DESCRIPTOR_TYPES:
|
||||||
|
"chrome://remote/content/shared/messagehandler/MessageHandler.jsm",
|
||||||
Module: "chrome://remote/content/shared/messagehandler/Module.jsm",
|
Module: "chrome://remote/content/shared/messagehandler/Module.jsm",
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -30,7 +32,7 @@ class Log extends Module {
|
|||||||
moduleName: "log",
|
moduleName: "log",
|
||||||
category: "event",
|
category: "event",
|
||||||
contextDescriptor: {
|
contextDescriptor: {
|
||||||
type: "all",
|
type: CONTEXT_DESCRIPTOR_TYPES.ALL,
|
||||||
},
|
},
|
||||||
values: ["log.entryAdded"],
|
values: ["log.entryAdded"],
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user