1173 lines
28 KiB
JavaScript
1173 lines
28 KiB
JavaScript
(() => {
|
|
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __commonJS = (cb, mod) =>
|
|
function __require() {
|
|
return (
|
|
mod ||
|
|
(0, cb[__getOwnPropNames(cb)[0]])(
|
|
(mod = { exports: {} }).exports,
|
|
mod,
|
|
),
|
|
mod.exports
|
|
);
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if ((from && typeof from === "object") || typeof from === "function") {
|
|
for (const key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, {
|
|
get: () => from[key],
|
|
enumerable:
|
|
!(desc = __getOwnPropDesc(from, key)) || desc.enumerable,
|
|
});
|
|
}
|
|
return to;
|
|
};
|
|
var __toESM = (mod, isNodeMode, target) => (
|
|
(target = mod != null ? __create(__getProtoOf(mod)) : {}),
|
|
__copyProps(
|
|
isNodeMode || !mod || !mod.__esModule
|
|
? __defProp(target, "default", { value: mod, enumerable: true })
|
|
: target,
|
|
mod,
|
|
)
|
|
);
|
|
|
|
// node_modules/.pnpm/webextension-polyfill@0.8.0/node_modules/webextension-polyfill/dist/browser-polyfill.js
|
|
var require_browser_polyfill = __commonJS({
|
|
"node_modules/.pnpm/webextension-polyfill@0.8.0/node_modules/webextension-polyfill/dist/browser-polyfill.js"(
|
|
exports,
|
|
module,
|
|
) {
|
|
((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;
|
|
}
|
|
})(
|
|
typeof globalThis !== "undefined"
|
|
? globalThis
|
|
: typeof self !== "undefined"
|
|
? self
|
|
: exports,
|
|
(module2) => {
|
|
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)";
|
|
const wrapAPIs = (extensionAPIs) => {
|
|
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,
|
|
},
|
|
elements: {
|
|
createSidebarPane: {
|
|
minArgs: 1,
|
|
maxArgs: 1,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
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,
|
|
},
|
|
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,
|
|
},
|
|
goBack: {
|
|
minArgs: 0,
|
|
maxArgs: 1,
|
|
},
|
|
goForward: {
|
|
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",
|
|
);
|
|
}
|
|
class DefaultWeakMap extends WeakMap {
|
|
constructor(createItem, items = void 0) {
|
|
super(items);
|
|
this.createItem = createItem;
|
|
}
|
|
get(key) {
|
|
if (!this.has(key)) {
|
|
this.set(key, this.createItem(key));
|
|
}
|
|
return super.get(key);
|
|
}
|
|
}
|
|
const isThenable = (value) => {
|
|
return (
|
|
value &&
|
|
typeof value === "object" &&
|
|
typeof value.then === "function"
|
|
);
|
|
};
|
|
const makeCallback = (promise, metadata) => {
|
|
return (...callbackArgs) => {
|
|
if (extensionAPIs.runtime.lastError) {
|
|
promise.reject(
|
|
new Error(extensionAPIs.runtime.lastError.message),
|
|
);
|
|
} 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";
|
|
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) {
|
|
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);
|
|
metadata.fallbackToNoCallback = false;
|
|
metadata.noCallback = true;
|
|
resolve();
|
|
}
|
|
} else if (metadata.noCallback) {
|
|
target[name](...args);
|
|
resolve();
|
|
} else {
|
|
target[name](
|
|
...args,
|
|
makeCallback(
|
|
{
|
|
resolve,
|
|
reject,
|
|
},
|
|
metadata,
|
|
),
|
|
);
|
|
}
|
|
});
|
|
};
|
|
};
|
|
const wrapMethod = (target, method, wrapper) => {
|
|
return new Proxy(method, {
|
|
apply(targetMethod, thisObj, args) {
|
|
return wrapper.call(thisObj, target, ...args);
|
|
},
|
|
});
|
|
};
|
|
const hasOwnProperty = Function.call.bind(
|
|
Object.prototype.hasOwnProperty,
|
|
);
|
|
const wrapObject = (target, wrappers = {}, metadata = {}) => {
|
|
const cache = /* @__PURE__ */ Object.create(null);
|
|
const handlers = {
|
|
has(proxyTarget2, prop) {
|
|
return prop in target || prop in cache;
|
|
},
|
|
get(proxyTarget2, prop, receiver) {
|
|
if (prop in cache) {
|
|
return cache[prop];
|
|
}
|
|
if (!(prop in target)) {
|
|
return void 0;
|
|
}
|
|
let value = target[prop];
|
|
if (typeof value === "function") {
|
|
if (typeof wrappers[prop] === "function") {
|
|
value = wrapMethod(
|
|
target,
|
|
target[prop],
|
|
wrappers[prop],
|
|
);
|
|
} else if (hasOwnProperty(metadata, prop)) {
|
|
const wrapper = wrapAsyncFunction(prop, metadata[prop]);
|
|
value = wrapMethod(target, target[prop], wrapper);
|
|
} else {
|
|
value = value.bind(target);
|
|
}
|
|
} else if (
|
|
typeof value === "object" &&
|
|
value !== null &&
|
|
(hasOwnProperty(wrappers, prop) ||
|
|
hasOwnProperty(metadata, prop))
|
|
) {
|
|
value = wrapObject(value, wrappers[prop], metadata[prop]);
|
|
} else if (hasOwnProperty(metadata, "*")) {
|
|
value = wrapObject(value, wrappers[prop], metadata["*"]);
|
|
} else {
|
|
Object.defineProperty(cache, prop, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
get() {
|
|
return target[prop];
|
|
},
|
|
set(value2) {
|
|
target[prop] = value2;
|
|
},
|
|
});
|
|
return value;
|
|
}
|
|
cache[prop] = value;
|
|
return value;
|
|
},
|
|
set(proxyTarget2, prop, value, receiver) {
|
|
if (prop in cache) {
|
|
cache[prop] = value;
|
|
} else {
|
|
target[prop] = value;
|
|
}
|
|
return true;
|
|
},
|
|
defineProperty(proxyTarget2, prop, desc) {
|
|
return Reflect.defineProperty(cache, prop, desc);
|
|
},
|
|
deleteProperty(proxyTarget2, prop) {
|
|
return Reflect.deleteProperty(cache, prop);
|
|
},
|
|
};
|
|
const proxyTarget = Object.create(target);
|
|
return new Proxy(proxyTarget, handlers);
|
|
};
|
|
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));
|
|
},
|
|
});
|
|
const onRequestFinishedWrappers = new DefaultWeakMap(
|
|
(listener) => {
|
|
if (typeof listener !== "function") {
|
|
return listener;
|
|
}
|
|
return function onRequestFinished(req) {
|
|
const wrappedReq = wrapObject(
|
|
req,
|
|
{},
|
|
{
|
|
getContent: {
|
|
minArgs: 0,
|
|
maxArgs: 0,
|
|
},
|
|
},
|
|
);
|
|
listener(wrappedReq);
|
|
};
|
|
},
|
|
);
|
|
let loggedSendResponseDeprecationWarning = false;
|
|
const onMessageWrappers = new DefaultWeakMap((listener) => {
|
|
if (typeof listener !== "function") {
|
|
return listener;
|
|
}
|
|
return function onMessage(message, sender, sendResponse) {
|
|
let didCallSendResponse = false;
|
|
let wrappedSendResponse;
|
|
const sendResponsePromise = new Promise((resolve) => {
|
|
wrappedSendResponse = (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 (
|
|
result !== true &&
|
|
!isResultThenable &&
|
|
!didCallSendResponse
|
|
) {
|
|
return false;
|
|
}
|
|
const sendPromisedResult = (promise) => {
|
|
promise
|
|
.then(
|
|
(msg) => {
|
|
sendResponse(msg);
|
|
},
|
|
(error) => {
|
|
let message2;
|
|
if (
|
|
error &&
|
|
(error instanceof Error ||
|
|
typeof error.message === "string")
|
|
) {
|
|
message2 = error.message;
|
|
} else {
|
|
message2 = "An unexpected error occurred";
|
|
}
|
|
sendResponse({
|
|
__mozWebExtensionPolyfillReject__: true,
|
|
message: message2,
|
|
});
|
|
},
|
|
)
|
|
.catch((err) => {
|
|
console.error(
|
|
"Failed to send onMessage rejected reply",
|
|
err,
|
|
);
|
|
});
|
|
};
|
|
if (isResultThenable) {
|
|
sendPromisedResult(result);
|
|
} else {
|
|
sendPromisedResult(sendResponsePromise);
|
|
}
|
|
return true;
|
|
};
|
|
});
|
|
const wrappedSendMessageCallback = (
|
|
{ reject, resolve },
|
|
reply,
|
|
) => {
|
|
if (extensionAPIs.runtime.lastError) {
|
|
if (
|
|
extensionAPIs.runtime.lastError.message ===
|
|
CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE
|
|
) {
|
|
resolve();
|
|
} else {
|
|
reject(new Error(extensionAPIs.runtime.lastError.message));
|
|
}
|
|
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
|
|
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 = {
|
|
devtools: {
|
|
network: {
|
|
onRequestFinished: wrapEvent(onRequestFinishedWrappers),
|
|
},
|
|
},
|
|
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: {
|
|
"*": settingMetadata,
|
|
},
|
|
services: {
|
|
"*": settingMetadata,
|
|
},
|
|
websites: {
|
|
"*": settingMetadata,
|
|
},
|
|
};
|
|
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
|
|
};
|
|
if (
|
|
typeof chrome != "object" ||
|
|
!chrome ||
|
|
!chrome.runtime ||
|
|
!chrome.runtime.id
|
|
) {
|
|
throw new Error(
|
|
"This script should only be loaded in a browser extension.",
|
|
);
|
|
}
|
|
module2.exports = wrapAPIs(chrome);
|
|
} else {
|
|
module2.exports = browser;
|
|
}
|
|
},
|
|
);
|
|
},
|
|
});
|
|
|
|
// extension/content-script.js
|
|
var import_webextension_polyfill = __toESM(require_browser_polyfill());
|
|
var EXTENSION = "nostrconnect";
|
|
var script = document.createElement("script");
|
|
script.setAttribute("async", "false");
|
|
script.setAttribute("type", "text/javascript");
|
|
script.setAttribute(
|
|
"src",
|
|
import_webextension_polyfill.default.runtime.getURL("nostr-provider.js"),
|
|
);
|
|
document.head.appendChild(script);
|
|
self.addEventListener("message", async (message) => {
|
|
if (message.source !== self) return;
|
|
if (!message.data) return;
|
|
if (!message.data.params) return;
|
|
if (message.data.ext !== EXTENSION) return;
|
|
var response;
|
|
try {
|
|
response = await import_webextension_polyfill.default.runtime.sendMessage(
|
|
{
|
|
type: message.data.type,
|
|
params: message.data.params,
|
|
host: location.host,
|
|
},
|
|
);
|
|
} catch (error) {
|
|
response = { error };
|
|
}
|
|
self.postMessage(
|
|
{ id: message.data.id, ext: EXTENSION, response },
|
|
message.origin,
|
|
);
|
|
});
|
|
})();
|