PostMessage из изолированного iFrame в основное окно, начало всегда равно нулю

Там что-то не получается о происхождении события с событием postMessage javascript.

Вот моя главная страница:

<html>
<body>

<h1>Test</h1>
<h2>Outside</h2>

<iframe src="iframe-include.html" 
    width="100%" height="100" 
    sandbox="allow-scripts"></iframe>

<script type="text/javascript">
window.addEventListener('message', function (event) {
    console.log(event);
}, false);
</script>

</body>
</html>

И мой контент iFrame

<html>
<body>

<h3>Inside</h3>

<script type="text/javascript">
var counter = 1,
    domain = window.location.protocol + '//' + window.location.host,
    send = function () {
        window.setTimeout(function () {
            console.log('iframe says:', domain);
            window.parent.postMessage(counter, domain);
            counter += 1;
            send();
        }, 3000);
    };

send();
</script>

</body>
</html>

Глядя на консоль, свойство origin объекта события всегда равно null, даже если переменная домена в iFrame верна.

Моя консоль говорит:

iframe-include.html:11 iframe says: http://127.0.0.1:8181
iframe.html:11 MessageEvent {isTrusted: true, data: 2, origin: "null", lastEventId: "", source: Window…}

В каждом документе говорится, что важно проверить событие event.origin внутри прослушивателя событий сообщения. Но как это сделать, если оно всегда равно null?

Спасибо за помощь

Ответ 1

Так как iframe изолирован песочницей, он потерял доступ к своим исходным данным.

добавление allow-same-origin в свойство изолированной песочницы iframe заставит его работать снова.

Ответ 2

Как указано здесь, в этом сценарии есть отличный способ определить отправителя без предоставления разрешения allow-same-origin:

  // Sandboxed iframes which lack the 'allow-same-origin'
  // header have "null" rather than a valid origin. This means you still
  // have to be careful about accepting data via the messaging API you
  // create. Check that source, and validate those inputs!
  var frame = document.getElementById('sandboxed');
  if (e.origin === "null" && e.source === frame.contentWindow)
    alert('Result: ' + e.data);

Обратите внимание, что источником является не null, а "null".