Песочница страницы в расширении Chrome из-за ошибки метания iframe при передаче сообщений - PullRequest
0 голосов
/ 13 февраля 2019

Я получаю следующую ошибку при попытке использовать мою всплывающую страницу для расширения хрома в качестве канала для связи между фоновой страницей и страницей, отображаемой в iframe во всплывающем окне.Мне нужно было изолированное окружение для запуска Vue.js, но мне нужно было иметь возможность получать данные из chrome.storage и работать с другими такими объектами, чтобы я получал пакеты данных и отправлял команды на фоновую страницу при необходимости.

Uncaught SecurityError: Нарушение доступа к песочнице: заблокирован фрейм в «chrome-extension: // kncjlbkddbibekfmmljfpibdgjfdegeb» от доступа к фрейму в «chrome-extension: // kncjlbkddbibekfmmljfpibdgjfdegeb».Кадр, запрашивающий доступ, помещен в «песочницу» и не имеет флага «allow-same-origin».

Это код всплывающей страницы канала:

//please look at it as if block comments aren't commented out
//this is needed  due to SO not having chrome.* available.
//although line comments are real comments.

let displayFrame = document.getElementById('displayFrame');
let displayPort = displayFrame.contentWindow;
/*
let backgroundPort = chrome.extension.connect({
  name : "Extension Connection"
});
*/

// Forwarding from background to index.
/*
backgroundPort.onMessage.addListener((msg) => {
  displayPort.postMessage(msg, "*");
});
*/

// Forwarding from index to background.
window.addEventListener("message", function(msg) {
  /*
    backgroundPort.postMessage({
      data : msg.data
    });
  */
});
<!doctype html>
<html lang='en'>

<head>
  <meta charset='UTF-8' />
  <script src="../scripts/popup.js" defer>
  </script>

  <style>
    * {
      box-sizing: border-box;
      opacity: 1.0;
      margin: 0px;
      padding: 0px;
      resize: none;
    }
  </style>
</head>

<body style="width : 300px; height: 500px;">
  <iframe id="displayFrame" sandbox="allow-same-origin allow-scripts" src="./index.html" style="width: 300px; height: 500px" frameborder="0"> </iframe>
</body>

</html>

Содержимое background.js и index.html/js, на мой взгляд, не важно, они оба правильно передают сообщения соответствующим сторонам приведенного выше кода.и я подтвердил, что это сообщение, передаваемое в консоли, работает.Проблема возникает, когда в index.js вносятся какие-либо изменения в переменную Vue.js.Я пытался из фактического объекта Vue (vm в документах) и изнутри (присоединение слушателя сообщения к окну на смонтированном хуке).Я полагаю, что проблема связана с упакованными установщиками для каждой переменной, которая позволяет Vue отслеживать изменения состояния, и мне было любопытно, знает ли кто-нибудь, как избавиться от ошибки.

У меня нет проблем с расширениемв общем и целом;передача сообщений и даже вызовы установок / функций Vue работают отлично.Просто каждый раз, когда я открываю всплывающую страницу, эта ошибка появляется в консоли фоновых страниц.Это то, о чем мне следует беспокоиться, и можно ли это исправить?

1 Ответ

0 голосов
/ 13 февраля 2019

Итак, эта проблема была решена.Ошибка возникала только при установке значения переменной vue на event.source в конце index.js window.addEventListener("message", (event) => { ... }).Я предполагаю, что то, как Vue отслеживает переменные, не совпадает с переменной, являющейся объектом окна отправителя. Однако я понял, что отправитель был родительским элементом для iframe все время , и поэтому я решил свою проблему следующим образом:

  • Не отправляя вступительный пакет, который сохранил event.source для отправки команды.
  • И вместо того, чтобы отправлять команды через window.parent.postMessage, где раньше я использовал this.vueVariable.postMessage.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...