Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js

Issue 1811853002: [DevTools] Move evaluateOnCallFrame to native (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 isPrimitiveValue: function(object) 282 isPrimitiveValue: function(object)
283 { 283 {
284 // FIXME(33716): typeof document.all is always 'undefined'. 284 // FIXME(33716): typeof document.all is always 'undefined'.
285 return InjectedScript.primitiveTypes[typeof object] && !this._isHTMLAllC ollection(object); 285 return InjectedScript.primitiveTypes[typeof object] && !this._isHTMLAllC ollection(object);
286 }, 286 },
287 287
288 /** 288 /**
289 * @param {*} object 289 * @param {*} object
290 * @param {string} groupName 290 * @param {string} groupName
291 * @param {boolean} canAccessInspectedGlobalObject 291 * @param {boolean} canAccessInspectedGlobalObject
292 * @param {boolean} forceValueType
292 * @param {boolean} generatePreview 293 * @param {boolean} generatePreview
293 * @return {!RuntimeAgent.RemoteObject} 294 * @return {!RuntimeAgent.RemoteObject}
294 */ 295 */
295 wrapObject: function(object, groupName, canAccessInspectedGlobalObject, gene ratePreview) 296 wrapObject: function(object, groupName, canAccessInspectedGlobalObject, forc eValueType, generatePreview)
296 { 297 {
297 if (canAccessInspectedGlobalObject) 298 if (canAccessInspectedGlobalObject)
298 return this._wrapObject(object, groupName, false, generatePreview); 299 return this._wrapObject(object, groupName, forceValueType, generateP review);
299 return this._fallbackWrapper(object); 300 return this._fallbackWrapper(object);
300 }, 301 },
301 302
302 /** 303 /**
303 * @param {*} object 304 * @param {*} object
304 * @return {!RuntimeAgent.RemoteObject} 305 * @return {!RuntimeAgent.RemoteObject}
305 */ 306 */
306 _fallbackWrapper: function(object) 307 _fallbackWrapper: function(object)
307 { 308 {
308 var result = { __proto__: null }; 309 var result = { __proto__: null };
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 { 398 {
398 return nullifyObjectProto(/** @type {!Object} */ (InjectedScriptHost.eva l("(" + objectId + ")"))); 399 return nullifyObjectProto(/** @type {!Object} */ (InjectedScriptHost.eva l("(" + objectId + ")")));
399 }, 400 },
400 401
401 clearLastEvaluationResult: function() 402 clearLastEvaluationResult: function()
402 { 403 {
403 delete this._lastResult; 404 delete this._lastResult;
404 }, 405 },
405 406
406 /** 407 /**
408 * @param {*} result
409 */
410 setLastEvaluationResult: function(result)
411 {
412 this._lastResult = result;
413 },
414
415 /**
407 * @param {string} objectId 416 * @param {string} objectId
408 * @param {boolean} ownProperties 417 * @param {boolean} ownProperties
409 * @param {boolean} accessorPropertiesOnly 418 * @param {boolean} accessorPropertiesOnly
410 * @param {boolean} generatePreview 419 * @param {boolean} generatePreview
411 * @return {!Array.<!RuntimeAgent.PropertyDescriptor>|boolean} 420 * @return {!Array.<!RuntimeAgent.PropertyDescriptor>|boolean}
412 */ 421 */
413 getProperties: function(objectId, ownProperties, accessorPropertiesOnly, gen eratePreview) 422 getProperties: function(objectId, ownProperties, accessorPropertiesOnly, gen eratePreview)
414 { 423 {
415 var parsedObjectId = this._parseObjectId(objectId); 424 var parsedObjectId = this._parseObjectId(objectId);
416 var object = this._objectForId(parsedObjectId); 425 var object = this._objectForId(parsedObjectId);
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 /** 648 /**
640 * @param {string} expression 649 * @param {string} expression
641 * @param {string} objectGroup 650 * @param {string} objectGroup
642 * @param {boolean} injectCommandLineAPI 651 * @param {boolean} injectCommandLineAPI
643 * @param {boolean} returnByValue 652 * @param {boolean} returnByValue
644 * @param {boolean} generatePreview 653 * @param {boolean} generatePreview
645 * @return {*} 654 * @return {*}
646 */ 655 */
647 evaluate: function(expression, objectGroup, injectCommandLineAPI, returnByVa lue, generatePreview) 656 evaluate: function(expression, objectGroup, injectCommandLineAPI, returnByVa lue, generatePreview)
648 { 657 {
649 return this._evaluateAndWrap(null, expression, objectGroup, injectComman dLineAPI, returnByValue, generatePreview); 658 var scopeExtensionForEval = injectCommandLineAPI ? new CommandLineAPI(th is._commandLineAPIImpl) : undefined;
659 var wrappedResult = InjectedScriptHost.evaluateWithExceptionDetails(expr ession, scopeExtensionForEval);
660 if (objectGroup === "console" && !wrappedResult.exceptionDetails)
661 this._lastResult = wrappedResult.result;
662 if (!wrappedResult.exceptionDetails) {
663 return { wasThrown: false,
664 result: this._wrapObject(wrappedResult.result, objectGroup, returnByValue, generatePreview),
665 __proto__: null };
666 }
667 return this._createThrownValue(wrappedResult.result, objectGroup, genera tePreview, wrappedResult.exceptionDetails);
650 }, 668 },
651 669
652 /** 670 /**
653 * @param {string} objectId 671 * @param {string} objectId
654 * @param {string} expression 672 * @param {string} expression
655 * @param {string} args 673 * @param {string} args
656 * @param {boolean} returnByValue 674 * @param {boolean} returnByValue
657 * @return {!Object|string} 675 * @return {!Object|string}
658 */ 676 */
659 callFunctionOn: function(objectId, expression, args, returnByValue) 677 callFunctionOn: function(objectId, expression, args, returnByValue)
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 } else if ("value" in callArgumentJson) { 790 } else if ("value" in callArgumentJson) {
773 var value = callArgumentJson.value; 791 var value = callArgumentJson.value;
774 if (callArgumentJson.type === "number" && typeof value !== "number") 792 if (callArgumentJson.type === "number" && typeof value !== "number")
775 value = Number(value); 793 value = Number(value);
776 return value; 794 return value;
777 } 795 }
778 return undefined; 796 return undefined;
779 }, 797 },
780 798
781 /** 799 /**
782 * @param {?JavaScriptCallFrame} callFrame
783 * @param {string} expression
784 * @param {string} objectGroup
785 * @param {boolean} injectCommandLineAPI
786 * @param {boolean} returnByValue
787 * @param {boolean} generatePreview
788 * @return {!Object}
789 */
790 _evaluateAndWrap: function(callFrame, expression, objectGroup, injectCommand LineAPI, returnByValue, generatePreview)
791 {
792 var wrappedResult = this._evaluateOn(callFrame, objectGroup, expression, injectCommandLineAPI);
793 if (!wrappedResult.exceptionDetails) {
794 return { wasThrown: false,
795 result: this._wrapObject(wrappedResult.result, objectGroup, returnByValue, generatePreview),
796 __proto__: null };
797 }
798 return this._createThrownValue(wrappedResult.result, objectGroup, genera tePreview, wrappedResult.exceptionDetails);
799 },
800
801 /**
802 * @param {*} value 800 * @param {*} value
803 * @param {string|undefined} objectGroup 801 * @param {string|undefined} objectGroup
804 * @param {boolean} generatePreview 802 * @param {boolean} generatePreview
805 * @param {!RuntimeAgent.ExceptionDetails=} exceptionDetails 803 * @param {!RuntimeAgent.ExceptionDetails=} exceptionDetails
806 * @return {!Object} 804 * @return {!Object}
807 */ 805 */
808 _createThrownValue: function(value, objectGroup, generatePreview, exceptionD etails) 806 _createThrownValue: function(value, objectGroup, generatePreview, exceptionD etails)
809 { 807 {
810 var remoteObject = this._wrapObject(value, objectGroup, false, generateP review && InjectedScriptHost.subtype(value) !== "error"); 808 var remoteObject = this._wrapObject(value, objectGroup, false, generateP review && InjectedScriptHost.subtype(value) !== "error");
811 if (!remoteObject.description){ 809 if (!remoteObject.description){
812 try { 810 try {
813 remoteObject.description = toStringDescription(value); 811 remoteObject.description = toStringDescription(value);
814 } catch (e) {} 812 } catch (e) {}
815 } 813 }
816 return { wasThrown: true, result: remoteObject, exceptionDetails: except ionDetails, __proto__: null }; 814 return { wasThrown: true, result: remoteObject, exceptionDetails: except ionDetails, __proto__: null };
817 }, 815 },
818 816
819 /** 817 /**
820 * @param {?JavaScriptCallFrame} callFrame
821 * @param {string} objectGroup
822 * @param {string} expression
823 * @param {boolean} injectCommandLineAPI
824 * @return {*}
825 */
826 _evaluateOn: function(callFrame, objectGroup, expression, injectCommandLineA PI)
827 {
828 // Only install command line api object for the time of evaluation.
829 // Surround the expression in with statements to inject our command line API so that
830 // the window object properties still take more precedent than our API f unctions.
831
832 var scopeExtensionForEval = (callFrame && injectCommandLineAPI) ? new Co mmandLineAPI(this._commandLineAPIImpl, callFrame) : undefined;
833 var wrappedResult = callFrame ? callFrame.evaluateWithExceptionDetails(e xpression, scopeExtensionForEval) : InjectedScriptHost.evaluateWithExceptionDeta ils(expression, injectCommandLineAPI ? new CommandLineAPI(this._commandLineAPIIm pl, callFrame) : undefined);
834 if (objectGroup === "console" && !wrappedResult.exceptionDetails)
835 this._lastResult = wrappedResult.result;
836 return wrappedResult;
837
838 },
839
840 /**
841 * @param {?Object} callFrame 818 * @param {?Object} callFrame
842 * @return {!Array.<!InjectedScript.CallFrameProxy>|boolean} 819 * @return {!Array.<!InjectedScript.CallFrameProxy>|boolean}
843 */ 820 */
844 wrapCallFrames: function(callFrame) 821 wrapCallFrames: function(callFrame)
845 { 822 {
846 if (!callFrame) 823 if (!callFrame)
847 return false; 824 return false;
848 825
849 var result = []; 826 var result = [];
850 var depth = 0; 827 var depth = 0;
851 do { 828 do {
852 result[depth] = new InjectedScript.CallFrameProxy(depth, callFrame); 829 result[depth] = new InjectedScript.CallFrameProxy(depth, callFrame);
853 callFrame = callFrame.caller; 830 callFrame = callFrame.caller;
854 ++depth; 831 ++depth;
855 } while (callFrame); 832 } while (callFrame);
856 return result; 833 return result;
857 }, 834 },
858 835
859 /** 836 /**
860 * @param {!JavaScriptCallFrame} topCallFrame
861 * @param {string} callFrameId
862 * @param {string} expression
863 * @param {string} objectGroup
864 * @param {boolean} injectCommandLineAPI
865 * @param {boolean} returnByValue
866 * @param {boolean} generatePreview
867 * @return {*}
868 */
869 evaluateOnCallFrame: function(topCallFrame, callFrameId, expression, objectG roup, injectCommandLineAPI, returnByValue, generatePreview)
870 {
871 var callFrame = this._callFrameForId(topCallFrame, callFrameId);
872 if (!callFrame)
873 return "Could not find call frame with given id";
874 return this._evaluateAndWrap(callFrame, expression, objectGroup, injectC ommandLineAPI, returnByValue, generatePreview);
875 },
876
877 /**
878 * @return {!CommandLineAPI} 837 * @return {!CommandLineAPI}
879 */ 838 */
880 commandLineAPI: function() 839 commandLineAPI: function()
881 { 840 {
882 return new CommandLineAPI(this._commandLineAPIImpl, null); 841 return new CommandLineAPI(this._commandLineAPIImpl);
883 }, 842 },
884 843
885 /** 844 /**
886 * @param {!JavaScriptCallFrame} topCallFrame 845 * @param {!JavaScriptCallFrame} topCallFrame
887 * @param {string} callFrameId 846 * @param {string} callFrameId
888 * @return {?JavaScriptCallFrame} 847 * @return {?JavaScriptCallFrame}
889 */ 848 */
890 _callFrameForId: function(topCallFrame, callFrameId) 849 _callFrameForId: function(topCallFrame, callFrameId)
891 { 850 {
892 var parsedCallFrameId = nullifyObjectProto(/** @type {!Object} */ (Injec tedScriptHost.eval("(" + callFrameId + ")"))); 851 var parsedCallFrameId = nullifyObjectProto(/** @type {!Object} */ (Injec tedScriptHost.eval("(" + callFrameId + ")")));
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
1474 scope.startLocation = startLocation; 1433 scope.startLocation = startLocation;
1475 if (endLocation) 1434 if (endLocation)
1476 scope.endLocation = endLocation; 1435 scope.endLocation = endLocation;
1477 1436
1478 return scope; 1437 return scope;
1479 } 1438 }
1480 1439
1481 /** 1440 /**
1482 * @constructor 1441 * @constructor
1483 * @param {!CommandLineAPIImpl} commandLineAPIImpl 1442 * @param {!CommandLineAPIImpl} commandLineAPIImpl
1484 * @param {?JavaScriptCallFrame} callFrame
1485 */ 1443 */
1486 function CommandLineAPI(commandLineAPIImpl, callFrame) 1444 function CommandLineAPI(commandLineAPIImpl)
1487 { 1445 {
1488 /** 1446 /**
1489 * @param {string} member
1490 * @return {boolean}
1491 */
1492 function inScopeVariables(member)
1493 {
1494 var scopeChain = callFrame.scopeChain;
1495 for (var i = 0; i < scopeChain.length; ++i) {
1496 if (member in scopeChain[i])
1497 return true;
1498 }
1499 return false;
1500 }
1501
1502 /**
1503 * @param {string} name The name of the method for which a toString method s hould be generated. 1447 * @param {string} name The name of the method for which a toString method s hould be generated.
1504 * @return {function():string} 1448 * @return {function():string}
1505 */ 1449 */
1506 function customToStringMethod(name) 1450 function customToStringMethod(name)
1507 { 1451 {
1508 return function() 1452 return function()
1509 { 1453 {
1510 var funcArgsSyntax = ""; 1454 var funcArgsSyntax = "";
1511 try { 1455 try {
1512 var funcSyntax = "" + commandLineAPIImpl[name]; 1456 var funcSyntax = "" + commandLineAPIImpl[name];
1513 funcSyntax = funcSyntax.replace(/\n/g, " "); 1457 funcSyntax = funcSyntax.replace(/\n/g, " ");
1514 funcSyntax = funcSyntax.replace(/^function[^\(]*\(([^\)]*)\).*$/ , "$1"); 1458 funcSyntax = funcSyntax.replace(/^function[^\(]*\(([^\)]*)\).*$/ , "$1");
1515 funcSyntax = funcSyntax.replace(/\s*,\s*/g, ", "); 1459 funcSyntax = funcSyntax.replace(/\s*,\s*/g, ", ");
1516 funcSyntax = funcSyntax.replace(/\bopt_(\w+)\b/g, "[$1]"); 1460 funcSyntax = funcSyntax.replace(/\bopt_(\w+)\b/g, "[$1]");
1517 funcArgsSyntax = funcSyntax.trim(); 1461 funcArgsSyntax = funcSyntax.trim();
1518 } catch (e) { 1462 } catch (e) {
1519 } 1463 }
1520 return "function " + name + "(" + funcArgsSyntax + ") { [Command Lin e API] }"; 1464 return "function " + name + "(" + funcArgsSyntax + ") { [Command Lin e API] }";
1521 }; 1465 };
1522 } 1466 }
1523 1467
1524 for (var i = 0; i < CommandLineAPI.members_.length; ++i) { 1468 for (var i = 0; i < CommandLineAPI.members_.length; ++i) {
1525 var member = CommandLineAPI.members_[i]; 1469 var member = CommandLineAPI.members_[i];
1526 if (callFrame && inScopeVariables(member))
1527 continue;
1528
1529 this[member] = bind(commandLineAPIImpl[member], commandLineAPIImpl); 1470 this[member] = bind(commandLineAPIImpl[member], commandLineAPIImpl);
1530 this[member].toString = customToStringMethod(member); 1471 this[member].toString = customToStringMethod(member);
1531 } 1472 }
1532 1473
1533 for (var i = 0; i < 5; ++i) { 1474 for (var i = 0; i < 5; ++i) {
1534 var member = "$" + i; 1475 var member = "$" + i;
1535 if (callFrame && inScopeVariables(member))
1536 continue;
1537
1538 this[member] = bind(commandLineAPIImpl._inspectedObject, commandLineAPII mpl, i); 1476 this[member] = bind(commandLineAPIImpl._inspectedObject, commandLineAPII mpl, i);
1539 } 1477 }
1540 1478
1541 this.$_ = injectedScript._lastResult; 1479 this.$_ = injectedScript._lastResult;
1542 1480
1543 this.__proto__ = null; 1481 this.__proto__ = null;
1544 } 1482 }
1545 1483
1546 // NOTE: Please keep the list of API methods below synchronized to that in WebIn spector.RuntimeModel 1484 // NOTE: Please keep the list of API methods below synchronized to that in WebIn spector.RuntimeModel
1547 // and V8InjectedScriptHost! 1485 // and V8InjectedScriptHost!
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1827 */ 1765 */
1828 _logEvent: function(event) 1766 _logEvent: function(event)
1829 { 1767 {
1830 inspectedGlobalObject.console.log(event.type, event); 1768 inspectedGlobalObject.console.log(event.type, event);
1831 } 1769 }
1832 } 1770 }
1833 1771
1834 injectedScript._commandLineAPIImpl = new CommandLineAPIImpl(); 1772 injectedScript._commandLineAPIImpl = new CommandLineAPIImpl();
1835 return injectedScript; 1773 return injectedScript;
1836 }) 1774 })
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698