Firefox расширение: открыть окно и записать динамический c контент - PullRequest
2 голосов
/ 12 апреля 2020

Я разработал расширение Chrome, и оно в основном совместимо с firefox API веб-расширений. Только одна проблема:

В Chrome Расширение у меня есть всплывающее окно. js и фон. js. Пользователь нажимает кнопку, всплывающее окно. js делает chrome .sendMessage для фона. js, где данные получены и после этого (всплывающее окно. html может быть в это время закрыто), я просто вызываю в фоновом режиме. js:

<code>newWin = window.open("about:blank", "Document Query", "width=800,height=500");
newWin.document.open();
newWin.document.write('<html><body><pre>' + documentJson + '
'); // newWin.document.close ();

, поэтому отлично работает в Chrome расширении, но не в firefox. Я прочитал здесь (https://javascript.info/popup-windows), что по соображениям безопасности firefox будет открываться только с «событием нажатия кнопки». И если я перейду над кодом во всплывающее окно. js, внутри button-click-evenListener, он откроется таким образом (но у меня пока нет подготовленных данных, это действительно не то, что я хочу)

Так что я перепробовал все, что нашел, но у меня не работает chrome .tabs.executeScript. Вот мой код с комментариями:

popup. js

    // working in firefox and chrome (popup.js)
    const newWin = window.open("about:blank", "hello", "width=200,height=200");
    newWin.document.write("Hello, world!");

    // not working firefox: id's match, he enters function (newWindow) but document.write doing nothing (but no error in log)
    // not working chrome: doesnt even enter "function (newWindow)""
    chrome.windows.create({
      type: 'popup',
      url: "output.html"
    }, function (newWindow) {
      console.log(newWindow);
      console.log(newWindow.id);
      chrome.tabs.executeScript(newWindow.tabs[0].id, {
        code: 'document.write("hello world");'
      });
    });

background. js

(создан локальный вывод. html и дан несколько разрешений в манифесте. json - вкладки, activeTab, вывод. html, about: blank)

            // opening but executeScript not working in firefox: Unchecked lastError value: Error: The operation is insecure.
            // opening but executeScript not working in chrome: Unchecked runtime.lastError: Cannot access contents of url "chrome-extension://plhphckppghaijagdmghdnjpilpdidkh/output.html". Extension manifest must request permission to access this host
            chrome.tabs.create({
              // type: 'popup',
              url: "output.html"
            }, function (newWindow) {
              console.log(newWindow);
              console.log(newWindow.id);
              chrome.tabs.executeScript(newWindow.id, {
                code: 'document.write("hello world");'
              });
            });

Как получить данные в новом окне / всплывающем окне из фона. js - я могу открыть пустую страницу оттуда, так что это только о запуске executeScript ()

1 Ответ

1 голос
/ 14 апреля 2020

Спасибо @wOxxOm за указание на URI данных для переноса документа json в браузер из фона. js.

При поиске метода javascript для создания URI данных я нашел эту ветку с предложением создать Blob : { ссылка }

Так что мое решение таково:

background. js

var documentJson = JSON.stringify(documents, null, 2)
let a = URL.createObjectURL(new Blob([documentJson]))
chrome.windows.create({
  type: 'popup',
  url: a
});

...