<html>
<body>
<p>This test makes sure that navigator.unregisterProtocolHandler 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.unregisterProtocolHandler)
    debug('Pass: window.navigator.unregisterProtocolHandler is defined.');
else
    debug('Fail: window.navigator.unregisterProtocolHandler is not defined.');

var invalid_protocols = ['http', 'https', 'file', 'web+'];
invalid_protocols.forEach(function (protocol) {
    var succeeded = false;
    try {
        window.navigator.unregisterProtocolHandler(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.unregisterProtocolHandler(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.unregisterProtocolHandler(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.unregisterProtocolHandler('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.unregisterProtocolHandler('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>
