<html>
<head>
<script src="../../../resources/js-test.js"></script>
</head>
<body>
<script>
description("Test window.postMessage() argument handling.");

self.jsTestIsAsync = true;

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function onmessage(evt) {
    if (evt.ports)
        debug("Received message '" + evt.data + "' with " + evt.ports.length + " ports.");
    else
        debug("Received message '" + evt.data);

    if (evt.data == 'done')
        finishJSTest();
}

window.addEventListener('message', onmessage, false);

function tryPostMessageFunction(postMessageFunction, first, second, third, shouldFail) {
    var pass, reason;
    try {
        postMessageFunction(first, second, third);
        pass = !shouldFail;
        reason = " did not throw an exception";
    } catch (e) {
        pass = shouldFail;
        reason = ": threw exception " + e;
    }
    if (pass)
        testPassed("Posting message ('" + first + "', " + third + ")" + reason);
    else
        testFailed("Posting message ('" + first + "', " + third + ")" + reason);
}

function tryPostMessage(first, second, third, shouldFail) {
    tryPostMessageFunction(window.postMessage, first, second, third, shouldFail);
}

document.getElementById("description").innerHTML = "Test that the second argument of window.postMessage is ignored or triggers an error if it is not a message port. You should see PASS message '1' through '7', followed by 'done', with messages 4-7 received below.<br><br>";

tryPostMessage('1', '*', 1, true);
tryPostMessage('2', '*', 'c', true);
tryPostMessage('3', '*', { x: 1 }, true);
tryPostMessage('4', '*', window);  // Passes because window has a "length" attribute of value '0', so it looks like an array
tryPostMessage('5', '*', undefined);
tryPostMessage('5a', '*', null, true);
tryPostMessage('6', '*', void 0);
var channel1 = new MessageChannel;
tryPostMessageFunction(window.postMessage, '7', '*', [channel1.port1, channel1.port2]);
var channel2 = new MessageChannel;
tryPostMessageFunction(window.postMessage, '7', '*', [channel2.port1, channel2.port2]);
var channel3 = new MessageChannel;
tryPostMessage(2147483648, '*', undefined);
tryPostMessage(2147483648, '*', null, true);
tryPostMessageFunction(window.postMessage, channel3.port1, '*', [channel3.port1, channel3.port2]);
var channel4 = new MessageChannel;
tryPostMessageFunction(window.postMessage, channel4.port1, '*', [channel4.port1, channel4.port2]);
var channel5 = new MessageChannel;
tryPostMessageFunction(window.postMessage, [channel5.port1, channel5.port2], '*', [channel5.port1, channel5.port2]);
tryPostMessageFunction(window.postMessage, 'data', '*', [channel5.port1, channel5.port2], true);
tryPostMessageFunction(window.postMessage, [channel5.port1, channel5.port2], '*', [], true);

var arrayBuffer = new ArrayBuffer(30);
var int8View = new Int8Array(arrayBuffer, 2, 10);
tryPostMessageFunction(window.postMessage, arrayBuffer, '*', [arrayBuffer]);
if (!(arrayBuffer.byteLength === 0))
    testFailed("arrayBuffer not neutered; byteLength = " + arrayBuffer.byteLength);
else
    testPassed("arrayBuffer neutered");

if (!(int8View.length == 0))
    testFailed("view was not neutered; length = " + int8View.length);
else
    testPassed("view neutered");

tryPostMessageFunction(window.postMessage, arrayBuffer, '*', [], true);
tryPostMessageFunction(window.postMessage, 'data', '*', [arrayBuffer], true);

tryPostMessageFunction(window.postMessage, int8View, '*', [], true);
tryPostMessageFunction(window.postMessage, 'data', '*', [int8View], true);

tryPostMessageFunction(window.postMessage, 'data', '*', {length:1}, true);
tryPostMessageFunction(window.postMessage, 'data', '*', [1,,2], true);
tryPostMessageFunction(window.postMessage, 'data', '*', [null, window.postMessage], true);

shouldThrow("window.postMessage()");
shouldThrow("window.postMessage('a')");

tryPostMessageFunction(window.postMessage, 'done', '*');
</script>
</body>
</html>
