mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-10-31 08:18:54 +02:00 
			
		
		
		
	Bug 1925270 - uplift webcompat interventions for v133.2.0 to ESR 128; r=denschub a=RyanVM
Differential Revision: https://phabricator.services.mozilla.com/D226038
This commit is contained in:
		
							parent
							
								
									7d979155b4
								
							
						
					
					
						commit
						88ec901b2c
					
				
					 56 changed files with 2348 additions and 121 deletions
				
			
		|  | @ -290,6 +290,8 @@ const AVAILABLE_INJECTIONS = [ | |||
|         "*://www.facebook.com/*", // Bug 1739489
 | ||||
|         "*://twitter.com/*", // Bug 1776229
 | ||||
|         "*://mobile.twitter.com/*", // Bug 1776229
 | ||||
|         "*://x.com/*", // Bug 1776229
 | ||||
|         "*://mobile.x.com/*", // Bug 1776229
 | ||||
|         "*://*.reddit.com/*", // Bug 1829755
 | ||||
|       ], | ||||
|       js: [ | ||||
|  | @ -585,6 +587,7 @@ const AVAILABLE_INJECTIONS = [ | |||
|         "*://*.lafoodbank.org/*", // 127006
 | ||||
|         "*://rutamayacoffee.com/*", // 129353
 | ||||
|         "*://ottoandspike.com.au/*", // bugzilla 1644602
 | ||||
|         "*://give.umrelief.org/give/*", // bugzilla 1916407
 | ||||
|       ], | ||||
|       js: [ | ||||
|         { | ||||
|  | @ -1001,20 +1004,6 @@ const AVAILABLE_INJECTIONS = [ | |||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1877346", | ||||
|     platform: "android", | ||||
|     domain: "offerup.com", | ||||
|     bug: "1877346", | ||||
|     contentScripts: { | ||||
|       matches: ["*://offerup.com/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1877346-offerup.com-infinite-scroll-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1884842", | ||||
|     platform: "android", | ||||
|  | @ -1059,15 +1048,108 @@ const AVAILABLE_INJECTIONS = [ | |||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "1882040", | ||||
|     platform: "android", | ||||
|     domain: "YouTube Shorts", | ||||
|     bug: "1882040", | ||||
|     id: "1922175", | ||||
|     platform: "all", | ||||
|     domain: "app.livingsecurity.com", | ||||
|     bug: "1922175", | ||||
|     contentScripts: { | ||||
|       matches: ["*://m.youtube.com/shorts", "*://m.youtube.com/shorts/*"], | ||||
|       matches: ["*://app.livingsecurity.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1896383-error-capturestacktrace-shim.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1889326", | ||||
|     platform: "desktop", | ||||
|     domain: "Office 365 email handling prompt", | ||||
|     bug: "1889326", | ||||
|     contentScripts: { | ||||
|       matches: [ | ||||
|         "*://*.live.com/*", | ||||
|         "*://*.office.com/*", | ||||
|         "*://*.office365.com/*", | ||||
|         "*://*.office365.us/*", | ||||
|         "*://*.outlook.cn/*", | ||||
|         "*://*.outlook.com/*", | ||||
|         "*://*.sharepoint.com/*", | ||||
|       ], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1889326-office365-email-handling-prompt-autohide.js", | ||||
|         }, | ||||
|       ], | ||||
|       allFrames: true, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1881922", | ||||
|     platform: "all", | ||||
|     domain: "helpdeskgeek.com", | ||||
|     bug: "1881922", | ||||
|     contentScripts: { | ||||
|       matches: ["*://helpdeskgeek.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1881922-disable-legacy-mutation-events.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1901780", | ||||
|     platform: "all", | ||||
|     domain: "vanbreda-health.be", | ||||
|     bug: "1901780", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.vanbreda-health.be/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1881922-disable-legacy-mutation-events.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1896571", | ||||
|     platform: "all", | ||||
|     domain: "gracobaby.ca", | ||||
|     bug: "1896571", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.gracobaby.ca/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1882040-disable-pull-to-refresh.css", | ||||
|           file: "injections/css/bug1896571-gracobaby.ca-unlock-scrolling.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1895994", | ||||
|     platform: "android", | ||||
|     domain: "www.softrans.ro", | ||||
|     bug: "1895994", | ||||
|     contentScripts: { | ||||
|       matches: ["*://*.softrans.ro/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1895994-softtrans.ro-unlock-scrolling.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1898952", | ||||
|     platform: "desktop", | ||||
|     domain: "digits.t-mobile.com", | ||||
|     bug: "1898952", | ||||
|     contentScripts: { | ||||
|       matches: ["*://digits.t-mobile.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1898952-digits.t-mobile.com.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|  | @ -1094,6 +1176,146 @@ const AVAILABLE_INJECTIONS = [ | |||
|       allFrames: true, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1899937", | ||||
|     platform: "all", | ||||
|     domain: "plus.nhk.jp", | ||||
|     bug: "1899937", | ||||
|     contentScripts: { | ||||
|       matches: ["*://plus.nhk.jp/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1899937-plus.nhk.jp-request-picture-in-picture.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1886616", | ||||
|     platform: "all", | ||||
|     domain: "www.six-group.com", | ||||
|     bug: "1886616", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.six-group.com/*/market-data/etf/etf-explorer.html*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1886616-www.six-group.com-select-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1896349", | ||||
|     platform: "all", | ||||
|     domain: "vivaldi.com", | ||||
|     bug: "1896349", | ||||
|     contentScripts: { | ||||
|       matches: ["*://vivaldi.com/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1896349-vivaldi.com-selected-text-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1836872", | ||||
|     platform: "desktop", | ||||
|     domain: "docs.google.com", | ||||
|     bug: "1836872", | ||||
|     contentScripts: { | ||||
|       matches: ["*://docs.google.com/document/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1836872-docs.google.com-font-submenus-inaccessible.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1779908", | ||||
|     platform: "desktop", | ||||
|     domain: "docs.google.com", | ||||
|     bug: "1779908", | ||||
|     contentScripts: { | ||||
|       matches: ["*://play.google.com/store/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1779908-play.google.com-scrollbar-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1879879", | ||||
|     platform: "all", | ||||
|     domain: "developers.pinterest.com", | ||||
|     bug: "1879879", | ||||
|     contentScripts: { | ||||
|       matches: ["*://developers.pinterest.com/docs/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1879879-developers.pinterest.com-list-alignment-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1856915", | ||||
|     platform: "android", | ||||
|     domain: "login.yahoo.com", | ||||
|     bug: "1856915", | ||||
|     contentScripts: { | ||||
|       matches: ["*://login.yahoo.com/account/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1856915-login.yahoo.com-unhide-password-button-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1841730", | ||||
|     platform: "desktop", | ||||
|     domain: "www.korg.com", | ||||
|     bug: "1841730", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.korg.com/*/support/download/product/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1841730-www.korg.com-fix-broken-page-loads.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1895051", | ||||
|     platform: "all", | ||||
|     domain: "www.zhihu.com", | ||||
|     bug: "1895051", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.zhihu.com/question/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1895051-www.zhihu.com-broken-button-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1924500", | ||||
|     platform: "desktop", | ||||
|     domain: "www.tiktok.com", | ||||
|     bug: "1924500", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.tiktok.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1924500-www.tiktok.com-fix-captcha-slider.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
| ]; | ||||
| 
 | ||||
| module.exports = AVAILABLE_INJECTIONS; | ||||
|  |  | |||
|  | @ -379,6 +379,27 @@ const AVAILABLE_SHIMS = [ | |||
|     ], | ||||
|     onlyIfBlockedByETP: true, | ||||
|   }, | ||||
|   { | ||||
|     id: "figshare", | ||||
|     platform: "all", | ||||
|     name: "Figshare", | ||||
|     bug: "1895990", | ||||
|     contentScripts: [ | ||||
|       { | ||||
|         js: "figshare.js", | ||||
|         matches: [ | ||||
|           "*://*.figsharelabs.io/*", | ||||
|           "*://opal.latrobe.edu.au/*", | ||||
|           "*://repository.lboro.ac.uk/*", | ||||
|           "*://portal.sds.ox.ac.uk/*", | ||||
|           "*://curate.nd.edu/*", | ||||
|           "*://kilthub.cmu.edu/*", | ||||
|         ], | ||||
|         runAt: "document_start", | ||||
|       }, | ||||
|     ], | ||||
|     onlyIfDFPIActive: true, | ||||
|   }, | ||||
|   { | ||||
|     id: "GoogleAnalyticsAndTagManager", | ||||
|     platform: "all", | ||||
|  |  | |||
|  | @ -1210,6 +1210,254 @@ const AVAILABLE_UA_OVERRIDES = [ | |||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1842767 - UA override for passport.bilibili.com | ||||
|      * | ||||
|      * Spoofing as Chrome makes the login page use a mobile layout. | ||||
|      */ | ||||
|     id: "bug1842767", | ||||
|     platform: "android", | ||||
|     domain: "passport.bilibili.com", | ||||
|     bug: "1842767", | ||||
|     config: { | ||||
|       matches: ["*://*.passport.bilibili.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1896354 - UA override for my.rhinoshield.fr | ||||
|      * | ||||
|      * Sites only supports Chrome, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1896354", | ||||
|     platform: "all", | ||||
|     domain: "my.rhinoshield.fr", | ||||
|     bug: "1896354", | ||||
|     config: { | ||||
|       matches: ["*://my.rhinoshield.fr/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1813177 - UA override for rbi.org.in | ||||
|      * | ||||
|      * The site endlessly redirects for a Firefox mobile UA string. | ||||
|      */ | ||||
|     id: "bug1813177", | ||||
|     platform: "android", | ||||
|     domain: "m.rbi.org.in", | ||||
|     bug: "1813177", | ||||
|     config: { | ||||
|       matches: ["*://m.rbi.org.in/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1903970 - UA override for unimedlitoral.com.br | ||||
|      * Webcompat issue #138342 - https://webcompat.com/issues/138342
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1903970", | ||||
|     platform: "all", | ||||
|     domain: "www.unimedlitoral.com.br", | ||||
|     bug: "1903970", | ||||
|     config: { | ||||
|       matches: ["*://www.unimedlitoral.com.br/agendaonline/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1902474 - UA override for lg.jio.com | ||||
|      * Webcompat issue #124681 - https://webcompat.com/issues/124681
 | ||||
|      * | ||||
|      * Site incorrectly blocks Firefox on Android. A desktop UA works. | ||||
|      */ | ||||
|     id: "bug1902474", | ||||
|     platform: "android", | ||||
|     domain: "lg.jio.com", | ||||
|     bug: "1902474", | ||||
|     config: { | ||||
|       matches: ["*://lg.jio.com/*"], | ||||
|       uaTransformer: originalUA => { | ||||
|         return originalUA.replace(/ (Mobile|Tablet);/, ""); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1909448 - UA override for fire.honeywell.com | ||||
|      * | ||||
|      * Site doesn't load on Firefox, but works fine with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1909448", | ||||
|     platform: "all", | ||||
|     domain: "fire.honeywell.com", | ||||
|     bug: "1909448", | ||||
|     config: { | ||||
|       matches: ["*://fire.honeywell.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1899937 - UA override for plus.nhk.jp | ||||
|      * Webcompat issue #103463 - https://webcompat.com/issues/103463
 | ||||
|      * | ||||
|      * Site blocks Firefox, so a UA spoof and an intervention is needed. | ||||
|      */ | ||||
|     id: "bug1899937-ua", | ||||
|     platform: "all", | ||||
|     domain: "plus.nhk.jp", | ||||
|     bug: "1899937", | ||||
|     config: { | ||||
|       matches: ["*://plus.nhk.jp/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1897724 - UA override for app.homewyse.com | ||||
|      * Webcompat issue #137164 - https://webcompat.com/issues/137164
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1897724", | ||||
|     platform: "all", | ||||
|     domain: "app.homewyse.com", | ||||
|     bug: "1897724", | ||||
|     config: { | ||||
|       matches: ["*://app.homewyse.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1898923 - UA override for trade-in.vodafone.com | ||||
|      * Webcompat issue #127158 - https://webcompat.com/issues/127158
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1898923", | ||||
|     platform: "all", | ||||
|     domain: "trade-in.vodafone.com", | ||||
|     bug: "1898923", | ||||
|     config: { | ||||
|       matches: ["*://trade-in.vodafone.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1899067 - UA override for game.granbluefantasy.jp | ||||
|      * Webcompat issue #43155 - https://webcompat.com/issues/43155
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1899067", | ||||
|     platform: "desktop", | ||||
|     domain: "game.granbluefantasy.jp", | ||||
|     bug: "1899067", | ||||
|     config: { | ||||
|       matches: ["*://game.granbluefantasy.jp/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1898941 - UA override for events.webinar.ru | ||||
|      * Webcompat issue #121871 - https://webcompat.com/issues/121871
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1898941", | ||||
|     platform: "all", | ||||
|     domain: "events.webinar.ru", | ||||
|     bug: "1898941", | ||||
|     config: { | ||||
|       matches: ["*://events.webinar.ru/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1919004 - UA override for www.editoracontexto.com.br | ||||
|      * Webcompat issue #141641 - https://webcompat.com/issues/141641
 | ||||
|      * | ||||
|      * Site presents its desktop CSS to Firefox on Android. | ||||
|      */ | ||||
|     id: "bug1919004", | ||||
|     platform: "android", | ||||
|     domain: "www.editoracontexto.com.br", | ||||
|     bug: "1919004", | ||||
|     config: { | ||||
|       matches: ["*://www.editoracontexto.com.br/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1921410 - UA override for beta.maps.apple.com | ||||
|      * Webcompat issue #140205 - https://webcompat.com/issues/140205
 | ||||
|      * | ||||
|      * Apple Maps beta artifically blocks Linux. | ||||
|      */ | ||||
|     id: "bug1921410", | ||||
|     platform: "linux", | ||||
|     domain: "beta.maps.apple.com", | ||||
|     bug: "1921410", | ||||
|     config: { | ||||
|       matches: ["*://beta.maps.apple.com/*"], | ||||
|       uaTransformer: originalUA => { | ||||
|         return UAHelpers.getWindowsUA(originalUA); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1899948 - UA override for tv.partner.co.il | ||||
|      * Webcompat issue #64703 - https://webcompat.com/issues/64703
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "1899948", | ||||
|     platform: "all", | ||||
|     domain: "tv.partner.co.il", | ||||
|     bug: "1899948", | ||||
|     config: { | ||||
|       matches: ["*://tv.partner.co.il/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| ]; | ||||
| 
 | ||||
| module.exports = AVAILABLE_UA_OVERRIDES; | ||||
|  |  | |||
|  | @ -0,0 +1,15 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * play.google.com - Extra scrollbar not hidden on store pages. | ||||
|  * | ||||
|  * Bug #1779908 - https://bugzilla.mozilla.org/show_bug.cgi?id=1779908 | ||||
|  * | ||||
|  * They are hiding the scrollbar with ::webkit-scrollbar, but not the standards- | ||||
|  * compliant method `scrollbar-width:none`. | ||||
|  */ | ||||
| .aoJE7e { | ||||
|   scrollbar-width: none; | ||||
| } | ||||
|  | @ -0,0 +1,18 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * docs.google.com - font submenus are inaccessible with overlay scrollbars on | ||||
|  * Bug #1836872 - https://bugzilla.mozilla.org/show_bug.cgi?id=1836872 | ||||
|  * | ||||
|  * The submenu panels are shifted too far to the right when overlay | ||||
|  * scrollbars are visible, and so they are dismissed while attemting | ||||
|  * to mouse over to them. Shifting them to the left fixes them. | ||||
|  */ | ||||
| /* font family sub-menus */ | ||||
| [class="goog-menu goog-menu-vertical"], | ||||
| /* font style sub-menus */ | ||||
| .goog-menu.apps-menu-hide-mnemonics { | ||||
|   margin-inline-start: -20px; | ||||
| } | ||||
|  | @ -0,0 +1,15 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * login.yahoo.com - Toggle to reveal password text is missing | ||||
|  * | ||||
|  * Bug #1856915 - https://bugzilla.mozilla.org/show_bug.cgi?id=1856915 | ||||
|  * | ||||
|  * Yahoo is using letter-spacing in a way which relies on a Blink quirk to | ||||
|  * not inadvertently hide their show/hide password text toggle. | ||||
|  */ | ||||
| #password-container > input[type="password"] { | ||||
|   min-width: 0; | ||||
| } | ||||
|  | @ -1,20 +0,0 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * offerup.com - Infinite scroll doesn't work | ||||
|  * Bug #1720060 - https://bugzilla.mozilla.org/show_bug.cgi?id=1720060 | ||||
|  * | ||||
|  * The site uses IntersectionObserver to show new items on the page, | ||||
|  * as the page being scrolled and it doesn't work with with | ||||
|  * Dynamic Toolbar enabled. Adding an empty element after the content | ||||
|  * to make up for the height of the dynamic toolbar makes it work. | ||||
|  */ | ||||
| 
 | ||||
| #__next::after { | ||||
|   display: block; | ||||
|   width: 100%; | ||||
|   height: 10px; | ||||
|   content: ""; | ||||
| } | ||||
|  | @ -0,0 +1,12 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * developers.pinterest.com - List elements are misaligned | ||||
|  * | ||||
|  * Bug #1879879 - https://bugzilla.mozilla.org/show_bug.cgi?id=1879879 | ||||
|  */ | ||||
| li > span:has(> div) { | ||||
|   display: block; | ||||
| } | ||||
|  | @ -1,14 +0,0 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * m.youtube.com/shorts - pull-to-refresh breaks scrolling | ||||
|  * Bug #1882040 - https://bugzilla.mozilla.org/show_bug.cgi?id=1882040 | ||||
|  * | ||||
|  * Pull-to-refresh is breaking scrolling on the YouTube Shorts mobile page. | ||||
|  * The easiest work-around is to inject this CSS to disable it for now. | ||||
|  */ | ||||
| html { | ||||
|   overscroll-behavior: contain; | ||||
| } | ||||
|  | @ -0,0 +1,15 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * www.six-group.com - Selected input values are hidden | ||||
|  * Bug #1886616 - https://bugzilla.mozilla.org/show_bug.cgi?id=1886616 | ||||
|  * WebCompat issue #129271 - https://webcompat.com/issues/129271 | ||||
|  * | ||||
|  * The page is hiding CSS content, which is not interoperable. In this | ||||
|  * case, it causes their select dropdown's values to be hidden. | ||||
|  */ | ||||
| select { | ||||
|   content: normal; | ||||
| } | ||||
|  | @ -0,0 +1,16 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * www.zhihu.com - Certain directory buttons are unclickable | ||||
|  * | ||||
|  * Bug #1895051 - https://bugzilla.mozilla.org/show_bug.cgi?id=1895051 | ||||
|  * | ||||
|  * On narrow enough screens, some of the site's directory buttons | ||||
|  * overlap with text differently on Firefox and Safari than in Chromium, | ||||
|  * making them unclickable. This fixes the issue. | ||||
|  */ | ||||
| .css-376mun { | ||||
|   display: block; | ||||
| } | ||||
|  | @ -0,0 +1,16 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * softtrans.ro - users cannot scroll the page horizontally on Android | ||||
|  * Bug #1895994 - https://bugzilla.mozilla.org/show_bug.cgi?id=1895994 | ||||
|  * | ||||
|  * The page uses a meta viewport tag on Android, and also hides overflow-x | ||||
|  * on the body tag, making it impossible to scroll the page. We can unset | ||||
|  * the overflow to fix this. | ||||
|  */ | ||||
| 
 | ||||
| body { | ||||
|   overflow-x: auto; | ||||
| } | ||||
|  | @ -0,0 +1,13 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * vivaldi.com - Selected text is invisible | ||||
|  * Bug #1896349 - https://bugzilla.mozilla.org/show_bug.cgi?id=1896349 | ||||
|  * WebCompat issue #136863 - https://webcompat.com/issues/136863 | ||||
|  */ | ||||
| ::selection { | ||||
|   color: HighlightText; | ||||
|   background-color: Highlight; | ||||
| } | ||||
|  | @ -0,0 +1,18 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * gracobaby.ca - users cannot scroll the page on narrow viewports | ||||
|  * Bug #1896571 - https://bugzilla.mozilla.org/show_bug.cgi?id=1896571 | ||||
|  * | ||||
|  * The page uses a meta viewport on narrower screen widths, and also | ||||
|  * hides overflow on the html tag, making it impossible to scroll the | ||||
|  * page. We can unset the overflow to fix this. | ||||
|  */ | ||||
| 
 | ||||
| @media (max-width: 767.98px) { | ||||
|   html { | ||||
|     overflow: auto; | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,35 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1841730 - Fix www.korg.com support download page loads on Windows. | ||||
|  * WebCompat issue #2787 - https://webcompat.com/issues/2787
 | ||||
|  * | ||||
|  * They are using a library named PACE, which has a timing bug with Firefox | ||||
|  * which breaks page loads (due to a stuck progress indicator) on Windows. | ||||
|  * This is the fix suggested at https://github.com/CodeByZach/pace/issues/510
 | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| (function () { | ||||
|   const win = window.wrappedJSObject; | ||||
| 
 | ||||
|   let val = new win.Object(); | ||||
|   val.eventLag = false; | ||||
| 
 | ||||
|   Object.defineProperty(win, "paceOptions", { | ||||
|     configurable: true, | ||||
| 
 | ||||
|     get: exportFunction(function () { | ||||
|       return val; | ||||
|     }, window), | ||||
| 
 | ||||
|     set: exportFunction(function (_val) { | ||||
|       val = _val; | ||||
|     }, window), | ||||
|   }); | ||||
| })(); | ||||
|  | @ -0,0 +1,43 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bugs 1881922, 1901780 - Disable legacy DOM Mutation Events to prevent performance issues. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| let bug = "1881922"; | ||||
| if (location.origin.includes("vanbreda")) { | ||||
|   bug = "1901780"; | ||||
| } | ||||
| console.info( | ||||
|   `DOM Mutation Events have been disabled to prevent performance issues. See https://bugzilla.mozilla.org/show_bug.cgi?id=${bug} for details.` | ||||
| ); | ||||
| 
 | ||||
| (function disableMutationEvents() { | ||||
|   const whichEvents = [ | ||||
|     "domattrmodified", | ||||
|     "domcharacterdatamodified", | ||||
|     "domnodeinserted", | ||||
|     "domnodeinsertedintodocument", | ||||
|     "domnoderemoved", | ||||
|     "domnoderemovedfromdocument", | ||||
|     "domsubtreemodified", | ||||
|   ]; | ||||
| 
 | ||||
|   const { prototype } = window.wrappedJSObject.EventTarget; | ||||
|   const { addEventListener } = prototype; | ||||
|   Object.defineProperty(prototype, "addEventListener", { | ||||
|     value: exportFunction(function (_type, b, c, d) { | ||||
|       const type = _type?.toLowerCase(); | ||||
|       if (whichEvents.includes(type)) { | ||||
|         return undefined; | ||||
|       } | ||||
|       return addEventListener.call(this, type, b, c, d); | ||||
|     }, window), | ||||
|   }); | ||||
| })(); | ||||
|  | @ -0,0 +1,36 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1889326 - Office 365 email handling prompt autohide | ||||
|  * | ||||
|  * This site patch prevents the notification bar on Office 365 | ||||
|  * apps from popping up on each page-load, offering to handle | ||||
|  * email with Outlook. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| const warning = | ||||
|   "Office 365 Outlook email handling prompt has been hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=1889326 for details."; | ||||
| 
 | ||||
| const localStorageKey = "mailProtocolHandlerAlreadyOffered"; | ||||
| 
 | ||||
| const nav = navigator.wrappedJSObject; | ||||
| const { registerProtocolHandler } = nav; | ||||
| const { localStorage } = window.wrappedJSObject; | ||||
| 
 | ||||
| Object.defineProperty(navigator.wrappedJSObject, "registerProtocolHandler", { | ||||
|   value: exportFunction(function (scheme, url, title) { | ||||
|     if (localStorage.getItem(localStorageKey)) { | ||||
|       console.info(warning); | ||||
|       return undefined; | ||||
|     } | ||||
|     registerProtocolHandler.call(nav, scheme, url, title); | ||||
|     localStorage.setItem(localStorageKey, true); | ||||
|     return undefined; | ||||
|   }, window), | ||||
| }); | ||||
|  | @ -0,0 +1,68 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1898952 - Spoof navigator.userAgentData for digits.t-mobile.com | ||||
|  * Webcompat issue #119767 - https://webcompat.com/issues/119767
 | ||||
|  * | ||||
|  * The site blocks Firefox and Safari, reading info from userAgentData. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction, cloneInto */ | ||||
| 
 | ||||
| if (!navigator.userAgentData) { | ||||
|   console.info( | ||||
|     "navigator.userAgentData has been overridden for compatibility reasons. See https://webcompat.com/issues/119767 for details." | ||||
|   ); | ||||
| 
 | ||||
|   const ua = navigator.userAgent; | ||||
|   const mobile = ua.includes("Mobile") || ua.includes("Tablet"); | ||||
| 
 | ||||
|   // Very roughly matches Chromium's GetPlatformForUAMetadata()
 | ||||
|   let platform = "Linux"; | ||||
|   if (mobile) { | ||||
|     platform = "Android"; | ||||
|   } else if (navigator.platform.startsWith("Win")) { | ||||
|     platform = "Windows"; | ||||
|   } else if (navigator.platform.startsWith("Mac")) { | ||||
|     platform = "macOS"; | ||||
|   } | ||||
| 
 | ||||
|   const version = (ua.match(/Firefox\/([0-9.]+)/) || ["", "58.0"])[1]; | ||||
| 
 | ||||
|   // These match Chrome's output as of version 126.
 | ||||
|   const brands = [ | ||||
|     { | ||||
|       brand: "Not/A)Brand", | ||||
|       version: "8", | ||||
|     }, | ||||
|     { | ||||
|       brand: "Chromium", | ||||
|       version, | ||||
|     }, | ||||
|     { | ||||
|       brand: "Google Chrome", | ||||
|       version, | ||||
|     }, | ||||
|   ]; | ||||
| 
 | ||||
|   const userAgentData = cloneInto( | ||||
|     { | ||||
|       brands, | ||||
|       mobile, | ||||
|       platform, | ||||
|     }, | ||||
|     window | ||||
|   ); | ||||
| 
 | ||||
|   Object.defineProperty(window.navigator.wrappedJSObject, "userAgentData", { | ||||
|     get: exportFunction(function () { | ||||
|       return userAgentData; | ||||
|     }, window), | ||||
| 
 | ||||
|     set: exportFunction(function () {}, window), | ||||
|   }); | ||||
| } | ||||
|  | @ -0,0 +1,27 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1899937 - Shim requestPictureInPicture for plus.nhk.jp | ||||
|  * WebCompat issue #103463 - https://webcompat.com/issues/103463
 | ||||
|  * | ||||
|  * plus.nhk.jp is showing an error when attempting to play videos. | ||||
|  * Shimming requestPictureInPicture to `{}` makes the videos play. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| console.info( | ||||
|   "requestPictureInPicture was shimmed for compatibility reasons. See https://bugzilla.mozilla.org/show_bug.cgi?id=1899937 for details." | ||||
| ); | ||||
| 
 | ||||
| const proto = HTMLVideoElement.wrappedJSObject.prototype; | ||||
| 
 | ||||
| Object.defineProperty(proto, "requestPictureInPicture", { | ||||
|   value: exportFunction(function () { | ||||
|     return {}; | ||||
|   }, window), | ||||
| }); | ||||
|  | @ -0,0 +1,71 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1924500 - Fix www.tiktok.com captcha slider | ||||
|  * WebCompat issue #142709 - https://webcompat.com/issues/142709
 | ||||
|  * | ||||
|  * They are relying on drag events having clientX coordinates, which are | ||||
|  * always zero on Firefox. A work-around is to listen for mousemove and | ||||
|  * dragover events to capture the clientX value from them, and then | ||||
|  * pass the value along when they reads a DragEvent.clientX. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| (function () { | ||||
|   let lastClientX = 0; | ||||
| 
 | ||||
|   const win = window.wrappedJSObject; | ||||
|   Object.defineProperty(win.DragEvent.prototype, "clientX", { | ||||
|     get: exportFunction(function () { | ||||
|       return lastClientX; | ||||
|     }, window), | ||||
|     set: exportFunction(function () {}, window), | ||||
|     configurable: true, | ||||
|   }); | ||||
| 
 | ||||
|   function setLastClientX(evt) { | ||||
|     lastClientX = evt.clientX; | ||||
|   } | ||||
| 
 | ||||
|   const captchaOverlayQuery = ".TUXModal-overlay"; | ||||
| 
 | ||||
|   function activate() { | ||||
|     document.documentElement.addEventListener("mousemove", setLastClientX); | ||||
|     document.documentElement.addEventListener("dragover", setLastClientX); | ||||
|   } | ||||
| 
 | ||||
|   function deactivate() { | ||||
|     lastClientX = 0; | ||||
|     document.documentElement.removeEventListener("mousemove", setLastClientX); | ||||
|     document.documentElement.removeEventListener("dragover", setLastClientX); | ||||
|   } | ||||
| 
 | ||||
|   const captchaObserver = new MutationObserver(mutations => { | ||||
|     for (let { addedNodes, removedNodes } of mutations) { | ||||
|       for (const node of addedNodes) { | ||||
|         try { | ||||
|           if (node.matches(captchaOverlayQuery)) { | ||||
|             activate(); | ||||
|           } | ||||
|         } catch (_) {} | ||||
|       } | ||||
|       for (const node of removedNodes) { | ||||
|         try { | ||||
|           if (node.matches(captchaOverlayQuery)) { | ||||
|             deactivate(); | ||||
|           } | ||||
|         } catch (_) {} | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
|   captchaObserver.observe(document.documentElement, { | ||||
|     childList: true, | ||||
|     subtree: true, | ||||
|   }); | ||||
| })(); | ||||
|  | @ -144,13 +144,14 @@ class UAOverrides { | |||
| 
 | ||||
|   async registerUAOverrides() { | ||||
|     const platformMatches = ["all"]; | ||||
|     let platformInfo = await browser.runtime.getPlatformInfo(); | ||||
|     platformMatches.push(platformInfo.os == "android" ? "android" : "desktop"); | ||||
|     const { os } = await browser.runtime.getPlatformInfo(); | ||||
|     platformMatches.push(os); | ||||
|     platformMatches.push(os == "android" ? "android" : "desktop"); | ||||
| 
 | ||||
|     for (const override of this._availableOverrides) { | ||||
|       if (platformMatches.includes(override.platform)) { | ||||
|         override.availableOnPlatform = true; | ||||
|         override.currentPlatform = platformInfo.os; | ||||
|         override.currentPlatform = os; | ||||
| 
 | ||||
|         // If there is a specific about:config preference governing
 | ||||
|         // this override, monitor its state.
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|   "manifest_version": 2, | ||||
|   "name": "Web Compatibility Interventions", | ||||
|   "description": "Urgent post-release fixes for web compatibility.", | ||||
|   "version": "128.5.0", | ||||
|   "version": "133.2.0", | ||||
|   "browser_specific_settings": { | ||||
|     "gecko": { | ||||
|       "id": "webcompat@mozilla.org", | ||||
|  | @ -120,6 +120,7 @@ | |||
|     "shims/facebook-sdk.js", | ||||
|     "shims/facebook.svg", | ||||
|     "shims/fastclick.js", | ||||
|     "shims/figshare.js", | ||||
|     "shims/firebase.js", | ||||
|     "shims/google-ads.js", | ||||
|     "shims/google-analytics-and-tag-manager.js", | ||||
|  |  | |||
|  | @ -56,6 +56,7 @@ FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["injections"]["css"] += [ | |||
|     "injections/css/bug1765947-veniceincoming.com-left-fix.css", | ||||
|     "injections/css/bug1770962-coldwellbankerhomes.com-image-height.css", | ||||
|     "injections/css/bug1774490-rainews.it-gallery-fix.css", | ||||
|     "injections/css/bug1779908-play.google.com-scrollbar-fix.css", | ||||
|     "injections/css/bug1784141-aveeno.com-acuvue.com-unsupported.css", | ||||
|     "injections/css/bug1784199-entrata-platform-unsupported.css", | ||||
|     "injections/css/bug1819678-nppes.cms.hhs.gov-unsupported-banner.css", | ||||
|  | @ -67,14 +68,20 @@ FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["injections"]["css"] += [ | |||
|     "injections/css/bug1830813-page.onstove.com-hide-unsupported.css", | ||||
|     "injections/css/bug1836103-autostar-novoross.ru-make-map-taller.css", | ||||
|     "injections/css/bug1836105-cnn.com-fix-blank-pages-when-printing.css", | ||||
|     "injections/css/bug1836872-docs.google.com-font-submenus-inaccessible.css", | ||||
|     "injections/css/bug1848711-vio.com-page-height.css", | ||||
|     "injections/css/bug1848713-cleanrider.com-slider.css", | ||||
|     "injections/css/bug1848849-theaa.com-printing-mode-fix.css", | ||||
|     "injections/css/bug1849388-kucharkaprodceru.cz-scroll-fix.css", | ||||
|     "injections/css/bug1856915-login.yahoo.com-unhide-password-button-fix.css", | ||||
|     "injections/css/bug1868345-tvmovie.de-scroll-fix.css", | ||||
|     "injections/css/bug1877346-offerup.com-infinite-scroll-fix.css", | ||||
|     "injections/css/bug1882040-disable-pull-to-refresh.css", | ||||
|     "injections/css/bug1879879-developers.pinterest.com-list-alignment-fix.css", | ||||
|     "injections/css/bug1884842-foodora.cz-height-fix.css", | ||||
|     "injections/css/bug1886616-www.six-group.com-select-fix.css", | ||||
|     "injections/css/bug1895051-www.zhihu.com-broken-button-fix.css", | ||||
|     "injections/css/bug1895994-softtrans.ro-unlock-scrolling.css", | ||||
|     "injections/css/bug1896349-vivaldi.com-selected-text-fix.css", | ||||
|     "injections/css/bug1896571-gracobaby.ca-unlock-scrolling.css", | ||||
| ] | ||||
| 
 | ||||
| FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["injections"]["js"] += [ | ||||
|  | @ -99,14 +106,20 @@ FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["injections"]["js"] += [ | |||
|     "injections/js/bug1830776-blueshieldca.com-unsupported.js", | ||||
|     "injections/js/bug1831007-nintendo-window-OnetrustActiveGroups.js", | ||||
|     "injections/js/bug1836157-thai-masszazs-niceScroll-disable.js", | ||||
|     "injections/js/bug1841730-www.korg.com-fix-broken-page-loads.js", | ||||
|     "injections/js/bug1842437-www.youtube.com-performance-now-precision.js", | ||||
|     "injections/js/bug1849058-nicochannel.jp-picture-in-picture-shim.js", | ||||
|     "injections/js/bug1855014-eksiseyler.com.js", | ||||
|     "injections/js/bug1855071-www.meteoam.it.js", | ||||
|     "injections/js/bug1859617-installtrigger-removal-shim.js", | ||||
|     "injections/js/bug1864564-esri-transfrom-names-shim.js", | ||||
|     "injections/js/bug1881922-disable-legacy-mutation-events.js", | ||||
|     "injections/js/bug1889326-office365-email-handling-prompt-autohide.js", | ||||
|     "injections/js/bug1896383-error-capturestacktrace-shim.js", | ||||
|     "injections/js/bug1897120-turnjs-zoom-fix.js", | ||||
|     "injections/js/bug1898952-digits.t-mobile.com.js", | ||||
|     "injections/js/bug1899937-plus.nhk.jp-request-picture-in-picture.js", | ||||
|     "injections/js/bug1924500-www.tiktok.com-fix-captcha-slider.js", | ||||
| ] | ||||
| 
 | ||||
| FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["shims"] += [ | ||||
|  | @ -132,6 +145,7 @@ FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["shims"] += [ | |||
|     "shims/facebook-sdk.js", | ||||
|     "shims/facebook.svg", | ||||
|     "shims/fastclick.js", | ||||
|     "shims/figshare.js", | ||||
|     "shims/firebase.js", | ||||
|     "shims/google-ads.js", | ||||
|     "shims/google-analytics-and-tag-manager.js", | ||||
|  |  | |||
							
								
								
									
										82
									
								
								browser/extensions/webcompat/shims/figshare.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								browser/extensions/webcompat/shims/figshare.js
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,82 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1895990 - figshare login broken with dFPI enabled | ||||
|  * | ||||
|  * The websites that use figshare for login require unpartitioned third-party | ||||
|  * cookie access for https://figshare.com. The figshare login process sets a
 | ||||
|  * third-party cookie for https://figshare.com, which is used as an proof of
 | ||||
|  * authentication on redirect back to the main site. This shim adds a request | ||||
|  * for storage access for https://figshare.com when the user tries to log in.
 | ||||
|  */ | ||||
| 
 | ||||
| // Third-party origin we need to request storage access for.
 | ||||
| const STORAGE_ACCESS_ORIGIN = "https://figshare.com"; | ||||
| 
 | ||||
| console.warn( | ||||
|   `When logging in, Firefox calls the Storage Access API on behalf of the site. See https://bugzilla.mozilla.org/show_bug.cgi?id=1895990 for details.` | ||||
| ); | ||||
| 
 | ||||
| document.documentElement.addEventListener( | ||||
|   "click", | ||||
|   e => { | ||||
|     const { target, isTrusted } = e; | ||||
|     if (!isTrusted) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     // If the user clicks the login link, we need to request storage access
 | ||||
|     // for https://figshare.com.
 | ||||
|     const link = target.closest(`a[href^="https://login.figshare.com"]`); | ||||
|     if (!link) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     console.warn( | ||||
|       "Calling the Storage Access API on behalf of " + STORAGE_ACCESS_ORIGIN | ||||
|     ); | ||||
| 
 | ||||
|     e.stopPropagation(); | ||||
|     e.preventDefault(); | ||||
|     document.requestStorageAccessForOrigin(STORAGE_ACCESS_ORIGIN).then(() => { | ||||
|       link.click(); | ||||
|     }); | ||||
|   }, | ||||
|   true | ||||
| ); | ||||
| 
 | ||||
| function watchFirefoxNotificationDialogAndHide() { | ||||
|   const observer = new MutationObserver((mutations, obs) => { | ||||
|     const element = document.querySelector( | ||||
|       "div[data-alerts-channel='firefox-notifications']" | ||||
|     ); | ||||
|     if (element) { | ||||
|       element.style.display = "none"; | ||||
|       obs.disconnect(); // Stop observing once we've found and hidden the element
 | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
|   // Start observing the document.
 | ||||
|   observer.observe(document.body, { | ||||
|     childList: true, | ||||
|     subtree: true, | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // Hide the Firefox error notification
 | ||||
| const notificationElement = document.querySelector( | ||||
|   "div[data-alerts-channel='firefox-notifications']" | ||||
| ); | ||||
| if (notificationElement) { | ||||
|   notificationElement.style.display = "none"; | ||||
| } else { | ||||
|   // Add a listener to watch for the Firefox notification element to load.
 | ||||
|   window.addEventListener( | ||||
|     "DOMContentLoaded", | ||||
|     watchFirefoxNotificationDialogAndHide | ||||
|   ); | ||||
| } | ||||
|  | @ -290,6 +290,8 @@ const AVAILABLE_INJECTIONS = [ | |||
|         "*://www.facebook.com/*", // Bug 1739489
 | ||||
|         "*://twitter.com/*", // Bug 1776229
 | ||||
|         "*://mobile.twitter.com/*", // Bug 1776229
 | ||||
|         "*://x.com/*", // Bug 1776229
 | ||||
|         "*://mobile.x.com/*", // Bug 1776229
 | ||||
|         "*://*.reddit.com/*", // Bug 1829755
 | ||||
|       ], | ||||
|       js: [ | ||||
|  | @ -585,6 +587,7 @@ const AVAILABLE_INJECTIONS = [ | |||
|         "*://*.lafoodbank.org/*", // 127006
 | ||||
|         "*://rutamayacoffee.com/*", // 129353
 | ||||
|         "*://ottoandspike.com.au/*", // bugzilla 1644602
 | ||||
|         "*://give.umrelief.org/give/*", // bugzilla 1916407
 | ||||
|       ], | ||||
|       js: [ | ||||
|         { | ||||
|  | @ -1001,20 +1004,6 @@ const AVAILABLE_INJECTIONS = [ | |||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1877346", | ||||
|     platform: "android", | ||||
|     domain: "offerup.com", | ||||
|     bug: "1877346", | ||||
|     contentScripts: { | ||||
|       matches: ["*://offerup.com/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1877346-offerup.com-infinite-scroll-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1884842", | ||||
|     platform: "android", | ||||
|  | @ -1059,15 +1048,108 @@ const AVAILABLE_INJECTIONS = [ | |||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "1882040", | ||||
|     platform: "android", | ||||
|     domain: "YouTube Shorts", | ||||
|     bug: "1882040", | ||||
|     id: "1922175", | ||||
|     platform: "all", | ||||
|     domain: "app.livingsecurity.com", | ||||
|     bug: "1922175", | ||||
|     contentScripts: { | ||||
|       matches: ["*://m.youtube.com/shorts", "*://m.youtube.com/shorts/*"], | ||||
|       matches: ["*://app.livingsecurity.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1896383-error-capturestacktrace-shim.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1889326", | ||||
|     platform: "desktop", | ||||
|     domain: "Office 365 email handling prompt", | ||||
|     bug: "1889326", | ||||
|     contentScripts: { | ||||
|       matches: [ | ||||
|         "*://*.live.com/*", | ||||
|         "*://*.office.com/*", | ||||
|         "*://*.office365.com/*", | ||||
|         "*://*.office365.us/*", | ||||
|         "*://*.outlook.cn/*", | ||||
|         "*://*.outlook.com/*", | ||||
|         "*://*.sharepoint.com/*", | ||||
|       ], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1889326-office365-email-handling-prompt-autohide.js", | ||||
|         }, | ||||
|       ], | ||||
|       allFrames: true, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1881922", | ||||
|     platform: "all", | ||||
|     domain: "helpdeskgeek.com", | ||||
|     bug: "1881922", | ||||
|     contentScripts: { | ||||
|       matches: ["*://helpdeskgeek.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1881922-disable-legacy-mutation-events.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1901780", | ||||
|     platform: "all", | ||||
|     domain: "vanbreda-health.be", | ||||
|     bug: "1901780", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.vanbreda-health.be/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1881922-disable-legacy-mutation-events.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1896571", | ||||
|     platform: "all", | ||||
|     domain: "gracobaby.ca", | ||||
|     bug: "1896571", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.gracobaby.ca/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1882040-disable-pull-to-refresh.css", | ||||
|           file: "injections/css/bug1896571-gracobaby.ca-unlock-scrolling.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1895994", | ||||
|     platform: "android", | ||||
|     domain: "www.softrans.ro", | ||||
|     bug: "1895994", | ||||
|     contentScripts: { | ||||
|       matches: ["*://*.softrans.ro/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1895994-softtrans.ro-unlock-scrolling.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1898952", | ||||
|     platform: "desktop", | ||||
|     domain: "digits.t-mobile.com", | ||||
|     bug: "1898952", | ||||
|     contentScripts: { | ||||
|       matches: ["*://digits.t-mobile.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1898952-digits.t-mobile.com.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|  | @ -1094,6 +1176,146 @@ const AVAILABLE_INJECTIONS = [ | |||
|       allFrames: true, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1899937", | ||||
|     platform: "all", | ||||
|     domain: "plus.nhk.jp", | ||||
|     bug: "1899937", | ||||
|     contentScripts: { | ||||
|       matches: ["*://plus.nhk.jp/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1899937-plus.nhk.jp-request-picture-in-picture.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1886616", | ||||
|     platform: "all", | ||||
|     domain: "www.six-group.com", | ||||
|     bug: "1886616", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.six-group.com/*/market-data/etf/etf-explorer.html*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1886616-www.six-group.com-select-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1896349", | ||||
|     platform: "all", | ||||
|     domain: "vivaldi.com", | ||||
|     bug: "1896349", | ||||
|     contentScripts: { | ||||
|       matches: ["*://vivaldi.com/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1896349-vivaldi.com-selected-text-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1836872", | ||||
|     platform: "desktop", | ||||
|     domain: "docs.google.com", | ||||
|     bug: "1836872", | ||||
|     contentScripts: { | ||||
|       matches: ["*://docs.google.com/document/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1836872-docs.google.com-font-submenus-inaccessible.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1779908", | ||||
|     platform: "desktop", | ||||
|     domain: "docs.google.com", | ||||
|     bug: "1779908", | ||||
|     contentScripts: { | ||||
|       matches: ["*://play.google.com/store/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1779908-play.google.com-scrollbar-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1879879", | ||||
|     platform: "all", | ||||
|     domain: "developers.pinterest.com", | ||||
|     bug: "1879879", | ||||
|     contentScripts: { | ||||
|       matches: ["*://developers.pinterest.com/docs/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1879879-developers.pinterest.com-list-alignment-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1856915", | ||||
|     platform: "android", | ||||
|     domain: "login.yahoo.com", | ||||
|     bug: "1856915", | ||||
|     contentScripts: { | ||||
|       matches: ["*://login.yahoo.com/account/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1856915-login.yahoo.com-unhide-password-button-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1841730", | ||||
|     platform: "desktop", | ||||
|     domain: "www.korg.com", | ||||
|     bug: "1841730", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.korg.com/*/support/download/product/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1841730-www.korg.com-fix-broken-page-loads.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1895051", | ||||
|     platform: "all", | ||||
|     domain: "www.zhihu.com", | ||||
|     bug: "1895051", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.zhihu.com/question/*"], | ||||
|       css: [ | ||||
|         { | ||||
|           file: "injections/css/bug1895051-www.zhihu.com-broken-button-fix.css", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     id: "bug1924500", | ||||
|     platform: "desktop", | ||||
|     domain: "www.tiktok.com", | ||||
|     bug: "1924500", | ||||
|     contentScripts: { | ||||
|       matches: ["*://www.tiktok.com/*"], | ||||
|       js: [ | ||||
|         { | ||||
|           file: "injections/js/bug1924500-www.tiktok.com-fix-captcha-slider.js", | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
| ]; | ||||
| 
 | ||||
| module.exports = AVAILABLE_INJECTIONS; | ||||
|  |  | |||
|  | @ -379,6 +379,27 @@ const AVAILABLE_SHIMS = [ | |||
|     ], | ||||
|     onlyIfBlockedByETP: true, | ||||
|   }, | ||||
|   { | ||||
|     id: "figshare", | ||||
|     platform: "all", | ||||
|     name: "Figshare", | ||||
|     bug: "1895990", | ||||
|     contentScripts: [ | ||||
|       { | ||||
|         js: "figshare.js", | ||||
|         matches: [ | ||||
|           "*://*.figsharelabs.io/*", | ||||
|           "*://opal.latrobe.edu.au/*", | ||||
|           "*://repository.lboro.ac.uk/*", | ||||
|           "*://portal.sds.ox.ac.uk/*", | ||||
|           "*://curate.nd.edu/*", | ||||
|           "*://kilthub.cmu.edu/*", | ||||
|         ], | ||||
|         runAt: "document_start", | ||||
|       }, | ||||
|     ], | ||||
|     onlyIfDFPIActive: true, | ||||
|   }, | ||||
|   { | ||||
|     id: "GoogleAnalyticsAndTagManager", | ||||
|     platform: "all", | ||||
|  |  | |||
|  | @ -1210,6 +1210,254 @@ const AVAILABLE_UA_OVERRIDES = [ | |||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1842767 - UA override for passport.bilibili.com | ||||
|      * | ||||
|      * Spoofing as Chrome makes the login page use a mobile layout. | ||||
|      */ | ||||
|     id: "bug1842767", | ||||
|     platform: "android", | ||||
|     domain: "passport.bilibili.com", | ||||
|     bug: "1842767", | ||||
|     config: { | ||||
|       matches: ["*://*.passport.bilibili.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1896354 - UA override for my.rhinoshield.fr | ||||
|      * | ||||
|      * Sites only supports Chrome, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1896354", | ||||
|     platform: "all", | ||||
|     domain: "my.rhinoshield.fr", | ||||
|     bug: "1896354", | ||||
|     config: { | ||||
|       matches: ["*://my.rhinoshield.fr/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1813177 - UA override for rbi.org.in | ||||
|      * | ||||
|      * The site endlessly redirects for a Firefox mobile UA string. | ||||
|      */ | ||||
|     id: "bug1813177", | ||||
|     platform: "android", | ||||
|     domain: "m.rbi.org.in", | ||||
|     bug: "1813177", | ||||
|     config: { | ||||
|       matches: ["*://m.rbi.org.in/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1903970 - UA override for unimedlitoral.com.br | ||||
|      * Webcompat issue #138342 - https://webcompat.com/issues/138342
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1903970", | ||||
|     platform: "all", | ||||
|     domain: "www.unimedlitoral.com.br", | ||||
|     bug: "1903970", | ||||
|     config: { | ||||
|       matches: ["*://www.unimedlitoral.com.br/agendaonline/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1902474 - UA override for lg.jio.com | ||||
|      * Webcompat issue #124681 - https://webcompat.com/issues/124681
 | ||||
|      * | ||||
|      * Site incorrectly blocks Firefox on Android. A desktop UA works. | ||||
|      */ | ||||
|     id: "bug1902474", | ||||
|     platform: "android", | ||||
|     domain: "lg.jio.com", | ||||
|     bug: "1902474", | ||||
|     config: { | ||||
|       matches: ["*://lg.jio.com/*"], | ||||
|       uaTransformer: originalUA => { | ||||
|         return originalUA.replace(/ (Mobile|Tablet);/, ""); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1909448 - UA override for fire.honeywell.com | ||||
|      * | ||||
|      * Site doesn't load on Firefox, but works fine with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1909448", | ||||
|     platform: "all", | ||||
|     domain: "fire.honeywell.com", | ||||
|     bug: "1909448", | ||||
|     config: { | ||||
|       matches: ["*://fire.honeywell.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1899937 - UA override for plus.nhk.jp | ||||
|      * Webcompat issue #103463 - https://webcompat.com/issues/103463
 | ||||
|      * | ||||
|      * Site blocks Firefox, so a UA spoof and an intervention is needed. | ||||
|      */ | ||||
|     id: "bug1899937-ua", | ||||
|     platform: "all", | ||||
|     domain: "plus.nhk.jp", | ||||
|     bug: "1899937", | ||||
|     config: { | ||||
|       matches: ["*://plus.nhk.jp/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1897724 - UA override for app.homewyse.com | ||||
|      * Webcompat issue #137164 - https://webcompat.com/issues/137164
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1897724", | ||||
|     platform: "all", | ||||
|     domain: "app.homewyse.com", | ||||
|     bug: "1897724", | ||||
|     config: { | ||||
|       matches: ["*://app.homewyse.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1898923 - UA override for trade-in.vodafone.com | ||||
|      * Webcompat issue #127158 - https://webcompat.com/issues/127158
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1898923", | ||||
|     platform: "all", | ||||
|     domain: "trade-in.vodafone.com", | ||||
|     bug: "1898923", | ||||
|     config: { | ||||
|       matches: ["*://trade-in.vodafone.com/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1899067 - UA override for game.granbluefantasy.jp | ||||
|      * Webcompat issue #43155 - https://webcompat.com/issues/43155
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1899067", | ||||
|     platform: "desktop", | ||||
|     domain: "game.granbluefantasy.jp", | ||||
|     bug: "1899067", | ||||
|     config: { | ||||
|       matches: ["*://game.granbluefantasy.jp/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1898941 - UA override for events.webinar.ru | ||||
|      * Webcompat issue #121871 - https://webcompat.com/issues/121871
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "bug1898941", | ||||
|     platform: "all", | ||||
|     domain: "events.webinar.ru", | ||||
|     bug: "1898941", | ||||
|     config: { | ||||
|       matches: ["*://events.webinar.ru/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1919004 - UA override for www.editoracontexto.com.br | ||||
|      * Webcompat issue #141641 - https://webcompat.com/issues/141641
 | ||||
|      * | ||||
|      * Site presents its desktop CSS to Firefox on Android. | ||||
|      */ | ||||
|     id: "bug1919004", | ||||
|     platform: "android", | ||||
|     domain: "www.editoracontexto.com.br", | ||||
|     bug: "1919004", | ||||
|     config: { | ||||
|       matches: ["*://www.editoracontexto.com.br/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1921410 - UA override for beta.maps.apple.com | ||||
|      * Webcompat issue #140205 - https://webcompat.com/issues/140205
 | ||||
|      * | ||||
|      * Apple Maps beta artifically blocks Linux. | ||||
|      */ | ||||
|     id: "bug1921410", | ||||
|     platform: "linux", | ||||
|     domain: "beta.maps.apple.com", | ||||
|     bug: "1921410", | ||||
|     config: { | ||||
|       matches: ["*://beta.maps.apple.com/*"], | ||||
|       uaTransformer: originalUA => { | ||||
|         return UAHelpers.getWindowsUA(originalUA); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   { | ||||
|     /* | ||||
|      * Bug 1899948 - UA override for tv.partner.co.il | ||||
|      * Webcompat issue #64703 - https://webcompat.com/issues/64703
 | ||||
|      * | ||||
|      * Site blocks Firefox, but seems to work with a UA spoof. | ||||
|      */ | ||||
|     id: "1899948", | ||||
|     platform: "all", | ||||
|     domain: "tv.partner.co.il", | ||||
|     bug: "1899948", | ||||
|     config: { | ||||
|       matches: ["*://tv.partner.co.il/*"], | ||||
|       uaTransformer: () => { | ||||
|         return UAHelpers.getDeviceAppropriateChromeUA(); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| ]; | ||||
| 
 | ||||
| module.exports = AVAILABLE_UA_OVERRIDES; | ||||
|  |  | |||
|  | @ -0,0 +1,15 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * play.google.com - Extra scrollbar not hidden on store pages. | ||||
|  * | ||||
|  * Bug #1779908 - https://bugzilla.mozilla.org/show_bug.cgi?id=1779908 | ||||
|  * | ||||
|  * They are hiding the scrollbar with ::webkit-scrollbar, but not the standards- | ||||
|  * compliant method `scrollbar-width:none`. | ||||
|  */ | ||||
| .aoJE7e { | ||||
|   scrollbar-width: none; | ||||
| } | ||||
|  | @ -0,0 +1,18 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * docs.google.com - font submenus are inaccessible with overlay scrollbars on | ||||
|  * Bug #1836872 - https://bugzilla.mozilla.org/show_bug.cgi?id=1836872 | ||||
|  * | ||||
|  * The submenu panels are shifted too far to the right when overlay | ||||
|  * scrollbars are visible, and so they are dismissed while attemting | ||||
|  * to mouse over to them. Shifting them to the left fixes them. | ||||
|  */ | ||||
| /* font family sub-menus */ | ||||
| [class="goog-menu goog-menu-vertical"], | ||||
| /* font style sub-menus */ | ||||
| .goog-menu.apps-menu-hide-mnemonics { | ||||
|   margin-inline-start: -20px; | ||||
| } | ||||
|  | @ -0,0 +1,15 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * login.yahoo.com - Toggle to reveal password text is missing | ||||
|  * | ||||
|  * Bug #1856915 - https://bugzilla.mozilla.org/show_bug.cgi?id=1856915 | ||||
|  * | ||||
|  * Yahoo is using letter-spacing in a way which relies on a Blink quirk to | ||||
|  * not inadvertently hide their show/hide password text toggle. | ||||
|  */ | ||||
| #password-container > input[type="password"] { | ||||
|   min-width: 0; | ||||
| } | ||||
|  | @ -1,20 +0,0 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * offerup.com - Infinite scroll doesn't work | ||||
|  * Bug #1720060 - https://bugzilla.mozilla.org/show_bug.cgi?id=1720060 | ||||
|  * | ||||
|  * The site uses IntersectionObserver to show new items on the page, | ||||
|  * as the page being scrolled and it doesn't work with with | ||||
|  * Dynamic Toolbar enabled. Adding an empty element after the content | ||||
|  * to make up for the height of the dynamic toolbar makes it work. | ||||
|  */ | ||||
| 
 | ||||
| #__next::after { | ||||
|   display: block; | ||||
|   width: 100%; | ||||
|   height: 10px; | ||||
|   content: ""; | ||||
| } | ||||
|  | @ -0,0 +1,12 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * developers.pinterest.com - List elements are misaligned | ||||
|  * | ||||
|  * Bug #1879879 - https://bugzilla.mozilla.org/show_bug.cgi?id=1879879 | ||||
|  */ | ||||
| li > span:has(> div) { | ||||
|   display: block; | ||||
| } | ||||
|  | @ -1,14 +0,0 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * m.youtube.com/shorts - pull-to-refresh breaks scrolling | ||||
|  * Bug #1882040 - https://bugzilla.mozilla.org/show_bug.cgi?id=1882040 | ||||
|  * | ||||
|  * Pull-to-refresh is breaking scrolling on the YouTube Shorts mobile page. | ||||
|  * The easiest work-around is to inject this CSS to disable it for now. | ||||
|  */ | ||||
| html { | ||||
|   overscroll-behavior: contain; | ||||
| } | ||||
|  | @ -0,0 +1,15 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * www.six-group.com - Selected input values are hidden | ||||
|  * Bug #1886616 - https://bugzilla.mozilla.org/show_bug.cgi?id=1886616 | ||||
|  * WebCompat issue #129271 - https://webcompat.com/issues/129271 | ||||
|  * | ||||
|  * The page is hiding CSS content, which is not interoperable. In this | ||||
|  * case, it causes their select dropdown's values to be hidden. | ||||
|  */ | ||||
| select { | ||||
|   content: normal; | ||||
| } | ||||
|  | @ -0,0 +1,16 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * www.zhihu.com - Certain directory buttons are unclickable | ||||
|  * | ||||
|  * Bug #1895051 - https://bugzilla.mozilla.org/show_bug.cgi?id=1895051 | ||||
|  * | ||||
|  * On narrow enough screens, some of the site's directory buttons | ||||
|  * overlap with text differently on Firefox and Safari than in Chromium, | ||||
|  * making them unclickable. This fixes the issue. | ||||
|  */ | ||||
| .css-376mun { | ||||
|   display: block; | ||||
| } | ||||
|  | @ -0,0 +1,16 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * softtrans.ro - users cannot scroll the page horizontally on Android | ||||
|  * Bug #1895994 - https://bugzilla.mozilla.org/show_bug.cgi?id=1895994 | ||||
|  * | ||||
|  * The page uses a meta viewport tag on Android, and also hides overflow-x | ||||
|  * on the body tag, making it impossible to scroll the page. We can unset | ||||
|  * the overflow to fix this. | ||||
|  */ | ||||
| 
 | ||||
| body { | ||||
|   overflow-x: auto; | ||||
| } | ||||
|  | @ -0,0 +1,13 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * vivaldi.com - Selected text is invisible | ||||
|  * Bug #1896349 - https://bugzilla.mozilla.org/show_bug.cgi?id=1896349 | ||||
|  * WebCompat issue #136863 - https://webcompat.com/issues/136863 | ||||
|  */ | ||||
| ::selection { | ||||
|   color: HighlightText; | ||||
|   background-color: Highlight; | ||||
| } | ||||
|  | @ -0,0 +1,18 @@ | |||
| /* 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/. */ | ||||
| 
 | ||||
| /** | ||||
|  * gracobaby.ca - users cannot scroll the page on narrow viewports | ||||
|  * Bug #1896571 - https://bugzilla.mozilla.org/show_bug.cgi?id=1896571 | ||||
|  * | ||||
|  * The page uses a meta viewport on narrower screen widths, and also | ||||
|  * hides overflow on the html tag, making it impossible to scroll the | ||||
|  * page. We can unset the overflow to fix this. | ||||
|  */ | ||||
| 
 | ||||
| @media (max-width: 767.98px) { | ||||
|   html { | ||||
|     overflow: auto; | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,35 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1841730 - Fix www.korg.com support download page loads on Windows. | ||||
|  * WebCompat issue #2787 - https://webcompat.com/issues/2787
 | ||||
|  * | ||||
|  * They are using a library named PACE, which has a timing bug with Firefox | ||||
|  * which breaks page loads (due to a stuck progress indicator) on Windows. | ||||
|  * This is the fix suggested at https://github.com/CodeByZach/pace/issues/510
 | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| (function () { | ||||
|   const win = window.wrappedJSObject; | ||||
| 
 | ||||
|   let val = new win.Object(); | ||||
|   val.eventLag = false; | ||||
| 
 | ||||
|   Object.defineProperty(win, "paceOptions", { | ||||
|     configurable: true, | ||||
| 
 | ||||
|     get: exportFunction(function () { | ||||
|       return val; | ||||
|     }, window), | ||||
| 
 | ||||
|     set: exportFunction(function (_val) { | ||||
|       val = _val; | ||||
|     }, window), | ||||
|   }); | ||||
| })(); | ||||
|  | @ -0,0 +1,43 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bugs 1881922, 1901780 - Disable legacy DOM Mutation Events to prevent performance issues. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| let bug = "1881922"; | ||||
| if (location.origin.includes("vanbreda")) { | ||||
|   bug = "1901780"; | ||||
| } | ||||
| console.info( | ||||
|   `DOM Mutation Events have been disabled to prevent performance issues. See https://bugzilla.mozilla.org/show_bug.cgi?id=${bug} for details.` | ||||
| ); | ||||
| 
 | ||||
| (function disableMutationEvents() { | ||||
|   const whichEvents = [ | ||||
|     "domattrmodified", | ||||
|     "domcharacterdatamodified", | ||||
|     "domnodeinserted", | ||||
|     "domnodeinsertedintodocument", | ||||
|     "domnoderemoved", | ||||
|     "domnoderemovedfromdocument", | ||||
|     "domsubtreemodified", | ||||
|   ]; | ||||
| 
 | ||||
|   const { prototype } = window.wrappedJSObject.EventTarget; | ||||
|   const { addEventListener } = prototype; | ||||
|   Object.defineProperty(prototype, "addEventListener", { | ||||
|     value: exportFunction(function (_type, b, c, d) { | ||||
|       const type = _type?.toLowerCase(); | ||||
|       if (whichEvents.includes(type)) { | ||||
|         return undefined; | ||||
|       } | ||||
|       return addEventListener.call(this, type, b, c, d); | ||||
|     }, window), | ||||
|   }); | ||||
| })(); | ||||
|  | @ -0,0 +1,36 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1889326 - Office 365 email handling prompt autohide | ||||
|  * | ||||
|  * This site patch prevents the notification bar on Office 365 | ||||
|  * apps from popping up on each page-load, offering to handle | ||||
|  * email with Outlook. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| const warning = | ||||
|   "Office 365 Outlook email handling prompt has been hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=1889326 for details."; | ||||
| 
 | ||||
| const localStorageKey = "mailProtocolHandlerAlreadyOffered"; | ||||
| 
 | ||||
| const nav = navigator.wrappedJSObject; | ||||
| const { registerProtocolHandler } = nav; | ||||
| const { localStorage } = window.wrappedJSObject; | ||||
| 
 | ||||
| Object.defineProperty(navigator.wrappedJSObject, "registerProtocolHandler", { | ||||
|   value: exportFunction(function (scheme, url, title) { | ||||
|     if (localStorage.getItem(localStorageKey)) { | ||||
|       console.info(warning); | ||||
|       return undefined; | ||||
|     } | ||||
|     registerProtocolHandler.call(nav, scheme, url, title); | ||||
|     localStorage.setItem(localStorageKey, true); | ||||
|     return undefined; | ||||
|   }, window), | ||||
| }); | ||||
|  | @ -0,0 +1,68 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1898952 - Spoof navigator.userAgentData for digits.t-mobile.com | ||||
|  * Webcompat issue #119767 - https://webcompat.com/issues/119767
 | ||||
|  * | ||||
|  * The site blocks Firefox and Safari, reading info from userAgentData. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction, cloneInto */ | ||||
| 
 | ||||
| if (!navigator.userAgentData) { | ||||
|   console.info( | ||||
|     "navigator.userAgentData has been overridden for compatibility reasons. See https://webcompat.com/issues/119767 for details." | ||||
|   ); | ||||
| 
 | ||||
|   const ua = navigator.userAgent; | ||||
|   const mobile = ua.includes("Mobile") || ua.includes("Tablet"); | ||||
| 
 | ||||
|   // Very roughly matches Chromium's GetPlatformForUAMetadata()
 | ||||
|   let platform = "Linux"; | ||||
|   if (mobile) { | ||||
|     platform = "Android"; | ||||
|   } else if (navigator.platform.startsWith("Win")) { | ||||
|     platform = "Windows"; | ||||
|   } else if (navigator.platform.startsWith("Mac")) { | ||||
|     platform = "macOS"; | ||||
|   } | ||||
| 
 | ||||
|   const version = (ua.match(/Firefox\/([0-9.]+)/) || ["", "58.0"])[1]; | ||||
| 
 | ||||
|   // These match Chrome's output as of version 126.
 | ||||
|   const brands = [ | ||||
|     { | ||||
|       brand: "Not/A)Brand", | ||||
|       version: "8", | ||||
|     }, | ||||
|     { | ||||
|       brand: "Chromium", | ||||
|       version, | ||||
|     }, | ||||
|     { | ||||
|       brand: "Google Chrome", | ||||
|       version, | ||||
|     }, | ||||
|   ]; | ||||
| 
 | ||||
|   const userAgentData = cloneInto( | ||||
|     { | ||||
|       brands, | ||||
|       mobile, | ||||
|       platform, | ||||
|     }, | ||||
|     window | ||||
|   ); | ||||
| 
 | ||||
|   Object.defineProperty(window.navigator.wrappedJSObject, "userAgentData", { | ||||
|     get: exportFunction(function () { | ||||
|       return userAgentData; | ||||
|     }, window), | ||||
| 
 | ||||
|     set: exportFunction(function () {}, window), | ||||
|   }); | ||||
| } | ||||
|  | @ -0,0 +1,27 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1899937 - Shim requestPictureInPicture for plus.nhk.jp | ||||
|  * WebCompat issue #103463 - https://webcompat.com/issues/103463
 | ||||
|  * | ||||
|  * plus.nhk.jp is showing an error when attempting to play videos. | ||||
|  * Shimming requestPictureInPicture to `{}` makes the videos play. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| console.info( | ||||
|   "requestPictureInPicture was shimmed for compatibility reasons. See https://bugzilla.mozilla.org/show_bug.cgi?id=1899937 for details." | ||||
| ); | ||||
| 
 | ||||
| const proto = HTMLVideoElement.wrappedJSObject.prototype; | ||||
| 
 | ||||
| Object.defineProperty(proto, "requestPictureInPicture", { | ||||
|   value: exportFunction(function () { | ||||
|     return {}; | ||||
|   }, window), | ||||
| }); | ||||
|  | @ -0,0 +1,71 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1924500 - Fix www.tiktok.com captcha slider | ||||
|  * WebCompat issue #142709 - https://webcompat.com/issues/142709
 | ||||
|  * | ||||
|  * They are relying on drag events having clientX coordinates, which are | ||||
|  * always zero on Firefox. A work-around is to listen for mousemove and | ||||
|  * dragover events to capture the clientX value from them, and then | ||||
|  * pass the value along when they reads a DragEvent.clientX. | ||||
|  */ | ||||
| 
 | ||||
| /* globals exportFunction */ | ||||
| 
 | ||||
| (function () { | ||||
|   let lastClientX = 0; | ||||
| 
 | ||||
|   const win = window.wrappedJSObject; | ||||
|   Object.defineProperty(win.DragEvent.prototype, "clientX", { | ||||
|     get: exportFunction(function () { | ||||
|       return lastClientX; | ||||
|     }, window), | ||||
|     set: exportFunction(function () {}, window), | ||||
|     configurable: true, | ||||
|   }); | ||||
| 
 | ||||
|   function setLastClientX(evt) { | ||||
|     lastClientX = evt.clientX; | ||||
|   } | ||||
| 
 | ||||
|   const captchaOverlayQuery = ".TUXModal-overlay"; | ||||
| 
 | ||||
|   function activate() { | ||||
|     document.documentElement.addEventListener("mousemove", setLastClientX); | ||||
|     document.documentElement.addEventListener("dragover", setLastClientX); | ||||
|   } | ||||
| 
 | ||||
|   function deactivate() { | ||||
|     lastClientX = 0; | ||||
|     document.documentElement.removeEventListener("mousemove", setLastClientX); | ||||
|     document.documentElement.removeEventListener("dragover", setLastClientX); | ||||
|   } | ||||
| 
 | ||||
|   const captchaObserver = new MutationObserver(mutations => { | ||||
|     for (let { addedNodes, removedNodes } of mutations) { | ||||
|       for (const node of addedNodes) { | ||||
|         try { | ||||
|           if (node.matches(captchaOverlayQuery)) { | ||||
|             activate(); | ||||
|           } | ||||
|         } catch (_) {} | ||||
|       } | ||||
|       for (const node of removedNodes) { | ||||
|         try { | ||||
|           if (node.matches(captchaOverlayQuery)) { | ||||
|             deactivate(); | ||||
|           } | ||||
|         } catch (_) {} | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
|   captchaObserver.observe(document.documentElement, { | ||||
|     childList: true, | ||||
|     subtree: true, | ||||
|   }); | ||||
| })(); | ||||
|  | @ -144,13 +144,14 @@ class UAOverrides { | |||
| 
 | ||||
|   async registerUAOverrides() { | ||||
|     const platformMatches = ["all"]; | ||||
|     let platformInfo = await browser.runtime.getPlatformInfo(); | ||||
|     platformMatches.push(platformInfo.os == "android" ? "android" : "desktop"); | ||||
|     const { os } = await browser.runtime.getPlatformInfo(); | ||||
|     platformMatches.push(os); | ||||
|     platformMatches.push(os == "android" ? "android" : "desktop"); | ||||
| 
 | ||||
|     for (const override of this._availableOverrides) { | ||||
|       if (platformMatches.includes(override.platform)) { | ||||
|         override.availableOnPlatform = true; | ||||
|         override.currentPlatform = platformInfo.os; | ||||
|         override.currentPlatform = os; | ||||
| 
 | ||||
|         // If there is a specific about:config preference governing
 | ||||
|         // this override, monitor its state.
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|   "manifest_version": 2, | ||||
|   "name": "Web Compatibility Interventions", | ||||
|   "description": "Urgent post-release fixes for web compatibility.", | ||||
|   "version": "128.5.0", | ||||
|   "version": "133.2.0", | ||||
|   "browser_specific_settings": { | ||||
|     "gecko": { | ||||
|       "id": "webcompat@mozilla.org", | ||||
|  | @ -120,6 +120,7 @@ | |||
|     "shims/facebook-sdk.js", | ||||
|     "shims/facebook.svg", | ||||
|     "shims/fastclick.js", | ||||
|     "shims/figshare.js", | ||||
|     "shims/firebase.js", | ||||
|     "shims/google-ads.js", | ||||
|     "shims/google-analytics-and-tag-manager.js", | ||||
|  |  | |||
|  | @ -0,0 +1,82 @@ | |||
| /* 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"; | ||||
| 
 | ||||
| /** | ||||
|  * Bug 1895990 - figshare login broken with dFPI enabled | ||||
|  * | ||||
|  * The websites that use figshare for login require unpartitioned third-party | ||||
|  * cookie access for https://figshare.com. The figshare login process sets a
 | ||||
|  * third-party cookie for https://figshare.com, which is used as an proof of
 | ||||
|  * authentication on redirect back to the main site. This shim adds a request | ||||
|  * for storage access for https://figshare.com when the user tries to log in.
 | ||||
|  */ | ||||
| 
 | ||||
| // Third-party origin we need to request storage access for.
 | ||||
| const STORAGE_ACCESS_ORIGIN = "https://figshare.com"; | ||||
| 
 | ||||
| console.warn( | ||||
|   `When logging in, Firefox calls the Storage Access API on behalf of the site. See https://bugzilla.mozilla.org/show_bug.cgi?id=1895990 for details.` | ||||
| ); | ||||
| 
 | ||||
| document.documentElement.addEventListener( | ||||
|   "click", | ||||
|   e => { | ||||
|     const { target, isTrusted } = e; | ||||
|     if (!isTrusted) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     // If the user clicks the login link, we need to request storage access
 | ||||
|     // for https://figshare.com.
 | ||||
|     const link = target.closest(`a[href^="https://login.figshare.com"]`); | ||||
|     if (!link) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     console.warn( | ||||
|       "Calling the Storage Access API on behalf of " + STORAGE_ACCESS_ORIGIN | ||||
|     ); | ||||
| 
 | ||||
|     e.stopPropagation(); | ||||
|     e.preventDefault(); | ||||
|     document.requestStorageAccessForOrigin(STORAGE_ACCESS_ORIGIN).then(() => { | ||||
|       link.click(); | ||||
|     }); | ||||
|   }, | ||||
|   true | ||||
| ); | ||||
| 
 | ||||
| function watchFirefoxNotificationDialogAndHide() { | ||||
|   const observer = new MutationObserver((mutations, obs) => { | ||||
|     const element = document.querySelector( | ||||
|       "div[data-alerts-channel='firefox-notifications']" | ||||
|     ); | ||||
|     if (element) { | ||||
|       element.style.display = "none"; | ||||
|       obs.disconnect(); // Stop observing once we've found and hidden the element
 | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
|   // Start observing the document.
 | ||||
|   observer.observe(document.body, { | ||||
|     childList: true, | ||||
|     subtree: true, | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // Hide the Firefox error notification
 | ||||
| const notificationElement = document.querySelector( | ||||
|   "div[data-alerts-channel='firefox-notifications']" | ||||
| ); | ||||
| if (notificationElement) { | ||||
|   notificationElement.style.display = "none"; | ||||
| } else { | ||||
|   // Add a listener to watch for the Firefox notification element to load.
 | ||||
|   window.addEventListener( | ||||
|     "DOMContentLoaded", | ||||
|     watchFirefoxNotificationDialogAndHide | ||||
|   ); | ||||
| } | ||||
|  | @ -5,9 +5,12 @@ | |||
| import asyncio | ||||
| import contextlib | ||||
| import time | ||||
| from base64 import b64decode | ||||
| from io import BytesIO | ||||
| from urllib.parse import quote | ||||
| 
 | ||||
| import webdriver | ||||
| from PIL import Image | ||||
| from webdriver.bidi.modules.script import ContextTarget | ||||
| 
 | ||||
| 
 | ||||
|  | @ -324,7 +327,7 @@ class Client: | |||
|             ) | ||||
| 
 | ||||
|         async def await_text(self, text, **kwargs): | ||||
|             xpath = f"//*[contains(text(),'{text}')]" | ||||
|             xpath = f"//*[text()[contains(.,'{text}')]]" | ||||
|             return await self.await_xpath(self, xpath, **kwargs) | ||||
| 
 | ||||
|         async def await_xpath( | ||||
|  | @ -567,8 +570,8 @@ class Client: | |||
| 
 | ||||
|     def find_text(self, text, is_displayed=None, **kwargs): | ||||
|         try: | ||||
|             ele = self.find_xpath(f"//*[contains(text(),'{text}')]", **kwargs) | ||||
|             return self._do_is_displayed_check(ele, is_displayed) | ||||
|             e = self.find_xpath(f"//*[text()[contains(.,'{text}')]]", **kwargs) | ||||
|             return self._do_is_displayed_check(e, is_displayed) | ||||
|         except webdriver.error.NoSuchElementException: | ||||
|             return None | ||||
| 
 | ||||
|  | @ -757,3 +760,12 @@ class Client: | |||
|           """, | ||||
|             args=[element], | ||||
|         ) | ||||
| 
 | ||||
|     def is_one_solid_color(self, element, max_fuzz=8): | ||||
|         # max_fuzz is needed as screenshots can have slight color bleeding/fringing | ||||
|         shotb64 = element.screenshot() | ||||
|         shot = Image.open(BytesIO(b64decode(shotb64))).convert("RGB") | ||||
|         for min, max in shot.getextrema(): | ||||
|             if max - min > max_fuzz: | ||||
|                 return False | ||||
|         return True | ||||
|  |  | |||
|  | @ -0,0 +1,31 @@ | |||
| import pytest | ||||
| 
 | ||||
| URL = "https://play.google.com/store/games" | ||||
| TOP_BAR_CSS = ".aoJE7e" | ||||
| 
 | ||||
| 
 | ||||
| async def top_bar_has_extra_scrollbar(client): | ||||
|     await client.navigate(URL) | ||||
|     top_bar = client.await_css(TOP_BAR_CSS) | ||||
|     return client.execute_script( | ||||
|         """ | ||||
|         const top_bar = arguments[0]; | ||||
|         const top_bar_item = top_bar.firstElementChild; | ||||
|         return top_bar.getBoundingClientRect().height > top_bar_item.getBoundingClientRect().height; | ||||
|     """, | ||||
|         top_bar, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.skip_platforms("android", "mac") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     assert not await top_bar_has_extra_scrollbar(client) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.skip_platforms("android", "mac") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     assert await top_bar_has_extra_scrollbar(client) | ||||
|  | @ -0,0 +1,67 @@ | |||
| import pytest | ||||
| 
 | ||||
| URL = "https://docs.google.com/document/d/1MUJpu1E-wR1Gq-a8csdzXbOXf4mSzNuMQGxoPPBqK1w/edit" | ||||
| 
 | ||||
| FONT_BUTTON_CSS = "#docs-font-family .goog-toolbar-menu-button-inner-box" | ||||
| FONT_MENU_WITH_SUBMENU_CSS = ( | ||||
|     ".goog-menu-vertical.docs-fontmenu .docs-submenuitem:has(.goog-submenu-arrow)" | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| async def are_font_submenus_accessible(client): | ||||
|     await client.navigate(URL) | ||||
| 
 | ||||
|     # wait for the submenus to be ready (added to the DOM) | ||||
|     client.await_css(FONT_MENU_WITH_SUBMENU_CSS) | ||||
| 
 | ||||
|     # open a submenu | ||||
|     client.await_css(FONT_BUTTON_CSS, is_displayed=True).click() | ||||
|     menuitem = client.await_css(FONT_MENU_WITH_SUBMENU_CSS, is_displayed=True) | ||||
|     font = client.execute_script( | ||||
|         """ | ||||
|         const [menuitem] = arguments; | ||||
| 
 | ||||
|         // get the name of the font, which helps us know which panel to wait for docs to create | ||||
|         const font = menuitem.querySelector("span[style]").style.fontFamily.replace("--Menu", ""); | ||||
| 
 | ||||
|         // trigger a mouseover on the menu item so docs opens the panel | ||||
|         menuitem.dispatchEvent(new MouseEvent("mouseover", { | ||||
|           bubbles: true, | ||||
|           cancelable: true, | ||||
|           view: window, | ||||
|         })); | ||||
| 
 | ||||
|         return font; | ||||
|     """, | ||||
|         menuitem, | ||||
|     ) | ||||
| 
 | ||||
|     # wait for the on-hover popup to actually be created and displayed | ||||
|     popup = client.await_xpath( | ||||
|         "//*[contains(@style, '{}')]".format(font), is_displayed=True | ||||
|     ) | ||||
|     assert popup | ||||
| 
 | ||||
|     return client.execute_script( | ||||
|         """ | ||||
|         const menuitem_arrow = arguments[0].querySelector(".goog-submenu-arrow"); | ||||
|         const popup = arguments[1].closest(".goog-menu.goog-menu-vertical"); | ||||
|         return popup.getBoundingClientRect().left < menuitem_arrow.getBoundingClientRect().right; | ||||
|     """, | ||||
|         menuitem, | ||||
|         popup, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.skip_platforms("android") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     assert await are_font_submenus_accessible(client) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.skip_platforms("android") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     assert not await are_font_submenus_accessible(client) | ||||
|  | @ -0,0 +1,44 @@ | |||
| import pytest | ||||
| from webdriver.error import NoSuchElementException | ||||
| 
 | ||||
| URL = "https://login.yahoo.com/" | ||||
| USERNAME_CSS = "#login-username" | ||||
| SIGNIN_CSS = "#login-signin" | ||||
| TOGGLE_CSS = "#password-toggle-button" | ||||
| RECAPTCHA_CSS = "#recaptcha-challenge" | ||||
| 
 | ||||
| 
 | ||||
| async def is_password_reveal_toggle_fully_visible(client): | ||||
|     await client.navigate(URL) | ||||
|     client.await_css(USERNAME_CSS).send_keys("webcompat") | ||||
|     client.await_css(SIGNIN_CSS).click() | ||||
|     client.await_css(RECAPTCHA_CSS, is_displayed=True) | ||||
|     print("\a")  # beep to let the user know to do the reCAPTCHA | ||||
|     try: | ||||
|         toggle = client.await_css(TOGGLE_CSS, timeout=60) | ||||
|     except NoSuchElementException: | ||||
|         pytest.xfail( | ||||
|             "Timed out waiting for reCAPTCHA to be completed. Please try again." | ||||
|         ) | ||||
|         return False | ||||
|     return client.execute_script( | ||||
|         """ | ||||
|         const toggle = arguments[0].getBoundingClientRect(); | ||||
|         return toggle.width >= 16; | ||||
|     """, | ||||
|         toggle, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.only_platforms("android") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     assert await is_password_reveal_toggle_fully_visible(client) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.only_platforms("android") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     assert not await is_password_reveal_toggle_fully_visible(client) | ||||
|  | @ -0,0 +1,41 @@ | |||
| import pytest | ||||
| from webdriver.error import NoSuchElementException | ||||
| 
 | ||||
| URL = "https://www.six-group.com/en/market-data/etf/etf-explorer.html" | ||||
| COOKIES_CSS = "#onetrust-consent-sdk" | ||||
| SELECT_CSS = "select[name='Dropdown']:has(option[value='active'])" | ||||
| 
 | ||||
| 
 | ||||
| async def select_value_is_visible(client): | ||||
|     try: | ||||
|         cookies = client.await_css(COOKIES_CSS, is_displayed=True, timeout=5) | ||||
|         client.remove_element(cookies) | ||||
|     except NoSuchElementException: | ||||
|         pass | ||||
| 
 | ||||
|     select = client.await_css(SELECT_CSS, is_displayed=True) | ||||
|     assert select | ||||
|     # remove the border and background from the select, so only the text | ||||
|     # should influence the screenshot. | ||||
|     client.execute_script( | ||||
|         """ | ||||
|         arguments[0].style.border = 'none'; | ||||
|         arguments[0].style.background = '#fff'; | ||||
|     """, | ||||
|         select, | ||||
|     ) | ||||
|     return not client.is_one_solid_color(select) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     await client.navigate(URL) | ||||
|     assert await select_value_is_visible(client) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     await client.navigate(URL) | ||||
|     assert not await select_value_is_visible(client) | ||||
|  | @ -0,0 +1,40 @@ | |||
| import pytest | ||||
| 
 | ||||
| URL = "https://vivaldi.com/blog/technology/vivaldi-wont-allow-a-machine-to-lie-to-you/" | ||||
| TEXT_CSS = "article header h1" | ||||
| 
 | ||||
| 
 | ||||
| async def is_selection_different(client): | ||||
|     text = client.await_css(TEXT_CSS, is_displayed=True) | ||||
|     assert text | ||||
| 
 | ||||
|     before = text.screenshot() | ||||
| 
 | ||||
|     client.execute_script( | ||||
|         """ | ||||
|         const text = arguments[0]; | ||||
|         const range = document.createRange(); | ||||
|         range.setStart(text, 0); | ||||
|         range.setEnd(text, 1); | ||||
|         const selection = window.getSelection(); | ||||
|         selection.removeAllRanges(); | ||||
|         selection.addRange(range); | ||||
|     """, | ||||
|         text, | ||||
|     ) | ||||
| 
 | ||||
|     return before != text.screenshot() | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     await client.navigate(URL) | ||||
|     assert await is_selection_different(client) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     await client.navigate(URL) | ||||
|     assert not await is_selection_different(client) | ||||
|  | @ -0,0 +1,23 @@ | |||
| import pytest | ||||
| 
 | ||||
| URL = "https://digits.t-mobile.com/" | ||||
| BLOCKED_CSS = "#incompatible" | ||||
| NOT_BLOCKED_CSS = "#compatible" | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.skip_platforms("android") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     await client.navigate(URL) | ||||
|     assert client.await_css(NOT_BLOCKED_CSS) | ||||
|     assert not client.find_css(BLOCKED_CSS) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.skip_platforms("android") | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     await client.navigate(URL) | ||||
|     assert client.await_css(BLOCKED_CSS) | ||||
|     assert not client.find_css(NOT_BLOCKED_CSS) | ||||
|  | @ -0,0 +1,36 @@ | |||
| import pytest | ||||
| 
 | ||||
| URL = "https://plus.nhk.jp/" | ||||
| UNSUPPORTED_CSS = ".firefox_not_supported" | ||||
| DENIED_TEXT = "This webpage is not available in your area" | ||||
| 
 | ||||
| 
 | ||||
| async def check_site(client, should_pass): | ||||
|     await client.navigate(URL, wait="load") | ||||
| 
 | ||||
|     denied, unsupported = client.await_first_element_of( | ||||
|         [ | ||||
|             client.text(DENIED_TEXT), | ||||
|             client.css(UNSUPPORTED_CSS), | ||||
|         ] | ||||
|     ) | ||||
| 
 | ||||
|     if denied: | ||||
|         pytest.skip("Region-locked, cannot test. Try using a VPN set to Japan.") | ||||
|         return | ||||
| 
 | ||||
|     assert (should_pass and not client.is_displayed(unsupported)) or ( | ||||
|         not should_pass and client.is_displayed(unsupported) | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.with_interventions | ||||
| async def test_enabled(client): | ||||
|     await check_site(client, should_pass=True) | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.asyncio | ||||
| @pytest.mark.without_interventions | ||||
| async def test_disabled(client): | ||||
|     await check_site(client, should_pass=False) | ||||
|  | @ -1,3 +1,4 @@ | |||
| asyncio==3.4.3 | ||||
| pillow==10.3.0 | ||||
| pytest-asyncio==0.16.0 | ||||
| urllib3==1.26 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Thomas Wisniewski
						Thomas Wisniewski