Diff
Modified: trunk/Source/WebCore/ChangeLog (129876 => 129877)
--- trunk/Source/WebCore/ChangeLog 2012-09-28 12:02:32 UTC (rev 129876)
+++ trunk/Source/WebCore/ChangeLog 2012-09-28 12:09:12 UTC (rev 129877)
@@ -1,3 +1,18 @@
+2012-09-28 Andrey Adaikin <[email protected]>
+
+ Web Inspector: [Canvas] log property setters too along with function calls
+ https://bugs.webkit.org/show_bug.cgi?id=97776
+
+ Reviewed by Pavel Feldman.
+
+ Trace logs should also contain property setter calls.
+
+ * inspector/InjectedScriptCanvasModuleSource.js:
+ (.):
+ * inspector/Inspector.json:
+ * inspector/front-end/CanvasProfileView.js:
+ (WebInspector.CanvasProfileView.prototype._showTraceLog):
+
2012-09-28 Kent Tamura <[email protected]>
Remove LocalizedNumber*.*
Modified: trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js (129876 => 129877)
--- trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js 2012-09-28 12:02:32 UTC (rev 129876)
+++ trunk/Source/WebCore/inspector/InjectedScriptCanvasModuleSource.js 2012-09-28 12:09:12 UTC (rev 129877)
@@ -288,6 +288,9 @@
this._args = Array.prototype.slice.call(args, 0);
this._result = result;
this._stackTrace = stackTrace || null;
+
+ if (!this._functionName)
+ console.assert(this._args.length === 2 && typeof this._args[0] === "string");
}
Call.prototype = {
@@ -308,6 +311,14 @@
},
/**
+ * @return {boolean}
+ */
+ isPropertySetter: function()
+ {
+ return !this._functionName;
+ },
+
+ /**
* @return {Array}
*/
args: function()
@@ -382,18 +393,24 @@
replay: function(replayableCall, cache)
{
var replayObject = ReplayableResource.replay(replayableCall.resource(), cache);
- var replayFunction = replayObject[replayableCall.functionName()];
- console.assert(typeof replayFunction === "function", "Expected a function to replay");
var replayArgs = replayableCall.args().map(function(obj) {
return ReplayableResource.replay(obj, cache);
});
- var replayResult = replayFunction.apply(replayObject, replayArgs);
- if (replayableCall.result() instanceof ReplayableResource) {
- var resource = replayableCall.result().replay(cache);
- if (!resource.wrappedObject())
- resource.setWrappedObject(replayResult);
+ var replayResult = undefined;
+
+ if (replayableCall.isPropertySetter())
+ replayObject[replayArgs[0]] = replayArgs[1];
+ else {
+ var replayFunction = replayObject[replayableCall.functionName()];
+ console.assert(typeof replayFunction === "function", "Expected a function to replay");
+ replayResult = replayFunction.apply(replayObject, replayArgs);
+ if (replayableCall.result() instanceof ReplayableResource) {
+ var resource = replayableCall.result().replay(cache);
+ if (!resource.wrappedObject())
+ resource.setWrappedObject(replayResult);
+ }
}
-
+
this._thisObject = replayObject;
this._functionName = replayableCall.functionName();
this._args = replayArgs;
@@ -439,6 +456,14 @@
},
/**
+ * @return {boolean}
+ */
+ isPropertySetter: function()
+ {
+ return !this._functionName;
+ },
+
+ /**
* @return {Array.<ReplayableResource|*>}
*/
args: function()
@@ -699,12 +724,7 @@
{
return wrappedObject[property];
},
- set: function(value)
- {
- // FIXME: Log the setter calls.
- console.error("FIXME: Setting an attribute %s was not logged.", property);
- wrappedObject[property] = value;
- },
+ set: self._wrapPropertySetter(self, wrappedObject, property),
enumerable: true
});
}
@@ -773,6 +793,30 @@
},
/**
+ * @param {Resource} resource
+ * @param {Object} originalObject
+ * @param {string} propertyName
+ * @return {Function}
+ */
+ _wrapPropertySetter: function(resource, originalObject, propertyName)
+ {
+ return function(value)
+ {
+ var manager = resource.manager();
+ if (!manager || !manager.capturing()) {
+ originalObject[propertyName] = value;
+ return;
+ }
+ var args = [propertyName, value];
+ manager.captureArguments(resource, args);
+ originalObject[propertyName] = value;
+ var stackTrace = StackTrace.create(1, arguments.callee);
+ var call = new Call(resource, "", args, undefined, stackTrace);
+ manager.captureCall(call);
+ };
+ },
+
+ /**
* @return {Object.<string, Function>}
*/
_customWrapFunctions: function()
@@ -2270,14 +2314,20 @@
var stackTrace = call.stackTrace();
var callFrame = stackTrace ? stackTrace.callFrame(0) || {} : {};
var traceLogItem = {
- functionName: call.functionName(),
- arguments: args,
sourceURL: callFrame.sourceURL,
lineNumber: callFrame.lineNumber,
columnNumber: callFrame.columnNumber
};
- if (call.result())
- traceLogItem.result = call.result() + "";
+ if (call.functionName()) {
+ traceLogItem.functionName = call.functionName();
+ traceLogItem.arguments = args;
+ } else {
+ traceLogItem.property = args[0];
+ traceLogItem.value = args[1];
+ }
+ var callResult = call.result();
+ if (callResult !== undefined && callResult !== null)
+ traceLogItem.result = callResult + "";
result.calls.push(traceLogItem);
}
return result;
Modified: trunk/Source/WebCore/inspector/Inspector.json (129876 => 129877)
--- trunk/Source/WebCore/inspector/Inspector.json 2012-09-28 12:02:32 UTC (rev 129876)
+++ trunk/Source/WebCore/inspector/Inspector.json 2012-09-28 12:09:12 UTC (rev 129877)
@@ -3101,8 +3101,10 @@
"id": "Call",
"type": "object",
"properties": [
- { "name": "functionName", "type": "string" },
- { "name": "arguments", "type": "array", "items": { "type": "string" } },
+ { "name": "functionName", "type": "string", "optional": true },
+ { "name": "arguments", "type": "array", "items": { "type": "string" }, "optional": true },
+ { "name": "property", "type": "string", "optional": true },
+ { "name": "value", "type": "string", "optional": true },
{ "name": "result", "type": "string", "optional": true },
{ "name": "sourceURL", "type": "string", "optional": true },
{ "name": "lineNumber", "type": "integer", "optional": true },
Modified: trunk/Source/WebCore/inspector/front-end/CanvasProfileView.js (129876 => 129877)
--- trunk/Source/WebCore/inspector/front-end/CanvasProfileView.js 2012-09-28 12:02:32 UTC (rev 129876)
+++ trunk/Source/WebCore/inspector/front-end/CanvasProfileView.js 2012-09-28 12:09:12 UTC (rev 129877)
@@ -110,17 +110,22 @@
traceLogItem.stepNo = i;
traceLogItem.appendChild(document.createTextNode("(" + (i+1) + ") "));
+ var sourceText = call.functionName || "context." + call.property;
if (call.sourceURL) {
// FIXME(62725): stack trace line/column numbers are one-based.
var lineNumber = Math.max(0, call.lineNumber - 1) || 0;
var columnNumber = Math.max(0, call.columnNumber - 1) || 0;
var linkElement = this._linkifier.linkifyLocation(call.sourceURL, lineNumber, columnNumber);
- linkElement.textContent = call.functionName;
+ linkElement.textContent = sourceText;
traceLogItem.appendChild(linkElement);
} else
- traceLogItem.appendChild(document.createTextNode(call.functionName));
+ traceLogItem.appendChild(document.createTextNode(sourceText));
- traceLogItem.appendChild(document.createTextNode("(" + call.arguments.join(", ") + ")"));
+ if (call.arguments)
+ traceLogItem.appendChild(document.createTextNode("(" + call.arguments.join(", ") + ")"));
+ else
+ traceLogItem.appendChild(document.createTextNode(" = " + call.value));
+
if (typeof call.result !== "undefined")
traceLogItem.appendChild(document.createTextNode(" => " + call.result));
this._traceLogElement.appendChild(traceLogItem);