ÂIPK !ú[about-compat/aboutCompat.htmlPK !<*¥Ç¨¨Saabout-compat/aboutCompat.jsPK !·shims/mochitest-shim-2.jsPK !<Œ$K*˜Àshims/mochitest-shim-3.jsPK ! { if (AppConstants.NIGHTLY_BUILD) { return "nightly"; } else if (AppConstants.MOZ_DEV_EDITION) { return "dev_edition"; } else if (AppConstants.EARLY_BETA_OR_EARLIER) { return "early_beta_or_earlier"; } else if (AppConstants.BETA_OR_RELEASE) { return "beta_or_release"; } return "unknown"; }, }, }; } }; PK ! { const prefName = `${extensionPrefNameBase}${name}`; const callback = () => { fire.async(name).catch(() => {}); // ignore Message Manager disconnects }; Services.prefs.addObserver(prefName, callback); return () => { Services.prefs.removeObserver(prefName, callback); }; }, }).api(), async getBranch(branchName) { const branch = `${extensionPrefNameBase}${branchName}.`; return Services.prefs.getChildList(branch).map(pref => { const name = pref.replace(branch, ""); return { name, value: Services.prefs.getBoolPref(pref) }; }); }, async getPref(name) { try { return Services.prefs.getBoolPref( `${extensionPrefNameBase}${name}` ); } catch (_) { return undefined; } }, async setPref(name, value) { Services.prefs.setBoolPref(`${extensionPrefNameBase}${name}`, value); }, }, }; } }; PK ! { switch (topic) { case "http-on-stop-request": { const { channelId } = subject.QueryInterface(Ci.nsIIdentChannel); this._unblockedChannelIds.delete(channelId); break; } case "urlclassifier-before-block-channel": { const channel = subject.QueryInterface( Ci.nsIUrlClassifierBlockedChannel ); const { channelId, url } = channel; let topHost; try { topHost = new URL(channel.topLevelUrl).hostname; } catch (_) { return; } for (const allowList of this._allowLists.values()) { for (const entry of allowList.values()) { const { matcher, hosts, notHosts } = entry; if (matcher.matches(url)) { if ( !notHosts?.has(topHost) && (hosts === true || hosts.has(topHost)) ) { this._unblockedChannelIds.add(channelId); channel.unblock(); return; } } } } break; } } }; Services.obs.addObserver(this._classifierObserver, "http-on-stop-request"); this._channelClassifier.addListener(this._classifierObserver); } stop() { if (!this._classifierObserver) { return; } Services.obs.removeObserver( this._classifierObserver, "http-on-stop-request" ); this._channelClassifier.removeListener(this._classifierObserver); delete this._channelClassifier; delete this._classifierObserver; } wasChannelIdUnblocked(channelId) { return this._unblockedChannelIds.has(channelId); } allow(allowListId, patterns, { hosts, notHosts }) { this._ensureStarted(); if (!this._allowLists.has(allowListId)) { this._allowLists.set(allowListId, new Map()); } const allowList = this._allowLists.get(allowListId); for (const pattern of patterns) { if (!allowList.has(pattern)) { allowList.set(pattern, { matcher: new MatchPattern(pattern), }); } const allowListPattern = allowList.get(pattern); if (!hosts) { allowListPattern.hosts = true; } else { if (!allowListPattern.hosts) { allowListPattern.hosts = new Set(); } for (const host of hosts) { allowListPattern.hosts.add(host); } } if (notHosts) { if (!allowListPattern.notHosts) { allowListPattern.notHosts = new Set(); } for (const notHost of notHosts) { allowListPattern.notHosts.add(notHost); } } } } revoke(allowListId) { this._allowLists.delete(allowListId); } } var manager = new Manager(); function getChannelId(context, requestId) { const wrapper = ChannelWrapper.getRegisteredChannel( requestId, context.extension.policy, context.xulBrowser.frameLoader.remoteTab ); return wrapper?.channel?.QueryInterface(Ci.nsIIdentChannel)?.channelId; } this.trackingProtection = class extends ExtensionAPI { onShutdown(isAppShutdown) { if (manager) { manager.stop(); } } getAPI(context) { return { trackingProtection: { async allow(allowListId, patterns, options) { manager.allow(allowListId, patterns, options); }, async revoke(allowListId) { manager.revoke(allowListId); }, async wasRequestUnblocked(requestId) { if (!manager) { return false; } const channelId = getChannelId(context, requestId); if (!channelId) { return false; } return manager.wasChannelIdUnblocked(channelId); }, }, }; } }; PK !<M®6ù ù #experiment-apis/pictureInPicture.js/* 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"; /* global ChromeUtils, ExtensionAPI, Services */ ChromeUtils.defineModuleGetter( this, "Services", "resource://gre/modules/Services.jsm" ); ChromeUtils.defineModuleGetter( this, "KEYBOARD_CONTROLS", "resource://gre/modules/PictureInPictureControls.jsm" ); ChromeUtils.defineModuleGetter( this, "TOGGLE_POLICIES", "resource://gre/modules/PictureInPictureControls.jsm" ); ChromeUtils.defineModuleGetter( this, "AppConstants", "resource://gre/modules/AppConstants.jsm" ); const TOGGLE_ENABLED_PREF = "media.videocontrols.picture-in-picture.video-toggle.enabled"; /** * This API is expected to be running in the parent process. */ this.pictureInPictureParent = class extends ExtensionAPI { getAPI(context) { return { pictureInPictureParent: { setOverrides(overrides) { // The Picture-in-Picture toggle is only implemented for Desktop, so make // this a no-op for non-Desktop builds. if (AppConstants.platform == "android") { return; } Services.ppmm.sharedData.set( "PictureInPicture:SiteOverrides", overrides ); }, }, }; } }; /** * This API is expected to be running in a content process - specifically, * the WebExtension content process that the background scripts run in. We * split these out so that they can return values synchronously to the * background scripts. */ this.pictureInPictureChild = class extends ExtensionAPI { getAPI(context) { return { pictureInPictureChild: { getKeyboardControls() { // The Picture-in-Picture toggle is only implemented for Desktop, so make // this return nothing for non-Desktop builds. if (AppConstants.platform == "android") { return Cu.cloneInto({}, context.cloneScope); } return Cu.cloneInto(KEYBOARD_CONTROLS, context.cloneScope); }, getPolicies() { // The Picture-in-Picture toggle is only implemented for Desktop, so make // this return nothing for non-Desktop builds. if (AppConstants.platform == "android") { return Cu.cloneInto({}, context.cloneScope); } return Cu.cloneInto(TOGGLE_POLICIES, context.cloneScope); }, }, }; } }; PK !<¢ºCƒƒabout-compat/AboutCompat.jsm/* 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 = ["AboutCompat"]; const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); const addonID = "webcompat@mozilla.org"; const addonPageRelativeURL = "/about-compat/aboutCompat.html"; function AboutCompat() { this.chromeURL = WebExtensionPolicy.getByID(addonID).getURL( addonPageRelativeURL ); } AboutCompat.prototype = { QueryInterface: ChromeUtils.generateQI(["nsIAboutModule"]), getURIFlags() { return Ci.nsIAboutModule.URI_MUST_LOAD_IN_EXTENSION_PROCESS; }, newChannel(aURI, aLoadInfo) { const uri = Services.io.newURI(this.chromeURL); const channel = Services.io.newChannelFromURIWithLoadInfo(uri, aLoadInfo); channel.originalURI = aURI; channel.owner = ( Services.scriptSecurityManager.createContentPrincipal || Services.scriptSecurityManager.createCodebasePrincipal )(uri, aLoadInfo.originAttributes); return channel; }, }; PK !about-compat/aboutCompat.html

PK !<*¥Ç¨¨about-compat/aboutCompat.js/* 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"; /* globals browser */ let availablePatches; const portToAddon = (function() { let port; function connect() { port = browser.runtime.connect({ name: "AboutCompatTab" }); port.onMessage.addListener(onMessageFromAddon); port.onDisconnect.addListener(e => { port = undefined; }); } connect(); async function send(message) { if (port) { return port.postMessage(message); } return Promise.reject("background script port disconnected"); } return { send }; })(); const $ = function(sel) { return document.querySelector(sel); }; const DOMContentLoadedPromise = new Promise(resolve => { document.addEventListener( "DOMContentLoaded", () => { resolve(); }, { once: true } ); }); Promise.all([ browser.runtime.sendMessage("getOverridesAndInterventions"), DOMContentLoadedPromise, ]).then(([info]) => { document.body.addEventListener("click", async evt => { const ele = evt.target; if (ele.nodeName === "BUTTON") { const row = ele.closest("[data-id]"); if (row) { evt.preventDefault(); ele.disabled = true; const id = row.getAttribute("data-id"); try { await browser.runtime.sendMessage({ command: "toggle", id }); } catch (_) { ele.disabled = false; } } } else if (ele.classList.contains("tab")) { document.querySelectorAll(".tab").forEach(tab => { tab.classList.remove("active"); }); ele.classList.add("active"); } }); availablePatches = info; redraw(); }); function onMessageFromAddon(msg) { if ("interventionsChanged" in msg) { redrawTable($("#interventions"), msg.interventionsChanged); } if ("overridesChanged" in msg) { redrawTable($("#overrides"), msg.overridesChanged); } const id = msg.toggling || msg.toggled; const button = $(`[data-id="${id}"] button`); if (!button) { return; } const active = msg.active; document.l10n.setAttributes( button, active ? "label-disable" : "label-enable" ); button.disabled = !!msg.toggling; } function redraw() { if (!availablePatches) { return; } const { overrides, interventions } = availablePatches; const showHidden = location.hash === "#all"; redrawTable($("#overrides"), overrides, showHidden); redrawTable($("#interventions"), interventions, showHidden); } function redrawTable(table, data, showHidden = false) { const df = document.createDocumentFragment(); table.querySelectorAll("tr").forEach(tr => { tr.remove(); }); let noEntriesMessage; if (data === false) { noEntriesMessage = "text-disabled-in-about-config"; } else if (data.length === 0) { noEntriesMessage = table.id === "overrides" ? "text-no-overrides" : "text-no-interventions"; } if (noEntriesMessage) { const tr = document.createElement("tr"); df.appendChild(tr); const td = document.createElement("td"); td.setAttribute("colspan", "3"); document.l10n.setAttributes(td, noEntriesMessage); tr.appendChild(td); table.appendChild(df); return; } for (const row of data) { if (row.hidden && !showHidden) { continue; } const tr = document.createElement("tr"); tr.setAttribute("data-id", row.id); df.appendChild(tr); let td = document.createElement("td"); td.innerText = row.domain; tr.appendChild(td); td = document.createElement("td"); const a = document.createElement("a"); const bug = row.bug; a.href = `https://bugzilla.mozilla.org/show_bug.cgi?id=${bug}`; document.l10n.setAttributes(a, "label-more-information", { bug }); a.target = "_blank"; td.appendChild(a); tr.appendChild(td); td = document.createElement("td"); tr.appendChild(td); const button = document.createElement("button"); document.l10n.setAttributes( button, row.active ? "label-disable" : "label-enable" ); td.appendChild(button); } table.appendChild(df); } window.onhashchange = redraw; PK ! { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 for WebCompat" ); }, }, }, { /* * Bug 1577519 - att.tv - Create a UA override for att.tv for playback on desktop * WebCompat issue #3846 - https://webcompat.com/issues/3846 * * att.tv (atttvnow.com) is blocking Firefox via UA sniffing. Spoofing as Chrome allows * to access the site and playback works fine. This is former directvnow.com */ id: "bug1577519", platform: "desktop", domain: "att.tv", bug: "1577519", config: { matches: ["*://*.att.tv/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" ); }, }, }, { /* * Bug 1570108 - steamcommunity.com - UA override for steamcommunity.com * WebCompat issue #34171 - https://webcompat.com/issues/34171 * * steamcommunity.com blocks chat feature for Firefox users showing unsupported browser message. * When spoofing as Chrome the chat works fine */ id: "bug1570108", platform: "desktop", domain: "steamcommunity.com", bug: "1570108", config: { matches: ["*://steamcommunity.com/chat*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" ); }, }, }, { /* * Bug 1582582 - sling.com - UA override for sling.com * WebCompat issue #17804 - https://webcompat.com/issues/17804 * * sling.com blocks Firefox users showing unsupported browser message. * When spoofing as Chrome playing content works fine */ id: "bug1582582", platform: "desktop", domain: "sling.com", bug: "1582582", config: { matches: ["https://watch.sling.com/*", "https://www.sling.com/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" ); }, }, }, { /* * Bug 1610026 - www.mobilesuica.com - UA override for www.mobilesuica.com * WebCompat issue #4608 - https://webcompat.com/issues/4608 * * mobilesuica.com showing unsupported message for Firefox users * Spoofing as Chrome allows to access the page */ id: "bug1610026", platform: "all", domain: "www.mobilesuica.com", bug: "1610026", config: { matches: ["https://www.mobilesuica.com/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" ); }, }, }, { /* * Bug 945963 - tieba.baidu.com serves simplified mobile content to Firefox Android * additionally, Bug 1525839 for more domains * WebCompat issue #18455 - https://webcompat.com/issues/18455 * * tieba.baidu.com and tiebac.baidu.com serve a heavily simplified and less functional * mobile experience to Firefox for Android users. Adding the AppleWebKit indicator * to the User Agent gets us the same experience. */ id: "bug945963", platform: "android", domain: "tieba.baidu.com", bug: "945963", config: { matches: [ "*://baike.baidu.com/*", "*://image.baidu.com/*", "*://news.baidu.com/*", "*://tieba.baidu.com/*", "*://tiebac.baidu.com/*", "*://wenku.baidu.com/*", "*://zhidao.baidu.com/*", ], uaTransformer: originalUA => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1177298 - Write UA overrides for top Japanese Sites * (Imported from ua-update.json.in) * * To receive the proper mobile version instead of the desktop version or * a lower grade mobile experience, the UA is spoofed. */ id: "bug1177298-2", platform: "android", domain: "lohaco.jp", bug: "1177298", config: { matches: ["*://*.lohaco.jp/*"], uaTransformer: _ => { return "Mozilla/5.0 (Linux; Android 5.0.2; Galaxy Nexus Build/IMM76B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36"; }, }, }, { /* * Bug 1177298 - Write UA overrides for top Japanese Sites * (Imported from ua-update.json.in) * * To receive the proper mobile version instead of the desktop version or * a lower grade mobile experience, the UA is spoofed. */ id: "bug1177298-3", platform: "android", domain: "nhk.or.jp", bug: "1177298", config: { matches: ["*://*.nhk.or.jp/*"], uaTransformer: originalUA => { return originalUA + " AppleWebKit"; }, }, }, { /* * Bug 1385206 - Create UA override for rakuten.co.jp on Firefox Android * (Imported from ua-update.json.in) * * rakuten.co.jp serves a Desktop version if Firefox is included in the UA. */ id: "bug1385206", platform: "android", domain: "rakuten.co.jp", bug: "1385206", config: { matches: ["*://*.rakuten.co.jp/*"], uaTransformer: originalUA => { return originalUA.replace(/Firefox.+$/, ""); }, }, }, { /* * Bug 969844 - mobile.de sends desktop site to Firefox on Android * * mobile.de sends the desktop site to Firefox Mobile. * Spoofing as Chrome works fine. */ id: "bug969844", platform: "android", domain: "mobile.de", bug: "969844", config: { matches: ["*://*.mobile.de/*"], uaTransformer: _ => { return "Mozilla/5.0 (Linux; Android 6.0.1; SM-G920F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36"; }, }, }, { /* * Bug 1509831 - cc.com - Add UA override for CC.com * WebCompat issue #329 - https://webcompat.com/issues/329 * * ComedyCentral blocks Firefox for not being able to play HLS, which was * true in previous versions, but no longer is. With a spoofed Chrome UA, * the site works just fine. */ id: "bug1509831", platform: "android", domain: "cc.com", bug: "1509831", config: { matches: ["*://*.cc.com/*"], uaTransformer: _ => { return "Mozilla/5.0 (Linux; Android 6.0.1; SM-G920F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36"; }, }, }, { /* * Bug 1509873 - zmags.com - Add UA override for secure.viewer.zmags.com * WebCompat issue #21576 - https://webcompat.com/issues/21576 * * The zmags viewer locks out Firefox Mobile with a "Browser unsupported" * message, but tests showed that it works just fine with a Chrome UA. * Outreach attempts were unsuccessful, and as the site has a relatively * high rank, we alter the UA. */ id: "bug1509873", platform: "android", domain: "zmags.com", bug: "1509873", config: { matches: ["*://*.viewer.zmags.com/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36" ); }, }, }, { /* * Bug 1566253 - posts.google.com - Add UA override for posts.google.com * WebCompat issue #17870 - https://webcompat.com/issues/17870 * * posts.google.com displaying "Your browser doesn't support this page". * Spoofing as Chrome works fine. */ id: "bug1566253", platform: "android", domain: "posts.google.com", bug: "1566253", config: { matches: ["*://posts.google.com/*"], uaTransformer: _ => { return "Mozilla/5.0 (Linux; Android 6.0.1; SM-G900M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.101 Mobile Safari/537.36"; }, }, }, { /* * Bug 1574522 - UA override for enuri.com on Firefox for Android * WebCompat issue #37139 - https://webcompat.com/issues/37139 * * enuri.com returns a different template for Firefox on Android * based on server side UA detection. This results in page content cut offs. * Spoofing as Chrome fixes the issue */ id: "bug1574522", platform: "android", domain: "enuri.com", bug: "1574522", config: { matches: ["*://enuri.com/*"], uaTransformer: _ => { return "Mozilla/5.0 (Linux; Android 6.0.1; SM-G900M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.111 Mobile Safari/537.36"; }, }, }, { /* * Bug 1574564 - UA override for ceskatelevize.cz on Firefox for Android * WebCompat issue #15467 - https://webcompat.com/issues/15467 * * ceskatelevize sets streamingProtocol depending on the User-Agent it sees * in the request headers, returning DASH for Chrome, HLS for iOS, * and Flash for Firefox Mobile. Since Mobile has no Flash, the video * doesn't work. Spoofing as Chrome makes the video play */ id: "bug1574564", platform: "android", domain: "ceskatelevize.cz", bug: "1574564", config: { matches: ["*://*.ceskatelevize.cz/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.111 Mobile Safari/537.36" ); }, }, }, { /* * Bug 1577250 - UA override for homebook.pl on Firefox for Android * WebCompat issue #24044 - https://webcompat.com/issues/24044 * * homebook.pl shows desktop site on Firefox for Android based on * UA detection. Spoofing as Chrome allows to get mobile site. */ id: "bug1577250", platform: "android", domain: "homebook.pl", bug: "1577250", config: { matches: ["*://*.homebook.pl/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.111 Mobile Safari/537.36" ); }, }, }, { /* * Bug 1577267 - UA override for metfone.com.kh on Firefox for Android * WebCompat issue #16363 - https://webcompat.com/issues/16363 * * metfone.com.kh has a server side UA detection which returns desktop site * for Firefox for Android. Spoofing as Chrome allows to receive mobile version */ id: "bug1577267", platform: "android", domain: "metfone.com.kh", bug: "1577267", config: { matches: ["*://*.metfone.com.kh/*"], uaTransformer: originalUA => { return ( UAHelpers.getPrefix(originalUA) + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.111 Mobile Safari/537.36" ); }, }, }, { /* * Bug 1598198 - User Agent extension for Samsung's galaxy.store URLs * * Samsung's galaxy.store shortlinks are supposed to redirect to a Samsung * intent:// URL on Samsung devices, but to an error page on other brands. * As we do not provide device info in our user agent string, this check * fails, and even Samsung users land on an error page if they use Firefox * for Android. * This intervention adds a simple "Samsung" identifier to the User Agent * on only the Galaxy Store URLs if the device happens to be a Samsung. */ id: "bug1598198", platform: "android", domain: "galaxy.store", bug: "1598198", config: { matches: [ "*://galaxy.store/*", "*://dev.galaxy.store/*", "*://stg.galaxy.store/*", ], uaTransformer: originalUA => { if (!browser.systemManufacturer) { return originalUA; } const manufacturer = browser.systemManufacturer.getManufacturer(); if (manufacturer && manufacturer.toLowerCase() === "samsung") { return originalUA.replace("Mobile;", "Mobile; Samsung;"); } return originalUA; }, }, }, { /* * Bug 1595215 - UA overrides for Uniqlo sites * Webcompat issue #38825 - https://webcompat.com/issues/38825 * * To receive the proper mobile version instead of the desktop version or * avoid redirect loop, the UA is spoofed. */ id: "bug1595215", platform: "android", domain: "uniqlo.com", bug: "1595215", config: { matches: ["*://*.uniqlo.com/*"], uaTransformer: originalUA => { return originalUA + " Mobile Safari"; }, }, }, { /* * Bug 1621065 - UA overrides for bracketchallenge.ncaa.com * Webcompat issue #49886 - https://webcompat.com/issues/49886 * * The NCAA bracket challenge website mistakenly classifies * any non-Chrome browser on Android as "is_old_android". As a result, * a modal is shown telling them they have security flaws. We have * attempted to reach out for a fix (and clarification). */ id: "bug1621065", platform: "android", domain: "bracketchallenge.ncaa.com", bug: "1621065", config: { matches: ["*://bracketchallenge.ncaa.com/*"], uaTransformer: originalUA => { return originalUA + " Chrome"; }, }, }, { /* * Bug 1622063 - UA override for wp1-ext.usps.gov * Webcompat issue #29867 - https://webcompat.com/issues/29867 * * The Job Search site for USPS does not work for Firefox Mobile * browsers (a 500 is returned). */ id: "bug1622063", platform: "android", domain: "wp1-ext.usps.gov", bug: "1622063", config: { matches: ["*://wp1-ext.usps.gov/*"], uaTransformer: originalUA => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1622081 - UA override for m2.bmo.com * Webcompat issue #45019 - https://webcompat.com/issues/45019 * * Unless the UA string contains "Chrome", m2.bmo.com will * display a modal saying the browser is out-of-date. */ id: "bug1622081", platform: "android", domain: "m2.bmo.com", bug: "1622081", config: { matches: ["*://m2.bmo.com/*"], uaTransformer: originalUA => { return originalUA + " Chrome"; }, }, }, { /* * Bug 1628455 - UA override for autotrader.ca * Webcompat issue #50961 - https://webcompat.com/issues/50961 * * autotrader.ca is showing desktop site for Firefox on Android * based on server side UA detection. Spoofing as Chrome allows to * get mobile experience */ id: "bug1628455", platform: "android", domain: "autotrader.ca", bug: "1628455", config: { matches: ["https://*.autotrader.ca/*"], uaTransformer: () => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1630280 - UA override for dominos.ch * Webcompat issue #48273 - https://webcompat.com/issues/48273 * * dominos.ch is suggesting downloading their native app and showing * an overlay that can't be removed in Firefox for Android. Spoofing * as Chrome allows to continue to the site */ id: "bug1630280", platform: "android", domain: "dominos.ch", bug: "1630280", config: { matches: ["https://*.dominos.ch/*"], uaTransformer: () => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1563839 - rolb.santanderbank.com - Build UA override * Bug 1646791 - bancosantander.es - Re-add UA override. * Bug 1665129 - *.gruposantander.es - Add wildcard domains. * WebCompat issue #33462 - https://webcompat.com/issues/33462 * SuMo request - https://support.mozilla.org/es/questions/1291085 * * santanderbank expects UA to have 'like Gecko', otherwise it runs * xmlDoc.onload whose support has been dropped. It results in missing labels in forms * and some other issues. Adding 'like Gecko' fixes those issues. */ id: "bug1646791", platform: "all", domain: "santanderbank.com", bug: "1646791", config: { matches: [ "*://*.bancosantander.es/*", "*://*.gruposantander.es/*", "*://*.santander.co.uk/*", "*://bob.santanderbank.com/*", "*://rolb.santanderbank.com/*", ], uaTransformer: originalUA => { return originalUA.replace("Gecko", "like Gecko"); }, }, }, { /* * Bug 1651292 - UA override for www.jp.square-enix.com * Webcompat issue #53018 - https://webcompat.com/issues/53018 * * Unless the UA string contains "Chrome 66+", a section of * www.jp.square-enix.com will show a never ending LOADING * page. */ id: "bug1651292", platform: "android", domain: "www.jp.square-enix.com", bug: "1651292", config: { matches: ["*://www.jp.square-enix.com/music/sem/page/FF7R/ost/*"], uaTransformer: originalUA => { return originalUA + " Chrome/83"; }, }, }, { /* * Bug 1654888 - UA override for ebuyer.com * Webcompat issue #52463 - https://webcompat.com/issues/52463 * * This site returns desktop site based on server side UA detection. * Spoofing as Chrome allows to get mobile experience */ id: "bug1654888", platform: "android", domain: "ebuyer.com", bug: "1654888", config: { matches: ["*://*.ebuyer.com/*"], uaTransformer: () => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1666754 - Mobile UA override for lffl.org * Bug 1665720 - lffl.org article page takes 2x as much time to load on Moto G * * This site returns desktop site based on server side UA detection. * Spoofing as Chrome allows to get mobile experience */ id: "bug1666754", platform: "android", domain: "lffl.org", bug: "1666754", config: { matches: ["*://*.lffl.org/*"], uaTransformer: () => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1679847 - Add UA override for avto.pro * Webcompat issue #60043 - https://webcompat.com/issues/60043 * * Unless Chrome is in the UA, the site serves a desktop version * on catalog pages */ id: "bug1679847", platform: "android", domain: "avto.pro", bug: "1679847", config: { matches: ["https://avto.pro/catalog/*"], uaTransformer: () => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, { /* * Bug 1679869 - Add UA override for vh1.com * Webcompat issue #52755 - https://webcompat.com/issues/52755 * * The site is not showing videos on Firefox on mobile stating * that android 4.4.4 and chrome browser required */ id: "bug1679869", platform: "android", domain: "vh1.com", bug: "1679869", config: { matches: ["*://*.vh1.com/*"], uaTransformer: () => { return UAHelpers.getDeviceAppropriateChromeUA(); }, }, }, ]; const UAHelpers = { getDeviceAppropriateChromeUA() { if (!UAHelpers._deviceAppropriateChromeUA) { const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : ""; const RunningFirefoxVersion = (userAgent.match(/Firefox\/([0-9.]+)/) || [ "", "58.0", ])[1]; const RunningAndroidVersion = userAgent.match(/Android\/[0-9.]+/) || "Android 6.0"; const ChromeVersionToMimic = "76.0.3809.111"; const ChromePhoneUA = `Mozilla/5.0 (Linux; ${RunningAndroidVersion}; Nexus 5 Build/MRA58N) FxQuantum/${RunningFirefoxVersion} AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${ChromeVersionToMimic} Mobile Safari/537.36`; const ChromeTabletUA = `Mozilla/5.0 (Linux; ${RunningAndroidVersion}; Nexus 7 Build/JSS15Q) FxQuantum/${RunningFirefoxVersion} AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${ChromeVersionToMimic} Safari/537.36`; const IsPhone = userAgent.includes("Mobile"); UAHelpers._deviceAppropriateChromeUA = IsPhone ? ChromePhoneUA : ChromeTabletUA; } return UAHelpers._deviceAppropriateChromeUA; }, getPrefix(originalUA) { return originalUA.substr(0, originalUA.indexOf(")") + 1); }, }; module.exports = AVAILABLE_UA_OVERRIDES; PK !<Òyào™™%experiment-apis/aboutConfigPrefs.json[ { "namespace": "aboutConfigPrefs", "description": "experimental API extension to allow access to about:config preferences", "events": [ { "name": "onPrefChange", "type": "function", "parameters": [ { "name": "name", "type": "string", "description": "The preference which changed" } ], "extraParameters": [ { "name": "name", "type": "string", "description": "The preference to monitor" } ] } ], "functions": [ { "name": "getBranch", "type": "function", "description": "Get all child prefs for a branch", "parameters": [ { "name": "branchName", "type": "string", "description": "The branch name" } ], "async": true }, { "name": "getPref", "type": "function", "description": "Get a preference's value", "parameters": [ { "name": "name", "type": "string", "description": "The preference name" } ], "async": true }, { "name": "setPref", "type": "function", "description": "Set a preference's value", "parameters": [ { "name": "name", "type": "string", "description": "The preference name" }, { "name": "value", "type": "boolean", "description": "The new value" } ], "async": true } ] } ] PK !<€‘Mf%%!experiment-apis/appConstants.json[ { "namespace": "appConstants", "description": "experimental API to expose some app constants", "functions": [ { "name": "getReleaseBranch", "type": "function", "description": "", "async": true, "parameters": [] } ] } ] PK ! { return experiments.includes(name); }); }, }, }; } }; PK ! { return set.matches(url); }, }, context.cloneScope, { cloneFunctions: true, } ); }, }, }; } }; PK ! #views { overflow: auto; } PK !<¦…´<££:injections/css/bug1570119-teamcoco.com-scrollbar-width.css/** * teamcoco.com - a scrollbar at the top covering navigation menu * Bug #1570119 - https://bugzilla.mozilla.org/show_bug.cgi?id=1570119 * * The scrollbar is covering navigation items making them unusable. * There are ::-webkit-scrollbar css rules already applied to the scrollbar, * hiding it in Chrome. Adding the scrollbar-width: none fixes the issue in Firefox. */ .css-bdnz85 { scrollbar-width: none; } PK ! #ml-route-options-time-selector-time-input { z-index: 1; /* overrides -5000, to show on top of the icon AND the rendered date */ opacity: 0; /* let the input element be fully transparent */ width: 100vw; /* render over the rendered date from Maps' dialog */ /* position this (absolute) element to fully cover the parent container */ left: 0; bottom: 0; top: 0; height: 100%; } PK !< îb¾¾:injections/css/bug1610016-gaana.com-input-position-fix.css/** * gaana.com - unable to accept T&C and Privacy Policy * Bug #1610016 - https://bugzilla.mozilla.org/show_bug.cgi?id=1610016 * WebCompat issue #29886 - https://webcompat.com/issues/29886 * * Unable to click on checkboxes due to input element floating to the right. * More info https://bugzilla.mozilla.org/show_bug.cgi?id=997189. Adding explicit * positioning to the input fixes the issue */ .agree_btns input { top: 0; left: 0; } PK ! * { pointer-events: none; } PK !