diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b888286..8b7c463 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -29,7 +29,6 @@ jobs: env: WEB_EXT_API_KEY: ${{ secrets.WEB_EXT_API_KEY }} WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }} - WEB_EXT_ID: ${{ secrets.WEB_EXT_ID }} chrome: name: Chrome runs-on: ubuntu-latest diff --git a/dev/copy-libs.sh b/dev/copy-libs.sh index fbff07a..e69de29 100755 --- a/dev/copy-libs.sh +++ b/dev/copy-libs.sh @@ -1 +0,0 @@ -cp node_modules/webextension-polyfill/dist/browser-polyfill.min.js src/lib/ diff --git a/package-lock.json b/package-lock.json index ba44434..ce2f177 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,8 +6,7 @@ "": { "license": "GPL-3.0", "dependencies": { - "normalize.css": "^8.0.1", - "webextension-polyfill": "^0.12.0" + "normalize.css": "^8.0.1" }, "devDependencies": { "chrome-webstore-upload-cli": "^3.3.0", @@ -7166,12 +7165,6 @@ "node": ">= 8" } }, - "node_modules/webextension-polyfill": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.12.0.tgz", - "integrity": "sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==", - "license": "MPL-2.0" - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index 3e90216..fb0ef07 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,7 @@ "web-ext": "^7.12.0" }, "dependencies": { - "normalize.css": "^8.0.1", - "webextension-polyfill": "^0.12.0" + "normalize.css": "^8.0.1" }, "webExt": { "sourceDir": "src/", diff --git a/src/background.js b/src/background.js index 2d42f8b..5493faa 100644 --- a/src/background.js +++ b/src/background.js @@ -1,5 +1,12 @@ -browser.browserAction.onClicked.addListener(() => browser.runtime.openOptionsPage()); +if (typeof browser === 'undefined') { + globalThis.browser = chrome; +} +browser.action.onClicked.addListener(() => browser.runtime.openOptionsPage()); + +// todo: +// global variable in non-persistent background script potentially problematic +// may need to store requestId in storage to make error handling 100% reliable const handledRequests = new Map(); browser.webRequest.onBeforeRequest.addListener(({ method, requestBody, requestId, timeStamp, url }) => { diff --git a/src/lib/browser-polyfill.min.js b/src/lib/browser-polyfill.min.js deleted file mode 100644 index 0758a1e..0000000 --- a/src/lib/browser-polyfill.min.js +++ /dev/null @@ -1,8 +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}})("undefined"==typeof globalThis?"undefined"==typeof self?this:self:globalThis,function(a){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(!(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)){a.exports=(a=>{const b={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,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},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:!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},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(0===Object.keys(b).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class c extends WeakMap{constructor(a,b=void 0){super(b),this.createItem=a}get(a){return this.has(a)||this.set(a,this.createItem(a)),super.get(a)}}const d=a=>a&&"object"==typeof a&&"function"==typeof a.then,e=(b,c)=>(...d)=>{a.runtime.lastError?b.reject(new Error(a.runtime.lastError.message)):c.singleCallbackArg||1>=d.length&&!1!==c.singleCallbackArg?b.resolve(d[0]):b.resolve(d)},f=a=>1==a?"argument":"arguments",g=(a,b)=>function(c,...d){if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((f,g)=>{if(b.fallbackToNoCallback)try{c[a](...d,e({resolve:f,reject:g},b))}catch(e){console.warn(`${a} API method doesn't seem to support the callback parameter, `+"falling back to call it without a callback: ",e),c[a](...d),b.fallbackToNoCallback=!1,b.noCallback=!0,f()}else b.noCallback?(c[a](...d),f()):c[a](...d,e({resolve:f,reject:g},b))})},h=(a,b,c)=>new Proxy(b,{apply(b,d,e){return c.call(d,a,...e)}});let i=Function.call.bind(Object.prototype.hasOwnProperty);const j=(a,b={},c={})=>{let d=Object.create(null),e=Object.create(a);return new Proxy(e,{has(b,c){return c in a||c in d},get(e,f){if(f in d)return d[f];if(!(f in a))return;let k=a[f];if("function"==typeof k){if("function"==typeof b[f])k=h(a,a[f],b[f]);else if(i(c,f)){let b=g(f,c[f]);k=h(a,a[f],b)}else k=k.bind(a);}else if("object"==typeof k&&null!==k&&(i(b,f)||i(c,f)))k=j(k,b[f],c[f]);else if(i(c,"*"))k=j(k,b[f],c["*"]);else return Object.defineProperty(d,f,{configurable:!0,enumerable:!0,get(){return a[f]},set(b){a[f]=b}}),k;return d[f]=k,k},set(b,c,e){return c in d?d[c]=e:a[c]=e,!0},defineProperty(a,b,c){return Reflect.defineProperty(d,b,c)},deleteProperty(a,b){return Reflect.deleteProperty(d,b)}})},k=a=>({addListener(b,c,...d){b.addListener(a.get(c),...d)},hasListener(b,c){return b.hasListener(a.get(c))},removeListener(b,c){b.removeListener(a.get(c))}}),l=new c(a=>"function"==typeof a?function(b){const c=j(b,{},{getContent:{minArgs:0,maxArgs:0}});a(c)}:a),m=new c(a=>"function"==typeof a?function(b,c,e){let f,g,h=!1,i=new Promise(a=>{f=function(b){h=!0,a(b)}});try{g=a(b,c,f)}catch(a){g=Promise.reject(a)}const j=!0!==g&&d(g);if(!0!==g&&!j&&!h)return!1;const k=a=>{a.then(a=>{e(a)},a=>{let b;b=a&&(a instanceof Error||"string"==typeof a.message)?a.message:"An unexpected error occurred",e({__mozWebExtensionPolyfillReject__:!0,message:b})}).catch(a=>{console.error("Failed to send onMessage rejected reply",a)})};return j?k(g):k(i),!0}:a),n=({reject:b,resolve:c},d)=>{a.runtime.lastError?a.runtime.lastError.message==="The message port closed before a response was received."?c():b(new Error(a.runtime.lastError.message)):d&&d.__mozWebExtensionPolyfillReject__?b(new Error(d.message)):c(d)},o=(a,b,c,...d)=>{if(d.lengthb.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((a,b)=>{const e=n.bind(null,{resolve:a,reject:b});d.push(e),c.sendMessage(...d)})},p={devtools:{network:{onRequestFinished:k(l)}},runtime:{onMessage:k(m),onMessageExternal:k(m),sendMessage:o.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:o.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},q={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return b.privacy={network:{"*":q},services:{"*":q},websites:{"*":q}},j(a,p,b)})(chrome)}else a.exports=globalThis.browser}); -//# sourceMappingURL=browser-polyfill.min.js.map - -// webextension-polyfill v.0.12.0 (https://github.com/mozilla/webextension-polyfill) - -/* 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/. */ diff --git a/src/manifest.json b/src/manifest.json index 614d6a7..1446393 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,5 +1,5 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "Outbox for Tumblr", "version": "1.0.4", @@ -10,7 +10,7 @@ "128": "icons/128.png" }, - "browser_action": { + "action": { "default_icon": { "16": "icons/16.png", "48": "icons/48.png", @@ -19,27 +19,34 @@ }, "background": { - "scripts": [ "lib/browser-polyfill.min.js", "background.js" ], - "persistent": true + "scripts": [ "background.js" ], + "service_worker": "background.js", + "persistent": false }, "homepage_url": "https://github.com/AprilSylph/Outbox-for-Tumblr#readme", "permissions": [ "storage", - "webRequest", + "webRequest" + ], + "host_permissions": [ "*://*.tumblr.com/*" ], "optional_permissions": [ "" ], + "optional_host_permissions": [ + "" + ], "options_ui": { "page": "outbox.html", "open_in_tab": true }, - "minimum_chrome_version": "80", + "minimum_chrome_version": "121", "browser_specific_settings": { "gecko": { - "strict_min_version": "74.0a1" + "id": "{ff20bd71-d65d-439f-b48a-c12627f3f2a3}", + "strict_min_version": "128.0" } } } diff --git a/src/outbox.css b/src/outbox.css index fd0f410..ce6378f 100644 --- a/src/outbox.css +++ b/src/outbox.css @@ -502,3 +502,28 @@ article details summary { article details[open] summary { display: none; } + +#permissions-banner { + box-sizing: border-box; + width: 375px; + min-width: 100%; + max-width: 100%; + padding: 8px 4px; + border-bottom: 1px solid rgb(var(--active-grey)); + + text-align: center; +} + +#grant-host-permission { + display: block; + padding: 0.5ch 1ch; + border-radius: 0.5ch; + margin: 8px auto 0; + + font-family: 'Courier New', Courier, monospace; + line-height: 1; +} + +#grant-host-permission:focus { + outline: 2px solid rgb(var(--accent)); +} diff --git a/src/outbox.html b/src/outbox.html index e3cb8fb..53ae0cb 100644 --- a/src/outbox.html +++ b/src/outbox.html @@ -9,11 +9,14 @@ - +
@@ -33,6 +36,13 @@

Links

  • Source code
  • +
    diff --git a/src/outbox.js b/src/outbox.js index 1cfb4ff..26f71b3 100644 --- a/src/outbox.js +++ b/src/outbox.js @@ -1,5 +1,9 @@ import { renderContent } from './lib/npf.js'; +if (typeof browser === 'undefined') { + globalThis.browser = chrome; +} + const anonymousAvatarSrc = 'data:image/png;base64,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'; const mainElement = document.querySelector('main'); @@ -175,3 +179,31 @@ browser.storage.onChanged.addListener(onStorageChanged); updateExportDownload(); importInput.addEventListener('change', onImportInputChanged); + +const permissionsBannerElement = document.getElementById('permissions-banner'); +const permissionsButton = document.getElementById('grant-host-permission'); +const updatePermissionsBannerVisibility = hasHostPermission => { + permissionsBannerElement.hidden = hasHostPermission; +}; +permissionsButton.addEventListener('click', () => { + browser.permissions + .request({ origins: ['*://*.tumblr.com/*'] }) + .then(updatePermissionsBannerVisibility); +}); +browser.permissions + .contains({ origins: ['*://*.tumblr.com/*'] }) + .then(updatePermissionsBannerVisibility); + +const allUrlsSection = document.getElementById('all-urls-section'); +const allUrlsButton = document.getElementById('grant-all-urls'); +const updateAllUrlsSectionVisibility = hasHostPermission => { + allUrlsSection.hidden = hasHostPermission; +}; +allUrlsButton.addEventListener('click', () => { + browser.permissions + .request({ origins: [''] }) + .then(updateAllUrlsSectionVisibility); +}); +browser.permissions + .contains({ origins: [''] }) + .then(updateAllUrlsSectionVisibility);