// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(async function() {
  TestRunner.addResult(`Tests getEventListeners() method of console command line API.\n`);

  await TestRunner.loadModule('console_test_runner');
  await TestRunner.showPanel('console');

  await TestRunner.loadHTML(`
    <p id="foo">
    </p>
    <div id="outer">
    <div id="inner">
    </div>
    </div>
    <div id="empty">
    </div>
    <button id="button" onclick="alert(1)" onmouseover="listener2()"></button>
    <button id="invalid" onclick="Invalid JavaScript"></button>
  `);

  await TestRunner.evaluateInPagePromise(`
    function output(message) {
        if (!self._output)
            self._output = [];
        self._output.push('[page] ' + message);
    }

    function listener1()
    {
    }
    function listener2()
    {
    }

    document.getElementById("inner").addEventListener("keydown", listener1, false);
    document.getElementById("inner").addEventListener("keydown", listener2, true);
    document.getElementById("inner").addEventListener("wheel", listener2, {"passive": true});
    document.getElementById("outer").addEventListener("mousemove", listener1, false);
    document.getElementById("outer").addEventListener("mousedown", listener2, true);
    document.getElementById("outer").addEventListener("keydown", listener2, true);
    document.getElementById("outer").addEventListener("keyup", listener2, {once: true});
    window.addEventListener("popstate", listener1, false);

    function dumpObject(object, prefix)
    {
        if (!object) {
            output("FAIL: object is " + object);
            return;
        }
        prefix = prefix || "";
        var keys = Object.keys(object);
        keys.sort();
        for (var i = 0; i < keys.length; ++i) {
            var value = object[keys[i]];
            var nameWithPrefix = prefix + keys[i] + ": ";
            switch (typeof(value)) {
            case "object":
                if (value === null) {
                    output(nameWithPrefix + "null");
                    break;
                }
                output(nameWithPrefix + "{");
                dumpObject(value, prefix + "    ")
                output(prefix + "}");
                break;
            case "string":
                output(nameWithPrefix + JSON.stringify(value));
                break;
            case "function":
                var body = value.toString().replace(/[ \\n]+/gm, " ");
                body = body.replace(/; }/g, " }");
                output(nameWithPrefix + body);
                break;
            default:
                output(nameWithPrefix + String(value));
                break;
            }
        }
    }

    function runTestsInPage(getEventListeners)
    {
        output("- inner -");
        var innerElement = document.getElementById("inner");
        var innerListeners = getEventListeners(innerElement);
        dumpObject(innerListeners);
        innerElement.removeEventListener("keydown", innerListeners.keydown[0].listener, innerListeners.keydown[0].useCapture);
        innerElement.removeEventListener("wheel", innerListeners.wheel[0].listener, innerListeners.wheel[0].useCapture);
        output("- inner after a removal -");
        dumpObject(getEventListeners(innerElement));
        output("- outer -");
        dumpObject(getEventListeners(document.getElementById("outer")));
        output("- attribute event listeners -");
        dumpObject(getEventListeners(document.getElementById("button")));
        output("- window -");
        dumpObject(getEventListeners(window));
        output("- empty -");
        dumpObject(getEventListeners(document.getElementById("empty")));
        output("- invalid -");
        dumpObject(getEventListeners(document.getElementById("invalid")));
        output("- object -");
        output(typeof getEventListeners({}));
        output("- null -");
        output(typeof getEventListeners(null));
        output("- undefined -");
        output(typeof getEventListeners(undefined));
    }
  `);

  ConsoleTestRunner.evaluateInConsole('runTestsInPage(getEventListeners)', async function() {
    const output = await TestRunner.evaluateInPageAsync('JSON.stringify(self._output)');
    TestRunner.addResults(JSON.parse(output));
    TestRunner.completeTest();
  });
})();
