diff --git a/dropbox-oauth.html b/dropbox-oauth.html deleted file mode 100644 index ae79995a..00000000 --- a/dropbox-oauth.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - OAuth Receiver - - - - - - - diff --git a/js/dropbox-auth-receiver.js b/js/dropbox-auth-receiver.js deleted file mode 100644 index cadb3b5c..00000000 --- a/js/dropbox-auth-receiver.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; - -/** - got from the old api - @see: https://github.com/dropbox/dropbox-sdk-js/blob/a88a138c0c3260c3537f30f94b003c1cf64f2fbd/examples/javascript/utils.js - */ -function parseQueryString(str) { - let ret = Object.create(null); - - if (typeof str !== 'string') { - return ret; - } - - str = str.trim().replace(/^(\?|#|&)/, ''); - - if (!str) { - return ret; - } - - str.split('&').forEach(function (param) { - let parts = param.replace(/\+/g, ' ').split('='); - // Firefox (pre 40) decodes `%3D` to `=` - // https://github.com/sindresorhus/query-string/pull/37 - let key = parts.shift(); - let val = parts.length > 0 ? parts.join('=') : undefined; - - key = decodeURIComponent(key); - - // missing `=` should be `null`: - // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters - val = val === undefined ? null : decodeURIComponent(val); - - if (ret[key] === undefined) { - ret[key] = val; - } else if (Array.isArray(ret[key])) { - ret[key].push(val); - } else { - ret[key] = [ret[key], val]; - } - }); - - return ret; -} - -window.onload = () => { - - let data = {'dropbox_access_token': parseQueryString(location.hash).access_token}; - - /* this was the only way that worked in keeping a value from page to page with location.href */ - /* tried localStorage, but didn't work :/ */ - if (typeof browser !== 'undefined') { - browser.storage.local.set(data) - .then(() => { - window.location.href = '/manage.html'; - }); - } else if (chrome.storage) { - chrome.storage.local.set(data, () => { - window.location.href = '/manage.html'; - }); - } -} diff --git a/manage/import-export-dropbox.js b/manage/import-export-dropbox.js index 08a92f86..c206d768 100644 --- a/manage/import-export-dropbox.js +++ b/manage/import-export-dropbox.js @@ -11,142 +11,129 @@ const HTTP_STATUS_CANCEL = 499; * tried localStorage, but didn't work :/ */ function hasDropboxAccessToken() { - if (typeof browser !== 'undefined') { /* firefox */ - return browser.storage.local.get('dropbox_access_token') - .then(item => { - return item.dropbox_access_token; - }); - } else { /* chrome */ - return new Promise((resolve, reject) => { - chrome.storage.local.get(['dropbox_access_token'], result => { - resolve(result.dropbox_access_token); - }); - }); - } + return chromeLocal.getValue('dropbox_access_token'); } -function openDropboxOauthPage() { - let client = new Dropbox.Dropbox({clientId: DROPBOX_API_KEY}); - let authUrl = client.getAuthenticationUrl(window.location.origin + DROPBOX_RECEIVER_HTML); +function requestDropboxAccessToken() { + const browserApi = typeof browser === 'undefined' ? chrome : browser; + const client = new Dropbox.Dropbox({clientId: DROPBOX_API_KEY}); + const authUrl = client.getAuthenticationUrl(browserApi.identity.getRedirectURL()); - window.location.href = authUrl; + return browserApi.identity.launchWebAuthFlow({url: authUrl, interactive: true}) + .then(urlReturned => { + const params = new URLSearchParams(new URL(urlReturned).hash.replace('#', '?')); + + chromeLocal.setValue('dropbox_access_token', params.get('access_token')); + + return params.get('access_token'); + }); } function uploadFileDropbox(client, stylesText) { return client.filesUpload({path: '/' + FILENAME, contents: stylesText}); } +$('#sync-dropbox-export').onclick = () => { -$('#sync-dropbox-export').onclick = async () => { - let accessToken = await hasDropboxAccessToken(); - if (!accessToken) { - openDropboxOauthPage(); - - return; - } - - let client = new Dropbox.Dropbox({ - clientId: DROPBOX_API_KEY, - accessToken: accessToken - }); - - /** - * check if the file exists, if exists, delete it before upload another - */ - client.filesDownload({path: '/' + FILENAME}) - .then(responseGet => { - /** deletes file if user want to */ - if (!confirm(t('overwriteFileExport'))) { - return Promise.reject({status: HTTP_STATUS_CANCEL}); + hasDropboxAccessToken().then(token => { + if (typeof token === 'undefined') { + return requestDropboxAccessToken(); } - return client.filesDelete({path: '/' + FILENAME}); + return token; }) - .then(responseDelete => { + .then(token => { + const client = new Dropbox.Dropbox({ + clientId: DROPBOX_API_KEY, + accessToken: token + }); + + return client.filesDownload({path: '/' + FILENAME}) + .then(_ => { + /** deletes file if user want to */ + if (!confirm(t('overwriteFileExport'))) { + return Promise.reject({status: HTTP_STATUS_CANCEL}); + } + + return client.filesDelete({path: '/' + FILENAME}); + }) /** file deleted with success, get styles and create a file */ - return API.getStyles().then(styles => JSON.stringify(styles, null, '\t')) - }) - .then(stylesText => { + .then(_ => API.getStyles().then(styles => JSON.stringify(styles, null, '\t'))) /** create file dropbox */ - return uploadFileDropbox(client, stylesText); - }) - .then(responseSave => { - alert(t('exportSavedSuccess')); - }) - .catch(async error => { - /* saving file first time */ - if (error.status === API_ERROR_STATUS_FILE_NOT_FOUND) { - let stylesText = await API.getStyles().then(styles => JSON.stringify(styles, null, '\t')); + .then(stylesText => uploadFileDropbox(client, stylesText)) + /** gives feedback to user */ + .then(_ => alert(t('exportSavedSuccess'))) + /* handle not found cases and cancel action */ + .catch(error => { + /* saving file first time */ + if (error.status === API_ERROR_STATUS_FILE_NOT_FOUND) { - uploadFileDropbox(client, stylesText) - .then(response => { - alert(t('exportSavedSuccess')); - }) - .catch(err => { - console.error(error); - }); + API.getStyles() + .then(styles => JSON.stringify(styles, null, '\t')) + .then(stylesText => uploadFileDropbox(client, stylesText)) + .then(_ => alert(t('exportSavedSuccess'))) + .catch(err => console.error(err)); - return; - } + return; + } - /* user cancelled the flow */ - if (error.status === HTTP_STATUS_CANCEL) { - return; - } + /* user cancelled the flow */ + if (error.status === HTTP_STATUS_CANCEL) { + return; + } - console.error(error); - - return; + console.error(error); + }); }); - }; -$('#sync-dropbox-import').onclick = async () => { +$('#sync-dropbox-import').onclick = () => { - let accessToken = await hasDropboxAccessToken(); - if (!accessToken) { - openDropboxOauthPage(); - - return; - } - - let client = new Dropbox.Dropbox({ - clientId: DROPBOX_API_KEY, - accessToken: accessToken - }); - - client.filesDownload({path: '/' + FILENAME}) - .then(response => { - let fileBlob = response.fileBlob; - - /* it's based on the import-export.js */ - const fReader = new FileReader(); - fReader.onloadend = event => { - const text = event.target.result; - const maybeUsercss = !/^[\s\r\n]*\[/.test(text) && - (text.includes('==UserStyle==') || /==UserStyle==/i.test(text)); - - (!maybeUsercss ? - importFromString(text) : - getOwnTab().then(tab => { - tab.url = URL.createObjectURL(new Blob([text], {type: 'text/css'})); - return API.installUsercss({direct: true, tab}) - .then(() => URL.revokeObjectURL(tab.url)); - }) - ); - }; - fReader.readAsText(fileBlob, 'utf-8'); - }) - .catch(error => { - /* no file */ - if (error.status === API_ERROR_STATUS_FILE_NOT_FOUND) { - alert(t('noFileToImport')); - - return; + hasDropboxAccessToken().then(token => { + if (typeof token === 'undefined') { + return requestDropboxAccessToken(); } - console.error(err); - }); + return token; + }) + .then(token => { - return; + const client = new Dropbox.Dropbox({ + clientId: DROPBOX_API_KEY, + accessToken: token + }); + + return client.filesDownload({path: '/' + FILENAME}) + .then(response => { + const fileBlob = response.fileBlob; + + /* it's based on the import-export.js */ + const fReader = new FileReader(); + fReader.onloadend = event => { + const text = event.target.result; + const maybeUsercss = !/^[\s\r\n]*\[/.test(text) && + (text.includes('==UserStyle==') || /==UserStyle==/i.test(text)); + + (!maybeUsercss ? + importFromString(text) : + getOwnTab().then(tab => { + tab.url = URL.createObjectURL(new Blob([text], {type: 'text/css'})); + return API.installUsercss({direct: true, tab}) + .then(() => URL.revokeObjectURL(tab.url)); + }) + ); + }; + fReader.readAsText(fileBlob, 'utf-8'); + }) + .catch(error => { + /* no file */ + if (error.status === API_ERROR_STATUS_FILE_NOT_FOUND) { + alert(t('noFileToImport')); + + return; + } + + console.error(error); + }); + }); }; diff --git a/manifest.json b/manifest.json index 43e5fe34..700431d1 100644 --- a/manifest.json +++ b/manifest.json @@ -17,6 +17,7 @@ "contextMenus", "storage", "alarms", + "identity", "" ], "background": { @@ -77,9 +78,6 @@ "js": ["content/install-hook-usercss.js"] } ], - "web_accessible_resources": [ - "/dropbox-oauth.html" - ], "browser_action": { "default_icon": { "16": "/images/icon/16w.png",