nfmzkvmx
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору WildGoblin Цитата: IMHO не очень удобно так добавлять, но за науку спасибо (досадно, что через гуи не сделали добавление)! | Наваял на скорую руку кнопку для Custom Buttons (в инициализацию): Код: (()=> { const loc = () => window.gBrowser.selectedBrowser.contentWindow.content.document.location, rulesFolder = OS.Path.join(OS.Constants.Path.profileDir, 'HTTPSEverywhereUserRules'), tPath = OS.Path.join(OS.Constants.Path.tmpDir, 'rule.tmp'), prompt = Services.prompt; const xhr = url => { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(), error = err => reject(xhr.statusText + ' [' + err.type + ': ' + xhr.status + ']'); xhr.mozBackgroundRequest = true; xhr.open('HEAD', url); xhr.channel.loadFlags |= Ci.nsIRequest.LOAD_ANONYMOUS | Ci.nsIRequest.LOAD_BYPASS_CACHE | Ci.nsIRequest.INHIBIT_CACHING; xhr.timeout = 10000; xhr.onload = e => xhr.status == 200 && resolve(xhr.responseURL) || error(e);; xhr.onerror = xhr.onabort = xhr.ontimeout = er => error(er); xhr.send(null); }) }; const convertFromUnicode = (chr, str) => { const converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = chr; return converter.ConvertFromUnicode(str); }; const writeToFile = (str, path) => { const enc = new TextEncoder(), arr = enc.encode(str); return OS.File.writeAtomic(path, arr, {tmpPath: tPath}); }; const openFile = path => { let file = new FileUtils.File(path); file.launch(); }; let dummyRule = [ '<ruleset name="[USER_DEFINED] [domain]">', '<target host="[domain]"/>', '<target host="*.[domain]"/>', '<securecookie host="^(?:.*\.)?[domainesc]$" name=".+"/>', '<rule from="^http:" to="https:"/>', '</ruleset>', ].join('\n'); const createRule = url => { let uri = Services.uriFixup.createFixupURI(url, 0), domain = Services.eTLD.getBaseDomain(uri, 0); if (!domain) return; let file = domain + '.xml', filePath = OS.Path.join(rulesFolder, file), rule = convertFromUnicode("UTF-8", dummyRule.replace(/\[domain\]/g, domain) .replace(/\[domainesc\]/g, domain.replace(/\./g, '\\.'))); OS.File.exists(filePath).then(val => { if (val) prompt.confirm(null, 'Правило для этого сайта уже существует!', 'Открыть для редактирования?') && openFile(filePath); else { writeToFile(rule, filePath).then( succes => openFile(filePath) , error => prompt.alert(null, 'Ошибка при записи в файл!', error) ) } }) }; this._handleClick = e => { let l = loc(); if (!l.protocol.startsWith('http')) return; if (l.protocol == 'http:') { xhr(l.href.replace('http:', 'https:')).then( reURL => { (loc().href = reURL) && createRule(reURL) } , error => prompt.alert(null, 'HTTPS-версия сайта недоступна!', error) ) } else createRule(l.href); } })(); | По клику ЛКМ по кнопке: Если на http-странице: выполняет запрос к https-версии адреса и, при успехе, перенаправляет на полученный адрес, затем создает (если не существует такого файла (Не правила! Проверяется только по имени файла в папке пользовательских правил!) по шаблону, см. переменную dummyRule) и открывает, в ассоциированной с xml-файлами программе, правило HTTPS Everywhere для редактирования. Или, если правило существует - предлагает отредактировать. Если на https, то просто создает/предлагает отредактировать правило. Все пути используются используются относительные! Проблем не должно быть независимо от оси/расположения папки профиля. Пробуйте. Проверял только на 52-ой ESR и без e10s (но, вроде, должно работать, если shims не отключены. Если не работает с мультипроцессным, то напишите, потом потыкаюсь, попробую исправить). | Всего записей: 186 | Зарегистр. 09-04-2017 | Отправлено: 15:34 09-07-2017 | Исправлено: nfmzkvmx, 15:39 09-07-2017 |
|