Информация об изменениях

Сообщение Портирование расширения Хрома в ФФ от 25.07.2020 17:15

Изменено 25.07.2020 17:17 EugenePerfect

Портирование расширения Хрома в ФФ
Добрый день, уважаемые знатоки!

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

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

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

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

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

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("MassageHandler", 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?
Портирование расширения Хрома в ФФ
Добрый день, уважаемые знатоки!

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

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

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

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

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

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?