| OLD | NEW |
| 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 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 } | 639 } |
| 640 if (ownProperties) { | 640 if (ownProperties) { |
| 641 if (object.__proto__ && !accessorPropertiesOnly) | 641 if (object.__proto__ && !accessorPropertiesOnly) |
| 642 yield { name: "__proto__", value: object.__proto__, writable
: true, configurable: true, enumerable: false, isOwn: true, __proto__: null }; | 642 yield { name: "__proto__", value: object.__proto__, writable
: true, configurable: true, enumerable: false, isOwn: true, __proto__: null }; |
| 643 break; | 643 break; |
| 644 } | 644 } |
| 645 } | 645 } |
| 646 }, | 646 }, |
| 647 | 647 |
| 648 /** | 648 /** |
| 649 * @param {string} objectId | |
| 650 * @param {string} expression | |
| 651 * @param {string} args | |
| 652 * @param {boolean} returnByValue | |
| 653 * @return {!Object|string} | |
| 654 */ | |
| 655 callFunctionOn: function(objectId, expression, args, returnByValue) | |
| 656 { | |
| 657 var parsedObjectId = this._parseObjectId(objectId); | |
| 658 var object = this._objectForId(parsedObjectId); | |
| 659 if (!this._isDefined(object)) | |
| 660 return "Could not find object with given id"; | |
| 661 | |
| 662 if (args) { | |
| 663 var resolvedArgs = []; | |
| 664 var callArgs = /** @type {!Array.<!RuntimeAgent.CallArgument>} */ (I
njectedScriptHost.eval(args)); | |
| 665 for (var i = 0; i < callArgs.length; ++i) { | |
| 666 try { | |
| 667 resolvedArgs[i] = this._resolveCallArgument(callArgs[i]); | |
| 668 } catch (e) { | |
| 669 return toString(e); | |
| 670 } | |
| 671 } | |
| 672 } | |
| 673 | |
| 674 var objectGroup = InjectedScriptHost.idToObjectGroupName(parsedObjectId.
id); | |
| 675 | |
| 676 /** | |
| 677 * @suppressReceiverCheck | |
| 678 * @param {*} object | |
| 679 * @param {boolean=} forceValueType | |
| 680 * @param {boolean=} generatePreview | |
| 681 * @param {?Array.<string>=} columnNames | |
| 682 * @param {boolean=} isTable | |
| 683 * @param {*=} customObjectConfig | |
| 684 * @return {!RuntimeAgent.RemoteObject} | |
| 685 * @this {InjectedScript} | |
| 686 */ | |
| 687 function wrap(object, forceValueType, generatePreview, columnNames, isTa
ble, customObjectConfig) | |
| 688 { | |
| 689 return this._wrapObject(object, objectGroup, forceValueType, generat
ePreview, columnNames, isTable, false, customObjectConfig); | |
| 690 } | |
| 691 | |
| 692 try { | |
| 693 | |
| 694 var remoteObjectAPI = { bindRemoteObject: bind(wrap, this), __proto_
_: null}; | |
| 695 InjectedScriptHost.setNonEnumProperty(inspectedGlobalObject, "__remo
teObjectAPI", remoteObjectAPI); | |
| 696 | |
| 697 var func = InjectedScriptHost.eval("with (typeof __remoteObjectAPI !
== 'undefined' ? __remoteObjectAPI : { __proto__: null }) {(" + expression + ")}
"); | |
| 698 if (typeof func !== "function") | |
| 699 return "Given expression does not evaluate to a function"; | |
| 700 | |
| 701 return { wasThrown: false, | |
| 702 result: this._wrapObject(InjectedScriptHost.callFunction(fu
nc, object, resolvedArgs), objectGroup, returnByValue), | |
| 703 __proto__: null }; | |
| 704 } catch (e) { | |
| 705 return this._createThrownValue(e, objectGroup, false); | |
| 706 } finally { | |
| 707 try { | |
| 708 delete inspectedGlobalObject["__remoteObjectAPI"]; | |
| 709 } catch(e) { | |
| 710 } | |
| 711 } | |
| 712 }, | |
| 713 | |
| 714 /** | |
| 715 * @param {string|undefined} objectGroupName | 649 * @param {string|undefined} objectGroupName |
| 716 * @param {*} jsonMLObject | 650 * @param {*} jsonMLObject |
| 717 * @throws {string} error message | 651 * @throws {string} error message |
| 718 */ | 652 */ |
| 719 _substituteObjectTagsInCustomPreview: function(objectGroupName, jsonMLObject
) | 653 _substituteObjectTagsInCustomPreview: function(objectGroupName, jsonMLObject
) |
| 720 { | 654 { |
| 721 var maxCustomPreviewRecursionDepth = 20; | 655 var maxCustomPreviewRecursionDepth = 20; |
| 722 this._customPreviewRecursionDepth = (this._customPreviewRecursionDepth |
| 0) + 1 | 656 this._customPreviewRecursionDepth = (this._customPreviewRecursionDepth |
| 0) + 1 |
| 723 try { | 657 try { |
| 724 if (this._customPreviewRecursionDepth >= maxCustomPreviewRecursionDe
pth) | 658 if (this._customPreviewRecursionDepth >= maxCustomPreviewRecursionDe
pth) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 739 } | 673 } |
| 740 | 674 |
| 741 for (var i = 0; i < jsonMLObject.length; ++i) | 675 for (var i = 0; i < jsonMLObject.length; ++i) |
| 742 this._substituteObjectTagsInCustomPreview(objectGroupName, jsonM
LObject[i]); | 676 this._substituteObjectTagsInCustomPreview(objectGroupName, jsonM
LObject[i]); |
| 743 } finally { | 677 } finally { |
| 744 this._customPreviewRecursionDepth--; | 678 this._customPreviewRecursionDepth--; |
| 745 } | 679 } |
| 746 }, | 680 }, |
| 747 | 681 |
| 748 /** | 682 /** |
| 749 * Resolves a value from CallArgument description. | |
| 750 * @param {!RuntimeAgent.CallArgument} callArgumentJson | |
| 751 * @return {*} resolved value | |
| 752 * @throws {string} error message | |
| 753 */ | |
| 754 _resolveCallArgument: function(callArgumentJson) | |
| 755 { | |
| 756 callArgumentJson = nullifyObjectProto(callArgumentJson); | |
| 757 var objectId = callArgumentJson.objectId; | |
| 758 if (objectId) { | |
| 759 var parsedArgId = this._parseObjectId(objectId); | |
| 760 if (!parsedArgId || parsedArgId["injectedScriptId"] !== injectedScri
ptId) | |
| 761 throw "Arguments should belong to the same JavaScript world as t
he target object."; | |
| 762 | |
| 763 var resolvedArg = this._objectForId(parsedArgId); | |
| 764 if (!this._isDefined(resolvedArg)) | |
| 765 throw "Could not find object with given id"; | |
| 766 | |
| 767 return resolvedArg; | |
| 768 } else if ("value" in callArgumentJson) { | |
| 769 var value = callArgumentJson.value; | |
| 770 if (callArgumentJson.type === "number" && typeof value !== "number") | |
| 771 value = Number(value); | |
| 772 return value; | |
| 773 } | |
| 774 return undefined; | |
| 775 }, | |
| 776 | |
| 777 /** | |
| 778 * @param {*} value | |
| 779 * @param {string|undefined} objectGroup | |
| 780 * @param {boolean} generatePreview | |
| 781 * @param {!RuntimeAgent.ExceptionDetails=} exceptionDetails | |
| 782 * @return {!Object} | |
| 783 */ | |
| 784 _createThrownValue: function(value, objectGroup, generatePreview, exceptionD
etails) | |
| 785 { | |
| 786 var remoteObject = this._wrapObject(value, objectGroup, false, generateP
review && InjectedScriptHost.subtype(value) !== "error"); | |
| 787 if (!remoteObject.description){ | |
| 788 try { | |
| 789 remoteObject.description = toStringDescription(value); | |
| 790 } catch (e) {} | |
| 791 } | |
| 792 return { wasThrown: true, result: remoteObject, exceptionDetails: except
ionDetails, __proto__: null }; | |
| 793 }, | |
| 794 | |
| 795 /** | |
| 796 * @param {?Object} callFrame | 683 * @param {?Object} callFrame |
| 797 * @return {!Array.<!InjectedScript.CallFrameProxy>|boolean} | 684 * @return {!Array.<!InjectedScript.CallFrameProxy>|boolean} |
| 798 */ | 685 */ |
| 799 wrapCallFrames: function(callFrame) | 686 wrapCallFrames: function(callFrame) |
| 800 { | 687 { |
| 801 if (!callFrame) | 688 if (!callFrame) |
| 802 return false; | 689 return false; |
| 803 | 690 |
| 804 var result = []; | 691 var result = []; |
| 805 var depth = 0; | 692 var depth = 0; |
| 806 do { | 693 do { |
| 807 result[depth] = new InjectedScript.CallFrameProxy(depth, callFrame); | 694 result[depth] = new InjectedScript.CallFrameProxy(depth, callFrame); |
| 808 callFrame = callFrame.caller; | 695 callFrame = callFrame.caller; |
| 809 ++depth; | 696 ++depth; |
| 810 } while (callFrame); | 697 } while (callFrame); |
| 811 return result; | 698 return result; |
| 812 }, | 699 }, |
| 813 | 700 |
| 814 /** | 701 /** |
| 815 * @return {!CommandLineAPI} | 702 * @return {!CommandLineAPI} |
| 816 */ | 703 */ |
| 817 commandLineAPI: function() | 704 commandLineAPI: function() |
| 818 { | 705 { |
| 819 return new CommandLineAPI(this._commandLineAPIImpl); | 706 return new CommandLineAPI(this._commandLineAPIImpl); |
| 820 }, | 707 }, |
| 821 | 708 |
| 822 /** | 709 /** |
| 710 * @param {string} objectGroup |
| 711 * @return {!Object} |
| 712 */ |
| 713 remoteObjectAPI: function(objectGroup) |
| 714 { |
| 715 /** |
| 716 * @suppressReceiverCheck |
| 717 * @param {*} object |
| 718 * @param {boolean=} forceValueType |
| 719 * @param {boolean=} generatePreview |
| 720 * @param {?Array.<string>=} columnNames |
| 721 * @param {boolean=} isTable |
| 722 * @param {*=} customObjectConfig |
| 723 * @return {!RuntimeAgent.RemoteObject} |
| 724 * @this {InjectedScript} |
| 725 */ |
| 726 function wrap(object, forceValueType, generatePreview, columnNames, isTa
ble, customObjectConfig) |
| 727 { |
| 728 return this._wrapObject(object, objectGroup, forceValueType, generat
ePreview, columnNames, isTable, false, customObjectConfig); |
| 729 } |
| 730 return { bindRemoteObject: bind(wrap, this), __proto__: null}; |
| 731 }, |
| 732 |
| 733 /** |
| 823 * @param {!Object} objectId | 734 * @param {!Object} objectId |
| 824 * @return {!Object|symbol|undefined} | 735 * @return {!Object|symbol|undefined} |
| 825 */ | 736 */ |
| 826 _objectForId: function(objectId) | 737 _objectForId: function(objectId) |
| 827 { | 738 { |
| 828 return objectId.injectedScriptId === injectedScriptId ? /** @type{!Objec
t|symbol|undefined} */ (InjectedScriptHost.objectForId(objectId.id)) : void 0; | 739 return objectId.injectedScriptId === injectedScriptId ? /** @type{!Objec
t|symbol|undefined} */ (InjectedScriptHost.objectForId(objectId.id)) : void 0; |
| 829 }, | 740 }, |
| 830 | 741 |
| 831 /** | 742 /** |
| 832 * @param {*} object | 743 * @param {*} object |
| (...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1728 */ | 1639 */ |
| 1729 _logEvent: function(event) | 1640 _logEvent: function(event) |
| 1730 { | 1641 { |
| 1731 inspectedGlobalObject.console.log(event.type, event); | 1642 inspectedGlobalObject.console.log(event.type, event); |
| 1732 } | 1643 } |
| 1733 } | 1644 } |
| 1734 | 1645 |
| 1735 injectedScript._commandLineAPIImpl = new CommandLineAPIImpl(); | 1646 injectedScript._commandLineAPIImpl = new CommandLineAPIImpl(); |
| 1736 return injectedScript; | 1647 return injectedScript; |
| 1737 }) | 1648 }) |
| OLD | NEW |