diff --git a/manage.html b/manage.html index d4717c19..3bb81278 100644 --- a/manage.html +++ b/manage.html @@ -170,12 +170,6 @@ - - - - - - diff --git a/sync/compress-text.js b/sync/compress-text.js deleted file mode 100644 index b4829b22..00000000 --- a/sync/compress-text.js +++ /dev/null @@ -1,41 +0,0 @@ -/* global zip onDOMready */ -/* exported createZipFileFromText readZipFileFromBlob */ -'use strict'; - -onDOMready().then(() => { - zip.workerScriptsPath = '../vendor/zipjs-browserify/'; -}); - -/** - * @param {String} filename - * @param {String} text content of the file as text - * @returns {Promise} resolves to a blob object representing the zip file - */ -function createZipFileFromText(filename, text) { - return new Promise((resolve, reject) => { - zip.createWriter(new zip.BlobWriter('application/zip'), writer => { - writer.add(filename, new zip.TextReader(text), function () { - writer.close(blob => { - resolve(blob); - }); - }); - }, reject); - }); -} - -/** - * @param {Object} blob object of zip file - * @returns {Promise} resolves to a string the content of the first file of the zip - */ -function readZipFileFromBlob(blob) { - return new Promise((resolve, reject) => { - zip.createReader(new zip.BlobReader(blob), zipReader => { - zipReader.getEntries(entries => { - entries[0].getData(new zip.BlobWriter('text/plain'), data => { - zipReader.close(); - resolve(data); - }); - }); - }, reject); - }); -} diff --git a/sync/cross-browser-functions.js b/sync/cross-browser-functions.js deleted file mode 100644 index 9dd877e1..00000000 --- a/sync/cross-browser-functions.js +++ /dev/null @@ -1,25 +0,0 @@ -/* exported getRedirectUrlAuthFlow launchWebAuthFlow */ -'use strict'; - -/** - * @returns {String} returns a redirect URL to be used in |launchWebAuthFlow| - */ -function getRedirectUrlAuthFlow() { - const browserApi = typeof browser === 'undefined' ? chrome : browser; - return browserApi.identity.getRedirectURL(); -} - -/** - * @param {Object} details based on chrome api - * @param {string} details.url url that initiates the auth flow - * @param {boolean} details.interactive if it is true a window will be displayed - * @return {Promise} returns the url containing the token for extraction - */ -function launchWebAuthFlow(details) { - if (typeof browser === 'undefined') { - return new Promise(resolve => { - chrome.identity.launchWebAuthFlow(details, resolve); - }); - } - return browser.identity.launchWebAuthFlow(details); -} diff --git a/sync/import-export-dropbox.js b/sync/import-export-dropbox.js deleted file mode 100644 index f72c711a..00000000 --- a/sync/import-export-dropbox.js +++ /dev/null @@ -1,178 +0,0 @@ -/* global messageBox Dropbox createZipFileFromText readZipFileFromBlob - launchWebAuthFlow getRedirectUrlAuthFlow importFromString resolve - $ $create t chromeLocal API getOwnTab */ -'use strict'; - -const DROPBOX_API_KEY = 'zg52vphuapvpng9'; -const FILENAME_ZIP_FILE = 'stylus.json'; -const DROPBOX_FILE = 'stylus.zip'; -const API_ERROR_STATUS_FILE_NOT_FOUND = 409; -const HTTP_STATUS_CANCEL = 499; - -function messageProgressBar(data) { - return messageBox({ - title: `${data.title}`, - className: 'config-dialog', - contents: [ - $create('p', data.text) - ], - buttons: [{ - textContent: t('confirmClose'), - dataset: {cmd: 'close'}, - }], - }).then(() => { - document.body.style.minWidth = ''; - document.body.style.minHeight = ''; - }); -} - -function hasDropboxAccessToken() { - return chromeLocal.getValue('dropbox_access_token'); -} - -function requestDropboxAccessToken() { - const client = new Dropbox.Dropbox({ - clientId: DROPBOX_API_KEY, - fetch - }); - const authUrl = client.getAuthenticationUrl(getRedirectUrlAuthFlow()); - return 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: '/' + DROPBOX_FILE, contents: stylesText}); -} - -$('#sync-dropbox-export').onclick = event => { - event.preventDefault(); - const mode = localStorage.installType; - const title = t('syncDropboxStyles'); - const text = mode === 'normal' ? t('connectingDropbox') : t('connectingDropboxNotAllowed'); - messageProgressBar({title, text}); - if (mode !== 'normal') return; - - hasDropboxAccessToken() - .then(token => token || requestDropboxAccessToken()) - .then(token => { - const client = new Dropbox.Dropbox({ - clientId: DROPBOX_API_KEY, - accessToken: token, - fetch - }); - return client.filesDownload({path: '/' + DROPBOX_FILE}) - .then(() => messageBox.confirm(t('overwriteFileExport'))) - .then(ok => { - // deletes file if user want to - if (!ok) { - return Promise.reject({status: HTTP_STATUS_CANCEL}); - } - return client.filesDelete({path: '/' + DROPBOX_FILE}); - }) - // file deleted with success, get styles and create a file - .then(() => { - messageProgressBar({title: title, text: t('gettingStyles')}); - return API.getAllStyles().then(styles => JSON.stringify(styles, null, '\t')); - }) - // create zip file - .then(stylesText => { - messageProgressBar({title: title, text: t('zipStyles')}); - return createZipFileFromText(FILENAME_ZIP_FILE, stylesText); - }) - // create file dropbox - .then(zipedText => { - messageProgressBar({title: title, text: t('uploadingFile')}); - return uploadFileDropbox(client, zipedText); - }) - // gives feedback to user - .then(() => messageProgressBar({title: title, text: t('exportSavedSuccess')})) - // handle not found cases and cancel action - .catch(error => { - console.log(error); - // saving file first time - if (error.status === API_ERROR_STATUS_FILE_NOT_FOUND) { - API.getAllStyles() - .then(styles => { - messageProgressBar({title: title, text: t('gettingStyles')}); - return JSON.stringify(styles, null, '\t'); - }) - .then(stylesText => { - messageProgressBar({title: title, text: t('zipStyles')}); - return createZipFileFromText(FILENAME_ZIP_FILE, stylesText); - }) - .then(zipedText => { - messageProgressBar({title: title, text: t('uploadingFile')}); - return uploadFileDropbox(client, zipedText); - }) - .then(() => messageProgressBar({title: title, text: t('exportSavedSuccess')})) - .catch(err => messageBox.alert(err)); - return; - } - - // user cancelled the flow - if (error.status === HTTP_STATUS_CANCEL) { - return; - } - - console.error(error); - }); - }); -}; - -$('#sync-dropbox-import').onclick = event => { - event.preventDefault(); - const mode = localStorage.installType; - const title = t('retrieveDropboxSync'); - const text = mode === 'normal' ? t('connectingDropbox') : t('connectingDropboxNotAllowed'); - messageProgressBar({title, text}); - if (mode !== 'normal') return; - - hasDropboxAccessToken() - .then(token => token || requestDropboxAccessToken()) - .then(token => { - const client = new Dropbox.Dropbox({ - clientId: DROPBOX_API_KEY, - accessToken: token, - fetch - }); - return client.filesDownload({path: '/' + DROPBOX_FILE}) - .then(response => { - messageProgressBar({title: title, text: t('unzipStyles')}); - return readZipFileFromBlob(response.fileBlob); - }) - .then(zipedFileBlob => { - messageProgressBar({title: title, text: t('readingStyles')}); - document.body.style.cursor = 'wait'; - 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.openUsercssInstallPage({direct: true, tab}) - .then(() => URL.revokeObjectURL(tab.url)); - }) - ).then(numStyles => { - document.body.style.cursor = ''; - resolve(numStyles); - }); - }; - fReader.readAsText(zipedFileBlob, 'utf-8'); - }) - .catch(error => { - // no file - if (error.status === API_ERROR_STATUS_FILE_NOT_FOUND) { - messageBox.alert(t('noFileToImport')); - return; - } - messageBox.alert(error); - }); - }); -};