Changeset 139729 in webkit
- Timestamp:
- Jan 15, 2013 1:46:29 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r139718 r139729 1 2013-01-15 Andrey Adaikin <aandrey@chromium.org> 2 3 Web Inspector: [Canvas] introduce CallArgument type into the protocol 4 https://bugs.webkit.org/show_bug.cgi?id=106640 5 6 Reviewed by Yury Semikhatsky. 7 8 Replaced hacky stub with actual Cache implementation. 9 10 * inspector/profiler/webgl/webgl-profiler-get-error.html: 11 1 12 2013-01-14 Dominic Cooney <dominicc@chromium.org> 2 13 -
trunk/LayoutTests/inspector/profiler/webgl/webgl-profiler-get-error.html
r133438 r139729 4 4 <script src="../canvas-profiler-test.js"></script> 5 5 <script> 6 7 /** 8 * @constructor 9 */ 10 function Cache() 11 { 12 this.reset(); 13 } 14 15 Cache.prototype = { 16 /** 17 * @return {number} 18 */ 19 size: function() 20 { 21 return this._size; 22 }, 23 24 reset: function() 25 { 26 /** @type {!Object.<number, Object>} */ 27 this._items = Object.create(null); 28 /** @type {number} */ 29 this._size = 0; 30 }, 31 32 /** 33 * @param {number} key 34 * @return {boolean} 35 */ 36 has: function(key) 37 { 38 return key in this._items; 39 }, 40 41 /** 42 * @param {number} key 43 * @return {Object} 44 */ 45 get: function(key) 46 { 47 return this._items[key]; 48 }, 49 50 /** 51 * @param {number} key 52 * @param {Object} item 53 */ 54 put: function(key, item) 55 { 56 if (!this.has(key)) 57 ++this._size; 58 this._items[key] = item; 59 } 60 } 6 61 7 62 var gl; … … 84 139 var errors = [rawGL.INVALID_ENUM, rawGL.INVALID_VALUE, rawGL.INVALID_OPERATION]; 85 140 errors.forEach(generateWebGLError.bind(this, rawGL)); 86 var cache = { 87 put: function() {}, 88 get: function() {} 89 }; 90 glResource.toReplayable(cache); 141 glResource.toReplayable(new Cache()); 91 142 assertNoErrors(rawGL); 92 143 assertEqualArrays(errors, getAllErrors(gl)); … … 97 148 var errors = [rawGL.INVALID_ENUM, rawGL.INVALID_VALUE, rawGL.INVALID_OPERATION]; 98 149 errors.forEach(generateWebGLError.bind(this, rawGL)); 99 var cache = { 100 put: function() {}, 101 get: function() {} 102 }; 103 glResource.toReplayable(cache); 150 glResource.toReplayable(new Cache()); 104 151 assertNoErrors(rawGL); 105 152 -
trunk/Source/WebCore/ChangeLog
r139726 r139729 1 2013-01-15 Andrey Adaikin <aandrey@chromium.org> 2 3 Web Inspector: [Canvas] introduce CallArgument type into the protocol 4 https://bugs.webkit.org/show_bug.cgi?id=106640 5 6 Reviewed by Yury Semikhatsky. 7 8 CallArgument type abstraction to describe arguments of a canvas context call. 9 Drive-by: Introduce a CanvasContext to fix the wrong contextId value in the protocol. 10 The contextId should point to the Resource that represents a context (2D or 3D canvas). 11 12 * inspector/InjectedScriptCanvasModuleSource.js: 13 (.): 14 * inspector/Inspector.json: 15 * inspector/front-end/CanvasProfileView.js: 16 1 17 2012-12-28 Vsevolod Vlasov <vsevik@chromium.org> 2 18 -
trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js
r139426 r139729 397 397 { 398 398 if (attachment) { 399 this._attachments = this._attachments || {}; 399 /** @type {Object.<string, Object>} */ 400 this._attachments = this._attachments || Object.create(null); 400 401 this._attachments[name] = attachment; 401 402 } else if (this._attachments) … … 447 448 replay: function(replayableCall, cache) 448 449 { 449 var replayObject = ReplayableResource.replay(replayableCall.re source(), cache);450 var replayObject = ReplayableResource.replay(replayableCall.replayableResource(), cache); 450 451 var replayArgs = replayableCall.args().map(function(obj) { 451 452 return ReplayableResource.replay(obj, cache); … … 503 504 * @return {ReplayableResource} 504 505 */ 505 re source: function()506 replayableResource: function() 506 507 { 507 508 return this._thisObject; … … 579 580 * @constructor 580 581 * @param {!Object} wrappedObject 581 */ 582 function Resource(wrappedObject) 582 * @param {string} name 583 */ 584 function Resource(wrappedObject, name) 583 585 { 584 586 /** @type {number} */ 585 587 this._id = ++Resource._uniqueId; 588 /** @type {string} */ 589 this._name = name || "Resource"; 590 /** @type {number} */ 591 this._kindId = Resource._uniqueKindIds[this._name] = (Resource._uniqueKindIds[this._name] || 0) + 1; 586 592 /** @type {ResourceTrackingManager} */ 587 593 this._resourceManager = null; … … 604 610 */ 605 611 Resource._uniqueId = 0; 612 613 /** 614 * @type {!Object.<string, number>} 615 */ 616 Resource._uniqueKindIds = {}; 606 617 607 618 /** … … 704 715 705 716 /** 717 * @return {ContextResource} 718 */ 719 contextResource: function() 720 { 721 if (this instanceof ContextResource) 722 return /** @type {ContextResource} */ (this); 723 724 if (this._calculatingContextResource) 725 return null; 726 727 this._calculatingContextResource = true; 728 var result = null; 729 for (var i = 0, n = this._calls.length; i < n; ++i) { 730 result = this._calls[i].resource().contextResource(); 731 if (result) 732 break; 733 } 734 delete this._calculatingContextResource; 735 console.assert(result, "Failed to find context resource for " + this._name + "@" + this._kindId); 736 return result; 737 }, 738 739 /** 706 740 * @param {!Cache} cache 707 741 * @return {!ReplayableResource} … … 713 747 return result; 714 748 var data = { 715 id: this._id 749 id: this._id, 750 name: this._name, 751 kindId: this._kindId 716 752 }; 717 753 result = new ReplayableResource(this, data); … … 721 757 }); 722 758 this._populateReplayableData(data, cache); 759 var contextResource = this.contextResource(); 760 if (contextResource !== this) 761 data.contextResource = Resource.toReplayable(contextResource, cache); 723 762 return result; 724 763 }, … … 744 783 return resource; 745 784 this._id = data.id; 785 this._name = data.name; 786 this._kindId = data.kindId; 746 787 this._resourceManager = null; 747 788 this._calls = []; … … 984 1025 985 1026 /** 986 * @param {function(new:Resource, !Object)} resourceConstructor 1027 * @param {function(new:Resource, !Object, string)} resourceConstructor 1028 * @param {string} resourceName 987 1029 * @return {function(this:Resource.WrapFunction)} 988 1030 */ 989 Resource.WrapFunction.resourceFactoryMethod = function(resourceConstructor )1031 Resource.WrapFunction.resourceFactoryMethod = function(resourceConstructor, resourceName) 990 1032 { 991 1033 /** @this Resource.WrapFunction */ … … 995 1037 if (!wrappedObject) 996 1038 return; 997 var resource = new resourceConstructor(wrappedObject );1039 var resource = new resourceConstructor(wrappedObject, resourceName); 998 1040 var manager = this._resource.manager(); 999 1041 if (manager) … … 1025 1067 1026 1068 /** 1069 * @return {string} 1070 */ 1071 description: function() 1072 { 1073 return this._data.name + "@" + this._data.kindId; 1074 }, 1075 1076 /** 1077 * @return {!ReplayableResource} 1078 */ 1079 replayableContextResource: function() 1080 { 1081 return this._data.contextResource || this; 1082 }, 1083 1084 /** 1027 1085 * @param {!Cache} cache 1028 1086 * @return {!Resource} … … 1050 1108 * @constructor 1051 1109 * @extends {Resource} 1052 */ 1053 function LogEverythingResource(wrappedObject) 1110 * @param {!Object} wrappedObject 1111 * @param {string} name 1112 */ 1113 function ContextResource(wrappedObject, name) 1054 1114 { 1055 Resource.call(this, wrappedObject); 1115 Resource.call(this, wrappedObject, name); 1116 } 1117 1118 ContextResource.prototype = { 1119 __proto__: Resource.prototype 1120 } 1121 1122 /** 1123 * @constructor 1124 * @extends {Resource} 1125 * @param {!Object} wrappedObject 1126 * @param {string} name 1127 */ 1128 function LogEverythingResource(wrappedObject, name) 1129 { 1130 Resource.call(this, wrappedObject, name); 1056 1131 } 1057 1132 … … 1087 1162 * @constructor 1088 1163 * @extends {Resource} 1089 */ 1090 function WebGLBoundResource(wrappedObject) 1164 * @param {!Object} wrappedObject 1165 * @param {string} name 1166 */ 1167 function WebGLBoundResource(wrappedObject, name) 1091 1168 { 1092 Resource.call(this, wrappedObject );1169 Resource.call(this, wrappedObject, name); 1093 1170 /** @type {!Object.<string, *>} */ 1094 1171 this._state = {}; … … 1117 1194 _doReplayCalls: function(data, cache) 1118 1195 { 1119 var state = {};1120 Object.keys(data.state).forEach(function(parameter) {1121 state[parameter] = ReplayableResource.replay(data.state[parameter], cache);1122 });1123 this._state = state;1124 1125 1196 var gl = this._replayContextResource(data, cache).wrappedObject(); 1126 1197 1198 /** @type {!Object.<string, Array.<string>>} */ 1127 1199 var bindingsData = { 1128 1200 TEXTURE_2D: ["bindTexture", "TEXTURE_BINDING_2D"], … … 1139 1211 }); 1140 1212 1213 var state = {}; 1214 Object.keys(data.state).forEach(function(parameter) { 1215 state[parameter] = ReplayableResource.replay(data.state[parameter], cache); 1216 }); 1217 this._state = state; 1141 1218 Resource.prototype._doReplayCalls.call(this, data, cache); 1142 1219 … … 1154 1231 _replayContextResource: function(data, cache) 1155 1232 { 1156 var calls = data.calls;1233 var calls = /** @type {!Array.<ReplayableCall>} */ (data.calls); 1157 1234 for (var i = 0, n = calls.length; i < n; ++i) { 1158 var resource = ReplayableResource.replay(calls[i].re source(), cache);1235 var resource = ReplayableResource.replay(calls[i].replayableResource(), cache); 1159 1236 var contextResource = WebGLRenderingContextResource.forObject(resource); 1160 1237 if (contextResource) … … 1182 1259 * @constructor 1183 1260 * @extends {WebGLBoundResource} 1184 */ 1185 function WebGLTextureResource(wrappedObject) 1261 * @param {!Object} wrappedObject 1262 * @param {string} name 1263 */ 1264 function WebGLTextureResource(wrappedObject, name) 1186 1265 { 1187 WebGLBoundResource.call(this, wrappedObject );1266 WebGLBoundResource.call(this, wrappedObject, name); 1188 1267 } 1189 1268 … … 1255 1334 var glResource = WebGLRenderingContextResource.forObject(call.resource()); 1256 1335 var gl = glResource.wrappedObject(); 1257 var framebufferResource = /** @type {WebGLFramebufferResource} */ glResource.currentBinding(gl.FRAMEBUFFER);1336 var framebufferResource = /** @type {WebGLFramebufferResource} */ (glResource.currentBinding(gl.FRAMEBUFFER)); 1258 1337 if (framebufferResource) 1259 1338 this.pushCall(new Call(glResource, "bindFramebuffer", [gl.FRAMEBUFFER, framebufferResource])); … … 1271 1350 * @constructor 1272 1351 * @extends {Resource} 1273 */ 1274 function WebGLProgramResource(wrappedObject) 1352 * @param {!Object} wrappedObject 1353 * @param {string} name 1354 */ 1355 function WebGLProgramResource(wrappedObject, name) 1275 1356 { 1276 Resource.call(this, wrappedObject );1357 Resource.call(this, wrappedObject, name); 1277 1358 } 1278 1359 … … 1301 1382 1302 1383 var uniforms = []; 1303 var uniformsCount = /** @type {number} */ gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);1384 var uniformsCount = /** @type {number} */ (gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS)); 1304 1385 for (var i = 0; i < uniformsCount; ++i) { 1305 1386 var activeInfo = gl.getActiveUniform(program, i); … … 1404 1485 * @constructor 1405 1486 * @extends {Resource} 1406 */ 1407 function WebGLShaderResource(wrappedObject) 1487 * @param {!Object} wrappedObject 1488 * @param {string} name 1489 */ 1490 function WebGLShaderResource(wrappedObject, name) 1408 1491 { 1409 Resource.call(this, wrappedObject );1492 Resource.call(this, wrappedObject, name); 1410 1493 } 1411 1494 … … 1440 1523 * @constructor 1441 1524 * @extends {WebGLBoundResource} 1442 */ 1443 function WebGLBufferResource(wrappedObject) 1525 * @param {!Object} wrappedObject 1526 * @param {string} name 1527 */ 1528 function WebGLBufferResource(wrappedObject, name) 1444 1529 { 1445 WebGLBoundResource.call(this, wrappedObject );1530 WebGLBoundResource.call(this, wrappedObject, name); 1446 1531 } 1447 1532 … … 1464 1549 * @constructor 1465 1550 * @extends {WebGLBoundResource} 1466 */ 1467 function WebGLFramebufferResource(wrappedObject) 1551 * @param {!Object} wrappedObject 1552 * @param {string} name 1553 */ 1554 function WebGLFramebufferResource(wrappedObject, name) 1468 1555 { 1469 WebGLBoundResource.call(this, wrappedObject );1556 WebGLBoundResource.call(this, wrappedObject, name); 1470 1557 } 1471 1558 … … 1487 1574 * @constructor 1488 1575 * @extends {WebGLBoundResource} 1489 */ 1490 function WebGLRenderbufferResource(wrappedObject) 1576 * @param {!Object} wrappedObject 1577 * @param {string} name 1578 */ 1579 function WebGLRenderbufferResource(wrappedObject, name) 1491 1580 { 1492 WebGLBoundResource.call(this, wrappedObject );1581 WebGLBoundResource.call(this, wrappedObject, name); 1493 1582 } 1494 1583 … … 1509 1598 /** 1510 1599 * @constructor 1511 * @extends { Resource}1600 * @extends {ContextResource} 1512 1601 * @param {!WebGLRenderingContext} glContext 1513 1602 * @param {function():WebGLRenderingContext} replayContextCallback … … 1515 1604 function WebGLRenderingContextResource(glContext, replayContextCallback) 1516 1605 { 1517 Resource.call(this, glContext);1606 ContextResource.call(this, glContext, "WebGLRenderingContext"); 1518 1607 this._replayContextCallback = replayContextCallback; 1519 1608 /** @type {Object.<number, boolean>} */ … … 1614 1703 { 1615 1704 var resource = Resource.forObject(obj); 1616 if (!resource || resource instanceof WebGLRenderingContextResource) 1617 return resource; 1618 var calls = resource.calls(); 1619 if (!calls || !calls.length) 1705 if (!resource) 1620 1706 return null; 1621 resource = calls[0].resource();1707 resource = resource.contextResource(); 1622 1708 return (resource instanceof WebGLRenderingContextResource) ? resource : null; 1623 1709 } … … 1864 1950 gl.activeTexture(glState.ACTIVE_TEXTURE); 1865 1951 1866 Resource.prototype._doReplayCalls.call(this, data, cache);1952 ContextResource.prototype._doReplayCalls.call(this, data, cache); 1867 1953 }, 1868 1954 … … 1932 2018 wrapFunctions = Object.create(null); 1933 2019 1934 wrapFunctions["createBuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLBufferResource );1935 wrapFunctions["createShader"] = Resource.WrapFunction.resourceFactoryMethod(WebGLShaderResource );1936 wrapFunctions["createProgram"] = Resource.WrapFunction.resourceFactoryMethod(WebGLProgramResource );1937 wrapFunctions["createTexture"] = Resource.WrapFunction.resourceFactoryMethod(WebGLTextureResource );1938 wrapFunctions["createFramebuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLFramebufferResource );1939 wrapFunctions["createRenderbuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLRenderbufferResource );1940 wrapFunctions["getUniformLocation"] = Resource.WrapFunction.resourceFactoryMethod(Resource );2020 wrapFunctions["createBuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLBufferResource, "WebGLBuffer"); 2021 wrapFunctions["createShader"] = Resource.WrapFunction.resourceFactoryMethod(WebGLShaderResource, "WebGLShader"); 2022 wrapFunctions["createProgram"] = Resource.WrapFunction.resourceFactoryMethod(WebGLProgramResource, "WebGLProgram"); 2023 wrapFunctions["createTexture"] = Resource.WrapFunction.resourceFactoryMethod(WebGLTextureResource, "WebGLTexture"); 2024 wrapFunctions["createFramebuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLFramebufferResource, "WebGLFramebuffer"); 2025 wrapFunctions["createRenderbuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLRenderbufferResource, "WebGLRenderbuffer"); 2026 wrapFunctions["getUniformLocation"] = Resource.WrapFunction.resourceFactoryMethod(Resource, "WebGLUniformLocation"); 1941 2027 1942 2028 /** … … 2090 2176 }, 2091 2177 2092 __proto__: Resource.prototype2178 __proto__: ContextResource.prototype 2093 2179 } 2094 2180 … … 2099 2185 /** 2100 2186 * @constructor 2101 * @extends { Resource}2187 * @extends {ContextResource} 2102 2188 * @param {!CanvasRenderingContext2D} context 2103 2189 * @param {function():CanvasRenderingContext2D} replayContextCallback … … 2105 2191 function CanvasRenderingContext2DResource(context, replayContextCallback) 2106 2192 { 2107 Resource.call(this, context);2193 ContextResource.call(this, context, "CanvasRenderingContext2D"); 2108 2194 this._replayContextCallback = replayContextCallback; 2109 2195 } … … 2434 2520 wrapFunctions = Object.create(null); 2435 2521 2436 wrapFunctions["createLinearGradient"] = Resource.WrapFunction.resourceFactoryMethod(LogEverythingResource );2437 wrapFunctions["createRadialGradient"] = Resource.WrapFunction.resourceFactoryMethod(LogEverythingResource );2438 wrapFunctions["createPattern"] = Resource.WrapFunction.resourceFactoryMethod(LogEverythingResource );2522 wrapFunctions["createLinearGradient"] = Resource.WrapFunction.resourceFactoryMethod(LogEverythingResource, "CanvasGradient"); 2523 wrapFunctions["createRadialGradient"] = Resource.WrapFunction.resourceFactoryMethod(LogEverythingResource, "CanvasGradient"); 2524 wrapFunctions["createPattern"] = Resource.WrapFunction.resourceFactoryMethod(LogEverythingResource, "CanvasPattern"); 2439 2525 2440 2526 /** … … 2473 2559 }, 2474 2560 2475 __proto__: Resource.prototype2561 __proto__: ContextResource.prototype 2476 2562 } 2477 2563 … … 2517 2603 addCall: function(call) 2518 2604 { 2519 var res = Resource.forObject(call.result());2520 if (res)2521 this.captureResource(res);2522 var size = this._replayablesCache.size();2523 2605 this._replayableCalls.push(call.toReplayable(this._replayablesCache)); 2524 console.assert(this._replayablesCache.size() === size, "Internal error: We should have captured all the resources already by this time.");2525 2606 } 2526 2607 } … … 2711 2792 * @constructor 2712 2793 */ 2713 var Injected Script= function()2794 var InjectedCanvasModule = function() 2714 2795 { 2715 2796 /** @type {!ResourceTrackingManager} */ … … 2725 2806 } 2726 2807 2727 Injected Script.prototype = {2808 InjectedCanvasModule.prototype = { 2728 2809 /** 2729 2810 * @param {!WebGLRenderingContext} glContext … … 2828 2909 for (var i = startOffset, n = calls.length; i < n; ++i) { 2829 2910 var call = calls[i]; 2830 var args = call.args().map(function(argument) { 2831 return argument + ""; 2832 }); 2911 var contextResource = call.replayableResource().replayableContextResource(); 2833 2912 var stackTrace = call.stackTrace(); 2834 2913 var callFrame = stackTrace ? stackTrace.callFrame(0) || {} : {}; 2835 2914 var traceLogItem = { 2836 contextId: this._makeContextId(c all.resource().id()),2915 contextId: this._makeContextId(contextResource.id()), 2837 2916 sourceURL: callFrame.sourceURL, 2838 2917 lineNumber: callFrame.lineNumber, … … 2841 2920 if (call.functionName()) { 2842 2921 traceLogItem.functionName = call.functionName(); 2843 traceLogItem.arguments = args; 2922 traceLogItem.arguments = call.args().map(this._createRemoteObject.bind(this)); 2923 if (call.result() !== undefined) 2924 traceLogItem.result = this._createRemoteObject(call.result()); 2844 2925 } else { 2845 traceLogItem.property = args[0];2846 traceLogItem.value = args[1];2926 traceLogItem.property = call.args()[0]; 2927 traceLogItem.value = this._createRemoteObject(call.args()[1]); 2847 2928 } 2848 var callResult = call.result();2849 if (callResult !== undefined && callResult !== null)2850 traceLogItem.result = callResult + "";2851 2929 result.calls.push(traceLogItem); 2852 2930 } 2853 2931 return result; 2932 }, 2933 2934 /** 2935 * @param {*} obj 2936 * @return {Object} 2937 */ 2938 _createRemoteObject: function(obj) 2939 { 2940 if (obj instanceof ReplayableResource) 2941 var description = obj.description(); 2942 else 2943 var description = "" + obj; 2944 return { description: description }; 2854 2945 }, 2855 2946 … … 2946 3037 } 2947 3038 2948 var injected Script = new InjectedScript();2949 return injected Script;3039 var injectedCanvasModule = new InjectedCanvasModule(); 3040 return injectedCanvasModule; 2950 3041 2951 3042 }) -
trunk/Source/WebCore/inspector/Inspector.json
r139429 r139729 3197 3197 }, 3198 3198 { 3199 "id": "CallArgument", 3200 "type": "object", 3201 "properties": [ 3202 { "name": "description", "type": "string" } 3203 ] 3204 }, 3205 { 3199 3206 "id": "Call", 3200 3207 "type": "object", … … 3202 3209 { "name": "contextId", "$ref": "ContextId" }, 3203 3210 { "name": "functionName", "type": "string", "optional": true }, 3204 { "name": "arguments", "type": "array", "items": { "type": "string" }, "optional": true }, 3211 { "name": "arguments", "type": "array", "items": { "$ref": "CallArgument" }, "optional": true }, 3212 { "name": "result", "$ref": "CallArgument", "optional": true }, 3205 3213 { "name": "property", "type": "string", "optional": true }, 3206 { "name": "value", "type": "string", "optional": true }, 3207 { "name": "result", "type": "string", "optional": true }, 3214 { "name": "value", "$ref": "CallArgument", "optional": true }, 3208 3215 { "name": "sourceURL", "type": "string", "optional": true }, 3209 3216 { "name": "lineNumber", "type": "integer", "optional": true }, -
trunk/Source/WebCore/inspector/front-end/CanvasProfileView.js
r139614 r139729 218 218 _createCallNode: function(index, call) 219 219 { 220 var traceLogItem = document.createElement("div");221 220 var data = {}; 222 221 data[0] = index + 1; … … 230 229 } 231 230 232 if (call.arguments) 233 data[1] += "(" + call.arguments.join(", ") + ")"; 234 else 235 data[1] += " = " + call.value; 231 if (call.arguments) { 232 var args = call.arguments.map(function(argument) { 233 return argument.description; 234 }); 235 data[1] += "(" + args.join(", ") + ")"; 236 } else 237 data[1] += " = " + call.value.description; 236 238 237 239 if (typeof call.result !== "undefined") 238 data[1] += " => " + call.result ;240 data[1] += " => " + call.result.description; 239 241 240 242 var node = new WebInspector.DataGridNode(data); 241 node.call = call;242 243 node.index = index; 243 244 node.selectable = true;
Note: See TracChangeset
for help on using the changeset viewer.