'use strict'; // ----------------- Internationalization ------------------ document.querySelectorAll('[data-i18n]').forEach(node => { let [text, attr] = node.dataset.i18n.split('|'); text = chrome.i18n.getMessage(text); attr ? node[attr] = text : node.appendChild(document.createTextNode(text)); }); // ----------------- /Internationalization ----------------- // ----- global const accounts = document.querySelector('#accounts'); const mode = document.querySelector('#mode'); const syncOnOff = document.querySelector('#syncOnOff'); const popup = document.querySelector('.popup'); const popupMain = popup.children[0]; let storageArea, minIndex = Number.MAX_SAFE_INTEGER; // ----------------- User Preference ----------------------- chrome.storage.local.get(null, result => { // if sync is NOT set or it is false, use this result syncOnOff.checked = result.sync; localStorage.setItem('sync', syncOnOff.checked); storageArea = result.sync ? chrome.storage.sync : chrome.storage.local; result.sync ? chrome.storage.sync.get(null, processOptions) : processOptions(result); }); // ----------------- /User Preference ---------------------- // ----------------- Spinner ------------------------------- const spinner = document.querySelector('.spinner'); function hideSpinner() { spinner.classList.remove('on'); setTimeout(() => { spinner.style.display = 'none'; }, 600); } function showSpinner() { spinner.style.display = 'flex'; spinner.classList.add('on'); } // ----------------- /spinner ------------------------------ // ----- add Listeners for menu document.querySelectorAll('nav a').forEach(item => item.addEventListener('click', process)); function process() { switch (this.dataset.i18n) { case 'add': localStorage.removeItem('id'); // clear localStorage; this indicates an add not an edit localStorage.setItem('nextIndex', minIndex); // index to use for this proxy so that it's added to the beginning location.href = '/proxy.html'; break; case 'export': Utils.exportFile(); break; case 'import': location.href = '/import.html'; break; case 'importProxyList': location.href = '/import-proxy-list.html'; break; case 'log': location.href = '/log.html'; break; case 'about': location.href = '/about.html'; break; case 'deleteAll': if (confirm(chrome.i18n.getMessage('confirmDelete'))) { showSpinner(); chrome.storage.local.clear(() => chrome.storage.sync.clear(() => { hideSpinner(); Utils.notify(chrome.i18n.getMessage('deleteAllmessage')); location.href = '/options.html'; })); } break; case 'deleteBrowserData': const h4 = document.createElement('h4'); const p = document.createElement('p'); popupMain.children[0].textContent = chrome.i18n.getMessage('deleteBrowserData'); let h = h4.cloneNode(); h.textContent = chrome.i18n.getMessage('deleteNot'); let p1 = p.cloneNode(); p1.textContent = chrome.i18n.getMessage('deleteBrowserDataNotDescription'); popupMain.children[1].appendChild(h); popupMain.children[1].appendChild(p1); h = h4.cloneNode(); h.textContent = chrome.i18n.getMessage('delete'); p1 = p.cloneNode(); p1.textContent = chrome.i18n.getMessage('deleteBrowserDataDescription'); popupMain.children[1].appendChild(h); popupMain.children[1].appendChild(p1); popupMain.children[2].children[0].addEventListener('click', closePopup); popupMain.children[2].children[1].addEventListener('click', () => // Not cancelled chrome.browsingData.remove({}, { //appcache: true, cache: true, cookies: true, downloads: false, //fileSystems: true, formData: false, history: false, indexedDB: true, localStorage: true, pluginData: true, //passwords: true, //webSQL: true, //serverBoundCertificates: true, serviceWorkers: true }, () => { Utils.notify(chrome.i18n.getMessage('done')); closePopup(); } )); showPopup(); break; } } // ----- add Listeners for initial elements mode.addEventListener('change', selectMode); function selectMode() { // set color mode.style.color = mode.children[mode.selectedIndex].style.color; console.log(mode, "selectMode"); // we already know the state of sync | this is set when manually changing the select // it is undefined when mode is switched from toolbar popup or on startup this && storageArea.set({mode: mode.value}); // --- change the state of success/secondary // change all success -> secondary document.querySelectorAll('.success').forEach(item => item.classList.replace('success', 'secondary')); switch (mode.value) { case 'patterns': document.querySelectorAll('input[name="onOff"]:checked').forEach(item => { const node = item.parentNode.parentNode; node.classList.replace('secondary', 'success'); // FF49, Ch 61 }); break; case 'disabled': // do nothing break; default: const node = document.getElementById(mode.value); node && node.classList.replace('secondary', 'success'); } } syncOnOff.addEventListener('change', () => { const useSync = syncOnOff.checked; // sync value always CHECKED locally // data is merged, replacing exisitng and adding new ones localStorage.setItem('sync', syncOnOff.checked); storageArea = syncOnOff.checked ? chrome.storage.sync : chrome.storage.local; if (useSync && confirm(chrome.i18n.getMessage('confirmTransferToSync'))) { showSpinner(); chrome.storage.local.set({sync: true}); // save sync state chrome.storage.local.get(null, result => { // get source delete result.sync; chrome.storage.sync.set(result, hideSpinner); // save to target }); // get source & save to target } else if (!useSync && confirm(chrome.i18n.getMessage('confirmTransferToLocal'))) { showSpinner(); chrome.storage.sync.get(null, result => { // get source result.sync = false; // set sync = false chrome.storage.local.set(result, hideSpinner); // save to target }); } }); chrome.runtime.onMessage.addListener((message, sender) => { // from popup or bg // console.log(message); if(!message.mode || message.mode === mode.value) { return; } // change if it is different mode.value = message.mode; selectMode(); }); function processOptions(pref) { // --- reset accounts.textContent = ''; // remove all