From 1a5d8c184b8a6f325fadbd388c6f69e27bfa18c6 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Thu, 1 Feb 2024 21:24:57 +0100 Subject: [PATCH] Update plasmo + rework permissions + explain permissions in readme + lots of suffering --- README.md | 16 +++ package.json | 17 +-- pnpm-lock.yaml | 215 ++++++++++-------------------- src/background.ts | 7 + src/background/messages/hello.ts | 4 +- src/background/messages/inject.ts | 10 ++ src/contents/movie-web.ts | 5 +- src/hooks/useDomainWhitelist.ts | 2 +- src/hooks/usePermission.ts | 28 ++-- src/popup.tsx | 2 +- src/tabs/PermissionGrant.tsx | 4 +- src/utils/injection.ts | 20 +++ src/utils/storage.ts | 6 +- src/utils/tabs.ts | 15 ++- 14 files changed, 172 insertions(+), 179 deletions(-) create mode 100644 src/background/messages/inject.ts create mode 100644 src/utils/injection.ts diff --git a/README.md b/README.md index 53dcf72..2836729 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,19 @@ We use pnpm with the latest version of NodeJS. pnpm i pnpm dev ``` + +## About permissions + +The extension uses the following base permission: + - `activeTab` - This only gives access to knowing what tab is currently active, in this case we use it for making the on/off button per site on the popout. **This does not allow us to know the content of the site active tab** and because of that, this is not something that is prompted or shown to users. + - `declarativeNetRequestWithHostAccess` - This allows us to do network request manipulation, but only for sites we have host access for. **This only gives us access after the user has had to accept permission prompt** and because of that, this is not something that is prompted or shown to users. + - `scripting` - This allows us to inject helper scripts, but only for sites we have host access for. **This only gives us access after the user has had to accept permission prompt** and because of that, this is not something that is prompted or shown to users. + - `storage` - We need to store which sites are enabled or disabled by the user. This poses no risks to users so this is not something that is prompted or shown to users. + +On top of this list, we get the ability to **request** access for the following origins: + - `https://*/*` + - `http://*/*` + +This means we can request permissions for all possible sites. This is only a prompt where the browser asks if the extension can access a site, this does not give us access without the user knowing. + +Once a user has requested to enable the extension for a site. It will inject a helper script so the site knows how to communicate with the extension. Then the extension will do the work that a normal site wouldn't be able to do (like making cross-origin requests or sending headers that are normally restricted). The helper script will be injected everytime they open that site. diff --git a/package.json b/package.json index 1134e5a..10c1fc7 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,12 @@ "dependencies": { "@plasmohq/messaging": "^0.6.1", "@plasmohq/storage": "^1.9.0", - "plasmo": "0.84.0", + "plasmo": "0.84.2", "react": "18.2.0", "react-dom": "18.2.0" }, "devDependencies": { + "@parcel/packager-ts": "2.9.3", "@types/chrome": "0.0.251", "@types/firefox-webext-browser": "^120.0.0", "@types/node": "20.9.0", @@ -43,13 +44,13 @@ }, "manifest": { "permissions": [ - "declarativeNetRequest", - "tabs" + "declarativeNetRequestWithHostAccess", + "activeTab", + "scripting" ], - "host_permissions": [ - "", - "https://dev.movie-web.app/*", - "https://movie-web.app/*" + "optional_host_permissions": [ + "https://*/*", + "http://*/*" ], "browser_specific_settings": { "gecko": { @@ -57,4 +58,4 @@ } } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c508e4f..1e2dd53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ dependencies: specifier: ^1.9.0 version: 1.9.0(react@18.2.0) plasmo: - specifier: 0.84.0 - version: 0.84.0(react-dom@18.2.0)(react@18.2.0) + specifier: 0.84.2 + version: 0.84.2(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -22,6 +22,9 @@ dependencies: version: 18.2.0(react@18.2.0) devDependencies: + '@parcel/packager-ts': + specifier: 2.9.3 + version: 2.9.3(@parcel/core@2.9.3) '@types/chrome': specifier: 0.0.251 version: 0.0.251 @@ -596,7 +599,6 @@ packages: /@lezer/common@1.2.0: resolution: {integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==} - dev: false /@lezer/lr@0.15.8: resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==} @@ -608,7 +610,6 @@ packages: resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==} dependencies: '@lezer/common': 1.2.0 - dev: false /@ljharb/through@2.3.11: resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} @@ -630,7 +631,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@lmdb/lmdb-darwin-x64@2.5.2: @@ -646,7 +646,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@lmdb/lmdb-linux-arm64@2.5.2: @@ -662,7 +661,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@lmdb/lmdb-linux-arm@2.5.2: @@ -678,7 +676,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@lmdb/lmdb-linux-x64@2.5.2: @@ -694,7 +691,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@lmdb/lmdb-win32-x64@2.5.2: @@ -710,7 +706,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@mischnic/json-sourcemap@0.1.0: @@ -729,14 +724,12 @@ packages: '@lezer/common': 1.2.0 '@lezer/lr': 1.3.14 json5: 2.2.3 - dev: false /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: @@ -744,7 +737,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: @@ -752,7 +744,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: @@ -760,7 +751,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: @@ -768,7 +758,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: @@ -776,7 +765,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@nodelib/fs.scandir@2.1.5: @@ -835,7 +823,6 @@ packages: '@parcel/logger': 2.9.3 '@parcel/utils': 2.9.3 lmdb: 2.7.11 - dev: false /@parcel/codeframe@2.8.3: resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==} @@ -849,7 +836,6 @@ packages: engines: {node: '>= 12.0.0'} dependencies: chalk: 4.1.2 - dev: false /@parcel/compressor-raw@2.9.3(@parcel/core@2.9.3): resolution: {integrity: sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==} @@ -937,7 +923,6 @@ packages: msgpackr: 1.10.1 nullthrows: 1.1.1 semver: 7.5.4 - dev: false /@parcel/diagnostic@2.8.3: resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==} @@ -953,7 +938,6 @@ packages: dependencies: '@mischnic/json-sourcemap': 0.1.1 nullthrows: 1.1.1 - dev: false /@parcel/events@2.8.3: resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==} @@ -963,7 +947,6 @@ packages: /@parcel/events@2.9.3: resolution: {integrity: sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==} engines: {node: '>= 12.0.0'} - dev: false /@parcel/fs-search@2.8.3: resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==} @@ -975,7 +958,6 @@ packages: /@parcel/fs-search@2.9.3: resolution: {integrity: sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==} engines: {node: '>= 12.0.0'} - dev: false /@parcel/fs@2.8.3(@parcel/core@2.9.3): resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==} @@ -1003,14 +985,12 @@ packages: '@parcel/utils': 2.9.3 '@parcel/watcher': 2.2.0 '@parcel/workers': 2.9.3(@parcel/core@2.9.3) - dev: false /@parcel/graph@2.9.3: resolution: {integrity: sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==} engines: {node: '>= 12.0.0'} dependencies: nullthrows: 1.1.1 - dev: false /@parcel/hash@2.8.3: resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==} @@ -1025,7 +1005,6 @@ packages: engines: {node: '>= 12.0.0'} dependencies: xxhash-wasm: 0.4.2 - dev: false /@parcel/logger@2.8.3: resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==} @@ -1041,7 +1020,6 @@ packages: dependencies: '@parcel/diagnostic': 2.9.3 '@parcel/events': 2.9.3 - dev: false /@parcel/markdown-ansi@2.8.3: resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==} @@ -1055,7 +1033,6 @@ packages: engines: {node: '>= 12.0.0'} dependencies: chalk: 4.1.2 - dev: false /@parcel/namer-default@2.9.3(@parcel/core@2.9.3): resolution: {integrity: sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==} @@ -1080,7 +1057,6 @@ packages: semver: 7.5.4 transitivePeerDependencies: - '@parcel/core' - dev: false /@parcel/optimizer-css@2.9.3(@parcel/core@2.9.3): resolution: {integrity: sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==} @@ -1201,7 +1177,6 @@ packages: '@parcel/utils': 2.9.3 '@parcel/workers': 2.9.3(@parcel/core@2.9.3) semver: 7.5.4 - dev: false /@parcel/packager-css@2.9.3(@parcel/core@2.9.3): resolution: {integrity: sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==} @@ -1265,6 +1240,15 @@ packages: - '@parcel/core' dev: false + /@parcel/packager-ts@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Vd9dm1FqaFDw/kWCh95zgGS08HvIpSLg5Aa+AIhFiM0G+kpRSItcBSNJVwC7JKmLk1rmQhmQKoCKX26+nvyAzA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: true + /@parcel/plugin@2.8.3(@parcel/core@2.9.3): resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==} engines: {node: '>= 12.0.0'} @@ -1281,7 +1265,6 @@ packages: '@parcel/types': 2.9.3(@parcel/core@2.9.3) transitivePeerDependencies: - '@parcel/core' - dev: false /@parcel/profiler@2.9.3: resolution: {integrity: sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==} @@ -1290,7 +1273,6 @@ packages: '@parcel/diagnostic': 2.9.3 '@parcel/events': 2.9.3 chrome-trace-event: 1.0.3 - dev: false /@parcel/reporter-bundle-buddy@2.9.3(@parcel/core@2.9.3): resolution: {integrity: sha512-9ftzLZ161USdvnxueT55EWufLI48va0xJfB5MAJLG92VAS1N1FSFgYKdkGFzBKw0eK9UScQNYnntCGC17rBayQ==} @@ -1382,7 +1364,6 @@ packages: engines: {node: ^12.18.3 || >=14} dependencies: detect-libc: 1.0.3 - dev: false /@parcel/transformer-babel@2.9.3(@parcel/core@2.9.3): resolution: {integrity: sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==} @@ -1631,7 +1612,6 @@ packages: utility-types: 3.10.0 transitivePeerDependencies: - '@parcel/core' - dev: false /@parcel/utils@2.8.3: resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==} @@ -1658,7 +1638,6 @@ packages: '@parcel/source-map': 2.1.1 chalk: 4.1.2 nullthrows: 1.1.1 - dev: false /@parcel/watcher-android-arm64@2.2.0: resolution: {integrity: sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==} @@ -1666,7 +1645,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /@parcel/watcher-darwin-arm64@2.2.0: @@ -1675,7 +1653,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@parcel/watcher-darwin-x64@2.2.0: @@ -1684,7 +1661,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@parcel/watcher-linux-arm-glibc@2.2.0: @@ -1693,7 +1669,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@parcel/watcher-linux-arm64-glibc@2.2.0: @@ -1702,7 +1677,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@parcel/watcher-linux-arm64-musl@2.2.0: @@ -1711,7 +1685,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@parcel/watcher-linux-x64-glibc@2.2.0: @@ -1720,7 +1693,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@parcel/watcher-linux-x64-musl@2.2.0: @@ -1729,7 +1701,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@parcel/watcher-win32-arm64@2.2.0: @@ -1738,7 +1709,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@parcel/watcher-win32-x64@2.2.0: @@ -1747,7 +1717,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@parcel/watcher@2.2.0: @@ -1769,7 +1738,6 @@ packages: '@parcel/watcher-linux-x64-musl': 2.2.0 '@parcel/watcher-win32-arm64': 2.2.0 '@parcel/watcher-win32-x64': 2.2.0 - dev: false /@parcel/workers@2.8.3(@parcel/core@2.9.3): resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==} @@ -1799,7 +1767,6 @@ packages: '@parcel/types': 2.9.3(@parcel/core@2.9.3) '@parcel/utils': 2.9.3 nullthrows: 1.1.1 - dev: false /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2000,8 +1967,8 @@ packages: - '@parcel/core' dev: false - /@plasmohq/parcel-config@0.40.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-aDyZIL3ScTmA1CsB/Sym7SxOMVSFUgNQrFovD+sl1M2nrYytqkLDFs7mspCpBlsxCGt97s8rD/kufke21UUHRA==} + /@plasmohq/parcel-config@0.40.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-YuE2wxtmMcygz+YC0YZbFRsRp6Vqe+qs+TJs15sn5jKVcOu01RZeKuThKOmcTCc1M6Bcst5OkGsV8RmkpGKKCQ==} dependencies: '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(typescript@5.2.2) @@ -2030,12 +1997,12 @@ packages: '@plasmohq/parcel-optimizer-encapsulate': 0.0.7 '@plasmohq/parcel-optimizer-es': 0.4.0 '@plasmohq/parcel-packager': 0.6.14 - '@plasmohq/parcel-resolver': 0.13.1 - '@plasmohq/parcel-resolver-post': 0.4.2 - '@plasmohq/parcel-runtime': 0.23.0 + '@plasmohq/parcel-resolver': 0.13.2 + '@plasmohq/parcel-resolver-post': 0.4.3 + '@plasmohq/parcel-runtime': 0.23.1 '@plasmohq/parcel-transformer-inject-env': 0.2.11 - '@plasmohq/parcel-transformer-inline-css': 0.3.9 - '@plasmohq/parcel-transformer-manifest': 0.17.8 + '@plasmohq/parcel-transformer-inline-css': 0.3.11 + '@plasmohq/parcel-transformer-manifest': 0.17.9 '@plasmohq/parcel-transformer-svelte': 0.5.2 '@plasmohq/parcel-transformer-vue': 0.5.0(react-dom@18.2.0)(react@18.2.0) transitivePeerDependencies: @@ -2167,8 +2134,8 @@ packages: nullthrows: 1.1.1 dev: false - /@plasmohq/parcel-resolver-post@0.4.2: - resolution: {integrity: sha512-dbrwjUQEhKqKBEgVJjL5ls1p6bpQ3VlDXI5REoaSpwoPcB7TRAcUfTwV4oNGE4eTnw4ElF08JkyslYvKgxosAw==} + /@plasmohq/parcel-resolver-post@0.4.3: + resolution: {integrity: sha512-+KxdAOyBJNK7wxLUbLhx0d4AWQg2trcCK8rwOSNL8JP0OgtSDaOFa2NqCTFwuccGco4PzmK+27U17LWSGTFAOQ==} engines: {parcel: '>= 2.7.0'} dependencies: '@parcel/core': 2.9.3 @@ -2185,21 +2152,21 @@ packages: - ts-node dev: false - /@plasmohq/parcel-resolver@0.13.1: - resolution: {integrity: sha512-IuKr3Ue1+2fsyJPQuHh4Yh36L3FI/2I27X6hC+NHlX/1j9fVYiFk89dTSPNhvAdGN/hwsMjQ/jCiKZGW1157xg==} + /@plasmohq/parcel-resolver@0.13.2: + resolution: {integrity: sha512-JVXk65c5g5rOci9xmuvEqpemOFc6yTlGO1A1LCllFeByl2hBszRCBBSNp9wsaes2gQIbClgzFjbOSijKV3acNw==} engines: {parcel: '>= 2.7.0'} dependencies: '@parcel/core': 2.9.3 '@parcel/hash': 2.9.3 '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) '@parcel/types': 2.9.3(@parcel/core@2.9.3) - fast-glob: 3.2.12 + fast-glob: 3.3.2 fs-extra: 11.1.1 got: 13.0.0 dev: false - /@plasmohq/parcel-runtime@0.23.0: - resolution: {integrity: sha512-+ZqH9XksSbWPC6pnvjmvmykxh1SfyYkSKyOeNQSeHsPFo40fADUKOda8Hw/vm/g5p8GIlv5YSb2iYZzCWmKs1g==} + /@plasmohq/parcel-runtime@0.23.1: + resolution: {integrity: sha512-EiBjAJcJjVFarUmiIqywKd+MHGIThWTkcZe5IYfR7ecaJRNhhZF1B/gPgoAwv1nLcxfvRIC2CF9z9frwQvrOYQ==} engines: {parcel: '>= 2.7.0'} dependencies: '@parcel/core': 2.9.3 @@ -2216,19 +2183,19 @@ packages: '@parcel/types': 2.9.3(@parcel/core@2.9.3) dev: false - /@plasmohq/parcel-transformer-inline-css@0.3.9: - resolution: {integrity: sha512-da1gVe3TX7J5lC6M04iHzp2NPwhh40n/Gx/Di9o2KLLEYe0q+pKlI5OjN9zf5kpXwXfVO7QzE5B1/tRGoEu2Bw==} + /@plasmohq/parcel-transformer-inline-css@0.3.11: + resolution: {integrity: sha512-EUSwEowFNSgC/F1q/V4H4NXJ23wwLzlmRI6lvIr6S0mIuG/FCga+lAV3IZ+yAuXqUM2VexX6JyYYpNVidrMSxw==} engines: {parcel: '>= 2.7.0'} dependencies: '@parcel/core': 2.9.3 '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) '@parcel/utils': 2.9.3 - browserslist: 4.21.10 - lightningcss: 1.21.7 + browserslist: 4.22.1 + lightningcss: 1.21.8 dev: false - /@plasmohq/parcel-transformer-manifest@0.17.8: - resolution: {integrity: sha512-G6XISWddf900Q/4ABlFLBJcqvN1VTYF06NytTOMSDO4dOraxGhgZ0CyC990b+LJEa7nc5xf4xhHQxf3mkjALPQ==} + /@plasmohq/parcel-transformer-manifest@0.17.9: + resolution: {integrity: sha512-syL5AbC7sKCNd6jpNU6qKdeUVWUDhiWLoHC5IYTVGcdVjKBql6lgs+e2JehjNB1BYW2lTrY5v3lI26Z6P6+/9Q==} engines: {parcel: '>= 2.7.0'} dependencies: '@mischnic/json-sourcemap': 0.1.0 @@ -3046,7 +3013,6 @@ packages: /abortcontroller-polyfill@1.7.5: resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} - dev: false /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -3236,7 +3202,6 @@ packages: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: safe-buffer: 5.2.1 - dev: false /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3281,15 +3246,15 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: caniuse-lite: 1.0.30001574 electron-to-chromium: 1.4.623 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.21.10) + update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: false /browserslist@4.22.2: @@ -3301,7 +3266,6 @@ packages: electron-to-chromium: 1.4.623 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: false /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -3368,7 +3332,6 @@ packages: /caniuse-lite@1.0.30001574: resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} - dev: false /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3421,7 +3384,6 @@ packages: /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - dev: false /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} @@ -3448,7 +3410,6 @@ packages: /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} - dev: false /code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -3700,7 +3661,6 @@ packages: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} hasBin: true - dev: false /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} @@ -3761,7 +3721,6 @@ packages: /dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: false /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} @@ -3771,7 +3730,6 @@ packages: /dotenv@7.0.0: resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} engines: {node: '>=6'} - dev: false /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -3779,7 +3737,6 @@ packages: /electron-to-chromium@1.4.623: resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==} - dev: false /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3952,7 +3909,6 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -4340,17 +4296,6 @@ packages: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} dev: false - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5143,7 +5088,6 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: false /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -5205,8 +5149,8 @@ packages: type-check: 0.4.0 dev: true - /lightningcss-darwin-arm64@1.21.7: - resolution: {integrity: sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==} + /lightningcss-darwin-arm64@1.21.8: + resolution: {integrity: sha512-BOMoGfcgkk2f4ltzsJqmkjiqRtlZUK+UdwhR+P6VgIsnpQBV3G01mlL6GzYxYqxq+6/3/n/D+4oy2NeknmADZw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] @@ -5223,8 +5167,8 @@ packages: dev: false optional: true - /lightningcss-darwin-x64@1.21.7: - resolution: {integrity: sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==} + /lightningcss-darwin-x64@1.21.8: + resolution: {integrity: sha512-YhF64mcVDPKKufL4aNFBnVH7uvzE0bW3YUsPXdP4yUcT/8IXChypOZ/PE1pmt2RlbmsyVuuIIeZU4zTyZe5Amw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] @@ -5241,8 +5185,8 @@ packages: dev: false optional: true - /lightningcss-freebsd-x64@1.21.7: - resolution: {integrity: sha512-RMfNzJWXCSfPnL55fcLWEAadcY6QUFT0S8NceNKYzp1KiCZtkJIy6RQ5SaVxPzRqd3iMsahUf5sfnG8N1UQSNQ==} + /lightningcss-freebsd-x64@1.21.8: + resolution: {integrity: sha512-CV6A/vTG2Ryd3YpChEgfWWv4TXCAETo9TcHSNx0IP0dnKcnDEiAko4PIKhCqZL11IGdN1ZLBCVPw+vw5ZYwzfA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] @@ -5259,8 +5203,8 @@ packages: dev: false optional: true - /lightningcss-linux-arm-gnueabihf@1.21.7: - resolution: {integrity: sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==} + /lightningcss-linux-arm-gnueabihf@1.21.8: + resolution: {integrity: sha512-9PMbqh8n/Xq0F4/j2NR/hHM2HRDiFXFSF0iOvV67pNWKJkHIO6mR8jBw/88Aro5Ye/ILsX5OuWsxIVJDFv0NXA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] @@ -5277,8 +5221,8 @@ packages: dev: false optional: true - /lightningcss-linux-arm64-gnu@1.21.7: - resolution: {integrity: sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==} + /lightningcss-linux-arm64-gnu@1.21.8: + resolution: {integrity: sha512-JTM/TuMMllkzaXV7/eDjG4IJKLlCl+RfYZwtsVmC82gc0QX0O37csGAcY2OGleiuA4DnEo/Qea5WoFfZUNC6zg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] @@ -5295,8 +5239,8 @@ packages: dev: false optional: true - /lightningcss-linux-arm64-musl@1.21.7: - resolution: {integrity: sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==} + /lightningcss-linux-arm64-musl@1.21.8: + resolution: {integrity: sha512-01gWShXrgoIb8urzShpn1RWtZuaSyKSzF2hfO+flzlTPoACqcO3rgcu/3af4Cw54e8vKzL5hPRo4kROmgaOMLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] @@ -5313,8 +5257,8 @@ packages: dev: false optional: true - /lightningcss-linux-x64-gnu@1.21.7: - resolution: {integrity: sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==} + /lightningcss-linux-x64-gnu@1.21.8: + resolution: {integrity: sha512-yVB5vYJjJb/Aku0V9QaGYIntvK/1TJOlNB9GmkNpXX5bSSP2pYW4lWW97jxFMHO908M0zjEt1qyOLMyqojHL+Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] @@ -5331,8 +5275,8 @@ packages: dev: false optional: true - /lightningcss-linux-x64-musl@1.21.7: - resolution: {integrity: sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==} + /lightningcss-linux-x64-musl@1.21.8: + resolution: {integrity: sha512-TYi+KNtBVK0+FZvxTX/d5XJb+tw3Jq+2Rr9hW359wp1afsi1Vkg+uVGgbn+m2dipa5XwpCseQq81ylMlXuyfPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] @@ -5349,8 +5293,8 @@ packages: dev: false optional: true - /lightningcss-win32-x64-msvc@1.21.7: - resolution: {integrity: sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==} + /lightningcss-win32-x64-msvc@1.21.8: + resolution: {integrity: sha512-mww+kqbPx0/C44l2LEloECtRUuOFDjq9ftp+EHTPiCp2t+avy0sh8MaFwGsrKkj2XfZhaRhi4CPVKBoqF1Qlwg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] @@ -5367,21 +5311,21 @@ packages: dev: false optional: true - /lightningcss@1.21.7: - resolution: {integrity: sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==} + /lightningcss@1.21.8: + resolution: {integrity: sha512-jEqaL7m/ZckZJjlMAfycr1Kpz7f93k6n7KGF5SJjuPSm6DWI6h3ayLZmgRHgy1OfrwoCed6h4C/gHYPOd1OFMA==} engines: {node: '>= 12.0.0'} dependencies: detect-libc: 1.0.3 optionalDependencies: - lightningcss-darwin-arm64: 1.21.7 - lightningcss-darwin-x64: 1.21.7 - lightningcss-freebsd-x64: 1.21.7 - lightningcss-linux-arm-gnueabihf: 1.21.7 - lightningcss-linux-arm64-gnu: 1.21.7 - lightningcss-linux-arm64-musl: 1.21.7 - lightningcss-linux-x64-gnu: 1.21.7 - lightningcss-linux-x64-musl: 1.21.7 - lightningcss-win32-x64-msvc: 1.21.7 + lightningcss-darwin-arm64: 1.21.8 + lightningcss-darwin-x64: 1.21.8 + lightningcss-freebsd-x64: 1.21.8 + lightningcss-linux-arm-gnueabihf: 1.21.8 + lightningcss-linux-arm64-gnu: 1.21.8 + lightningcss-linux-arm64-musl: 1.21.8 + lightningcss-linux-x64-gnu: 1.21.8 + lightningcss-linux-x64-musl: 1.21.8 + lightningcss-win32-x64-msvc: 1.21.8 dev: false /lightningcss@1.22.1: @@ -5445,7 +5389,6 @@ packages: '@lmdb/lmdb-linux-arm64': 2.7.11 '@lmdb/lmdb-linux-x64': 2.7.11 '@lmdb/lmdb-win32-x64': 2.7.11 - dev: false /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} @@ -5624,20 +5567,17 @@ packages: '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 - dev: false optional: true /msgpackr@1.10.1: resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} optionalDependencies: msgpackr-extract: 3.0.2 - dev: false /msgpackr@1.8.5: resolution: {integrity: sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==} optionalDependencies: msgpackr-extract: 3.0.2 - dev: false /mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} @@ -5692,7 +5632,6 @@ packages: /node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} @@ -5700,7 +5639,6 @@ packages: /node-addon-api@7.0.0: resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} - dev: false /node-gyp-build-optional-packages@5.0.3: resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} @@ -5710,13 +5648,11 @@ packages: /node-gyp-build-optional-packages@5.0.6: resolution: {integrity: sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==} hasBin: true - dev: false /node-gyp-build-optional-packages@5.0.7: resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} hasBin: true requiresBuild: true - dev: false optional: true /node-object-hash@3.0.0: @@ -5726,7 +5662,6 @@ packages: /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: false /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -5753,7 +5688,6 @@ packages: /nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: false /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -5862,7 +5796,6 @@ packages: /ordered-binary@1.5.1: resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} - dev: false /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} @@ -5959,7 +5892,6 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -5982,8 +5914,8 @@ packages: engines: {node: '>= 6'} dev: false - /plasmo@0.84.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SK6A/uX5mo4EsYiF7JySTOCp2aMo3ejfpbNey89M0zat9p0yDTKEClvMs9MWKXld5Ae0CXPaMYcZPAMvCMngPQ==} + /plasmo@0.84.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9fyuQubUdYOHEs7plvppB7tPfyqTpA1UlWEYUGeVOgKQ6/rhvpvjBLCWyhzy/S3CrzXL8nZ7HQ1xHka4Coe0PA==} hasBin: true dependencies: '@expo/spawn-async': 1.7.2 @@ -5992,7 +5924,7 @@ packages: '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) '@parcel/watcher': 2.2.0 '@plasmohq/init': 0.7.0 - '@plasmohq/parcel-config': 0.40.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@plasmohq/parcel-config': 0.40.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@plasmohq/parcel-core': 0.1.8 buffer: 6.0.3 chalk: 5.3.0 @@ -6417,7 +6349,6 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -7029,13 +6960,13 @@ packages: engines: {node: '>= 10.0.0'} dev: false - /update-browserslist-db@1.0.13(browserslist@4.21.10): + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.10 + browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 dev: false @@ -7049,7 +6980,6 @@ packages: browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 - dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -7064,7 +6994,6 @@ packages: /utility-types@3.10.0: resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} engines: {node: '>= 4'} - dev: false /vue@3.3.4: resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} @@ -7084,7 +7013,6 @@ packages: /weak-lru-cache@1.2.2: resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - dev: false /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -7185,7 +7113,6 @@ packages: /xxhash-wasm@0.4.2: resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} - dev: false /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} diff --git a/src/background.ts b/src/background.ts index 1b79798..4df1ecf 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,4 +1,6 @@ import { isChrome } from '~utils/extension'; +import { injectScript } from '~utils/injection'; +import { listenToTabChanges } from '~utils/tabs'; // Both brave and firefox for some reason need this extension reload, // If this isn't done, they will never load properly and will fail updateDynamicRules() @@ -11,3 +13,8 @@ if (isChrome()) { browser.runtime.reload(); }); } + +// We need to do some programatic script injection, +// since we may not have permission everytime, so inject when we switch tab. +listenToTabChanges(() => injectScript()); +injectScript(); diff --git a/src/background/messages/hello.ts b/src/background/messages/hello.ts index 84a8489..12d0af3 100644 --- a/src/background/messages/hello.ts +++ b/src/background/messages/hello.ts @@ -4,6 +4,7 @@ import { hasPermission } from '~hooks/usePermission'; import { getVersion } from '~hooks/useVersion'; import type { BaseRequest } from '~types/request'; import type { BaseResponse } from '~types/response'; +import { makeUrlIntoDomain } from '~utils/domains'; import { isDomainWhitelisted } from '~utils/storage'; type Response = BaseResponse<{ @@ -14,12 +15,13 @@ type Response = BaseResponse<{ const handler: PlasmoMessaging.MessageHandler = async (req, res) => { try { + const domain = makeUrlIntoDomain(req.sender.url ?? ''); const version = getVersion(); res.send({ success: true, version, allowed: await isDomainWhitelisted(req.sender.tab.url), - hasPermission: await hasPermission(), + hasPermission: await hasPermission(domain), }); } catch (err) { res.send({ diff --git a/src/background/messages/inject.ts b/src/background/messages/inject.ts new file mode 100644 index 0000000..3d21762 --- /dev/null +++ b/src/background/messages/inject.ts @@ -0,0 +1,10 @@ +import type { PlasmoMessaging } from '@plasmohq/messaging'; + +import { injectScript } from '~utils/injection'; + +const handler: PlasmoMessaging.MessageHandler = async (_req, res) => { + injectScript(); + res.send({}); +}; + +export default handler; diff --git a/src/contents/movie-web.ts b/src/contents/movie-web.ts index 263895d..62d253e 100644 --- a/src/contents/movie-web.ts +++ b/src/contents/movie-web.ts @@ -1,10 +1,7 @@ import { relayMessage } from '@plasmohq/messaging'; import type { PlasmoCSConfig } from 'plasmo'; -export const config: PlasmoCSConfig = { - // works for chrome, but not for firefox, so we add explicit domains for firefox - matches: ['', 'https://dev.movie-web.app/*', 'https://movie-web.app/*'], -}; +export const config: PlasmoCSConfig = {}; relayMessage({ name: 'hello', diff --git a/src/hooks/useDomainWhitelist.ts b/src/hooks/useDomainWhitelist.ts index 73b8e51..aa4fb51 100644 --- a/src/hooks/useDomainWhitelist.ts +++ b/src/hooks/useDomainWhitelist.ts @@ -26,7 +26,7 @@ export function useDomainWhitelist() { export function useToggleWhitelistDomain(domain: string) { const { domainWhitelist, addDomain, removeDomain } = useDomainWhitelist(); const isWhitelisted = domainWhitelist.includes(domain); - const { grantPermission } = usePermission(); + const { grantPermission } = usePermission(domain); const toggle = useCallback(() => { if (!isWhitelisted) { diff --git a/src/hooks/usePermission.ts b/src/hooks/usePermission.ts index 9f72045..06e6fbc 100644 --- a/src/hooks/usePermission.ts +++ b/src/hooks/usePermission.ts @@ -1,29 +1,39 @@ +import { sendToBackground } from '@plasmohq/messaging'; import { useCallback, useEffect, useState } from 'react'; import { useDomainWhitelist } from './useDomainWhitelist'; -export async function hasPermission() { +function makeDomainIntoOriginMatchers(domain: string): string[] { + return [`http://${domain}/*`, `https://${domain}/*`]; +} + +export async function hasPermission(domain: string) { return chrome.permissions.contains({ - origins: [''], + origins: makeDomainIntoOriginMatchers(domain), }); } -export function usePermission() { +export function usePermission(domain: string) { const { addDomain } = useDomainWhitelist(); const [permission, setPermission] = useState(false); - const grantPermission = useCallback(async (domain?: string) => { + const grantPermission = useCallback(async () => { const granted = await chrome.permissions.request({ - origins: [''], + origins: makeDomainIntoOriginMatchers(domain), }); setPermission(granted); - if (granted && domain) addDomain(domain); + if (granted && domain) { + await sendToBackground({ + name: 'inject', + }); + addDomain(domain); + } return granted; - }, []); + }, [domain]); useEffect(() => { - hasPermission().then((has) => setPermission(has)); - }, []); + hasPermission(domain).then((has) => setPermission(has)); + }, [domain]); return { hasPermission: permission, diff --git a/src/popup.tsx b/src/popup.tsx index 1980551..7cbea18 100644 --- a/src/popup.tsx +++ b/src/popup.tsx @@ -11,7 +11,7 @@ import { usePermission } from '~hooks/usePermission'; function IndexPopup() { const domain = useDomain(); const { isWhitelisted, toggle } = useToggleWhitelistDomain(domain); - const { grantPermission, hasPermission } = usePermission(); + const { grantPermission, hasPermission } = usePermission(domain); let page = 'toggle'; if (!hasPermission) page = 'perm'; diff --git a/src/tabs/PermissionGrant.tsx b/src/tabs/PermissionGrant.tsx index 5cd54fc..195aa58 100644 --- a/src/tabs/PermissionGrant.tsx +++ b/src/tabs/PermissionGrant.tsx @@ -6,12 +6,12 @@ import './PermissionGrant.css'; export default function PermissionGrant() { const { domainWhitelist } = useDomainWhitelist(); - const { hasPermission, grantPermission } = usePermission(); const queryParams = new URLSearchParams(window.location.search); const redirectUrl = queryParams.get('redirectUrl') ?? 'https://movie-web.app'; const domain = makeUrlIntoDomain(redirectUrl); + const { hasPermission, grantPermission } = usePermission(domain); const permissionsGranted = domainWhitelist.includes(domain) && hasPermission; const redirectBack = () => { @@ -21,7 +21,7 @@ export default function PermissionGrant() { }; const handleGrantPermission = () => { - grantPermission(domain).then(() => { + grantPermission().then(() => { redirectBack(); }); }; diff --git a/src/utils/injection.ts b/src/utils/injection.ts new file mode 100644 index 0000000..9d9879f --- /dev/null +++ b/src/utils/injection.ts @@ -0,0 +1,20 @@ +// raw urls don't work with eslint, so its a false positive +// eslint-disable-next-line import/no-unresolved +import contentScriptUrl from 'raw:~contents/movie-web'; + +import { queryCurrentTab } from '~utils/tabs'; + +export function injectScript() { + queryCurrentTab((tab) => { + if (!tab.id) return; + chrome.scripting + .executeScript({ + target: { + tabId: tab.id, + }, + world: 'MAIN', + files: [contentScriptUrl], + }) + .catch(() => {}); + }); +} diff --git a/src/utils/storage.ts b/src/utils/storage.ts index ae06680..a1427df 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -3,11 +3,11 @@ import { useStorage } from '@plasmohq/storage/hook'; import { makeUrlIntoDomain } from '~utils/domains'; -export const DEFAULT_DOMAIN_WHITELIST = ['movie-web.app', 'dev.movie-web.app']; +export const DEFAULT_DOMAIN_WHITELIST = []; export const storage = new Storage(); -const getDomainWhiteList = async () => { +export const getDomainWhiteList = async () => { const whitelist = await storage.get('domainWhitelist'); if (!whitelist) await storage.set('domainWhitelist', DEFAULT_DOMAIN_WHITELIST); return whitelist ?? DEFAULT_DOMAIN_WHITELIST; @@ -15,7 +15,7 @@ const getDomainWhiteList = async () => { const domainIsInWhitelist = async (domain: string) => { const whitelist = await getDomainWhiteList(); - return whitelist?.some((d) => d.includes(domain)) ?? false; + return whitelist?.some((d) => d === domain) ?? false; }; export function useDomainStorage() { diff --git a/src/utils/tabs.ts b/src/utils/tabs.ts index 00b538f..e05f7f8 100644 --- a/src/utils/tabs.ts +++ b/src/utils/tabs.ts @@ -1,14 +1,17 @@ import { isChrome } from './extension'; -export function queryCurrentDomain(cb: (domain: string | null) => void) { - const handle = (tabUrl: string | null) => { - if (!tabUrl) cb(null); - else cb(tabUrl); +export function queryCurrentTab(cb: (tab: chrome.tabs.Tab | browser.tabs.Tab) => void) { + const handle = (tab: chrome.tabs.Tab | browser.tabs.Tab) => { + cb(tab); }; const ops = { active: true, currentWindow: true } as const; - if (isChrome()) chrome.tabs.query(ops).then((tabs) => handle(tabs[0]?.url)); - else browser.tabs.query(ops).then((tabs) => handle(tabs[0]?.url)); + if (isChrome()) chrome.tabs.query(ops).then((tabs) => handle(tabs[0])); + else browser.tabs.query(ops).then((tabs) => handle(tabs[0])); +} + +export function queryCurrentDomain(cb: (domain: string | null) => void) { + queryCurrentTab((tab) => cb(tab.url ?? null)); } export function listenToTabChanges(cb: () => void) {