forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			65 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			1.6 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";
 | |
| 
 | |
| /* globals browser */
 | |
| 
 | |
| if (!window.Shims) {
 | |
|   window.Shims = new Map();
 | |
| }
 | |
| 
 | |
| if (!window.ShimsHelperReady) {
 | |
|   window.ShimsHelperReady = true;
 | |
| 
 | |
|   browser.runtime.onMessage.addListener(details => {
 | |
|     const { shimId, warning } = details;
 | |
|     if (!shimId) {
 | |
|       return;
 | |
|     }
 | |
|     window.Shims.set(shimId, details);
 | |
|     if (warning) {
 | |
|       console.warn(warning);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   async function handleMessage(port, shimId, messageId, message) {
 | |
|     let response;
 | |
|     const shim = window.Shims.get(shimId);
 | |
|     if (shim) {
 | |
|       const { needsShimHelpers, origin } = shim;
 | |
|       if (origin === location.origin) {
 | |
|         if (needsShimHelpers?.includes(message)) {
 | |
|           const msg = { shimId, message };
 | |
|           try {
 | |
|             response = await browser.runtime.sendMessage(msg);
 | |
|           } catch (_) {}
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     port.postMessage({ messageId, response });
 | |
|   }
 | |
| 
 | |
|   window.addEventListener(
 | |
|     "ShimConnects",
 | |
|     e => {
 | |
|       e.stopPropagation();
 | |
|       e.preventDefault();
 | |
|       const { port, pendingMessages, shimId } = e.detail;
 | |
|       const shim = window.Shims.get(shimId);
 | |
|       if (!shim) {
 | |
|         return;
 | |
|       }
 | |
|       port.onmessage = ({ data }) => {
 | |
|         handleMessage(port, shimId, data.messageId, data.message);
 | |
|       };
 | |
|       for (const [messageId, message] of pendingMessages) {
 | |
|         handleMessage(port, shimId, messageId, message);
 | |
|       }
 | |
|     },
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   window.dispatchEvent(new CustomEvent("ShimHelperReady"));
 | |
| }
 | 
