Bug 1511281 - Update GeckoView user agent override to use docShell.customUserAgent r=snorp

Differential Revision: https://phabricator.services.mozilla.com/D13593

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Randall Barker 2018-12-14 14:40:06 +00:00
parent acfba8e927
commit 5d8ff39a09
2 changed files with 47 additions and 34 deletions

View File

@ -10,9 +10,31 @@ XPCOMUtils.defineLazyModuleGetters(this, {
GeckoViewUtils: "resource://gre/modules/GeckoViewUtils.jsm",
});
XPCOMUtils.defineLazyGetter(
this, "MOBILE_USER_AGENT",
function() {
return Cc["@mozilla.org/network/protocol;1?name=http"]
.getService(Ci.nsIHttpProtocolHandler).userAgent;
});
XPCOMUtils.defineLazyGetter(
this, "DESKTOP_USER_AGENT",
function() {
return MOBILE_USER_AGENT
.replace(/Android \d.+?; [a-zA-Z]+/, "X11; Linux x86_64")
.replace(/Gecko\/[0-9\.]+/, "Gecko/20100101");
});
XPCOMUtils.defineLazyGetter(
this, "VR_USER_AGENT",
function() {
return 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;
// Handles GeckoView content settings including:
// * tracking protection
@ -42,6 +64,19 @@ class GeckoViewSettingsChild extends GeckoViewChildModule {
docShell.useTrackingProtection = aUse;
}
get userAgent() {
if (this.userAgentOverride !== null) {
return this.userAgentOverride;
}
if (this.userAgentMode === USER_AGENT_MODE_DESKTOP) {
return DESKTOP_USER_AGENT;
}
if (this.userAgentMode === USER_AGENT_MODE_VR) {
return VR_USER_AGENT;
}
return null;
}
get userAgentMode() {
return this._userAgentMode;
}
@ -51,6 +86,12 @@ class GeckoViewSettingsChild extends GeckoViewChildModule {
return;
}
this._userAgentMode = aMode;
const docShell = content && GeckoViewUtils.getRootDocShell(content);
if (docShell) {
docShell.customUserAgent = this.userAgent;
} else {
warn `Failed to set custom user agent. Doc shell not found`;
}
if (this._userAgentOverride !== null) {
return;
}
@ -67,6 +108,12 @@ class GeckoViewSettingsChild extends GeckoViewChildModule {
return;
}
this._userAgentOverride = aUserAgent;
const docShell = content && GeckoViewUtils.getRootDocShell(content);
if (docShell) {
docShell.customUserAgent = this.userAgent;
} else {
warn `Failed to set custom user agent. Doc shell not found`;
}
const utils = content.windowUtils;
if (aUserAgent === null) {
utils.setDesktopModeViewport(this._userAgentMode === USER_AGENT_MODE_DESKTOP);

View File

@ -11,7 +11,6 @@ ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetters(this, {
SafeBrowsing: "resource://gre/modules/SafeBrowsing.jsm",
Services: "resource://gre/modules/Services.jsm",
});
XPCOMUtils.defineLazyGetter(
@ -80,22 +79,6 @@ class GeckoViewSettings extends GeckoViewModule {
return this.browser.isRemoteBrowser;
}
observe(aSubject, aTopic, aData) {
debug `observer`;
let channel = aSubject.QueryInterface(Ci.nsIHttpChannel);
if (this.browser.outerWindowID !== channel.topLevelOuterContentWindowId) {
return;
}
if (this.userAgentOverride !== null ||
this.userAgentMode === USER_AGENT_MODE_DESKTOP ||
this.userAgentMode === USER_AGENT_MODE_VR) {
channel.setRequestHeader("User-Agent", this.userAgent, false);
}
}
get userAgent() {
if (this.userAgentOverride !== null) {
return this.userAgentOverride;
@ -117,7 +100,6 @@ class GeckoViewSettings extends GeckoViewModule {
if (this.userAgentMode === aMode) {
return;
}
this.updateUserAgentObserver(this._userAgentOverride, aMode);
this._userAgentMode = aMode;
}
@ -126,25 +108,9 @@ class GeckoViewSettings extends GeckoViewModule {
}
set userAgentOverride(aUserAgent) {
this.updateUserAgentObserver(aUserAgent, this._userAgentMode);
this._userAgentOverride = aUserAgent;
}
updateUserAgentObserver(aUserAgent, aMode) {
const wasAdded = this.userAgentOverride !== null || this.userAgentMode !== USER_AGENT_MODE_MOBILE;
const shouldAdd = aUserAgent !== null || aMode !== USER_AGENT_MODE_MOBILE;
try {
if (wasAdded && !shouldAdd) {
Services.obs.removeObserver(this, "http-on-useragent-request");
} else if (!wasAdded && shouldAdd) {
Services.obs.addObserver(this, "http-on-useragent-request");
}
} catch (e) {
warn `Caught exception while adding/removing "http-on-useragent-request" observer: ${e.message}`;
}
}
get displayMode() {
return this.window.docShell.displayMode;
}