fune/devtools/shared/specs/index.js
Alexandre Poirot 6b018ef63f Bug 1875045 - [devtools] Release Object actors by bulk. r=devtools-reviewers,devtools-backward-compat-reviewers,nchevobbe
For now we were releasing object actors one by one.
This would force to send an individual RDP request for each of them.
The console often release all objects actors related to older console message
going over the maximum limit of displayed console messages (10k).
This can easily grow in a large number of actors to be released,
either if console message are receiving many arguments and/or
if many console are logged.

We have to have one request per target as the actors could only be reached
within same-thread actor.
In order to prepare for ObjectFront removal, introduce a target-scoped "Objects" actor
which is a singleton per Target. It will receive the new "release in bulk objects actors"
method. Later, it will start implementing all the existing methods of the Object Actor
in order to migrate away from having to instantiate one Object Front (notice the singular on "Object"),
per inspected JS Object.

On the fronted side a new Object Command is introduced in order to abstract away the RDP/Fronts work.

Differential Revision: https://phabricator.services.mozilla.com/D198784
2024-01-29 13:59:51 +00:00

409 lines
11 KiB
JavaScript

/* 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/. */
"use strict";
// Registry indexing all specs and front modules
//
// All spec and front modules should be listed here
// in order to be referenced by any other spec or front module.
// Declare in which spec module and front module a set of types are defined.
// This array should be sorted by `spec` attribute, and this is verified in the
// test devtools/shared/protocol/tests/xpcshell/test_protocol_index.js
const Types = (exports.__TypesForTests = [
{
types: [
"accessible",
"accessiblewalker",
"accessibility",
"parentaccessibility",
],
spec: "devtools/shared/specs/accessibility",
front: "devtools/client/fronts/accessibility",
},
{
types: ["addons"],
spec: "devtools/shared/specs/addon/addons",
front: "devtools/client/fronts/addon/addons",
},
{
types: ["webExtensionInspectedWindow"],
spec: "devtools/shared/specs/addon/webextension-inspected-window",
front: "devtools/client/fronts/addon/webextension-inspected-window",
},
{
types: ["animationplayer", "animations"],
spec: "devtools/shared/specs/animation",
front: "devtools/client/fronts/animation",
},
{
types: ["arraybuffer"],
spec: "devtools/shared/specs/array-buffer",
front: "devtools/client/fronts/array-buffer",
},
{
types: ["blackboxing"],
spec: "devtools/shared/specs/blackboxing",
front: "devtools/client/fronts/blackboxing",
},
{
types: ["breakpoint-list"],
spec: "devtools/shared/specs/breakpoint-list",
front: "devtools/client/fronts/breakpoint-list",
},
{
types: ["changes"],
spec: "devtools/shared/specs/changes",
front: "devtools/client/fronts/changes",
},
{
types: ["compatibility"],
spec: "devtools/shared/specs/compatibility",
front: "devtools/client/fronts/compatibility",
},
{
types: ["cssProperties"],
spec: "devtools/shared/specs/css-properties",
front: "devtools/client/fronts/css-properties",
},
{
types: ["processDescriptor"],
spec: "devtools/shared/specs/descriptors/process",
front: "devtools/client/fronts/descriptors/process",
},
{
types: ["tabDescriptor"],
spec: "devtools/shared/specs/descriptors/tab",
front: "devtools/client/fronts/descriptors/tab",
},
{
types: ["webExtensionDescriptor"],
spec: "devtools/shared/specs/descriptors/webextension",
front: "devtools/client/fronts/descriptors/webextension",
},
{
types: ["workerDescriptor"],
spec: "devtools/shared/specs/descriptors/worker",
front: "devtools/client/fronts/descriptors/worker",
},
{
types: ["device"],
spec: "devtools/shared/specs/device",
front: "devtools/client/fronts/device",
},
{
types: ["environment"],
spec: "devtools/shared/specs/environment",
front: null,
},
{
types: ["frame"],
spec: "devtools/shared/specs/frame",
front: "devtools/client/fronts/frame",
},
/* heap snapshot has old fashion client and no front */
{
types: ["heapSnapshotFile"],
spec: "devtools/shared/specs/heap-snapshot-file",
front: null,
},
{
types: ["customhighlighter"],
spec: "devtools/shared/specs/highlighters",
front: "devtools/client/fronts/highlighters",
},
{
types: ["inspector"],
spec: "devtools/shared/specs/inspector",
front: "devtools/client/fronts/inspector",
},
{
types: ["flexbox", "grid", "layout"],
spec: "devtools/shared/specs/layout",
front: "devtools/client/fronts/layout",
},
{
types: ["manifest"],
spec: "devtools/shared/specs/manifest",
front: "devtools/client/fronts/manifest",
},
{
types: ["memory"],
spec: "devtools/shared/specs/memory",
front: "devtools/client/fronts/memory",
},
{
types: ["networkContent"],
spec: "devtools/shared/specs/network-content",
front: "devtools/client/fronts/network-content",
},
{
types: ["netEvent"],
spec: "devtools/shared/specs/network-event",
front: null,
},
{
types: ["networkParent"],
spec: "devtools/shared/specs/network-parent",
front: "devtools/client/fronts/network-parent",
},
/* imageData isn't an actor but just a DictType */
{
types: ["imageData", "disconnectedNode", "disconnectedNodeArray"],
spec: "devtools/shared/specs/node",
front: null,
},
{
types: ["domnode", "domnodelist"],
spec: "devtools/shared/specs/node",
front: "devtools/client/fronts/node",
},
{
types: ["obj", "object.descriptor"],
spec: "devtools/shared/specs/object",
front: null,
},
{
types: ["objects-manager"],
spec: "devtools/shared/specs/objects-manager",
front: "devtools/client/fronts/objects-manager",
},
{
types: ["pagestyle"],
spec: "devtools/shared/specs/page-style",
front: "devtools/client/fronts/page-style",
},
{
types: ["perf"],
spec: "devtools/shared/specs/perf",
front: "devtools/client/fronts/perf",
},
{
types: ["preference"],
spec: "devtools/shared/specs/preference",
front: "devtools/client/fronts/preference",
},
{
types: ["privatePropertiesIterator"],
spec: "devtools/shared/specs/private-properties-iterator",
front: "devtools/client/fronts/private-properties-iterator",
},
{
types: ["propertyIterator"],
spec: "devtools/shared/specs/property-iterator",
front: "devtools/client/fronts/property-iterator",
},
{
types: ["reflow"],
spec: "devtools/shared/specs/reflow",
front: "devtools/client/fronts/reflow",
},
{
types: ["responsive"],
spec: "devtools/shared/specs/responsive",
front: "devtools/client/fronts/responsive",
},
{
types: ["root"],
spec: "devtools/shared/specs/root",
front: "devtools/client/fronts/root",
},
{
types: ["screenshot"],
spec: "devtools/shared/specs/screenshot",
front: "devtools/client/fronts/screenshot",
},
{
types: ["screenshot-content"],
spec: "devtools/shared/specs/screenshot-content",
front: "devtools/client/fronts/screenshot-content",
},
{
types: ["source"],
spec: "devtools/shared/specs/source",
front: "devtools/client/fronts/source",
},
{
types: [
"Cache",
"cookies",
"localStorage",
"extensionStorage",
"indexedDB",
"sessionStorage",
],
spec: "devtools/shared/specs/storage",
front: "devtools/client/fronts/storage",
},
/* longstring is special, it has a wrapper type. See its spec module */
{
types: ["longstring"],
spec: "devtools/shared/specs/string",
front: null,
},
{
types: ["longstractor"],
spec: "devtools/shared/specs/string",
front: "devtools/client/fronts/string",
},
{
types: ["domstylerule"],
spec: "devtools/shared/specs/style-rule",
front: "devtools/client/fronts/style-rule",
},
{
types: ["stylesheets"],
spec: "devtools/shared/specs/style-sheets",
front: "devtools/client/fronts/style-sheets",
},
{
types: ["symbol"],
spec: "devtools/shared/specs/symbol",
front: null,
},
{
types: ["symbolIterator"],
spec: "devtools/shared/specs/symbol-iterator",
front: "devtools/client/fronts/symbol-iterator",
},
{
types: ["target-configuration"],
spec: "devtools/shared/specs/target-configuration",
front: "devtools/client/fronts/target-configuration",
},
{
types: ["contentProcessTarget"],
spec: "devtools/shared/specs/targets/content-process",
front: null,
},
{
types: ["parentProcessTarget"],
spec: "devtools/shared/specs/targets/parent-process",
front: null,
},
{
types: ["webExtensionTarget"],
spec: "devtools/shared/specs/targets/webextension",
front: null,
},
{
types: ["windowGlobalTarget"],
spec: "devtools/shared/specs/targets/window-global",
front: "devtools/client/fronts/targets/window-global",
},
{
types: ["workerTarget"],
spec: "devtools/shared/specs/targets/worker",
front: "devtools/client/fronts/targets/worker",
},
{
types: ["thread"],
spec: "devtools/shared/specs/thread",
front: "devtools/client/fronts/thread",
},
{
types: ["thread-configuration"],
spec: "devtools/shared/specs/thread-configuration",
front: "devtools/client/fronts/thread-configuration",
},
{
types: ["tracer"],
spec: "devtools/shared/specs/tracer",
front: "devtools/client/fronts/tracer",
},
{
types: ["domwalker"],
spec: "devtools/shared/specs/walker",
front: "devtools/client/fronts/walker",
},
{
types: ["watcher"],
spec: "devtools/shared/specs/watcher",
front: "devtools/client/fronts/watcher",
},
{
types: ["console"],
spec: "devtools/shared/specs/webconsole",
front: "devtools/client/fronts/webconsole",
},
{
types: ["pushSubscription"],
spec: "devtools/shared/specs/worker/push-subscription",
front: "devtools/client/fronts/worker/push-subscription",
},
{
types: ["serviceWorker"],
spec: "devtools/shared/specs/worker/service-worker",
front: "devtools/client/fronts/worker/service-worker",
},
{
types: ["serviceWorkerRegistration"],
spec: "devtools/shared/specs/worker/service-worker-registration",
front: "devtools/client/fronts/worker/service-worker-registration",
},
]);
const lazySpecs = new Map();
const lazyFronts = new Map();
// Convert the human readable `Types` list into efficient maps
Types.forEach(item => {
item.types.forEach(type => {
lazySpecs.set(type, item.spec);
lazyFronts.set(type, item.front);
});
});
/**
* Try lazy loading spec module for the given type.
*
* @param [string] type
* Type name
*
* @returns true, if it matched a lazy loaded type and tried to load it.
*/
function lazyLoadSpec(type) {
const modulePath = lazySpecs.get(type);
if (modulePath) {
try {
require(modulePath);
} catch (e) {
throw new Error(
`Unable to load lazy spec module '${modulePath}' for type '${type}'.
Error: ${e}`
);
}
lazySpecs.delete(type);
return true;
}
return false;
}
exports.lazyLoadSpec = lazyLoadSpec;
/**
* Try lazy loading front module for the given type.
*
* @param [string] type
* Type name
*
* @returns true, if it matched a lazy loaded type and tried to load it.
*/
function lazyLoadFront(type) {
const modulePath = lazyFronts.get(type);
if (modulePath) {
try {
require(modulePath);
} catch (e) {
throw new Error(
`Unable to load lazy front module '${modulePath}' for type '${type}'.
Error: ${e}`
);
}
lazyFronts.delete(type);
return true;
}
return false;
}
exports.lazyLoadFront = lazyLoadFront;