| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| let {session, contextGroup, Protocol} = InspectorTest.start("Tests that CommandLineAPI is presented only while evaluation."); |
| |
| contextGroup.addScript( |
| ` |
| var methods = ["dir","dirxml","profile","profileEnd","clear","table","keys","values","debug","undebug","monitor","unmonitor","inspect","copy"]; |
| var window = this; |
| function presentedAPIMethods() |
| { |
| var methodCount = 0; |
| for (var method of methods) { |
| try { |
| if (eval("window." + method + "&&" + method + ".toString ? " + method + ".toString().indexOf(\\"[Command Line API]\\") !== -1 : false")) |
| ++methodCount; |
| } catch (e) { |
| } |
| } |
| methodCount += eval("\\"$_\\" in window ? $_ === 239 : false") ? 1 : 0; |
| return methodCount; |
| } |
| |
| function setPropertyForMethod() |
| { |
| window.dir = 42; |
| } |
| |
| function defineValuePropertyForMethod() |
| { |
| Object.defineProperty(window, "dir", { value: 42 }); |
| } |
| |
| function defineAccessorPropertyForMethod() |
| { |
| Object.defineProperty(window, "dir", { set: function() {}, get: function(){ return 42 } }); |
| } |
| |
| function definePropertiesForMethod() |
| { |
| Object.defineProperties(window, { "dir": { set: function() {}, get: function(){ return 42 } }}); |
| } |
| |
| var builtinGetOwnPropertyDescriptorOnObject; |
| var builtinGetOwnPropertyDescriptorOnObjectPrototype; |
| var builtinGetOwnPropertyDescriptorOnWindow; |
| |
| function redefineGetOwnPropertyDescriptors() |
| { |
| builtinGetOwnPropertyDescriptorOnObject = Object.getOwnPropertyDescriptor; |
| Object.getOwnPropertyDescriptor = function() {} |
| builtinGetOwnPropertyDescriptorOnObjectPrototype = Object.prototype.getOwnPropertyDescriptor; |
| Object.prototype.getOwnPropertyDescriptor = function() {} |
| builtinGetOwnPropertyDescriptorOnWindow = window.getOwnPropertyDescriptor; |
| window.getOwnPropertyDescriptor = function() {} |
| } |
| |
| function restoreGetOwnPropertyDescriptors() |
| { |
| Object.getOwnPropertyDescriptor = builtinGetOwnPropertyDescriptorOnObject; |
| Object.prototype.getOwnPropertyDescriptor = builtinGetOwnPropertyDescriptorOnObjectPrototype; |
| window.getOwnPropertyDescriptor = builtinGetOwnPropertyDescriptorOnWindow; |
| }`); |
| |
| runExpressionAndDumpPresentedMethods("") |
| .then(dumpLeftMethods) |
| .then(() => runExpressionAndDumpPresentedMethods("setPropertyForMethod()")) |
| .then(dumpLeftMethods) |
| .then(dumpDir) |
| .then(() => runExpressionAndDumpPresentedMethods("defineValuePropertyForMethod()")) |
| .then(dumpLeftMethods) |
| .then(dumpDir) |
| .then(() => runExpressionAndDumpPresentedMethods("definePropertiesForMethod()")) |
| .then(dumpLeftMethods) |
| .then(dumpDir) |
| .then(() => runExpressionAndDumpPresentedMethods("defineAccessorPropertyForMethod()")) |
| .then(dumpLeftMethods) |
| .then(dumpDir) |
| .then(() => runExpressionAndDumpPresentedMethods("redefineGetOwnPropertyDescriptors()")) |
| .then(dumpLeftMethods) |
| .then(dumpDir) |
| .then(() => evaluate("restoreGetOwnPropertyDescriptors()", false)) |
| .then(InspectorTest.completeTest); |
| |
| function evaluate(expression, includeCommandLineAPI) |
| { |
| return Protocol.Runtime.evaluate({ expression: expression, objectGroup: "console", includeCommandLineAPI: includeCommandLineAPI }); |
| } |
| |
| function setLastEvaluationResultTo239() |
| { |
| return evaluate("239", false); |
| } |
| |
| function runExpressionAndDumpPresentedMethods(expression) |
| { |
| InspectorTest.log(expression); |
| return setLastEvaluationResultTo239() |
| .then(() => evaluate(expression + "; var a = presentedAPIMethods(); a", true)) |
| .then((result) => InspectorTest.logMessage(result)); |
| } |
| |
| function dumpLeftMethods() |
| { |
| // Should always be zero. |
| return setLastEvaluationResultTo239() |
| .then(() => evaluate("presentedAPIMethods()", false)) |
| .then((result) => InspectorTest.logMessage(result)); |
| } |
| |
| function dumpDir() |
| { |
| // Should always be presented. |
| return evaluate("dir", false) |
| .then((result) => InspectorTest.logMessage(result)); |
| } |