<html>
    <head>
        <script src="../resources/js-test-pre.js"></script>
    </head>
    <body>
        <p id="description"></p>
        <div id="console"></div>

        <script>
            var newStreamCalled = false;
            var destroyStreamCalled = false;

            function main() {
                if (!window.testRunner) {
                    debug("This test can only run from within DumpRenderTree, because it requires TestNetscapePlugin.\n");
                    return;
                }
                testRunner.waitUntilDone();
            }

            main();

            function streamStarted() {
                shouldBeFalse('newStreamCalled');
                newStreamCalled = true;
            }

            function streamDestroyed(reason) { 
                window.reason = reason;

                shouldBeTrue('newStreamCalled')
                shouldBe('reason', '1');

                debug('<br><span class="pass">TEST COMPLETE</span>');

                testRunner.notifyDone();
            }
        </script>

        <embed
            type="application/x-webkit-test-netscape"
            onStreamLoad="streamStarted()"
            onStreamDestroy="streamDestroyed"
            id="plugin">
    </body>
    <script>
        description("This tests that NPP_DestroyStream is called with NPRES_NETWORK_ERR not called if a plug-in returns -1 its NPP_Write callback.");

        var plugin = document.getElementById("plugin");

        plugin.returnNegativeOneFromWrite = true;
        shouldBeTrue("plugin.returnNegativeOneFromWrite");

        plugin.getURLNotify("data:text/html,Test", null, "callback");
    </script>
</html>

