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
|
/* 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/. */
/* eslint-disable no-restricted-globals */
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
event: "chrome://remote/content/marionette/event.sys.mjs",
Log: "chrome://remote/content/shared/Log.sys.mjs",
});
XPCOMUtils.defineLazyGetter(lazy, "logger", () =>
lazy.Log.get(lazy.Log.TYPES.MARIONETTE)
);
export class MarionetteEventsChild extends JSWindowActorChild {
get innerWindowId() {
return this.manager.innerWindowId;
}
actorCreated() {
// Prevent the logger from being created if the current log level
// isn't set to 'trace'. This is important for a faster content process
// creation when Marionette is running.
if (lazy.Log.isTraceLevelOrOrMore) {
lazy.logger.trace(
`[${this.browsingContext.id}] MarionetteEvents actor created ` +
`for window id ${this.innerWindowId}`
);
}
}
handleEvent({ target, type }) {
if (!Services.cpmm.sharedData.get("MARIONETTE_EVENTS_ENABLED")) {
// The parent process will set MARIONETTE_EVENTS_ENABLED to false when
// the Marionette session ends to avoid unnecessary inter process
// communications
return;
}
// Ignore invalid combinations of load events and document's readyState.
if (
(type === "DOMContentLoaded" && target.readyState != "interactive") ||
(type === "pageshow" && target.readyState != "complete")
) {
lazy.logger.warn(
`Ignoring event '${type}' because document has an invalid ` +
`readyState of '${target.readyState}'.`
);
return;
}
switch (type) {
case "beforeunload":
case "DOMContentLoaded":
case "hashchange":
case "pagehide":
case "pageshow":
case "popstate":
this.sendAsyncMessage("MarionetteEventsChild:PageLoadEvent", {
browsingContext: this.browsingContext,
documentURI: target.documentURI,
readyState: target.readyState,
type,
windowId: this.innerWindowId,
});
break;
// Listen for click event to indicate one click has happened, so actions
// code can send dblclick event
case "click":
lazy.event.DoubleClickTracker.setClick();
break;
case "dblclick":
case "unload":
lazy.event.DoubleClickTracker.resetClick();
break;
}
}
}
|