blob: dc2683b1fa9366261870653029195782f74d5c6d [file] [log] [blame]
// 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 that overriding global methods (like Array.prototype.push, Math.max) will not break the inspector.\n`);
await TestRunner.loadModule('console_test_runner');
await TestRunner.showPanel('console');
await TestRunner.evaluateInPagePromise(`
var originalError = window.Error;
(function() {
var originalFunctionCall = Function.prototype.call;
var originalFunctionApply = Function.prototype.apply;
var overriddenFunctionCall = function() {
original();
console.error("FAIL: Function.prototype.call should not be called!");
var result = originalFunctionCall.apply(this, arguments);
overridden();
return result;
}
var overriddenFunctionApply = function(thisArg, argsArray) {
original();
console.error("FAIL: Function.prototype.apply should not be called!");
var result = originalFunctionApply.call(this, thisArg, argsArray);
overridden();
return result;
}
function original()
{
Function.prototype.call = originalFunctionCall;
Function.prototype.apply = originalFunctionApply;
}
function overridden()
{
Function.prototype.call = overriddenFunctionCall;
Function.prototype.apply = overriddenFunctionApply;
}
overridden();
})();
function throwGetter()
{
console.error("FAIL: Should not be called!");
throw new Error("FAIL");
}
function testOverriddenArrayPushAndMathMax()
{
Object.defineProperty(Array.prototype, "push", {
get: throwGetter
});
Object.defineProperty(Math, "max", {
get: throwGetter
});
return [1, 2, 3];
}
function testOverriddenConstructorName()
{
var obj = {};
obj.constructor = { name: "foo" };
return obj;
}
function testThrowConstructorName()
{
var obj = {};
Object.defineProperty(obj, "constructor", {
get: throwGetter
});
return obj;
}
function testOverriddenIsFinite()
{
window.isFinite = throwGetter;
var out;
(function() {
out = arguments;
})("arg1", "arg2");
return out;
}
function testOverriddenError()
{
window.Error = 42;
return { result: "PASS" };
}
function restoreError()
{
window.Error = originalError;
return { result: "PASS" };
}
function testOverriddenToString(obj, overrideThrow)
{
if (overrideThrow)
var func = function() { throw new Error; }
else
var func = function() { return [1]; }
Object.defineProperty(obj, "toString", { value: func, enumerable: false });
Object.defineProperty(obj, "valueOf", { value: func, enumerable: false });
// Now the ("" + obj) expression should throw.
try {
var dummy = "" + obj;
console.error("FAIL: Expected to throw but got: " + dummy);
} catch (e) {
}
return obj;
}
`);
TestRunner.runTestSuite([
function evaluateInConsole(next) {
var expressions = [
'testOverriddenArrayPushAndMathMax()',
'testOverriddenConstructorName()',
'testThrowConstructorName()',
'testOverriddenIsFinite()',
'testOverriddenError()',
'restoreError()',
'testOverriddenToString(function func() {}, true)',
'testOverriddenToString(function func() {}, false)',
'testOverriddenToString(new Function, true)',
'testOverriddenToString(new Function, false)',
'testOverriddenToString(/^regex$/, true)',
'testOverriddenToString(/^regex$/, false)',
'testOverriddenToString(new Date, true)',
'testOverriddenToString(new Date, false)',
'testOverriddenToString({}, true)',
'testOverriddenToString({}, false)',
'testOverriddenToString(new Number(1), true)',
'testOverriddenToString(new Number(1), false)',
];
function iterate() {
var expr = expressions.shift();
if (!expr) {
TestRunner.deprecatedRunAfterPendingDispatches(next);
return;
}
ConsoleTestRunner.evaluateInConsole(expr, iterate);
}
iterate();
},
async function testRuntimeAgentCallFunctionOn(next) {
var result = await TestRunner.RuntimeAgent.evaluate('({ a : 1, b : 2 })');
function sum() {
return this.a + this.b;
}
result = await TestRunner.RuntimeAgent.callFunctionOn(sum.toString(), result.objectId);
TestRunner.assertEquals(3, result.value);
next();
},
async function dumpConsoleMessages(next) {
await ConsoleTestRunner.dumpConsoleMessages();
next();
}
]);
})();