2020-06-03 02:51:13 +03:00
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
|
|
const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
|
|
|
|
const {FrameTree} = ChromeUtils.import('chrome://juggler/content/content/FrameTree.js');
|
|
|
|
const {SimpleChannel} = ChromeUtils.import('chrome://juggler/content/SimpleChannel.js');
|
|
|
|
const {PageAgent} = ChromeUtils.import('chrome://juggler/content/content/PageAgent.js');
|
|
|
|
|
|
|
|
let frameTree;
|
|
|
|
const helper = new Helper();
|
|
|
|
const messageManager = this;
|
|
|
|
|
2020-10-02 14:13:42 +03:00
|
|
|
let pageAgent;
|
2020-06-03 02:51:13 +03:00
|
|
|
|
|
|
|
let failedToOverrideTimezone = false;
|
|
|
|
|
|
|
|
const applySetting = {
|
|
|
|
geolocation: (geolocation) => {
|
|
|
|
if (geolocation) {
|
|
|
|
docShell.setGeolocationOverride({
|
|
|
|
coords: {
|
|
|
|
latitude: geolocation.latitude,
|
|
|
|
longitude: geolocation.longitude,
|
|
|
|
accuracy: geolocation.accuracy,
|
|
|
|
altitude: NaN,
|
|
|
|
altitudeAccuracy: NaN,
|
|
|
|
heading: NaN,
|
|
|
|
speed: NaN,
|
|
|
|
},
|
|
|
|
address: null,
|
|
|
|
timestamp: Date.now()
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
docShell.setGeolocationOverride(null);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
onlineOverride: (onlineOverride) => {
|
|
|
|
if (!onlineOverride) {
|
|
|
|
docShell.onlineOverride = Ci.nsIDocShell.ONLINE_OVERRIDE_NONE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
docShell.onlineOverride = onlineOverride === 'online' ?
|
|
|
|
Ci.nsIDocShell.ONLINE_OVERRIDE_ONLINE : Ci.nsIDocShell.ONLINE_OVERRIDE_OFFLINE;
|
|
|
|
},
|
|
|
|
|
|
|
|
bypassCSP: (bypassCSP) => {
|
|
|
|
docShell.bypassCSPEnabled = bypassCSP;
|
|
|
|
},
|
|
|
|
|
|
|
|
timezoneId: (timezoneId) => {
|
|
|
|
failedToOverrideTimezone = !docShell.overrideTimezone(timezoneId);
|
|
|
|
},
|
|
|
|
|
|
|
|
locale: (locale) => {
|
|
|
|
docShell.languageOverride = locale;
|
|
|
|
},
|
|
|
|
|
|
|
|
javaScriptDisabled: (javaScriptDisabled) => {
|
|
|
|
docShell.allowJavascript = !javaScriptDisabled;
|
|
|
|
},
|
|
|
|
|
2021-05-14 18:06:34 +03:00
|
|
|
scrollbarsHidden: (hidden) => {
|
|
|
|
frameTree.setScrollbarsHidden(hidden);
|
|
|
|
},
|
|
|
|
|
2020-06-03 02:51:13 +03:00
|
|
|
colorScheme: (colorScheme) => {
|
|
|
|
frameTree.setColorScheme(colorScheme);
|
|
|
|
},
|
2021-05-18 22:23:12 +03:00
|
|
|
|
|
|
|
reducedMotion: (reducedMotion) => {
|
|
|
|
frameTree.setReducedMotion(reducedMotion);
|
|
|
|
},
|
2021-06-09 02:00:15 +03:00
|
|
|
|
|
|
|
forcedColors: (forcedColors) => {
|
|
|
|
frameTree.setForcedColors(forcedColors);
|
|
|
|
},
|
2020-06-03 02:51:13 +03:00
|
|
|
};
|
|
|
|
|
2020-10-02 14:13:42 +03:00
|
|
|
const channel = SimpleChannel.createForMessageManager('content::page', messageManager);
|
|
|
|
|
2020-06-03 02:51:13 +03:00
|
|
|
function initialize() {
|
2020-10-01 09:50:02 +03:00
|
|
|
const response = sendSyncMessage('juggler:content-ready')[0];
|
|
|
|
// If we didn't get a response, then we don't want to do anything
|
|
|
|
// as a part of this frame script.
|
|
|
|
if (!response)
|
|
|
|
return;
|
2020-06-03 02:51:13 +03:00
|
|
|
const {
|
|
|
|
scriptsToEvaluateOnNewDocument = [],
|
|
|
|
bindings = [],
|
|
|
|
settings = {}
|
|
|
|
} = response || {};
|
|
|
|
|
|
|
|
// Enforce focused state for all top level documents.
|
|
|
|
docShell.overrideHasFocus = true;
|
2020-11-06 04:53:22 +03:00
|
|
|
docShell.forceActiveState = true;
|
2020-06-03 02:51:13 +03:00
|
|
|
frameTree = new FrameTree(docShell);
|
|
|
|
for (const [name, value] of Object.entries(settings)) {
|
|
|
|
if (value !== undefined)
|
|
|
|
applySetting[name](value);
|
|
|
|
}
|
2021-05-11 19:27:39 +03:00
|
|
|
for (const { worldName, name, script } of bindings)
|
|
|
|
frameTree.addBinding(worldName, name, script);
|
2021-05-12 18:52:08 +03:00
|
|
|
for (const script of scriptsToEvaluateOnNewDocument)
|
|
|
|
frameTree.addScriptToEvaluateOnNewDocument(script);
|
2020-06-03 02:51:13 +03:00
|
|
|
|
2020-10-02 14:13:42 +03:00
|
|
|
pageAgent = new PageAgent(messageManager, channel, frameTree);
|
2020-06-03 02:51:13 +03:00
|
|
|
|
|
|
|
channel.register('', {
|
|
|
|
addScriptToEvaluateOnNewDocument(script) {
|
|
|
|
frameTree.addScriptToEvaluateOnNewDocument(script);
|
|
|
|
},
|
|
|
|
|
2021-05-11 19:27:39 +03:00
|
|
|
addBinding({worldName, name, script}) {
|
|
|
|
frameTree.addBinding(worldName, name, script);
|
2020-06-03 02:51:13 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
applyContextSetting({name, value}) {
|
|
|
|
applySetting[name](value);
|
|
|
|
},
|
|
|
|
|
|
|
|
ensurePermissions() {
|
|
|
|
// noop, just a rountrip.
|
|
|
|
},
|
|
|
|
|
|
|
|
hasFailedToOverrideTimezone() {
|
|
|
|
return failedToOverrideTimezone;
|
|
|
|
},
|
|
|
|
|
2021-03-03 05:52:19 +03:00
|
|
|
async awaitViewportDimensions({width, height, deviceSizeIsPageSize}) {
|
|
|
|
docShell.deviceSizeIsPageSize = deviceSizeIsPageSize;
|
2020-06-03 02:51:13 +03:00
|
|
|
const win = docShell.domWindow;
|
|
|
|
if (win.innerWidth === width && win.innerHeight === height)
|
|
|
|
return;
|
|
|
|
await new Promise(resolve => {
|
|
|
|
const listener = helper.addEventListener(win, 'resize', () => {
|
|
|
|
if (win.innerWidth === width && win.innerHeight === height) {
|
|
|
|
helper.removeListeners([listener]);
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
dispose() {
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const gListeners = [
|
|
|
|
helper.addEventListener(messageManager, 'unload', msg => {
|
|
|
|
helper.removeListeners(gListeners);
|
2020-10-02 14:13:42 +03:00
|
|
|
pageAgent.dispose();
|
2020-06-03 02:51:13 +03:00
|
|
|
frameTree.dispose();
|
2020-10-02 14:13:42 +03:00
|
|
|
channel.dispose();
|
2020-06-03 02:51:13 +03:00
|
|
|
}),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
initialize();
|