<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
// NOTE: More cases should be tested and addressed by:
// <https://webkit.org/b/152294> Web Inspector: Parse InjectedScriptSource as a built-in to get guaranteed non-user-overriden built-ins

function triggerIteration() {
    let callCount = 0;

    const originalIterator = Object.getOwnPropertyDescriptor(Array.prototype, Symbol.iterator);
    Object.defineProperty(Array.prototype, Symbol.iterator, {
        get() {
            ++callCount;
            return originalIterator.value;
        }
    });

    let array = [];

    debugger;

    // Preview an object.
    console.log({a:1, b:2, c:{}});

    // Use Array Iterator at least once.
    for (let x of array) { }

    Object.defineProperty(Array.prototype, Symbol.iterator, originalIterator);

    return callCount;
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("InjectedScript.Observable");

    suite.addTestCase({
        name: "InjectedScript.Observable:Array.prototype[Symbol.iterator]",
        description: "Array iteration in Injected Script should not be observable",
        test(resolve, reject) {
            InspectorTest.evaluateInPage(`triggerIteration()`, (error, result) => {
                InspectorTest.expectEqual(result, 1, "Array.prototype[Symbol.iterator] call count should be 1.");
                resolve();
            });

            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                InspectorTest.pass("Paused.");
                WI.debuggerManager.resume().catch(reject);
            });
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Resumed, (event) => {
                InspectorTest.pass("Resumed.");
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test that certain InjectedScriptSource operations are not observable by user code.</p>
</body>
</html>
