Портирование расширения Хрома в ФФ
От: EugenePerfect  
Дата: 25.07.20 17:15
Оценка:
Добрый день, уважаемые знатоки!

Есть у меня отличное самописное расширение для Хрома, допиливаемое неспешно "на коленке" вот уже несколько лет.

И по ряду причин, возникла необходимость портировать его (хотя бы в урезанном виде) под ФФ.

И одна из функций, которое реализует расширение, была выгрузка распарсенной сводной информации о публикациях со страниц одного узкоспециального сайта в виде простого текста.

Реализовано было до безобразия просто, см. ниже. Закомментаренное — это реализация в хромовском расширении, предыдущая строка — переделанное под ДОМ расширений ФФ.

В контент-скрипте:

function DownloadFile(options){
  console.log("DownloadFile", options);
  browser.runtime.sendMessage({ type: "download", url: options.url, filename: options.filename } );
//    chrome.extension.sendMessage({ type: 'download', url: url, filename: filename });     
}

...

    var filecontent = aParsedPage.pubauthor + "\n" + aParsedPage.pubnumber + "\n" + 
                        aParsedPage.pubdate + "\n" + aParsedPage.pubname + "\n" + 
                        aParsedPage.pubdesc;

    var url = 'data:application/txt;charset=utf-8,' + encodeURIComponent(filecontent);

    var filename = fileprefix + 'descr.txt';

    DownloadFile({ url: url, filename: filename });


И в бэкграунд скрипте:

browser.runtime.onMessage.addListener(MessageHandler);
//chrome.extension.onMessage.addListener(MessageHandler);

function MessageHandler(request, sender, callback){
  console.log("MеssageHandler", request.type, request);
    
  switch (request.type) {
    case "download":
      chrome.downloads.download({
        url: request.url,
        filename: request.filename,
        saveAs: false
      });
      break;

    default:
      break;
  }
}


Сразу скажу, что если функции DownloadFile передаются обычные сетевые URL протокола http(s) — оба варианта (и Хромовский, и ФФ) отлично отрабатывают. Сформированные строки-URLы выглядят в отладчике абсолютно одинаково, как и целевые имена файлов для загрузки. Все оттестировано и работает совершенно корректно и аналогично одинаково — за исключением маленькой детали.

Именно при подстановке вместо URL сформированной на лету строки данных — в Хроме ожидаемо загружается в дефолтной папке текстовый файл, а в ФФ — ничего не происходит вообще. Просто молча игнорируется и продолжается выполнение скрипта.

Что уже было опробовано:
1) добавление в манифест <ALL_URLS>
2) попытка формировать URL через BLOB:

    var filecontent = aParsedPage.pubauthor + "\n" + aParsedPage.pubnumber + "\n" + 
                        aParsedPage.pubdate + "\n" + aParsedPage.pubname + "\n" + 
                        aParsedPage.pubdesc;

    var oMyBlob = new Blob([ filecontent ] , {type : 'application/txt;charset=utf-8'}); // the blob
    var url = URL.createObjectURL(oMyBlob );


В любых вариантах просто молча ничего не происходит, без выдачи каких-либо ошибок и предупреждений. И в варианте №2 к тому строка не формируется ожидаемым образом.

На данный момент, идеи у меня иссякли, гугление также не выдает ничего нового. Дальше без данной функции продолжать разработку смысла также нет, т.к. она по сути базовая.

Что скажет уважаемый ALL?
Отредактировано 25.07.2020 17:17 EugenePerfect . Предыдущая версия .
Re: Портирование расширения Хрома в ФФ
От: L.K. Марс  
Дата: 25.07.20 18:27
Оценка:
EP>Что скажет уважаемый ALL?

Скачать файл можно и безо всяких downloads.download:

var el = document.createElement('a');
el.href = 'data:attachment/text,' + base64data;
el.target = '_blank';
el.download = '1.txt';
el.click();
Re[2]: Портирование расширения Хрома в ФФ
От: EugenePerfect  
Дата: 25.07.20 20:27
Оценка:
Здравствуйте, L.K., Вы писали:

EP>>Что скажет уважаемый ALL?


LK>Скачать файл можно и безо всяких downloads.download:


Безусловно, можно. Но неужели есть такая мысль, что ради скачивания ОДНОГО файла, городилось целое расширение?

Производится скачка большого количества файлов в автоматическом режиме. Которые складываются в упорядоченную структуру каталогов, и сопровождаются текстовыми описаниями. Ключевая фраза выделена. Аттрибут "download" позволяет задать только имя файла, но не путь, так что все валится гамузом а папку "download". Разгребать и упорядочивать потом это ручками... Слишком дофига времени и смысла не имеет.

Собственно, без описаний — это хаотический бесполезный набор информации. Описания генерируются из контента сайта "на лету".

У меня как бы уже родилась идея обхода — на каком-то серваке запустить скрипт, который всего-то будет на запрос типа "http://meserver.com/get.php?some_long_text" будет выдавать это самое some_long_text, обёрнутое в миме-тип "application/text". Но это слишком уж заковыристо, хотелось бы проще.

К тому же я не питаю иллюзий по поводу своей гениальности, так что если бы поставленная задача в самом деле была неразрешима более простым путём, подобный сервис давно уже кто-то бы сделал.
Отредактировано 25.07.2020 20:31 EugenePerfect . Предыдущая версия .
Re: Портирование расширения Хрома в ФФ
От: EugenePerfect  
Дата: 25.07.20 20:57
Оценка:
Здравствуйте, EugenePerfect, Вы писали:

EP>В любых вариантах просто молча ничего не происходит, без выдачи каких-либо ошибок и предупреждений. И в варианте №2 к тому строка не формируется ожидаемым образом.


Старость — не радость. Все же не молча он меня шлёт в сад:

Приостановлено на исключении
Error: Type error for parameter options (Error processing url: Error: Access denied for URL data:application/txt;charset=utf-8****

Re[3]: Портирование расширения Хрома в ФФ
От: L.K. Марс  
Дата: 25.07.20 21:36
Оценка: -1
EP>Производится скачка большого количества файлов в автоматическом режиме. Которые складываются в упорядоченную структуру каталогов

Упаковать всё каким-нибудь JSZip. И получить архив со структурой каталогов.

Ну или — копаться в доках Мозиллы. Если нужно именно через downloads.download.

Или пользоваться только хромом (если юзеров мало; например, расширение создано для нужд небольшой фирмы).
Re[4]: Портирование расширения Хрома в ФФ
От: EugenePerfect  
Дата: 25.07.20 23:11
Оценка:
Здравствуйте, L.K., Вы писали:

LK>Или пользоваться только хромом (если юзеров мало; например, расширение создано для нужд небольшой фирмы).


Ежу понятно, что я бы не сел перелопачивать несколько десятков тысяч строк кода [отлично работающего в Хроме и Опере расширения], если бы и в самом деле не было однозначной и неизбежной необходимости портировать именно под ФФ [при этом не теряя функционала, сохраняя совместимость и не меняя интерфейса].

Необходимость эта для меня очевидна, и обсуждение ее никак не приближает к решению проблемы.

Все имеющиеся доки, Факи и примеры на developer.mozilla.org, имеющие хоть какое-то отношение к рассматриваемому вопросу, уже изучены и не дают никаких намеков, что происходит и что еще можно потыкать.

Более широкое гугление выдало только вариант с блобом, но он выдает тот же самый результат.

Дело существенно осложняется совершенно идиотской и малопредсказуемой обработкой ошибок при загрузке расширений ФайерФоксом. Например, в результате 30-минутной генерации ртом матов выяснено, что если в скрипте при раскомментаривании многострочного куска кода завтыкать удалить "убежавшую" вправо за пределы видимости замыкающую "скобку" */, то расширение тупо и молча не запускается, не выдавая вообще никаких сообщений об ошибках. Аналогично — при несовпадении любых скобок.
Re: Портирование расширения Хрома в ФФ
От: EugeneIvanov Земля http://e-ivanov.ru/portfolio/
Дата: 28.07.20 07:48
Оценка:
Если вам нужно сохранить файл, то и пользуйтесь нужным API FF для этого.

Если API нет, то ничего не выйдет, ибо FF очень строг в безопасности.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.