mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1187 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1187 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function (global, factory) {
 | |
|     if (typeof define === "function" && define.amd) {
 | |
|         define("webextension-polyfill", ["module"], factory);
 | |
|     } else if (typeof exports !== "undefined") {
 | |
|         factory(module);
 | |
|     } else {
 | |
|         var mod = {
 | |
|             exports: {}
 | |
|         };
 | |
|         factory(mod);
 | |
|         global.browser = mod.exports;
 | |
|     }
 | |
| })(this, function (module) {
 | |
|     /* webextension-polyfill - v0.4.0 - Wed Feb 06 2019 11:58:31 */
 | |
|     /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | |
|     /* vim: set sts=2 sw=2 et tw=80: */
 | |
|     /* 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";
 | |
| 
 | |
|     if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) {
 | |
|         const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
 | |
|         const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)";
 | |
| 
 | |
|         // Wrapping the bulk of this polyfill in a one-time-use function is a minor
 | |
|         // optimization for Firefox. Since Spidermonkey does not fully parse the
 | |
|         // contents of a function until the first time it's called, and since it will
 | |
|         // never actually need to be called, this allows the polyfill to be included
 | |
|         // in Firefox nearly for free.
 | |
|         const wrapAPIs = extensionAPIs => {
 | |
|             // NOTE: apiMetadata is associated to the content of the api-metadata.json file
 | |
|             // at build time by replacing the following "include" with the content of the
 | |
|             // JSON file.
 | |
|             const apiMetadata = {
 | |
|                 "alarms": {
 | |
|                     "clear": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "clearAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "get": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "bookmarks": {
 | |
|                     "create": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "get": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getChildren": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getRecent": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getSubTree": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getTree": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "move": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "remove": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeTree": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "search": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "update": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     }
 | |
|                 },
 | |
|                 "browserAction": {
 | |
|                     "disable": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "enable": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "getBadgeBackgroundColor": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getBadgeText": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getPopup": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getTitle": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "openPopup": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "setBadgeBackgroundColor": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "setBadgeText": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "setIcon": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "setPopup": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "setTitle": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     }
 | |
|                 },
 | |
|                 "browsingData": {
 | |
|                     "remove": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "removeCache": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeCookies": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeDownloads": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeFormData": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeHistory": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeLocalStorage": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removePasswords": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removePluginData": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "settings": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "commands": {
 | |
|                     "getAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "contextMenus": {
 | |
|                     "remove": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "update": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     }
 | |
|                 },
 | |
|                 "cookies": {
 | |
|                     "get": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getAll": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getAllCookieStores": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "remove": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "set": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "devtools": {
 | |
|                     "inspectedWindow": {
 | |
|                         "eval": {
 | |
|                             "minArgs": 1,
 | |
|                             "maxArgs": 2,
 | |
|                             "singleCallbackArg": false
 | |
|                         }
 | |
|                     },
 | |
|                     "panels": {
 | |
|                         "create": {
 | |
|                             "minArgs": 3,
 | |
|                             "maxArgs": 3,
 | |
|                             "singleCallbackArg": true
 | |
|                         }
 | |
|                     }
 | |
|                 },
 | |
|                 "downloads": {
 | |
|                     "cancel": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "download": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "erase": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getFileIcon": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "open": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "pause": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeFile": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "resume": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "search": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "show": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     }
 | |
|                 },
 | |
|                 "extension": {
 | |
|                     "isAllowedFileSchemeAccess": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "isAllowedIncognitoAccess": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "history": {
 | |
|                     "addUrl": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "deleteAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "deleteRange": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "deleteUrl": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getVisits": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "search": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "i18n": {
 | |
|                     "detectLanguage": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getAcceptLanguages": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "identity": {
 | |
|                     "launchWebAuthFlow": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "idle": {
 | |
|                     "queryState": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "management": {
 | |
|                     "get": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "getSelf": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "setEnabled": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "uninstallSelf": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "notifications": {
 | |
|                     "clear": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "create": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "getAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "getPermissionLevel": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "update": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     }
 | |
|                 },
 | |
|                 "pageAction": {
 | |
|                     "getPopup": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getTitle": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "hide": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "setIcon": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "setPopup": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "setTitle": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     },
 | |
|                     "show": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1,
 | |
|                         "fallbackToNoCallback": true
 | |
|                     }
 | |
|                 },
 | |
|                 "permissions": {
 | |
|                     "contains": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "remove": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "request": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "runtime": {
 | |
|                     "getBackgroundPage": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "getBrowserInfo": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "getPlatformInfo": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "openOptionsPage": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "requestUpdateCheck": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "sendMessage": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 3
 | |
|                     },
 | |
|                     "sendNativeMessage": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "setUninstallURL": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "sessions": {
 | |
|                     "getDevices": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getRecentlyClosed": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "restore": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "storage": {
 | |
|                     "local": {
 | |
|                         "clear": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 0
 | |
|                         },
 | |
|                         "get": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "getBytesInUse": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "remove": {
 | |
|                             "minArgs": 1,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "set": {
 | |
|                             "minArgs": 1,
 | |
|                             "maxArgs": 1
 | |
|                         }
 | |
|                     },
 | |
|                     "managed": {
 | |
|                         "get": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "getBytesInUse": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 1
 | |
|                         }
 | |
|                     },
 | |
|                     "sync": {
 | |
|                         "clear": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 0
 | |
|                         },
 | |
|                         "get": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "getBytesInUse": {
 | |
|                             "minArgs": 0,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "remove": {
 | |
|                             "minArgs": 1,
 | |
|                             "maxArgs": 1
 | |
|                         },
 | |
|                         "set": {
 | |
|                             "minArgs": 1,
 | |
|                             "maxArgs": 1
 | |
|                         }
 | |
|                     }
 | |
|                 },
 | |
|                 "tabs": {
 | |
|                     "captureVisibleTab": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "create": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "detectLanguage": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "discard": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "duplicate": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "executeScript": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "get": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getCurrent": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     },
 | |
|                     "getZoom": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getZoomSettings": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "highlight": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "insertCSS": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "move": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "query": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "reload": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "remove": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "removeCSS": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "sendMessage": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 3
 | |
|                     },
 | |
|                     "setZoom": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "setZoomSettings": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "update": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     }
 | |
|                 },
 | |
|                 "topSites": {
 | |
|                     "get": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "webNavigation": {
 | |
|                     "getAllFrames": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getFrame": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     }
 | |
|                 },
 | |
|                 "webRequest": {
 | |
|                     "handlerBehaviorChanged": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 0
 | |
|                     }
 | |
|                 },
 | |
|                 "windows": {
 | |
|                     "create": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "get": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 2
 | |
|                     },
 | |
|                     "getAll": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getCurrent": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "getLastFocused": {
 | |
|                         "minArgs": 0,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "remove": {
 | |
|                         "minArgs": 1,
 | |
|                         "maxArgs": 1
 | |
|                     },
 | |
|                     "update": {
 | |
|                         "minArgs": 2,
 | |
|                         "maxArgs": 2
 | |
|                     }
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             if (Object.keys(apiMetadata).length === 0) {
 | |
|                 throw new Error("api-metadata.json has not been included in browser-polyfill");
 | |
|             }
 | |
| 
 | |
|             /**
 | |
|              * A WeakMap subclass which creates and stores a value for any key which does
 | |
|              * not exist when accessed, but behaves exactly as an ordinary WeakMap
 | |
|              * otherwise.
 | |
|              *
 | |
|              * @param {function} createItem
 | |
|              *        A function which will be called in order to create the value for any
 | |
|              *        key which does not exist, the first time it is accessed. The
 | |
|              *        function receives, as its only argument, the key being created.
 | |
|              */
 | |
|             class DefaultWeakMap extends WeakMap {
 | |
|                 constructor(createItem, items = undefined) {
 | |
|                     super(items);
 | |
|                     this.createItem = createItem;
 | |
|                 }
 | |
| 
 | |
|                 get(key) {
 | |
|                     if (!this.has(key)) {
 | |
|                         this.set(key, this.createItem(key));
 | |
|                     }
 | |
| 
 | |
|                     return super.get(key);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             /**
 | |
|              * Returns true if the given object is an object with a `then` method, and can
 | |
|              * therefore be assumed to behave as a Promise.
 | |
|              *
 | |
|              * @param {*} value The value to test.
 | |
|              * @returns {boolean} True if the value is thenable.
 | |
|              */
 | |
|             const isThenable = value => {
 | |
|                 return value && typeof value === "object" && typeof value.then === "function";
 | |
|             };
 | |
| 
 | |
|             /**
 | |
|              * Creates and returns a function which, when called, will resolve or reject
 | |
|              * the given promise based on how it is called:
 | |
|              *
 | |
|              * - If, when called, `chrome.runtime.lastError` contains a non-null object,
 | |
|              *   the promise is rejected with that value.
 | |
|              * - If the function is called with exactly one argument, the promise is
 | |
|              *   resolved to that value.
 | |
|              * - Otherwise, the promise is resolved to an array containing all of the
 | |
|              *   function's arguments.
 | |
|              *
 | |
|              * @param {object} promise
 | |
|              *        An object containing the resolution and rejection functions of a
 | |
|              *        promise.
 | |
|              * @param {function} promise.resolve
 | |
|              *        The promise's resolution function.
 | |
|              * @param {function} promise.rejection
 | |
|              *        The promise's rejection function.
 | |
|              * @param {object} metadata
 | |
|              *        Metadata about the wrapped method which has created the callback.
 | |
|              * @param {integer} metadata.maxResolvedArgs
 | |
|              *        The maximum number of arguments which may be passed to the
 | |
|              *        callback created by the wrapped async function.
 | |
|              *
 | |
|              * @returns {function}
 | |
|              *        The generated callback function.
 | |
|              */
 | |
|             const makeCallback = (promise, metadata) => {
 | |
|                 return (...callbackArgs) => {
 | |
|                     if (extensionAPIs.runtime.lastError) {
 | |
|                         promise.reject(extensionAPIs.runtime.lastError);
 | |
|                     } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
 | |
|                         promise.resolve(callbackArgs[0]);
 | |
|                     } else {
 | |
|                         promise.resolve(callbackArgs);
 | |
|                     }
 | |
|                 };
 | |
|             };
 | |
| 
 | |
|             const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments";
 | |
| 
 | |
|             /**
 | |
|              * Creates a wrapper function for a method with the given name and metadata.
 | |
|              *
 | |
|              * @param {string} name
 | |
|              *        The name of the method which is being wrapped.
 | |
|              * @param {object} metadata
 | |
|              *        Metadata about the method being wrapped.
 | |
|              * @param {integer} metadata.minArgs
 | |
|              *        The minimum number of arguments which must be passed to the
 | |
|              *        function. If called with fewer than this number of arguments, the
 | |
|              *        wrapper will raise an exception.
 | |
|              * @param {integer} metadata.maxArgs
 | |
|              *        The maximum number of arguments which may be passed to the
 | |
|              *        function. If called with more than this number of arguments, the
 | |
|              *        wrapper will raise an exception.
 | |
|              * @param {integer} metadata.maxResolvedArgs
 | |
|              *        The maximum number of arguments which may be passed to the
 | |
|              *        callback created by the wrapped async function.
 | |
|              *
 | |
|              * @returns {function(object, ...*)}
 | |
|              *       The generated wrapper function.
 | |
|              */
 | |
|             const wrapAsyncFunction = (name, metadata) => {
 | |
|                 return function asyncFunctionWrapper(target, ...args) {
 | |
|                     if (args.length < metadata.minArgs) {
 | |
|                         throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
 | |
|                     }
 | |
| 
 | |
|                     if (args.length > metadata.maxArgs) {
 | |
|                         throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
 | |
|                     }
 | |
| 
 | |
|                     return new Promise((resolve, reject) => {
 | |
|                         if (metadata.fallbackToNoCallback) {
 | |
|                             // This API method has currently no callback on Chrome, but it return a promise on Firefox,
 | |
|                             // and so the polyfill will try to call it with a callback first, and it will fallback
 | |
|                             // to not passing the callback if the first call fails.
 | |
|                             try {
 | |
|                                 target[name](...args, makeCallback({ resolve, reject }, metadata));
 | |
|                             } catch (cbError) {
 | |
|                                 console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError);
 | |
| 
 | |
|                                 target[name](...args);
 | |
| 
 | |
|                                 // Update the API method metadata, so that the next API calls will not try to
 | |
|                                 // use the unsupported callback anymore.
 | |
|                                 metadata.fallbackToNoCallback = false;
 | |
|                                 metadata.noCallback = true;
 | |
| 
 | |
|                                 resolve();
 | |
|                             }
 | |
|                         } else if (metadata.noCallback) {
 | |
|                             target[name](...args);
 | |
|                             resolve();
 | |
|                         } else {
 | |
|                             target[name](...args, makeCallback({ resolve, reject }, metadata));
 | |
|                         }
 | |
|                     });
 | |
|                 };
 | |
|             };
 | |
| 
 | |
|             /**
 | |
|              * Wraps an existing method of the target object, so that calls to it are
 | |
|              * intercepted by the given wrapper function. The wrapper function receives,
 | |
|              * as its first argument, the original `target` object, followed by each of
 | |
|              * the arguments passed to the original method.
 | |
|              *
 | |
|              * @param {object} target
 | |
|              *        The original target object that the wrapped method belongs to.
 | |
|              * @param {function} method
 | |
|              *        The method being wrapped. This is used as the target of the Proxy
 | |
|              *        object which is created to wrap the method.
 | |
|              * @param {function} wrapper
 | |
|              *        The wrapper function which is called in place of a direct invocation
 | |
|              *        of the wrapped method.
 | |
|              *
 | |
|              * @returns {Proxy<function>}
 | |
|              *        A Proxy object for the given method, which invokes the given wrapper
 | |
|              *        method in its place.
 | |
|              */
 | |
|             const wrapMethod = (target, method, wrapper) => {
 | |
|                 return new Proxy(method, {
 | |
|                     apply(targetMethod, thisObj, args) {
 | |
|                         return wrapper.call(thisObj, target, ...args);
 | |
|                     }
 | |
|                 });
 | |
|             };
 | |
| 
 | |
|             let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
 | |
| 
 | |
|             /**
 | |
|              * Wraps an object in a Proxy which intercepts and wraps certain methods
 | |
|              * based on the given `wrappers` and `metadata` objects.
 | |
|              *
 | |
|              * @param {object} target
 | |
|              *        The target object to wrap.
 | |
|              *
 | |
|              * @param {object} [wrappers = {}]
 | |
|              *        An object tree containing wrapper functions for special cases. Any
 | |
|              *        function present in this object tree is called in place of the
 | |
|              *        method in the same location in the `target` object tree. These
 | |
|              *        wrapper methods are invoked as described in {@see wrapMethod}.
 | |
|              *
 | |
|              * @param {object} [metadata = {}]
 | |
|              *        An object tree containing metadata used to automatically generate
 | |
|              *        Promise-based wrapper functions for asynchronous. Any function in
 | |
|              *        the `target` object tree which has a corresponding metadata object
 | |
|              *        in the same location in the `metadata` tree is replaced with an
 | |
|              *        automatically-generated wrapper function, as described in
 | |
|              *        {@see wrapAsyncFunction}
 | |
|              *
 | |
|              * @returns {Proxy<object>}
 | |
|              */
 | |
|             const wrapObject = (target, wrappers = {}, metadata = {}) => {
 | |
|                 let cache = Object.create(null);
 | |
|                 let handlers = {
 | |
|                     has(proxyTarget, prop) {
 | |
|                         return prop in target || prop in cache;
 | |
|                     },
 | |
| 
 | |
|                     get(proxyTarget, prop, receiver) {
 | |
|                         if (prop in cache) {
 | |
|                             return cache[prop];
 | |
|                         }
 | |
| 
 | |
|                         if (!(prop in target)) {
 | |
|                             return undefined;
 | |
|                         }
 | |
| 
 | |
|                         let value = target[prop];
 | |
| 
 | |
|                         if (typeof value === "function") {
 | |
|                             // This is a method on the underlying object. Check if we need to do
 | |
|                             // any wrapping.
 | |
| 
 | |
|                             if (typeof wrappers[prop] === "function") {
 | |
|                                 // We have a special-case wrapper for this method.
 | |
|                                 value = wrapMethod(target, target[prop], wrappers[prop]);
 | |
|                             } else if (hasOwnProperty(metadata, prop)) {
 | |
|                                 // This is an async method that we have metadata for. Create a
 | |
|                                 // Promise wrapper for it.
 | |
|                                 let wrapper = wrapAsyncFunction(prop, metadata[prop]);
 | |
|                                 value = wrapMethod(target, target[prop], wrapper);
 | |
|                             } else {
 | |
|                                 // This is a method that we don't know or care about. Return the
 | |
|                                 // original method, bound to the underlying object.
 | |
|                                 value = value.bind(target);
 | |
|                             }
 | |
|                         } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {
 | |
|                             // This is an object that we need to do some wrapping for the children
 | |
|                             // of. Create a sub-object wrapper for it with the appropriate child
 | |
|                             // metadata.
 | |
|                             value = wrapObject(value, wrappers[prop], metadata[prop]);
 | |
|                         } else {
 | |
|                             // We don't need to do any wrapping for this property,
 | |
|                             // so just forward all access to the underlying object.
 | |
|                             Object.defineProperty(cache, prop, {
 | |
|                                 configurable: true,
 | |
|                                 enumerable: true,
 | |
|                                 get() {
 | |
|                                     return target[prop];
 | |
|                                 },
 | |
|                                 set(value) {
 | |
|                                     target[prop] = value;
 | |
|                                 }
 | |
|                             });
 | |
| 
 | |
|                             return value;
 | |
|                         }
 | |
| 
 | |
|                         cache[prop] = value;
 | |
|                         return value;
 | |
|                     },
 | |
| 
 | |
|                     set(proxyTarget, prop, value, receiver) {
 | |
|                         if (prop in cache) {
 | |
|                             cache[prop] = value;
 | |
|                         } else {
 | |
|                             target[prop] = value;
 | |
|                         }
 | |
|                         return true;
 | |
|                     },
 | |
| 
 | |
|                     defineProperty(proxyTarget, prop, desc) {
 | |
|                         return Reflect.defineProperty(cache, prop, desc);
 | |
|                     },
 | |
| 
 | |
|                     deleteProperty(proxyTarget, prop) {
 | |
|                         return Reflect.deleteProperty(cache, prop);
 | |
|                     }
 | |
|                 };
 | |
| 
 | |
|                 // Per contract of the Proxy API, the "get" proxy handler must return the
 | |
|                 // original value of the target if that value is declared read-only and
 | |
|                 // non-configurable. For this reason, we create an object with the
 | |
|                 // prototype set to `target` instead of using `target` directly.
 | |
|                 // Otherwise we cannot return a custom object for APIs that
 | |
|                 // are declared read-only and non-configurable, such as `chrome.devtools`.
 | |
|                 //
 | |
|                 // The proxy handlers themselves will still use the original `target`
 | |
|                 // instead of the `proxyTarget`, so that the methods and properties are
 | |
|                 // dereferenced via the original targets.
 | |
|                 let proxyTarget = Object.create(target);
 | |
|                 return new Proxy(proxyTarget, handlers);
 | |
|             };
 | |
| 
 | |
|             /**
 | |
|              * Creates a set of wrapper functions for an event object, which handles
 | |
|              * wrapping of listener functions that those messages are passed.
 | |
|              *
 | |
|              * A single wrapper is created for each listener function, and stored in a
 | |
|              * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`
 | |
|              * retrieve the original wrapper, so that  attempts to remove a
 | |
|              * previously-added listener work as expected.
 | |
|              *
 | |
|              * @param {DefaultWeakMap<function, function>} wrapperMap
 | |
|              *        A DefaultWeakMap object which will create the appropriate wrapper
 | |
|              *        for a given listener function when one does not exist, and retrieve
 | |
|              *        an existing one when it does.
 | |
|              *
 | |
|              * @returns {object}
 | |
|              */
 | |
|             const wrapEvent = wrapperMap => ({
 | |
|                 addListener(target, listener, ...args) {
 | |
|                     target.addListener(wrapperMap.get(listener), ...args);
 | |
|                 },
 | |
| 
 | |
|                 hasListener(target, listener) {
 | |
|                     return target.hasListener(wrapperMap.get(listener));
 | |
|                 },
 | |
| 
 | |
|                 removeListener(target, listener) {
 | |
|                     target.removeListener(wrapperMap.get(listener));
 | |
|                 }
 | |
|             });
 | |
| 
 | |
|             // Keep track if the deprecation warning has been logged at least once.
 | |
|             let loggedSendResponseDeprecationWarning = false;
 | |
| 
 | |
|             const onMessageWrappers = new DefaultWeakMap(listener => {
 | |
|                 if (typeof listener !== "function") {
 | |
|                     return listener;
 | |
|                 }
 | |
| 
 | |
|                 /**
 | |
|                  * Wraps a message listener function so that it may send responses based on
 | |
|                  * its return value, rather than by returning a sentinel value and calling a
 | |
|                  * callback. If the listener function returns a Promise, the response is
 | |
|                  * sent when the promise either resolves or rejects.
 | |
|                  *
 | |
|                  * @param {*} message
 | |
|                  *        The message sent by the other end of the channel.
 | |
|                  * @param {object} sender
 | |
|                  *        Details about the sender of the message.
 | |
|                  * @param {function(*)} sendResponse
 | |
|                  *        A callback which, when called with an arbitrary argument, sends
 | |
|                  *        that value as a response.
 | |
|                  * @returns {boolean}
 | |
|                  *        True if the wrapped listener returned a Promise, which will later
 | |
|                  *        yield a response. False otherwise.
 | |
|                  */
 | |
|                 return function onMessage(message, sender, sendResponse) {
 | |
|                     let didCallSendResponse = false;
 | |
| 
 | |
|                     let wrappedSendResponse;
 | |
|                     let sendResponsePromise = new Promise(resolve => {
 | |
|                         wrappedSendResponse = function (response) {
 | |
|                             if (!loggedSendResponseDeprecationWarning) {
 | |
|                                 console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack);
 | |
|                                 loggedSendResponseDeprecationWarning = true;
 | |
|                             }
 | |
|                             didCallSendResponse = true;
 | |
|                             resolve(response);
 | |
|                         };
 | |
|                     });
 | |
| 
 | |
|                     let result;
 | |
|                     try {
 | |
|                         result = listener(message, sender, wrappedSendResponse);
 | |
|                     } catch (err) {
 | |
|                         result = Promise.reject(err);
 | |
|                     }
 | |
| 
 | |
|                     const isResultThenable = result !== true && isThenable(result);
 | |
| 
 | |
|                     // If the listener didn't returned true or a Promise, or called
 | |
|                     // wrappedSendResponse synchronously, we can exit earlier
 | |
|                     // because there will be no response sent from this listener.
 | |
|                     if (result !== true && !isResultThenable && !didCallSendResponse) {
 | |
|                         return false;
 | |
|                     }
 | |
| 
 | |
|                     // A small helper to send the message if the promise resolves
 | |
|                     // and an error if the promise rejects (a wrapped sendMessage has
 | |
|                     // to translate the message into a resolved promise or a rejected
 | |
|                     // promise).
 | |
|                     const sendPromisedResult = promise => {
 | |
|                         promise.then(msg => {
 | |
|                             // send the message value.
 | |
|                             sendResponse(msg);
 | |
|                         }, error => {
 | |
|                             // Send a JSON representation of the error if the rejected value
 | |
|                             // is an instance of error, or the object itself otherwise.
 | |
|                             let message;
 | |
|                             if (error && (error instanceof Error || typeof error.message === "string")) {
 | |
|                                 message = error.message;
 | |
|                             } else {
 | |
|                                 message = "An unexpected error occurred";
 | |
|                             }
 | |
| 
 | |
|                             sendResponse({
 | |
|                                 __mozWebExtensionPolyfillReject__: true,
 | |
|                                 message
 | |
|                             });
 | |
|                         }).catch(err => {
 | |
|                             // Print an error on the console if unable to send the response.
 | |
|                             console.error("Failed to send onMessage rejected reply", err);
 | |
|                         });
 | |
|                     };
 | |
| 
 | |
|                     // If the listener returned a Promise, send the resolved value as a
 | |
|                     // result, otherwise wait the promise related to the wrappedSendResponse
 | |
|                     // callback to resolve and send it as a response.
 | |
|                     if (isResultThenable) {
 | |
|                         sendPromisedResult(result);
 | |
|                     } else {
 | |
|                         sendPromisedResult(sendResponsePromise);
 | |
|                     }
 | |
| 
 | |
|                     // Let Chrome know that the listener is replying.
 | |
|                     return true;
 | |
|                 };
 | |
|             });
 | |
| 
 | |
|             const wrappedSendMessageCallback = ({ reject, resolve }, reply) => {
 | |
|                 if (extensionAPIs.runtime.lastError) {
 | |
|                     // Detect when none of the listeners replied to the sendMessage call and resolve
 | |
|                     // the promise to undefined as in Firefox.
 | |
|                     // See https://github.com/mozilla/webextension-polyfill/issues/130
 | |
|                     if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
 | |
|                         resolve();
 | |
|                     } else {
 | |
|                         reject(extensionAPIs.runtime.lastError);
 | |
|                     }
 | |
|                 } else if (reply && reply.__mozWebExtensionPolyfillReject__) {
 | |
|                     // Convert back the JSON representation of the error into
 | |
|                     // an Error instance.
 | |
|                     reject(new Error(reply.message));
 | |
|                 } else {
 | |
|                     resolve(reply);
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
 | |
|                 if (args.length < metadata.minArgs) {
 | |
|                     throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
 | |
|                 }
 | |
| 
 | |
|                 if (args.length > metadata.maxArgs) {
 | |
|                     throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
 | |
|                 }
 | |
| 
 | |
|                 return new Promise((resolve, reject) => {
 | |
|                     const wrappedCb = wrappedSendMessageCallback.bind(null, { resolve, reject });
 | |
|                     args.push(wrappedCb);
 | |
|                     apiNamespaceObj.sendMessage(...args);
 | |
|                 });
 | |
|             };
 | |
| 
 | |
|             const staticWrappers = {
 | |
|                 runtime: {
 | |
|                     onMessage: wrapEvent(onMessageWrappers),
 | |
|                     onMessageExternal: wrapEvent(onMessageWrappers),
 | |
|                     sendMessage: wrappedSendMessage.bind(null, "sendMessage", { minArgs: 1, maxArgs: 3 })
 | |
|                 },
 | |
|                 tabs: {
 | |
|                     sendMessage: wrappedSendMessage.bind(null, "sendMessage", { minArgs: 2, maxArgs: 3 })
 | |
|                 }
 | |
|             };
 | |
|             const settingMetadata = {
 | |
|                 clear: { minArgs: 1, maxArgs: 1 },
 | |
|                 get: { minArgs: 1, maxArgs: 1 },
 | |
|                 set: { minArgs: 1, maxArgs: 1 }
 | |
|             };
 | |
|             apiMetadata.privacy = {
 | |
|                 network: {
 | |
|                     networkPredictionEnabled: settingMetadata,
 | |
|                     webRTCIPHandlingPolicy: settingMetadata
 | |
|                 },
 | |
|                 services: {
 | |
|                     passwordSavingEnabled: settingMetadata
 | |
|                 },
 | |
|                 websites: {
 | |
|                     hyperlinkAuditingEnabled: settingMetadata,
 | |
|                     referrersEnabled: settingMetadata
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
 | |
|         };
 | |
| 
 | |
|         // The build process adds a UMD wrapper around this file, which makes the
 | |
|         // `module` variable available.
 | |
|         module.exports = wrapAPIs(chrome);
 | |
|     } else {
 | |
|         module.exports = browser;
 | |
|     }
 | |
| });
 | |
| //# sourceMappingURL=browser-polyfill.js.map
 |