mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-10-31 16:28:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| /**
 | |
|  * 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,
 | |
|   });
 | |
| })();
 | 
