Данные MessageChannel port.postMessage являются нулевыми при вызове postMessage с переносимым объектом?

Я узнаю о MessageChannel и передаваемых объектах.

У меня есть фрейм, который является междоменным с моей страницы. Документация, окружающая MessageChannel, указывает, что он полностью поддерживает междоменную связь.

У меня есть этот код внутри моей междоменной страницы внутри iframe:

var messageChannel = new MessageChannel();

//  Transfer port2 to the background page to establish communications.
window.parent.postMessage('connect', 'chrome-extension://jbnkffmindojffecdhbbmekbmkkfpmjd', [messageChannel.port2]);
messageChannel.port1.start();

// Give time for background to setup its port. Not great practice, but OK for example.
setTimeout(function(){ 

    // Create a 32MB "file" and fill it.
    var uInt8Array = new Uint8Array(1024*1024*32); // 32MB
    for (var i = 0; i < uInt8Array.length; ++i) {
        uInt8Array[i] = i;
    }

    messageChannel.port1.onmessage = function(message){
        console.log('iframe message:', message);
    };

    messageChannel.port1.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);

    if (uInt8Array.buffer.byteLength)
        throw "Failed to transfer buffer";

}, 1000);

и на моей фоновой странице у меня есть:

window.onmessage = function(messageEvent) {
    //  Make sure the origin is correct for security
    if (messageEvent.origin === 'https://www.youtube.com') {

        if (messageEvent.ports.length > 0 && messageEvent.data === 'connect') {
            var port = messageEvent.ports[0];

            port.onmessage = function (message) {
                console.log("background message:", message);
            };
        }

    }
};

Когда я пытаюсь отправить сообщение в буфер uInt8Array - я не получаю данных на другой стороне:

но если я попытаюсь отправить что-нибудь простое, скажите:

messageChannel.port1.postMessage('hello');

тогда я вижу:

При использовании переносимых объектов - представлены ли данные где-то еще? Я, кажется, в состоянии передать порт просто отлично, но я изо всех сил пытаюсь передать массив данных. НО, поскольку мое исключение не выбрасывается - похоже, оно передано... но куда оно делось??

1 ответ

Решение

Я сократил ваш пример кода и обнаружил, что ArrayBuffer всегда теряется, когда он проходит через MessagePort из MessageChannel,

Сообщается как проблема 334408: "ArrayBuffer потерян в MessageChannel во время postMessage (получатель event.data == null)" https://code.google.com/p/chromium/issues/detail?id=334408

Другие вопросы по тегам