1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/* 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/. */
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
Log: "chrome://remote/content/shared/Log.sys.mjs",
NodeCache: "chrome://remote/content/shared/webdriver/NodeCache.sys.mjs",
});
XPCOMUtils.defineLazyGetter(lazy, "logger", () => lazy.Log.get());
// Observer to clean-up element references for closed browsing contexts.
class BrowsingContextObserver {
constructor(actor) {
this.actor = actor;
}
async observe(subject, topic, data) {
if (topic === "browsing-context-discarded") {
this.actor.cleanUp({ browsingContext: subject });
}
}
}
export class WebDriverProcessDataChild extends JSProcessActorChild {
#browsingContextObserver;
#nodeCache;
constructor() {
super();
// For now have a single reference store only. Once multiple WebDriver
// sessions are supported, it needs to be hashed by the session id.
this.#nodeCache = new lazy.NodeCache();
// Register observer to cleanup element references when a browsing context
// gets destroyed.
this.#browsingContextObserver = new BrowsingContextObserver(this);
Services.obs.addObserver(
this.#browsingContextObserver,
"browsing-context-discarded"
);
}
actorCreated() {
lazy.logger.trace(
`WebDriverProcessData actor created for PID ${Services.appinfo.processID}`
);
}
didDestroy() {
Services.obs.removeObserver(
this.#browsingContextObserver,
"browsing-context-discarded"
);
}
/**
* Clean up all the process specific data.
*
* @param {object=} options
* @param {BrowsingContext=} options.browsingContext
* If specified only clear data living in that browsing context.
*/
cleanUp(options = {}) {
const { browsingContext = null } = options;
this.#nodeCache.clear({ browsingContext });
}
/**
* Get the node cache.
*
* @returns {NodeCache}
* The cache containing DOM node references.
*/
getNodeCache() {
return this.#nodeCache;
}
async receiveMessage(msg) {
switch (msg.name) {
case "WebDriverProcessDataParent:CleanUp":
return this.cleanUp(msg.data);
default:
return Promise.reject(
new Error(`Unexpected message received: ${msg.name}`)
);
}
}
}
|