<html>
<head>
<title>Test CSSOM View module: MediaQueryList interface</title>
<style type="text/css">

</style>
<script type="text/javascript" charset="utf-8">
    if (window.testRunner)
        testRunner.dumpAsText();

    function log(m) {
        document.getElementById('results').innerHTML += m + '<br>';
    }

    function callback1(query) {
        log("[1] - query " + query.media + " changed to " + (query.matches ? "true" : "false"));
    }

    function callback2(query) {
        log("[2] - query " + query.media + " changed to " + (query.matches ? "true" : "false"));
    }

    function runTests()
    {
        if (!window.testRunner)
            return;

        var query = window.matchMedia("screen");

        query.addListener(callback1);

        try {
            query.addListener(5);
        } catch (e) {
            log("query.addListener(5) threw exception as expected");
        }

        try {
            query.addListener('cinco');
        } catch (e) {
            log("query.addListener('cinco') threw exception as expected");
            
        }
        try {
            query.addListener([1,2]);
        } catch (e) {
            log("query.addListener([1,2]) threw exception as expected");
        }
        query.addListener(callback2);

        window.internals.settings.setMediaTypeOverride("handheld");
    }

</script>
</head>
<body onload="runTests()">
    <p>Test the MediaQueryList interface: <a href="http://dev.w3.org/csswg/cssom-view/#the-mediaquerylist-interface" title="CSSOM View Module">http://dev.w3.org/csswg/cssom-view/#the-mediaquerylist-interface</a>.</p>
    <p>Invalid listeners. Two callbacks are expected.</p>
    <div id="results">
    </div>
</body>
</html>
