En raison de restriction chrome, nous ne pouvons pas récupérer le certificat en interne, merci de suivre ces étapes:
+ +python checkmyhttps.py install".'
- lbl_nativeAppInstallNote4.innerHTML = browser.i18n.getMessage('__nativeAppInstallReload__')
-
- const lnk_nativeDownload = document.querySelector('a[data-download]')
- const lnk_reloadExtension = document.getElementById('extension-reload')
-
- box_pageLoad.checked = CMH.options.settings.checkOnPageLoad
- box_alertIDNDomains.checked = CMH.options.settings.alertOnUnicodeIDNDomainNames
- box_notifications.checked = CMH.options.settings.disableNotifications
- lastDomainSaved = CMH.options.settings.checkServerUrl.match(/^https:\/\/([^:\/\s]+)/)[1]
- txt_server.value = CMH.options.settings.checkServerUrl
- txt_publicKey.value = CMH.options.settings.publicKey
-
- box_pageLoad.addEventListener('input', (e) => {
- browser.storage.local.set({
- checkOnPageLoad: box_pageLoad.checked,
- }).then(() => {
- div_messageCheckServer.dataset.type = 'success'
- div_messageCheckServer.textContent = browser.i18n.getMessage('__settingsSaved__')
- }, (error) => {
- div_messageCheckServer.dataset.type = 'error'
- div_messageCheckServer.textContent = 'Error!'
- })
+const page_title = document.getElementById('options-title');
+const title_general = document.querySelector('div.form > h2:nth-of-type(1)');
+const title_checkServer = document.querySelector('div.form > h2:nth-of-type(2)');
+const box_pageLoad = document.querySelector('input[name="checkOnPageLoad"]');
+const lbl_pageLoad = document.querySelector('label[for="checkOnPageLoad"]');
+const box_alertIDNDomains = document.querySelector('input[name="alertOnUnicodeIDNDomainNames"]');
+const lbl_alertIDNDomains = document.querySelector('label[for="alertOnUnicodeIDNDomainNames"]');
+const box_notifications = document.querySelector('input[name="disableNotifications"]');
+const lbl_notifications = document.querySelector('label[for="disableNotifications"]');
+const txt_server = document.querySelector('input[name="api_server"]');
+const lbl_server = document.querySelector('label[for="api_server"]');
+const txt_publicKey = document.querySelector('input[name="api_publicKey"]');
+const lbl_publicKey = document.querySelector('label[for="api_publicKey"]');
+const btn_save = document.getElementById('form-submit');
+const btn_restoreDefault = document.getElementById('restore-default');
+const btn_getPublicKey = document.getElementById('get-publicKey');
+const div_messageCheckServer = document.querySelector('p.message-checkserver');
+
+async function askServiceWorkerAboutDataVariableInLocalStorage(variableMapStruct) {
+
+ const response = await chrome.runtime.sendMessage({dataVariable : variableMapStruct});
+
+ return response.response
+}
+
+let lastDomainSaved = ''
+
+//document.title = chrome.i18n.getMessage('__checkMyHttpsSettings__')
+page_title.textContent = chrome.i18n.getMessage('__checkMyHttpsSettings__')
+title_general.textContent = chrome.i18n.getMessage('__general__')
+title_checkServer.textContent = chrome.i18n.getMessage('__checkServerSettings__')
+lbl_alertIDNDomains.textContent = chrome.i18n.getMessage('__alertOnUnicodeIDNDomainNames__')
+lbl_notifications.textContent = chrome.i18n.getMessage('__disableNotifications__')
+lbl_server.textContent = chrome.i18n.getMessage('__checkServerAddress__')
+lbl_publicKey.textContent = chrome.i18n.getMessage('__checkServerPublicKey__')
+btn_save.textContent = chrome.i18n.getMessage('__save__')
+btn_restoreDefault.textContent = chrome.i18n.getMessage('__restoreDefault__')
+btn_getPublicKey.textContent = chrome.i18n.getMessage('__getPublicKey__')
+
+// Get user Data information
+askServiceWorkerAboutDataVariableInLocalStorage(["alertOnUnicodeIDNDomainNames", "boolean"]).then( (response) => {
+ box_alertIDNDomains.checked = response.toString() == "true" ? true : false
+});
+
+askServiceWorkerAboutDataVariableInLocalStorage(["disableNotifications", "boolean"]).then( (response) => {
+ box_notifications.checked = response.toString() == "true" ? true : false;
+});
+
+askServiceWorkerAboutDataVariableInLocalStorage(["checkServerUrl", "string"]).then( (response) => {
+ txt_server.value = response
+});
+
+askServiceWorkerAboutDataVariableInLocalStorage(["publicKey", "string"]).then( (response) => {
+ txt_publicKey.value = response
+});
+
+
+lastDomainSaved = CMH.options.settings.checkServerUrl.match(/^https:\/\/([^:\/\s]+)/)[1]
+
+box_alertIDNDomains.addEventListener('input', (e) => {
+ askServiceWorkerAboutDataVariableInLocalStorage(["alertOnUnicodeIDNDomainNames", "boolean", box_alertIDNDomains.checked])
+ .then(() => {
+ console.log("Je rentre dans la condition")
+ div_messageCheckServer.dataset.type = 'success'
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__settingsSaved__')
+ }, (error) => {
+ div_messageCheckServer.dataset.type = 'error'
+ div_messageCheckServer.textContent = 'Error!'
})
-
- box_alertIDNDomains.addEventListener('input', (e) => {
- browser.storage.local.set({
- alertOnUnicodeIDNDomainNames: box_alertIDNDomains.checked,
- }).then(() => {
- div_messageCheckServer.dataset.type = 'success'
- div_messageCheckServer.textContent = browser.i18n.getMessage('__settingsSaved__')
- }, (error) => {
- div_messageCheckServer.dataset.type = 'error'
- div_messageCheckServer.textContent = 'Error!'
- })
+})
+
+box_notifications.addEventListener('input', (e) => {
+ askServiceWorkerAboutDataVariableInLocalStorage(["disableNotifications", "boolean", box_notifications.checked])
+ .then(() => {
+ div_messageCheckServer.dataset.type = 'success'
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__settingsSaved__')
+ }, (error) => {
+ div_messageCheckServer.dataset.type = 'error'
+ div_messageCheckServer.textContent = 'Error!'
})
+})
- box_notifications.addEventListener('input', (e) => {
- browser.storage.local.set({
- disableNotifications: box_notifications.checked,
+btn_save.addEventListener('click', async (event) => {
+ btn_save.disabled = true
+ div_messageCheckServer.textContent = ''
+ if (txt_server.value.slice(-1) !== '/') {
+ txt_server.value += '/'
+ }
+
+ const saveSettingsToBrowser = () => {
+ chrome.storage.local.set({
+ checkServerUrl: txt_server.value,
+ publicKey: txt_publicKey.value
}).then(() => {
+ btn_save.disabled = false
div_messageCheckServer.dataset.type = 'success'
- div_messageCheckServer.textContent = browser.i18n.getMessage('__settingsSaved__')
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__settingsSaved__')
}, (error) => {
+ btn_save.disabled = false
div_messageCheckServer.dataset.type = 'error'
div_messageCheckServer.textContent = 'Error!'
})
- })
-
- btn_save.addEventListener('click', async (event) => {
- btn_save.disabled = true
- div_messageCheckServer.textContent = ''
- if (txt_server.value.slice(-1) !== '/') {
- txt_server.value += '/'
- }
-
- const saveSettingsToBrowser = () => {
- browser.storage.local.set({
- checkServerUrl: txt_server.value,
- publicKey: txt_publicKey.value
- }).then(() => {
- btn_save.disabled = false
- div_messageCheckServer.dataset.type = 'success'
- div_messageCheckServer.textContent = browser.i18n.getMessage('__settingsSaved__')
- }, (error) => {
- btn_save.disabled = false
- div_messageCheckServer.dataset.type = 'error'
- div_messageCheckServer.textContent = 'Error!'
- })
- }
-
- if (/*CMH.common.isWebExtTlsApiSupported()*/ 1 === 1) {
- isValidCheckServer = await CMH.options.verifyServerAtStartup(txt_server.value, txt_publicKey.value)
- if (isValidCheckServer === 1) {
- saveSettingsToBrowser()
- } else {
- btn_save.disabled = false
- div_messageCheckServer.dataset.type = 'error'
- //div_messageCheckServer.textContent = 'Error!'
-
- CMH.native.postMessageAndWaitResponse({ action: 'setOptions', params: {
- checkServerUrl: txt_server.value,
- publicKey: txt_publicKey.value
- }}, 'setOptionsRes').then((data) => {
- saveSettingsToBrowser()
- }, (error) => {
- div_messageCheckServer.dataset.type = 'error'
- switch (isValidCheckServer) {
- case -1:
- div_messageCheckServer.textContent = browser.i18n.getMessage('__serverUnreachable__')
- break;
- case -2:
- div_messageCheckServer.textContent = browser.i18n.getMessage('__invalidPublicKeyInOptions__')
- break;
+ }
+
+ isValidCheckServer = await CMH.options.verifyServerAtStartup(txt_server.value, txt_publicKey.value)
+ if (isValidCheckServer === 1) {
+ saveSettingsToBrowser()
+ }
+ else {
+ btn_save.disabled = false
+ div_messageCheckServer.dataset.type = 'error'
+ switch (isValidCheckServer) {
+ case -1:
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__serverUnreachable__')
+ break;
+ case -2:
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__invalidPublicKeyInOptions__')
+ break;
case 0:
- div_messageCheckServer.textContent = browser.i18n.getMessage('__publicKeyNotCorresponding__')
- break;
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__publicKeyNotCorresponding__')
+ break;
+ case -3:
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__serverHardcodedFingerprintNotCorresponding__');
+ break;
default:
div_messageCheckServer.textContent = 'Error!'
break;
- }
- })
}
}
- }, true)
+})
+
+btn_restoreDefault.addEventListener('click', (event) => {
+ const defaultCheckServer = CMH.options.defaultCheckServer
+ if (defaultCheckServer !== null) {
+ txt_server.value = defaultCheckServer.url
+ txt_publicKey.value = defaultCheckServer.publicKey
+ btn_getPublicKey.style.display = 'none'
+ }
+}, true)
- btn_restoreDefault.addEventListener('click', (event) => {
- const defaultCheckServer = CMH.options.defaultCheckServer
- if (defaultCheckServer !== null) {
- txt_server.value = defaultCheckServer.url
- txt_publicKey.value = defaultCheckServer.publicKey
- }
- }, true)
-
-
- btn_testNativeConnection.addEventListener('click', (event) => {
- div_messageNativeAppDiscon.dataset.type = ''
- div_messageNativeAppDiscon.innerHTML = ''
- CMH.native.testConnection().then((data) => {
- if (data.res === true) {
- if (CMH.common.compareVersion(data.response.version, CMH.native.minimumAppVersion) < 0) {
- div_messageNativeAppDiscon.dataset.type = 'error'
- div_messageNativeAppDiscon.innerHTML = browser.i18n.getMessage('__nativeAppNeedToBeUpdated__')
- } else {
- div_messageNativeAppDiscon.dataset.type = 'success'
- div_messageNativeAppDiscon.textContent = browser.i18n.getMessage('__nativeAppInstallAt__', [ data.response.filepath, data.response.version ])
- browser.runtime.reload()
- }
- } else if (data.res === false) {
- div_messageNativeAppDiscon.dataset.type = 'error'
- div_messageNativeAppDiscon.innerHTML = browser.i18n.getMessage('__nativeAppNotFoundSeeInstall__')
- }
- })
- }, true)
- lnk_nativeDownload.addEventListener('click', (event) => {
- const link = event.target.href
- browser.downloads.download({
- url: link,
- saveAs: true
+btn_getPublicKey.addEventListener('click', (event) => {
+ btn_getPublicKey.disabled = true
+ div_messageCheckServer.textContent = ''
+ if (txt_server.value.slice(-1) !== '/') {
+ txt_server.value += '/'
+ }
+
+ CMH.certificatesManager.getCertUrl(txt_server.value+'download/public_key').then((response) => {
+ btn_getPublicKey.disabled = false
+ if (response.data !== null) {
+ txt_publicKey.value = response.data
+ btn_getPublicKey.style.display = 'none'
+ }
+ else
+ {
+ div_messageCheckServer.dataset.type = 'error'
+ div_messageCheckServer.textContent = chrome.i18n.getMessage('__publicKeyUnreachable__')
+ }
})
- event.preventDefault()
- }, true)
+}, true)
- lnk_reloadExtension.addEventListener('click', (event) => {
- browser.runtime.reload()
- event.preventDefault()
- }, true)
-
- txt_server.addEventListener('keyup', () => {
- const domainMatch = txt_server.value.match(/^https:\/\/([^:\/\s]+)/)
- if (domainMatch && (domainMatch[1] !== lastDomainSaved)) {
- txt_publicKey.value = ''
- }
- }, true)
+const onPublicKeyChange = () => {
+ if (txt_publicKey.value.length === 0) {
+ btn_getPublicKey.style.display = ''
+ } else {
+ btn_getPublicKey.style.display = 'none'
+ }
+}
+txt_publicKey.addEventListener('keyup', onPublicKeyChange, true)
+txt_server.addEventListener('keyup', () => {
+ const domainMatch = txt_server.value.match(/^https:\/\/([^:\/\s]+)/)
+ if (domainMatch && (domainMatch[1] !== lastDomainSaved)) {
+ txt_publicKey.value = ''
+ btn_getPublicKey.style.display = ''
+ }
+}, true)
- btn_save.disabled = false
+onPublicKeyChange()
+btn_save.disabled = false
- document.body.style.display = ''
-}, (error) => { console.error(`Error: ${error}`) })
+document.body.style.display = ''
diff --git a/Chromium/service_worker.js b/Chromium/service_worker.js
new file mode 100644
index 00000000..132b7781
--- /dev/null
+++ b/Chromium/service_worker.js
@@ -0,0 +1,176 @@
+/*
+api.js : permet de requêter le serveur cmh pour obtenir le certificat du serveur
+*/
+
+// importScripts("./lib/common.js")
+// importScripts("./lib/certificateManager.js")
+// importScripts("./lib/options.js")
+
+let defaultCheckServer = {
+ url: "https://checkmyhttps.net/",
+ publicKey: `-----BEGIN PUBLIC KEY-----
+ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvPk7sw/smaqXrF+glR1i
+ be/AjaxTnUCVwYJ+iSYxizBl5n42RGRaxhbbkJuM9esnFJd74bb9Uv5oM5rZWtSO
+ sedr49uY237V5C3z0PPSYPaJD290bJzwK4bOZim9cr8DT25KhRj5WoXbnuULVLAE
+ 5DO55nUbhp51HisOUsZwtYNEE53D8Ev8wX2iwzAx4X0E2KvVpoyI23u4UVFdQxUJ
+ GVzI7Bs8OQyzFJBhalEjaylK3gDNDMFF3reNGgIEPIMIs9I6bUaOgaQsT/b65SR9
+ qxWyrOrQcYl42y8mpC7SN+8zPnxUuRQgIgvR1VDThJVf5+pRi+phPLaX5exEkoDZ
+ ISU8UiCquAfd0dgjNzo/wUvSykkJvAZHNtkn5kNeVE/cOYFw8jWZfX7oe2Gy5CGk
+ 83abNDpkpdvDpDJwHA8oP8q/0Wzd1EJkGyPfr79eEwtUEblWXaYvVPrvcrBkuex0
+ F1MMQJ82WtAwP7DtwEvkHDezuMyjK2jO0cxcYfXh1mjuTRYuCZ4fdvVUpIyoDo8g
+ MoWqP4U0RmOXjG7GoqVVH89aFxtMYmXWolL08sYSOBG2R3sD/kMQq2I++DpDyxtX
+ 8cxDdBxXrh+PNQTOLbuuQIesn/MTHSHMo8bHDVsooEVrgGDIad2/AK2seihhVMsj
+ 17aoSfDrFx7OQi+0BmiZKzsCAwEAAQ==
+ -----END PUBLIC KEY-----`
+}
+
+// Permet l'ouverture du "SidePanel" lorsque l'on clique sur l'icon de l'extension
+chrome.sidePanel.setPanelBehavior( {openPanelOnActionClick: true}).catch( (error) => console.error(error));
+
+// Permet d'initialiser dans le local storage la variable souhaitée !
+function initializeVariableInLocalStorage(varInfoArray) {
+
+ let keyName = varInfoArray[0]
+ let valueType = varInfoArray[1]
+
+ switch(valueType) {
+
+ case "boolean":
+ chrome.storage.local.set({ [keyName]: varInfoArray[2] || false}).then( () => {})
+ break;
+ case "string":
+ chrome.storage.local.set({ [keyName]: varInfoArray[2] || ""}).then( () => {})
+ break;
+ default:
+ }
+}
+
+/*
+Apply a verification on serverUrl and publicKey from userMessage
+*/
+async function applyVerificationOnServerAndPublicKeyParameters(request) {
+ // let serverURL = request.serverUrl || " ";
+ // if (serverURL.length === 0) {
+ // return -1
+ // }
+
+ // serverURL += 'api.php?info&sign'
+
+ // console.log("ServerURL " + serverURL)
+
+ // let response = null
+ // let response_data = null
+ // let httpHeadMethod = false
+
+ // try {
+ // if (httpHeadMethod) {
+ // fetchInit = { method: 'HEAD' }
+ // } else {
+ // fetchInit = {}
+ // }
+ // response = await fetch(serverURL, fetchInit)
+
+ // const contentType = response.headers.get('content-type')
+ // console.log("ETAT BOOLEAN: " + contentType.includes("application/json") )
+ // console.log("ETAT BOOLEAN: " + (contentType != null) )
+
+ // if(contentType != null && contentType.includes('application/json')) {
+ // console.log("Je rentre dans")
+ // response_data = await response.json()
+ // console.log("RESPONSE: " + response_data)
+ // console.log("Data: " + response_data.signature)
+
+ // } else {
+ // response_data = await response.text()
+ // }
+ // } catch (e) {
+ // // console.error(e)
+ // }
+
+ // console.log("Fetch the server" + response_data)
+}
+
+/*
+
+Take action on data variables saved in local storage
+*/
+async function takeActionFromMessageToDataVariables(request) {
+
+ let keyName = request.dataVariable[0]
+ let valueType = request.dataVariable[1]
+ let updateVariable = request.dataVariable[2]
+
+ let isInitialized = await checkIfDataVariablesInLocalStorageIsInitialized(keyName);
+
+ if (isInitialized) {
+
+ // If the array contain a third value, this means that we want to change the value of the variable
+ if (updateVariable != undefined) {
+ initializeVariableInLocalStorage([keyName, valueType, updateVariable])
+ }
+
+ // We get the actual value to send it back in the content script
+ let result = await chrome.storage.local.get( [keyName]);
+ console.log("Direction le client: " + Object.values(result) )
+
+ console.log("Je renvoie le résultat.")
+ return {response: Object.values(result)}
+ }
+ else
+ {
+ initializeVariableInLocalStorage( [keyName, valueType] )
+ }
+}
+
+/*
+Enabling this event in order to receive message for our content scripts files
+*/
+chrome.runtime.onMessage.addListener(
+ function(request, sender, sendResponse) {
+
+ if (request.dataVariable != undefined) {
+ takeActionFromMessageToDataVariables(request).then((response) => {
+ sendResponse(response)
+ })
+ return true
+ }
+
+ if (request.verifyServerConfiguration != undefined) {
+ applyVerificationOnServerAndPublicKeyParameters(request).then( (result) => {
+ console.log("VOICI LE RESULTAT DE LA VERIF: " + result)
+ })
+ return true
+ }
+
+ // chrome.storage.local.get(null, (result) => {
+ // console.log("All stored data:", result);
+ // });
+
+ return true
+ }
+);
+
+async function checkIfDataVariablesInLocalStorageIsInitialized(keyName) {
+
+ let result = await chrome.storage.local.get(keyName)
+
+ return Object.hasOwn(result, keyName)
+}
+
+// We check wether the default variables are initialized, otherwise we call a function to initialize them !
+chrome.runtime.onInstalled.addListener( () => {
+
+ checkIfDataVariablesInLocalStorageIsInitialized("checkServerUrl").then( (isInitialized) => {
+ if ( !isInitialized ) {
+ initializeVariableInLocalStorage( ["checkServerUrl", "string", defaultCheckServer.url] )
+ initializeVariableInLocalStorage( ["publicKey", "string", defaultCheckServer.publicKey] )
+ }
+ });
+
+
+ // chrome.storage.local.get(null, (result) => {
+ // console.log("All stored data:", result);
+ // });
+
+})
+
diff --git a/Chromium/vendors/webextension-polyfill-0.3.1/browser-polyfill.min.js b/Chromium/vendors/webextension-polyfill-0.3.1/browser-polyfill.min.js
deleted file mode 100644
index 86ca59d2..00000000
--- a/Chromium/vendors/webextension-polyfill-0.3.1/browser-polyfill.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-(function(a,b){if("function"==typeof define&&define.amd)define("webextension-polyfill",["module"],b);else if("undefined"!=typeof exports)b(module);else{var c={exports:{}};b(c),a.browser=c.exports}})(this,function(a){"use strict";if("undefined"==typeof browser||Object.getPrototypeOf(browser)!==Object.prototype){a.exports=(()=>{const e={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:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},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:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},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}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0}}},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:!0},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:!0}},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:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},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(0===Object.keys(e).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class f extends WeakMap{constructor(u,v=void 0){super(v),this.createItem=u}get(u){return this.has(u)||this.set(u,this.createItem(u)),super.get(u)}}const g=u=>{return u&&"object"==typeof u&&"function"==typeof u.then},h=(u,v)=>{return(...w)=>{chrome.runtime.lastError?u.reject(chrome.runtime.lastError):v.singleCallbackArg||1>=w.length?u.resolve(w[0]):u.resolve(w)}},i=u=>1==u?"argument":"arguments",j=(u,v)=>{return function(x,...y){if(y.length