From 06eb962e85147e170eaa39f9fd76aa114909a9a0 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Sat, 16 Jul 2022 12:25:51 -0700 Subject: [PATCH] Update safari extension --- apple/Sources/SafariExtension/Resources/manifest.json | 2 +- apple/Sources/SafariExtension/Resources/scripts/background.js | 2 +- apple/Sources/SafariExtension/Resources/scripts/constants.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apple/Sources/SafariExtension/Resources/manifest.json b/apple/Sources/SafariExtension/Resources/manifest.json index f9512292b..e59fa2d65 100644 --- a/apple/Sources/SafariExtension/Resources/manifest.json +++ b/apple/Sources/SafariExtension/Resources/manifest.json @@ -11,7 +11,7 @@ "url": "https://omnivore.app/" }, "homepage_url": "https://omnivore.app/", - "content_security_policy": "default-src 'none'; child-src 'none'; manifest-src 'none'; media-src 'none'; object-src 'none'; prefetch-src 'none'; worker-src 'none'; connect-src https://storage.googleapis.com/ https://omnivore.app/api/ blob:; frame-src 'none'; font-src 'none'; img-src data:; script-src 'self'; script-src-elem 'self'; script-src-attr 'none'; style-src 'self'; style-src-elem 'self'; style-src-attr 'none'; base-uri 'none'; form-action 'none'; block-all-mixed-content; upgrade-insecure-requests; report-uri https://api.jeurissen.co/reports/csp/webext/omnivore/", + "content_security_policy": "default-src 'none'; child-src 'none'; manifest-src 'none'; media-src 'none'; object-src 'none'; prefetch-src 'none'; worker-src 'none'; connect-src https://storage.googleapis.com/ https://api-prod.omnivore.app/api/ blob:; frame-src 'none'; font-src 'none'; img-src data:; script-src 'self'; script-src-elem 'self'; script-src-attr 'none'; style-src 'self'; style-src-elem 'self'; style-src-attr 'none'; base-uri 'none'; form-action 'none'; block-all-mixed-content; upgrade-insecure-requests; report-uri https://api.jeurissen.co/reports/csp/webext/omnivore/", "icons": { "16": "/images/extension/icon-16.png", "24": "/images/extension/icon-24.png", diff --git a/apple/Sources/SafariExtension/Resources/scripts/background.js b/apple/Sources/SafariExtension/Resources/scripts/background.js index 4c1369ce6..62ba715e6 100644 --- a/apple/Sources/SafariExtension/Resources/scripts/background.js +++ b/apple/Sources/SafariExtension/Resources/scripts/background.js @@ -1 +1 @@ -(()=>{"use strict";let e;const t="https://omnivore.app",s="https://omnivore.app/api/";function n(e){return new Promise((t=>{browserApi.storage.local.get(e,(s=>{const n=s&&s[e]||null;t(n)}))}))}function o(e){return new Promise((t=>{browserApi.storage.local.set(e,t)}))}function r(e){return new Promise((t=>{browserApi.storage.local.remove(e,t)}))}function a(t){t.setRequestHeader("Content-Type","application/json"),e&&t.setRequestHeader("Authorization",e)}function i(){n("postInstallClickComplete").then((e=>{e&&r("postInstallClickComplete")}))}function c(e,s){if(4===s.readyState)if(200===s.status){const{data:n}=JSON.parse(s.response);if("createArticle"in n)if("errorCodes"in n.createArticle){const s={text:descriptions[n.createArticle.errorCodes[0]]||"Unable to save page",type:"error"};"UNAUTHORIZED"===n.createArticle.errorCodes[0]&&(s.errorCode=401,s.url=t,i()),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:s})}else{const s=n.createArticle.createdArticle,o=n.createArticle.user,r=t+(s.hasContent?`/${o.profile.username}/`+s.slug:"/home");browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:r,linkText:"View",type:"success"}})}else if("errorCodes"in n.createArticleSavingRequest)browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:descriptions[n.createArticleSavingRequest.errorCodes[0]]||"Unable to save page",type:"error"}});else{const s=n.createArticleSavingRequest.articleSavingRequest,o=t+"/article/sr/"+s.id;browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:o,linkText:"View",type:"success"}})}}else 400===s.status&&browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}function l(e){browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Saving..."}});const n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&c(e,n)},browserApi.tabs.sendMessage(e.id,{action:ACTIONS.GetContent},(async o=>{if(!o||"object"!=typeof o)return;const{type:r,pageInfo:c,doc:l,uploadContentObjUrl:p}=o;let d=null;switch(r){case"pdf":if(d=await function(e,n,o,r){return new Promise((c=>{const l=new XMLHttpRequest;l.onreadystatechange=async function(){if(4===l.readyState){if(200===l.status){const{data:s}=JSON.parse(l.response);if("errorCodes"in s.uploadFileRequest&&"UNAUTHORIZED"===s.uploadFileRequest.errorCodes[0]&&(i(),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error",errorCode:401,url:t}})),s.uploadFileRequest&&s.uploadFileRequest.id&&!("errorCodes"in s.uploadFileRequest)){const e=await function({id:e,uploadSignedUrl:t},s,n){return fetch(n).then((e=>e.blob())).then((n=>new Promise((o=>{const r=new XMLHttpRequest;r.open("PUT",t,!0),r.setRequestHeader("Content-Type",s),r.onerror=()=>{o(null)},r.onload=()=>{o({id:e})},r.send(n)})))).catch((e=>{console.error("error uploading file",e)}))}(s.uploadFileRequest,o,r);return URL.revokeObjectURL(r),c(e)}browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}else 400===l.status&&browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}});c(!1)}};const p=JSON.stringify({query:"mutation UploadFileRequest($input: UploadFileRequestInput!) {\n uploadFileRequest(input:$input) {\n ... on UploadFileRequestError {\n errorCodes\n }\n ... on UploadFileRequestSuccess {\n id\n uploadSignedUrl\n }\n }\n }",variables:{input:{url:n,contentType:o}}});l.open("POST",s+"graphql",!0),a(l),l.send(p)}))}(e,encodeURI(e.url),c.contentType,p),!d||!d.id)return void browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}const u=l&&l.length||d,g=u?CREATE_ARTICLE_QUERY:CREATE_ARTICLE_SAVING_REQUEST_QUERY,b={url:encodeURI(e.url)};u&&(b.preparedDocument={document:l,pageInfo:c},b.uploadFileId=d&&d.id||null);const f=JSON.stringify({query:g,variables:{input:b}});n.open("POST",s+"graphql",!0),a(n),n.send(f)}))}async function p(e){const t=await n(e+"_saveInProgress");if(!t)return;clearInterval(t);const s=await n(e+"_saveInProgressTimeoutId_"+t);s&&clearTimeout(s)}function d(r){return n("postInstallClickComplete").then((async n=>{if(n)return!0;if("undefined"!=typeof browser&&browser.runtime&&browser.runtime.sendNativeMessage){const t=await browser.runtime.sendNativeMessage("omnivore",{message:ACTIONS.GetAuthToken});t.authToken&&(e=t.authToken)}return new Promise((e=>{const n=new XMLHttpRequest;n.onreadystatechange=function(){if(4===n.readyState&&200===n.status){const{data:s}=JSON.parse(n.response);s.me?(o({postInstallClickComplete:!0}),e(!0)):(browserApi.tabs.sendMessage(r,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Loading..."}}),browserApi.tabs.sendMessage(r,{action:ACTIONS.ShowMessage,payload:{text:"",type:"error",errorCode:401,url:t}}),e(null))}};const i=JSON.stringify({query:"{me{id}}"});n.open("POST",s+"graphql",!0),a(n),n.send(i)}))}))}function u(e){new Promise((e=>{browserApi.tabs.query({active:!0,currentWindow:!0},(function(t){e(t[0]||null)}))})).then((t=>{browserApi.tabs.sendMessage(t.id,{action:ACTIONS.Ping},(async function(s){if(s&&s.pong)await d(t.id)&&e(t);else{const s=browserApi.runtime.getManifest().content_scripts,n=[...s[0].js,...s[1].js];!function(s,n,o){function r(e,t,s){return function(){browserScriptingApi.executeScript(e,t,s)}}let a=async function(){await d(t.id)&&e(t)};for(let e=n.length-1;e>=0;--e)a=r(s,{file:n[e]},a);null!==a&&a()}(t.id,n)}}))}))}function g(e,t){let s="/images/toolbar/icon";if(ENV_IS_FIREFOX?s+="_firefox":ENV_IS_EDGE&&(s+="_edge"),e||(s+="_inactive"),("boolean"==typeof t?t:window.matchMedia("(prefers-color-scheme: dark)").matches)&&(s+="_dark"),ENV_IS_FIREFOX)return s+".svg";const n=["16","24","32","48"];ENV_IS_EDGE||n.push("19","38");const o={};for(let e=0;e{!function t(){browserApi.tabs.get(e,(function(e){browserApi.runtime.lastError&&setTimeout(t,150),f(e)}))}()})),browserApi.tabs.onUpdated.addListener(((e,t,s)=>{t.status&&s&&s.active&&f(s)})),browserApi.tabs.onRemoved.addListener((e=>{!function(e){new Promise((e=>{browserApi.storage.local.get(null,(t=>{e(t||{})}))})).then((function(t){const s=[],n=Object.keys(t),o=e+"_saveInProgress";for(let e=0;e{"complete"!==e.status?(browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Page loading..."}}),s&&"function"==typeof s&&s()):(t&&"function"==typeof t&&t(),l(e))}))}p(e),t(null,(()=>{!function(e,t,s,n=1e3,o=10500){const r=setInterval(e,n),a=setTimeout((()=>{clearInterval(r),t()}),o);s&&"function"==typeof s&&s(r,a)}((()=>{t((()=>{p(e)}))}),(()=>{p(e),browserApi.tabs.get(e,(e=>{l(e)}))}),((t,s)=>{const n={};n[e+"_saveInProgress"]=t,n[e+"_saveInProgressTimeoutId_"+t]=s,o(n)}))}))}(e.id)}))})),browserApi.runtime.onMessage.addListener(((e,t,s)=>{if(e.forwardToTab)return delete e.forwardToTab,void browserApi.tabs.sendRequest(t.tab.id,e);e.action===ACTIONS.RefreshDarkMode&&b(t.tab.id,e.payload.value)})),browserActionApi.setIcon({path:g(!0)}),browserApi.contextMenus.create({id:"log-selection",title:"Save to Omnivore",contexts:["link"],onclick:async function(e){u((async function(t){await async function(e,t){return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Saving..."}}),new Promise(((n,o)=>{const r=new XMLHttpRequest;r.open("POST",s+"graphql",!0),a(r),r.onerror=e=>{n(null)},r.onload=t=>{try{c(e,r)}catch(e){console.log("response error",e)}n({})};const i=JSON.stringify({query:CREATE_ARTICLE_SAVING_REQUEST_QUERY,variables:{input:{url:t}}});r.send(i)})).catch((e=>{console.error("error saving url",e)}))}(t,e.linkUrl)}))}})})(); \ No newline at end of file +(()=>{"use strict";var e,t=new Uint8Array(16);function n(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(t)}const o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&o.test(e)};for(var r=[],a=0;a<256;++a)r.push((a+256).toString(16).substr(1));const i=function(e,t,o){var a=(e=e||{}).random||(e.rng||n)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t){o=o||0;for(var i=0;i<16;++i)t[o+i]=a[i];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!s(n))throw TypeError("Stringified UUID is invalid");return n}(a)};let u;const c="https://omnivore.app",d="https://api-prod.omnivore.app/api/";function l(e){return new Promise((t=>{browserApi.storage.local.get(e,(n=>{const o=n&&n[e]||null;t(o)}))}))}function p(e){return new Promise((t=>{browserApi.storage.local.set(e,t)}))}function f(e){return new Promise((t=>{browserApi.storage.local.remove(e,t)}))}function g(e){e.setRequestHeader("Content-Type","application/json"),u&&e.setRequestHeader("Authorization",u)}function b(){l("postInstallClickComplete").then((e=>{e&&f("postInstallClickComplete")}))}async function w(e,t,n,o){return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Saving..."}}),new Promise(((s,r)=>{const a=new XMLHttpRequest;a.open("POST",d+"graphql",!0),g(a),a.onerror=e=>{r(e)},a.onload=()=>{try{const t=function(e,t,n){if(4===n.readyState){if(200===n.status){const{data:o}=JSON.parse(n.response),s=o[t];if(!s)return;if("errorCodes"in s){const t={text:descriptions[o.createArticle.errorCodes[0]]||"Unable to save page",type:"error"};return"UNAUTHORIZED"===s.errorCodes[0]&&(t.errorCode=401,t.url=c,b()),void browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:t})}const r=s.url;return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:r??c+"/home",linkText:"Read Now",type:"success"}}),s}if(400===n.status)return void browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}}(e,n,a);if(!t)return r();s(t)}catch(e){r(e)}};const i=JSON.stringify({query:t,variables:{input:o}});a.send(i)})).catch((t=>{console.log("error saving page",t),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}))}function y(e){browserApi.tabs.sendMessage(e.id,{action:ACTIONS.GetContent},(async t=>{if(!t||"object"!=typeof t)return;const n=i(),{type:o,pageInfo:s,doc:r,uploadContentObjUrl:a}=t;switch(o){case"html":await w(e,SAVE_PAGE_QUERY,"savePage",{source:"extension",clientRequestId:n,originalContent:r,title:s.title,url:encodeURI(e.url)});break;case"url":await w(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:n,url:encodeURI(e.url)});break;case"pdf":{const t=await function(e,t,n,o){return new Promise((s=>{const r=new XMLHttpRequest;r.onreadystatechange=async function(){if(4===r.readyState){if(200===r.status){const{data:t}=JSON.parse(r.response);if("errorCodes"in t.uploadFileRequest&&"UNAUTHORIZED"===t.uploadFileRequest.errorCodes[0]&&(b(),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error",errorCode:401,url:c}})),t.uploadFileRequest&&t.uploadFileRequest.id&&t.uploadFileRequest.createdPageId&&!("errorCodes"in t.uploadFileRequest)){const r=await function({id:e,uploadSignedUrl:t},n,o){return fetch(o).then((e=>e.blob())).then((o=>new Promise((s=>{const r=new XMLHttpRequest;r.open("PUT",t,!0),r.setRequestHeader("Content-Type",n),r.onerror=()=>{s(void 0)},r.onload=()=>{s({id:e})},r.send(o)})))).catch((e=>{console.error("error uploading file",e)}))}(t.uploadFileRequest,n,o);if(URL.revokeObjectURL(o),!r)return;const a=t.uploadFileRequest.createdPageId,i=c+"/article/sr/"+a;return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:i,linkText:"Read Now",type:"success"}}),s(t.uploadFileRequest)}browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}else 400===r.status&&browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}});s(!1)}};const a=JSON.stringify({query:"mutation UploadFileRequest($input: UploadFileRequestInput!) {\n uploadFileRequest(input:$input) {\n ... on UploadFileRequestError {\n errorCodes\n }\n ... on UploadFileRequestSuccess {\n id\n createdPageId\n uploadSignedUrl\n }\n }\n }",variables:{input:{url:t,contentType:n,createPageEntry:!0}}});r.open("POST",d+"graphql",!0),g(r),r.send(a)}))}(e,encodeURI(e.url),s.contentType,a);if(!t||!t.id)return void await w(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:n,url:encodeURI(e.url)});break}}}))}async function A(e){const t=await l(e+"_saveInProgress");if(!t)return;clearInterval(t);const n=await l(e+"_saveInProgressTimeoutId_"+t);n&&clearTimeout(n)}function h(e){return l("postInstallClickComplete").then((async t=>{if(t)return!0;if("undefined"!=typeof browser&&browser.runtime&&browser.runtime.sendNativeMessage){const e=await browser.runtime.sendNativeMessage("omnivore",{message:ACTIONS.GetAuthToken});e.authToken&&(u=e.authToken)}return new Promise((t=>{const n=new XMLHttpRequest;n.onreadystatechange=function(){if(4===n.readyState&&200===n.status){const{data:o}=JSON.parse(n.response);o.me?(p({postInstallClickComplete:!0}),t(!0)):(browserApi.tabs.sendMessage(e,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Loading..."}}),browserApi.tabs.sendMessage(e,{action:ACTIONS.ShowMessage,payload:{text:"",type:"error",errorCode:401,url:c}}),t(null))}};const o=JSON.stringify({query:"{me{id}}"});n.open("POST",d+"graphql",!0),g(n),n.send(o)}))}))}function S(e){new Promise((e=>{browserApi.tabs.query({active:!0,currentWindow:!0},(function(t){e(t[0]||null)}))})).then((t=>{browserApi.tabs.sendMessage(t.id,{action:ACTIONS.Ping},(async function(n){if(n&&n.pong)await h(t.id)&&e(t);else{const n=browserApi.runtime.getManifest().content_scripts,o=[...n[0].js,...n[1].js];!function(n,o,s){function r(e,t,n){return function(){browserScriptingApi.executeScript(e,t,n)}}let a=async function(){await h(t.id)&&e(t)};for(let e=o.length-1;e>=0;--e)a=r(n,{file:o[e]},a);null!==a&&a()}(t.id,o)}}))}))}function v(e,t){let n="/images/toolbar/icon";if(ENV_IS_FIREFOX?n+="_firefox":ENV_IS_EDGE&&(n+="_edge"),e||(n+="_inactive"),("boolean"==typeof t?t:window.matchMedia("(prefers-color-scheme: dark)").matches)&&(n+="_dark"),ENV_IS_FIREFOX)return n+".svg";const o=["16","24","32","48"];ENV_IS_EDGE||o.push("19","38");const s={};for(let e=0;e{!function t(){browserApi.tabs.get(e,(function(e){browserApi.runtime.lastError&&setTimeout(t,150),I(e)}))}()})),browserApi.tabs.onUpdated.addListener(((e,t,n)=>{t.status&&n&&n.active&&I(n)})),browserApi.tabs.onRemoved.addListener((e=>{!function(e){new Promise((e=>{browserApi.storage.local.get(null,(t=>{e(t||{})}))})).then((function(t){const n=[],o=Object.keys(t),s=e+"_saveInProgress";for(let e=0;e{"complete"!==e.status?(browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Page loading..."}}),n&&"function"==typeof n&&n()):(t&&"function"==typeof t&&t(),y(e))}))}A(e),t(null,(()=>{!function(e,t,n,o=1e3,s=10500){const r=setInterval(e,o),a=setTimeout((()=>{clearInterval(r),t()}),s);n&&"function"==typeof n&&n(r,a)}((()=>{t((()=>{A(e)}))}),(()=>{A(e),browserApi.tabs.get(e,(e=>{y(e)}))}),((t,n)=>{const o={};o[e+"_saveInProgress"]=t,o[e+"_saveInProgressTimeoutId_"+t]=n,p(o)}))}))}(e.id)}))})),browserApi.runtime.onMessage.addListener(((e,t,n)=>{if(e.forwardToTab)return delete e.forwardToTab,void browserApi.tabs.sendRequest(t.tab.id,e);e.action===ACTIONS.RefreshDarkMode&&m(t.tab.id,e.payload.value)})),browserActionApi.setIcon({path:v(!0)}),browserApi.contextMenus.create({id:"save-selection",title:"Save to Omnivore",contexts:["link"],onclick:async function(e){S((async function(t){await async function(e,t){const n=i();await w(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:n,url:encodeURI(t)})}(t,e.linkUrl)}))}})})(); \ No newline at end of file diff --git a/apple/Sources/SafariExtension/Resources/scripts/constants.js b/apple/Sources/SafariExtension/Resources/scripts/constants.js index 86558e7ad..3e6593627 100644 --- a/apple/Sources/SafariExtension/Resources/scripts/constants.js +++ b/apple/Sources/SafariExtension/Resources/scripts/constants.js @@ -1 +1 @@ -"use strict";window.browserApi="object"==typeof chrome&&chrome&&chrome.runtime&&chrome||"object"==typeof browser&&browser||{},window.browserActionApi=browserApi.action||browserApi.browserAction||browserApi.pageAction,window.browserScriptingApi=browserApi.scripting||browserApi.tabs,window.ENV_EXTENSION_ORIGIN=browserApi.runtime.getURL("PATH/").replace("/PATH/",""),window.ENV_IS_FIREFOX=ENV_EXTENSION_ORIGIN.startsWith("moz-extension://"),window.ENV_IS_EDGE=navigator.userAgent.toLowerCase().indexOf("edg")>-1,window.ENV_DOES_NOT_SUPPORT_BLOB_URL_ACCESS=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),window.SELECTORS={CANONICAL_URL:["head > link[rel='canonical']"],TITLE:["head > meta[property='og:title']"]},window.ACTIONS={ShowMessage:"SHOW_MESSAGE",GetContent:"GET_CONTENT",GetPageInfo:"GET_PAGE_INFO",Ping:"PING",AddIframeContent:"ADD_IFRAME_CONTENT",RefreshDarkMode:"REFRESH_DARK_MODE",GetAuthToken:"GET_AUTH_TOKEN"},window.DONT_REMOVE_ELEMENTS=["meta","script","title"],window.CREATE_ARTICLE_QUERY="mutation CreateArticle ($input: CreateArticleInput!){\n createArticle(input:$input){\n ... on CreateArticleSuccess{\n createdArticle{\n id\n title\n slug\n hasContent\n }\n user {\n id\n profile {\n id\n username\n }\n }\n}\n ... on CreateArticleError{\n errorCodes\n }\n}\n}",window.CREATE_ARTICLE_SAVING_REQUEST_QUERY="mutation CreateArticleSavingRequest ($input: CreateArticleSavingRequestInput!){\n createArticleSavingRequest(input:$input){\n ... on CreateArticleSavingRequestSuccess{\n articleSavingRequest{\n id\n }\n }\n ... on CreateArticleSavingRequestError{\n errorCodes\n }\n }\n}"; \ No newline at end of file +"use strict";window.browserApi="object"==typeof chrome&&chrome&&chrome.runtime&&chrome||"object"==typeof browser&&browser||{},window.browserActionApi=browserApi.action||browserApi.browserAction||browserApi.pageAction,window.browserScriptingApi=browserApi.scripting||browserApi.tabs,window.ENV_EXTENSION_ORIGIN=browserApi.runtime.getURL("PATH/").replace("/PATH/",""),window.ENV_IS_FIREFOX=ENV_EXTENSION_ORIGIN.startsWith("moz-extension://"),window.ENV_IS_EDGE=navigator.userAgent.toLowerCase().indexOf("edg")>-1,window.ENV_DOES_NOT_SUPPORT_BLOB_URL_ACCESS=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),window.SELECTORS={CANONICAL_URL:["head > link[rel='canonical']"],TITLE:["head > meta[property='og:title']"]},window.ACTIONS={ShowMessage:"SHOW_MESSAGE",GetContent:"GET_CONTENT",GetPageInfo:"GET_PAGE_INFO",Ping:"PING",AddIframeContent:"ADD_IFRAME_CONTENT",RefreshDarkMode:"REFRESH_DARK_MODE",GetAuthToken:"GET_AUTH_TOKEN"},window.DONT_REMOVE_ELEMENTS=["meta","script","title"],window.SAVE_URL_QUERY="mutation SaveUrl ($input: SaveUrlInput!) {\n saveUrl(input:$input){\n ... on SaveSuccess {\n url\n }\n ... on SaveError {\n errorCodes\n }\n }\n}",window.SAVE_FILE_QUERY="mutation SaveFile ($input: SaveFileInput!) {\n saveFile(input:$input){\n ... on SaveSuccess {\n url\n }\n ... on SaveError {\n errorCodes\n }\n }\n}",window.SAVE_PAGE_QUERY="mutation SavePage ($input: SavePageInput!) {\n savePage(input:$input){\n ... on SaveSuccess {\n url\n }\n ... on SaveError {\n errorCodes\n }\n }\n}",window.CREATE_ARTICLE_QUERY="mutation CreateArticle ($input: CreateArticleInput!){\n createArticle(input:$input){\n ... on CreateArticleSuccess{\n createdArticle{\n id\n title\n slug\n hasContent\n }\n user {\n id\n profile {\n id\n username\n }\n }\n}\n ... on CreateArticleError{\n errorCodes\n }\n}\n}",window.CREATE_ARTICLE_SAVING_REQUEST_QUERY="mutation CreateArticleSavingRequest ($input: CreateArticleSavingRequestInput!){\n createArticleSavingRequest(input:$input){\n ... on CreateArticleSavingRequestSuccess{\n articleSavingRequest{\n id\n }\n }\n ... on CreateArticleSavingRequestError{\n errorCodes\n }\n }\n}"; \ No newline at end of file