<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); // Legacy overload resolution will consider 3rd argument to be the (string) origin.
tryPostMessage('3', '*', { x: 1 }, true);
tryPostMessage('3a', { x: 1 }, '*', true); // Legacy argument order.
tryPostMessage('4', '*', window);  // Passes because window has a "length" attribute of value '0', so it looks like an array
tryPostMessage('4a', window, '*'); // Legacy argument order.
tryPostMessage('5', '*', undefined);
tryPostMessage('5a', '*', null, true);
tryPostMessage('6', '*', void 0);
var channel1 = new MessageChannel;
tryPostMessageFunction(window.postMessage, '7', '*', [channel1.port1, channel1.port2]);
var channel1a = new MessageChannel;
tryPostMessageFunction(window.postMessage, '7a', [channel1a.port1, channel1a.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>
