зеркало из https://github.com/mozilla/gecko-dev.git
192 строки
5.2 KiB
JavaScript
192 строки
5.2 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";
|
|
|
|
var EXPORTED_SYMBOLS = ["GeckoViewSettings"];
|
|
|
|
const { GeckoViewModule } = ChromeUtils.import(
|
|
"resource://gre/modules/GeckoViewModule.jsm"
|
|
);
|
|
|
|
const { XPCOMUtils } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/XPCOMUtils.sys.mjs"
|
|
);
|
|
|
|
const lazy = {};
|
|
|
|
XPCOMUtils.defineLazyGetter(lazy, "MOBILE_USER_AGENT", function() {
|
|
return Cc["@mozilla.org/network/protocol;1?name=http"].getService(
|
|
Ci.nsIHttpProtocolHandler
|
|
).userAgent;
|
|
});
|
|
|
|
XPCOMUtils.defineLazyGetter(lazy, "DESKTOP_USER_AGENT", function() {
|
|
return lazy.MOBILE_USER_AGENT.replace(
|
|
/Android \d.+?; [a-zA-Z]+/,
|
|
"X11; Linux x86_64"
|
|
).replace(/Gecko\/[0-9\.]+/, "Gecko/20100101");
|
|
});
|
|
|
|
XPCOMUtils.defineLazyGetter(lazy, "VR_USER_AGENT", function() {
|
|
return lazy.MOBILE_USER_AGENT.replace(/Mobile/, "Mobile VR");
|
|
});
|
|
|
|
// This needs to match GeckoSessionSettings.java
|
|
const USER_AGENT_MODE_MOBILE = 0;
|
|
const USER_AGENT_MODE_DESKTOP = 1;
|
|
const USER_AGENT_MODE_VR = 2;
|
|
|
|
// This needs to match GeckoSessionSettings.java
|
|
const DISPLAY_MODE_BROWSER = 0;
|
|
const DISPLAY_MODE_MINIMAL_UI = 1;
|
|
const DISPLAY_MODE_STANDALONE = 2;
|
|
const DISPLAY_MODE_FULLSCREEN = 3;
|
|
|
|
// This needs to match GeckoSessionSettings.java
|
|
const VIEWPORT_MODE_MOBILE = 0;
|
|
const VIEWPORT_MODE_DESKTOP = 1;
|
|
|
|
// Handles GeckoSession settings.
|
|
class GeckoViewSettings extends GeckoViewModule {
|
|
onInit() {
|
|
debug`onInit`;
|
|
this._userAgentMode = USER_AGENT_MODE_MOBILE;
|
|
this._userAgentOverride = null;
|
|
this._sessionContextId = null;
|
|
|
|
this.registerListener(["GeckoView:GetUserAgent"]);
|
|
}
|
|
|
|
onEvent(aEvent, aData, aCallback) {
|
|
debug`onEvent ${aEvent} ${aData}`;
|
|
|
|
switch (aEvent) {
|
|
case "GeckoView:GetUserAgent": {
|
|
aCallback.onSuccess(this.customUserAgent ?? lazy.MOBILE_USER_AGENT);
|
|
}
|
|
}
|
|
}
|
|
|
|
onSettingsUpdate() {
|
|
const { settings } = this;
|
|
debug`onSettingsUpdate: ${settings}`;
|
|
|
|
this.displayMode = settings.displayMode;
|
|
this.unsafeSessionContextId = settings.unsafeSessionContextId;
|
|
this.userAgentMode = settings.userAgentMode;
|
|
this.userAgentOverride = settings.userAgentOverride;
|
|
this.sessionContextId = settings.sessionContextId;
|
|
this.suspendMediaWhenInactive = settings.suspendMediaWhenInactive;
|
|
this.allowJavascript = settings.allowJavascript;
|
|
this.viewportMode = settings.viewportMode;
|
|
this.useTrackingProtection = !!settings.useTrackingProtection;
|
|
|
|
// When the page is loading from the main process (e.g. from an extension
|
|
// page) we won't be able to query the actor here.
|
|
this.getActor("GeckoViewSettings")?.sendAsyncMessage(
|
|
"SettingsUpdate",
|
|
settings
|
|
);
|
|
}
|
|
|
|
get allowJavascript() {
|
|
return this.browsingContext.allowJavascript;
|
|
}
|
|
|
|
set allowJavascript(aAllowJavascript) {
|
|
this.browsingContext.allowJavascript = aAllowJavascript;
|
|
}
|
|
|
|
get customUserAgent() {
|
|
if (this.userAgentOverride !== null) {
|
|
return this.userAgentOverride;
|
|
}
|
|
if (this.userAgentMode === USER_AGENT_MODE_DESKTOP) {
|
|
return lazy.DESKTOP_USER_AGENT;
|
|
}
|
|
if (this.userAgentMode === USER_AGENT_MODE_VR) {
|
|
return lazy.VR_USER_AGENT;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
set useTrackingProtection(aUse) {
|
|
this.browsingContext.useTrackingProtection = aUse;
|
|
}
|
|
|
|
set viewportMode(aViewportMode) {
|
|
this.browsingContext.forceDesktopViewport =
|
|
aViewportMode == VIEWPORT_MODE_DESKTOP;
|
|
}
|
|
|
|
get userAgentMode() {
|
|
return this._userAgentMode;
|
|
}
|
|
|
|
set userAgentMode(aMode) {
|
|
if (this.userAgentMode === aMode) {
|
|
return;
|
|
}
|
|
this._userAgentMode = aMode;
|
|
this.browsingContext.customUserAgent = this.customUserAgent;
|
|
}
|
|
|
|
get browsingContext() {
|
|
return this.browser.browsingContext.top;
|
|
}
|
|
|
|
get userAgentOverride() {
|
|
return this._userAgentOverride;
|
|
}
|
|
|
|
set userAgentOverride(aUserAgent) {
|
|
if (aUserAgent === this.userAgentOverride) {
|
|
return;
|
|
}
|
|
this._userAgentOverride = aUserAgent;
|
|
this.browsingContext.customUserAgent = this.customUserAgent;
|
|
}
|
|
|
|
get suspendMediaWhenInactive() {
|
|
return this.browser.suspendMediaWhenInactive;
|
|
}
|
|
|
|
set suspendMediaWhenInactive(aSuspendMediaWhenInactive) {
|
|
if (aSuspendMediaWhenInactive != this.browser.suspendMediaWhenInactive) {
|
|
this.browser.suspendMediaWhenInactive = aSuspendMediaWhenInactive;
|
|
}
|
|
}
|
|
|
|
displayModeSettingToValue(aSetting) {
|
|
switch (aSetting) {
|
|
case DISPLAY_MODE_BROWSER:
|
|
return "browser";
|
|
case DISPLAY_MODE_MINIMAL_UI:
|
|
return "minimal-ui";
|
|
case DISPLAY_MODE_STANDALONE:
|
|
return "standalone";
|
|
case DISPLAY_MODE_FULLSCREEN:
|
|
return "fullscreen";
|
|
default:
|
|
warn`Invalid displayMode value ${aSetting}.`;
|
|
return "browser";
|
|
}
|
|
}
|
|
|
|
set displayMode(aMode) {
|
|
this.browsingContext.displayMode = this.displayModeSettingToValue(aMode);
|
|
}
|
|
|
|
set sessionContextId(aAttribute) {
|
|
this._sessionContextId = aAttribute;
|
|
}
|
|
|
|
get sessionContextId() {
|
|
return this._sessionContextId;
|
|
}
|
|
}
|
|
|
|
const { debug, warn } = GeckoViewSettings.initLogging("GeckoViewSettings");
|