Chromium Code Reviews| 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 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 getProperties: function(object, objectGroupName, ownProperties, accessorProp ertiesOnly, generatePreview) | 339 getProperties: function(object, objectGroupName, ownProperties, accessorProp ertiesOnly, generatePreview) |
| 340 { | 340 { |
| 341 var descriptors = []; | 341 var descriptors = []; |
| 342 var iter = this._propertyDescriptors(object, ownProperties, accessorProp ertiesOnly, undefined); | 342 var iter = this._propertyDescriptors(object, ownProperties, accessorProp ertiesOnly, undefined); |
| 343 // Go over properties, wrap object values. | 343 // Go over properties, wrap object values. |
| 344 for (var descriptor of iter) { | 344 for (var descriptor of iter) { |
| 345 if ("get" in descriptor) | 345 if ("get" in descriptor) |
| 346 descriptor.get = this._wrapObject(descriptor.get, objectGroupNam e); | 346 descriptor.get = this._wrapObject(descriptor.get, objectGroupNam e); |
| 347 if ("set" in descriptor) | 347 if ("set" in descriptor) |
| 348 descriptor.set = this._wrapObject(descriptor.set, objectGroupNam e); | 348 descriptor.set = this._wrapObject(descriptor.set, objectGroupNam e); |
| 349 if ("value" in descriptor) | 349 if ("value" in descriptor) { |
| 350 generatePreview = descriptor.name !== "__proto__"; | |
|
dgozman
2016/06/14 09:08:30
I don't get this change.
luoe
2016/06/14 17:49:29
In another place, I changed a call to getPropertie
| |
| 350 descriptor.value = this._wrapObject(descriptor.value, objectGrou pName, false, generatePreview); | 351 descriptor.value = this._wrapObject(descriptor.value, objectGrou pName, false, generatePreview); |
| 352 } | |
| 351 if (!("configurable" in descriptor)) | 353 if (!("configurable" in descriptor)) |
| 352 descriptor.configurable = false; | 354 descriptor.configurable = false; |
| 353 if (!("enumerable" in descriptor)) | 355 if (!("enumerable" in descriptor)) |
| 354 descriptor.enumerable = false; | 356 descriptor.enumerable = false; |
| 355 if ("symbol" in descriptor) | 357 if ("symbol" in descriptor) |
| 356 descriptor.symbol = this._wrapObject(descriptor.symbol, objectGr oupName); | 358 descriptor.symbol = this._wrapObject(descriptor.symbol, objectGr oupName); |
| 357 push(descriptors, descriptor); | 359 push(descriptors, descriptor); |
| 358 } | 360 } |
| 359 return descriptors; | 361 return descriptors; |
| 360 }, | 362 }, |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 802 * @return {!RuntimeAgent.ObjectPreview} preview | 804 * @return {!RuntimeAgent.ObjectPreview} preview |
| 803 */ | 805 */ |
| 804 _generatePreview: function(object, firstLevelKeys, secondLevelKeys, isTable, skipEntriesPreview) | 806 _generatePreview: function(object, firstLevelKeys, secondLevelKeys, isTable, skipEntriesPreview) |
| 805 { | 807 { |
| 806 var preview = this._createEmptyPreview(); | 808 var preview = this._createEmptyPreview(); |
| 807 var firstLevelKeysCount = firstLevelKeys ? firstLevelKeys.length : 0; | 809 var firstLevelKeysCount = firstLevelKeys ? firstLevelKeys.length : 0; |
| 808 | 810 |
| 809 var propertiesThreshold = { | 811 var propertiesThreshold = { |
| 810 properties: isTable ? 1000 : max(5, firstLevelKeysCount), | 812 properties: isTable ? 1000 : max(5, firstLevelKeysCount), |
| 811 indexes: isTable ? 1000 : max(100, firstLevelKeysCount), | 813 indexes: isTable ? 1000 : max(100, firstLevelKeysCount), |
| 814 characters: isTable ? Infinity : 120, | |
| 815 abbreviatedTextLength: isTable ? Infinity : 40, | |
| 812 __proto__: null | 816 __proto__: null |
| 813 }; | 817 }; |
| 814 | 818 |
| 815 try { | 819 try { |
| 816 var descriptors = injectedScript._propertyDescriptors(object, undefi ned, undefined, firstLevelKeys); | 820 var descriptors = injectedScript._propertyDescriptors(object, undefi ned, undefined, firstLevelKeys); |
| 817 | 821 |
| 818 this._appendPropertyDescriptors(preview, descriptors, propertiesThre shold, secondLevelKeys, isTable); | 822 this._appendPropertyDescriptors(preview, descriptors, propertiesThre shold, secondLevelKeys, isTable); |
| 819 if (propertiesThreshold.indexes < 0 || propertiesThreshold.propertie s < 0) | 823 if (propertiesThreshold.indexes < 0 || propertiesThreshold.propertie s < 0 || propertiesThreshold.characters < 0) |
| 820 return preview; | 824 return preview; |
| 821 | 825 |
| 822 // Add internal properties to preview. | 826 // Add internal properties to preview. |
| 823 var rawInternalProperties = InjectedScriptHost.getInternalProperties (object) || []; | 827 var rawInternalProperties = InjectedScriptHost.getInternalProperties (object) || []; |
| 824 var internalProperties = []; | 828 var internalProperties = []; |
| 825 for (var i = 0; i < rawInternalProperties.length; i += 2) { | 829 for (var i = 0; i < rawInternalProperties.length; i += 2) { |
| 826 push(internalProperties, { | 830 push(internalProperties, { |
| 827 name: rawInternalProperties[i], | 831 name: rawInternalProperties[i], |
| 828 value: rawInternalProperties[i + 1], | 832 value: rawInternalProperties[i + 1], |
| 829 isOwn: true, | 833 isOwn: true, |
| 830 enumerable: true, | 834 enumerable: true, |
| 831 __proto__: null | 835 __proto__: null |
| 832 }); | 836 }); |
| 833 } | 837 } |
| 834 this._appendPropertyDescriptors(preview, internalProperties, propert iesThreshold, secondLevelKeys, isTable); | 838 this._appendPropertyDescriptors(preview, internalProperties, propert iesThreshold, secondLevelKeys, isTable); |
| 835 | 839 |
| 836 if (this.subtype === "map" || this.subtype === "set" || this.subtype === "iterator") | 840 if (this.subtype === "map" || this.subtype === "set" || this.subtype === "iterator") |
| 837 this._appendEntriesPreview(object, preview, skipEntriesPreview); | 841 this._appendEntriesPreview(object, preview, skipEntriesPreview); |
| 838 | 842 |
| 839 } catch (e) {} | 843 } catch (e) {} |
| 840 | 844 |
| 841 return preview; | 845 return preview; |
| 842 }, | 846 }, |
| 843 | 847 |
| 844 /** | 848 /** |
| 849 * @param {*} value | |
| 850 * @return {!RuntimeAgent.ObjectPreview} | |
| 851 */ | |
| 852 _generateSubPreview: function(value) | |
| 853 { | |
| 854 var remoteObject = new InjectedScript.RemoteObject(value, undefined, tru e, undefined, true, undefined, undefined, true); | |
| 855 var valuePreview = remoteObject.preview || remoteObject._createEmptyPrev iew(); | |
| 856 return valuePreview; | |
| 857 }, | |
| 858 | |
| 859 /** | |
| 845 * @param {!RuntimeAgent.ObjectPreview} preview | 860 * @param {!RuntimeAgent.ObjectPreview} preview |
| 846 * @param {!Array.<*>|!Iterable.<*>} descriptors | 861 * @param {!Array.<*>|!Iterable.<*>} descriptors |
| 847 * @param {!Object} propertiesThreshold | 862 * @param {!Object} propertiesThreshold |
| 848 * @param {?Array.<string>=} secondLevelKeys | 863 * @param {?Array.<string>=} secondLevelKeys |
| 849 * @param {boolean=} isTable | 864 * @param {boolean=} isTable |
| 850 */ | 865 */ |
| 851 _appendPropertyDescriptors: function(preview, descriptors, propertiesThresho ld, secondLevelKeys, isTable) | 866 _appendPropertyDescriptors: function(preview, descriptors, propertiesThresho ld, secondLevelKeys, isTable) |
| 852 { | 867 { |
| 853 for (var descriptor of descriptors) { | 868 for (var descriptor of descriptors) { |
| 854 if (propertiesThreshold.indexes < 0 || propertiesThreshold.propertie s < 0) | 869 if (propertiesThreshold.indexes < 0 || propertiesThreshold.propertie s < 0) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 888 // Special-case HTMLAll. | 903 // Special-case HTMLAll. |
| 889 if (type === "undefined" && injectedScript._isHTMLAllCollection(valu e)) | 904 if (type === "undefined" && injectedScript._isHTMLAllCollection(valu e)) |
| 890 type = "object"; | 905 type = "object"; |
| 891 | 906 |
| 892 // Render own properties. | 907 // Render own properties. |
| 893 if (value === null) { | 908 if (value === null) { |
| 894 this._appendPropertyPreview(preview, { name: name, type: "object ", subtype: "null", value: "null", __proto__: null }, propertiesThreshold); | 909 this._appendPropertyPreview(preview, { name: name, type: "object ", subtype: "null", value: "null", __proto__: null }, propertiesThreshold); |
| 895 continue; | 910 continue; |
| 896 } | 911 } |
| 897 | 912 |
| 898 var maxLength = 100; | |
| 899 if (InjectedScript.primitiveTypes[type]) { | 913 if (InjectedScript.primitiveTypes[type]) { |
| 900 if (type === "string" && value.length > maxLength) | 914 if (type === "string" && value.length > propertiesThreshold.abbr eviatedTextLength) |
| 901 value = this._abbreviateString(value, maxLength, true); | 915 value = this._abbreviateString(value, Math.min(propertiesThr eshold.characters, propertiesThreshold.abbreviatedTextLength), true); |
| 902 this._appendPropertyPreview(preview, { name: name, type: type, v alue: toStringDescription(value), __proto__: null }, propertiesThreshold); | 916 this._appendPropertyPreview(preview, { name: name, type: type, v alue: toStringDescription(value), __proto__: null }, propertiesThreshold); |
| 903 continue; | 917 continue; |
| 904 } | 918 } |
| 905 | 919 |
| 906 var property = { name: name, type: type, __proto__: null }; | 920 var property = { name: name, type: type, __proto__: null }; |
| 907 var subtype = injectedScript._subtype(value); | 921 var subtype = injectedScript._subtype(value); |
| 908 if (subtype) | 922 if (subtype) |
| 909 property.subtype = subtype; | 923 property.subtype = subtype; |
| 910 | 924 |
| 911 if (secondLevelKeys === null || secondLevelKeys) { | 925 if (secondLevelKeys === null || secondLevelKeys) { |
| 912 var subPreview = this._generatePreview(value, secondLevelKeys || undefined, undefined, isTable); | 926 var subPreview = this._generatePreview(value, secondLevelKeys || undefined, undefined, isTable); |
| 913 property.valuePreview = subPreview; | 927 property.valuePreview = subPreview; |
| 914 if (subPreview.overflow) | 928 } else if ((preview.subtype === "array" || subtype === "array") && s ubtype !== "node") { |
| 915 preview.overflow = true; | 929 var subPreview = this._generateSubPreview(value); |
| 930 property.valuePreview = subPreview; | |
| 916 } else { | 931 } else { |
| 917 var description = ""; | 932 var description = ""; |
| 918 if (type !== "function") | 933 if (type !== "function") |
| 919 description = this._abbreviateString(/** @type {string} */ ( injectedScript._describe(value)), maxLength, subtype === "regexp"); | 934 description = this._abbreviateString(/** @type {string} */ ( injectedScript._describe(value)), propertiesThreshold.characters, subtype === "r egexp"); |
| 920 property.value = description; | 935 property.value = description; |
| 921 } | 936 } |
| 922 this._appendPropertyPreview(preview, property, propertiesThreshold); | 937 this._appendPropertyPreview(preview, property, propertiesThreshold); |
| 923 } | 938 } |
| 924 }, | 939 }, |
| 925 | 940 |
| 926 /** | 941 /** |
| 927 * @param {!RuntimeAgent.ObjectPreview} preview | 942 * @param {!RuntimeAgent.ObjectPreview} preview |
| 928 * @param {!Object} property | 943 * @param {!Object} property |
| 929 * @param {!Object} propertiesThreshold | 944 * @param {!Object} propertiesThreshold |
| 930 */ | 945 */ |
| 931 _appendPropertyPreview: function(preview, property, propertiesThreshold) | 946 _appendPropertyPreview: function(preview, property, propertiesThreshold) |
| 932 { | 947 { |
| 948 // Before updating indexes or properties, make sure we have enough chara cters to continue appending | |
| 949 if (propertiesThreshold.characters <= 0) { | |
| 950 preview.overflow = true; | |
| 951 return; | |
| 952 } | |
| 953 | |
| 954 // If the property name is a number | |
| 933 if (toString(property.name >>> 0) === property.name) | 955 if (toString(property.name >>> 0) === property.name) |
| 934 propertiesThreshold.indexes--; | 956 propertiesThreshold.indexes--; |
| 935 else | 957 else { |
| 936 propertiesThreshold.properties--; | 958 propertiesThreshold.properties--; |
| 959 // Only objects have keynames displayed in previews | |
| 960 propertiesThreshold.characters -= property.name.length; | |
| 961 } | |
| 962 if (property.value) | |
| 963 propertiesThreshold.characters -= property.value.length; | |
| 964 else if (property.valuePreview) { | |
| 965 var minLength = property.description ? property.description.length : 0; | |
| 966 if (property.valuePreview.description && property.valuePreview.descr iption.length < minLength) | |
| 967 minLength = property.valuePreview.description.length; | |
| 968 if (preview.subtype === "array") | |
| 969 minLength = estimatePropertyPreviewLength(property); | |
| 970 | |
| 971 propertiesThreshold.characters -= minLength; | |
| 972 } | |
| 973 | |
| 974 | |
| 975 // if (propertiesThreshold.indexes < 0 || propertiesThreshold.properties < 0 || propertiesThreshold.characters < 0) { | |
| 937 if (propertiesThreshold.indexes < 0 || propertiesThreshold.properties < 0) { | 976 if (propertiesThreshold.indexes < 0 || propertiesThreshold.properties < 0) { |
| 938 preview.overflow = true; | 977 preview.overflow = true; |
| 978 push(preview.properties, property); | |
| 939 } else { | 979 } else { |
| 940 push(preview.properties, property); | 980 push(preview.properties, property); |
| 941 } | 981 } |
| 982 | |
| 983 function estimatePropertyPreviewLength(property) | |
| 984 { | |
| 985 if (!property) { | |
| 986 return 0; | |
| 987 } else if (property.value) { | |
| 988 return property.name.length + property.value.length; | |
| 989 } else if (property.valuePreview && property.valuePreview.properties .length) { | |
| 990 var valuePreviewPropertyLengths = property.valuePreview.properti es.map((prop) => estimatePropertyPreviewLength(prop)); | |
| 991 var valuePreviewLength = valuePreviewPropertyLengths.reduce((a, b) => a + b, 0); | |
| 992 return property.name.length + ": ".length + valuePreviewLength + 2; | |
| 993 } else if (property.description) { | |
| 994 return property.description.length; | |
| 995 } else { | |
| 996 return 0; | |
| 997 } | |
| 998 } | |
| 942 }, | 999 }, |
| 943 | 1000 |
| 944 /** | 1001 /** |
| 945 * @param {!Object} object | 1002 * @param {!Object} object |
| 946 * @param {!RuntimeAgent.ObjectPreview} preview | 1003 * @param {!RuntimeAgent.ObjectPreview} preview |
| 947 * @param {boolean=} skipEntriesPreview | 1004 * @param {boolean=} skipEntriesPreview |
| 948 */ | 1005 */ |
| 949 _appendEntriesPreview: function(object, preview, skipEntriesPreview) | 1006 _appendEntriesPreview: function(object, preview, skipEntriesPreview) |
| 950 { | 1007 { |
| 951 var entries = InjectedScriptHost.collectionEntries(object); | 1008 var entries = InjectedScriptHost.collectionEntries(object); |
| 952 if (!entries) | 1009 if (!entries) |
| 953 return; | 1010 return; |
| 954 if (skipEntriesPreview) { | 1011 if (skipEntriesPreview) { |
| 955 if (entries.length) | 1012 if (entries.length) |
| 956 preview.overflow = true; | 1013 preview.overflow = true; |
| 957 return; | 1014 return; |
| 958 } | 1015 } |
| 959 preview.entries = []; | 1016 preview.entries = []; |
| 960 var entriesThreshold = 5; | 1017 var entriesThreshold = 5; |
| 961 for (var i = 0; i < entries.length; ++i) { | 1018 for (var i = 0; i < entries.length; ++i) { |
| 962 if (preview.entries.length >= entriesThreshold) { | 1019 if (preview.entries.length >= entriesThreshold) { |
| 963 preview.overflow = true; | 1020 preview.overflow = true; |
| 964 break; | 1021 break; |
| 965 } | 1022 } |
| 966 var entry = nullifyObjectProto(entries[i]); | 1023 var entry = nullifyObjectProto(entries[i]); |
| 967 var previewEntry = { | 1024 var previewEntry = { |
| 968 value: generateValuePreview(entry.value), | 1025 value: this._generateSubPreview(entry.value), |
| 969 __proto__: null | 1026 __proto__: null |
| 970 }; | 1027 }; |
| 971 if ("key" in entry) | 1028 if ("key" in entry) |
| 972 previewEntry.key = generateValuePreview(entry.key); | 1029 previewEntry.key = this._generateSubPreview(entry.key); |
| 973 push(preview.entries, previewEntry); | 1030 push(preview.entries, previewEntry); |
| 974 } | 1031 } |
| 975 | |
| 976 /** | |
| 977 * @param {*} value | |
| 978 * @return {!RuntimeAgent.ObjectPreview} | |
| 979 */ | |
| 980 function generateValuePreview(value) | |
| 981 { | |
| 982 var remoteObject = new InjectedScript.RemoteObject(value, undefined, true, undefined, true, undefined, undefined, true); | |
| 983 var valuePreview = remoteObject.preview || remoteObject._createEmpty Preview(); | |
| 984 return valuePreview; | |
| 985 } | |
| 986 }, | 1032 }, |
| 987 | 1033 |
| 988 /** | 1034 /** |
| 989 * @param {string} string | 1035 * @param {string} string |
| 990 * @param {number} maxLength | 1036 * @param {number} maxLength |
| 991 * @param {boolean=} middle | 1037 * @param {boolean=} middle |
| 992 * @return {string} | 1038 * @return {string} |
| 993 */ | 1039 */ |
| 994 _abbreviateString: function(string, maxLength, middle) | 1040 _abbreviateString: function(string, maxLength, middle) |
| 995 { | 1041 { |
| 996 if (string.length <= maxLength) | 1042 if (string.length <= maxLength) |
| 997 return string; | 1043 return string; |
| 998 if (middle) { | 1044 if (middle) { |
| 999 var leftHalf = maxLength >> 1; | 1045 var leftHalf = maxLength >> 1; |
| 1000 var rightHalf = maxLength - leftHalf - 1; | 1046 var rightHalf = maxLength - leftHalf - 1; |
| 1001 return string.substr(0, leftHalf) + "\u2026" + string.substr(string. length - rightHalf, rightHalf); | 1047 return string.substr(0, leftHalf) + "\u2026" + string.substr(string. length - rightHalf, rightHalf); |
| 1002 } | 1048 } |
| 1003 return string.substr(0, maxLength) + "\u2026"; | 1049 return string.substr(0, maxLength) + "\u2026"; |
| 1004 }, | 1050 }, |
| 1005 | 1051 |
| 1006 __proto__: null | 1052 __proto__: null |
| 1007 } | 1053 } |
| 1008 | 1054 |
| 1009 return injectedScript; | 1055 return injectedScript; |
| 1010 }) | 1056 }) |
| OLD | NEW |