<html>
<body>
<p>This test makes sure that navigator.registerProtocolHandler throws the proper exceptions and has no-op default implementation.</p>
<pre id="console"></pre>
<script>
if (window.testRunner)
    testRunner.dumpAsText();

function debug(str)
{
    var c = document.getElementById('console')
    c.appendChild(document.createTextNode(str + '\n'));
}

if (window.navigator.registerProtocolHandler)
    debug('Pass: window.navigator.registerProtocolHandler is defined.');
else
    debug('Fail: window.navigator.registerProtocolHandler is not defined.');

var invalid_protocols = ['http', 'https', 'file', 'web+'];
invalid_protocols.forEach(function (protocol) {
    var succeeded = false;
    try {
        window.navigator.registerProtocolHandler(protocol, "invalid protocol %s", "title");
    } catch (e) {
        succeeded = 'SecurityError' == e.name;
    }

    if (succeeded)
        debug('Pass: Invalid protocol "' + protocol + '" threw SecurityError exception.');
    else
        debug('Fail: Invalid protocol "' + protocol + '" allowed.');
});

var valid_protocols = ['bitcoin', 'BitcoIn', 'geo', 'im', 'irc', 'Irc', 'ircs', 'magnet', 'MagneT', 'mailto', 'mms', 'news', 'nntp', 'sip', 'sms', 'smsto', 'SmsTo', 'ssh', 'tel', 'urn', 'webcal', 'WebCAL', 'wtai', 'WTAI', 'xmpp'];
valid_protocols.forEach(function (protocol) {
    var succeeded = false;
    try {
        window.navigator.registerProtocolHandler(protocol, "valid protocol %s", "title");
        succeeded = true;
    } catch (e) {
        succeeded = false;
    }

    if (succeeded)
        debug('Pass: Valid protocol "' + protocol + '" allowed.');
    else
        debug('Fail: Valid protocol "' + protocol + '" failed.');
});

var invalid_schemes = ['mailto:', 'ssh:/', 'magnet:+', 'tel:sip'];
invalid_schemes.forEach(function (scheme) {
    var succeeded = false;
    try {
        window.navigator.registerProtocolHandler(scheme, 'invalid scheme uri=%s', 'title');
    } catch (e) {
        succeeded = true;
    }

    if (succeeded)
        debug('Pass: Invalid scheme "' + scheme + '" failed.');
    else
        debug('Fail: Invalid scheme "' + scheme + '" allowed.');
});

var invalid_urls = ["", "%S"];
invalid_urls.forEach(function (url) {
   var succeeded = false;
   try {
        window.navigator.registerProtocolHandler('web+myprotocol', url, 'title');
    } catch (e) {
        succeeded = 'SyntaxError' == e.name;
    }

    if (succeeded)
        debug('Pass: Invalid url "' + url + '" threw SyntaxError exception.');
    else
        debug('Fail: Invalid url "' + url + '" allowed.');
});

// Test that the API has default no-op implementation.
var succeeded = true;
try {
    window.navigator.registerProtocolHandler('web+myprotocol', "%s", "title");
} catch (e) {
    succeeded = false;
}

if (succeeded)
    debug('Pass: Valid call succeeded.');
else
    debug('Fail: Invalid call did not succeed.');
</script>
</body>
</html>
