'use strict'; function fetchText(url) { return new Promise((resolve, reject) => { // you can't use fetch in Chrome under 'file:' protocol const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.addEventListener('load', () => resolve(xhr.responseText)); xhr.addEventListener('error', () => reject(xhr)); xhr.send(); }); } function install(style) { const request = Object.assign(style, { method: 'saveUsercss', reason: 'install', url: location.href, updateUrl: location.href }); return communicate(request); } function communicate(request) { return new Promise((resolve, reject) => { chrome.runtime.sendMessage(request, result => { if (result.status === 'error') { reject(result.error); } else { resolve(result); } }); }); } function initUsercssInstall() { fetchText(location.href).then(source => communicate({ method: 'filterUsercss', source: source, checkDup: true }) ).then(({style, dup}) => { if (dup) { if (confirm(chrome.i18n.getMessage('styleInstallOverwrite', [style.name, dup.version, style.version]))) { return install(style); } } else if (confirm(chrome.i18n.getMessage('styleInstall', [style.name]))) { return install(style); } }).catch(err => { alert(chrome.i18n.getMessage('styleInstallFailed', String(err))); }); } function isUsercss() { if (!/\.user\.(css|styl|less|scss|sass)$/i.test(location.pathname)) { return false; } if (!/text\/(css|plain)/.test(document.contentType)) { return false; } if (!/==userstyle==/i.test(document.body.textContent)) { return false; } return true; } if (isUsercss()) { // It seems that we need to wait some time to redraw the page. setTimeout(initUsercssInstall, 500); }