Title: [144722] trunk
Revision
144722
Author
[email protected]
Date
2013-03-04 22:12:18 -0800 (Mon, 04 Mar 2013)

Log Message

Web Inspector: Exceptions when WebInspector run in hosted mode.
https://bugs.webkit.org/show_bug.cgi?id=111326

Reviewed by Pavel Feldman.

Source/WebCore:

There is bug in commands code generation in InspectorBackend.js
As a consequence all protocol enums have wrong names and cause
exception when refererenced.

Currently protocol enums are referenced only from NetworkManager.

Test: inspector/inspector-backend-commands-generation.html

* inspector/front-end/InspectorBackend.js:
(InspectorBackendClass.prototype.loadFromJSONIfNeeded):
Use static method to generate code.
(InspectorBackendClass._generateCommands):
Extracted from loadFromJSONIfNeeded. Typo fixed.

LayoutTests:

Test runtime commands code generator output.

* inspector/inspector-backend-commands-generation-expected.txt: Added.
* inspector/inspector-backend-commands-generation.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (144721 => 144722)


--- trunk/LayoutTests/ChangeLog	2013-03-05 06:09:40 UTC (rev 144721)
+++ trunk/LayoutTests/ChangeLog	2013-03-05 06:12:18 UTC (rev 144722)
@@ -1,3 +1,15 @@
+2013-03-04  Eugene Klyuchnikov  <[email protected]>
+
+        Web Inspector: Exceptions when WebInspector run in hosted mode.
+        https://bugs.webkit.org/show_bug.cgi?id=111326
+
+        Reviewed by Pavel Feldman.
+
+        Test runtime commands code generator output.
+
+        * inspector/inspector-backend-commands-generation-expected.txt: Added.
+        * inspector/inspector-backend-commands-generation.html: Added.
+
 2013-03-04  Kinuko Yasuda  <[email protected]>
 
         Rebaseline 4 virtual/softwarecompositing tests.

Added: trunk/LayoutTests/inspector/inspector-backend-commands-generation-expected.txt (0 => 144722)


--- trunk/LayoutTests/inspector/inspector-backend-commands-generation-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/inspector/inspector-backend-commands-generation-expected.txt	2013-03-05 06:12:18 UTC (rev 144722)
@@ -0,0 +1,7 @@
+Tests correctness of code generated by InspectorBackend.
+
+InspectorBackend.registerEnum("Page.ResourceType", {Document: "Document", XHR: "XHR", ConsoleAPI: "console-api", Other: "other"});
+InspectorBackend.registerCommand("Page.addScriptToEvaluateOnLoad", [{"name": "scriptSource", "type": "string", "optional": false}], ["identifier"]);
+InspectorBackend.registerEvent("Page.domContentEventFired", ["timestamp"]);
+InspectorBackend.registerPageDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Page");
+

Added: trunk/LayoutTests/inspector/inspector-backend-commands-generation.html (0 => 144722)


--- trunk/LayoutTests/inspector/inspector-backend-commands-generation.html	                        (rev 0)
+++ trunk/LayoutTests/inspector/inspector-backend-commands-generation.html	2013-03-05 06:12:18 UTC (rev 144722)
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<script src=""
+<script>
+function test()
+{
+    var inspectorJson = {"domains": [{
+        "domain": "Page",
+        "types": [{
+            "id": "ResourceType",
+            "type": "string",
+            "enum": ["Document", "XHR", "console-api", "other"]
+        }],
+        "commands": [{
+            "name": "addScriptToEvaluateOnLoad",
+            "parameters": [
+                {"name": "scriptSource", "type": "string"}
+            ],
+            "returns": [
+                {"name": "identifier", "type": "string"}
+            ]
+        }],
+        "events": [{
+            "name": "domContentEventFired",
+            "parameters": [
+                {"name": "timestamp", "type": "number"}
+            ]
+        }]
+    }]};
+    var commands = InspectorBackendClass._generateCommands(inspectorJson);
+    InspectorTest.addResult(commands);
+    InspectorTest.completeTest();
+}
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Tests correctness of code generated by InspectorBackend.</p>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (144721 => 144722)


--- trunk/Source/WebCore/ChangeLog	2013-03-05 06:09:40 UTC (rev 144721)
+++ trunk/Source/WebCore/ChangeLog	2013-03-05 06:12:18 UTC (rev 144722)
@@ -1,3 +1,24 @@
+2013-03-04  Eugene Klyuchnikov  <[email protected]>
+
+        Web Inspector: Exceptions when WebInspector run in hosted mode.
+        https://bugs.webkit.org/show_bug.cgi?id=111326
+
+        Reviewed by Pavel Feldman.
+
+        There is bug in commands code generation in InspectorBackend.js
+        As a consequence all protocol enums have wrong names and cause
+        exception when refererenced.
+
+        Currently protocol enums are referenced only from NetworkManager.
+
+        Test: inspector/inspector-backend-commands-generation.html
+
+        * inspector/front-end/InspectorBackend.js:
+        (InspectorBackendClass.prototype.loadFromJSONIfNeeded):
+        Use static method to generate code.
+        (InspectorBackendClass._generateCommands):
+        Extracted from loadFromJSONIfNeeded. Typo fixed.
+
 2013-03-04  Chris Rogers  <[email protected]>
 
         Add audio hardware support for multi-channel output by implementing AudioDestinationNode.maxChannelCount

Modified: trunk/Source/WebCore/inspector/front-end/InspectorBackend.js (144721 => 144722)


--- trunk/Source/WebCore/inspector/front-end/InspectorBackend.js	2013-03-05 06:09:40 UTC (rev 144721)
+++ trunk/Source/WebCore/inspector/front-end/InspectorBackend.js	2013-03-05 06:12:18 UTC (rev 144722)
@@ -56,7 +56,7 @@
         callback.methodName = method;
         if (this.dumpInspectorTimeStats)
             callback.sendRequestTime = Date.now();
-        
+
         return callbackId;
     },
 
@@ -280,101 +280,110 @@
         var xhr = new XMLHttpRequest();
         xhr.open("GET", jsonUrl, false);
         xhr.send(null);
-    
+
         var schema = JSON.parse(xhr.responseText);
-        var jsTypes = { integer: "number", array: "object" };
-        var rawTypes = {};
-    
-        var domains = schema["domains"];
-        for (var i = 0; i < domains.length; ++i) {
-            var domain = domains[i];
-            for (var j = 0; domain.types && j < domain.types.length; ++j) {
-                var type = domain.types[j];
-                rawTypes[domain.domain + "." + type.id] = jsTypes[type.type] || type.type;
-            }
+        var code = InspectorBackendClass._generateCommands(schema);
+        eval(code);
+    }
+}
+
+/**
+ * @param {*} schema
+ * @return {string}
+ */
+InspectorBackendClass._generateCommands = function(schema) {
+    var jsTypes = { integer: "number", array: "object" };
+    var rawTypes = {};
+    var result = [];
+
+    var domains = schema["domains"] || [];
+    for (var i = 0; i < domains.length; ++i) {
+        var domain = domains[i];
+        for (var j = 0; domain.types && j < domain.types.length; ++j) {
+            var type = domain.types[j];
+            rawTypes[domain.domain + "." + type.id] = jsTypes[type.type] || type.type;
         }
+    }
 
-        function toUpperCase(groupIndex, group0, group1)
-        {
-            return [group0, group1][groupIndex].toUpperCase();
+    function toUpperCase(groupIndex, group0, group1)
+    {
+        return [group0, group1][groupIndex].toUpperCase();
+    }
+    function generateEnum(enumName, items)
+    {
+        var members = []
+        for (var m = 0; m < items.length; ++m) {
+            var value = items[m];
+            var name = value.replace(/-(\w)/g, toUpperCase.bind(null, 1)).toTitleCase();
+            name = name.replace(/HTML|XML|WML|API/ig, toUpperCase.bind(null, 0));
+            members.push(name + ": \"" + value +"\"");
         }
-        function generateEnum(enumName, items)
-        {
-            var members = []
-            for (var m = 0; m < items.length; ++m) {
-                var value = items[m];
-                var name = value.replace(/-(\w)/g, toUpperCase.bind(null, 1)).toTitleCase();
-                name = name.replace(/HTML|XML|WML|API/ig, toUpperCase.bind(null, 0));
-                members.push(name + ": \"" + value +"\"");
+        return "InspectorBackend.registerEnum(\"" + enumName + "\", {" + members.join(", ") + "});";
+    }
+
+    for (var i = 0; i < domains.length; ++i) {
+        var domain = domains[i];
+
+        var types = domain["types"] || [];
+        for (var j = 0; j < types.length; ++j) {
+            var type = types[j];
+            if ((type["type"] === "string") && type["enum"])
+                result.push(generateEnum(domain.domain + "." + type.id, type["enum"]));
+            else if (type["type"] === "object") {
+                var properties = type["properties"] || [];
+                for (var k = 0; k < properties.length; ++k) {
+                    var property = properties[k];
+                    if ((property["type"] === "string") && property["enum"])
+                        result.push(generateEnum(domain.domain + "." + type.id + property["name"].toTitleCase(), property["enum"]));
+                }
             }
-            return "InspectorBackend.registerEnum(\"" + enumName + "s\", {" + members.join(", ") + "});\n";
         }
-    
-        var result = [];
-        for (var i = 0; i < domains.length; ++i) {
-            var domain = domains[i];
 
-            var types = domain["types"] || [];
-            for (var j = 0; j < types.length; ++j) {
-                var type = types[j];
-                if ((type["type"] === "string") && type["enum"])
-                    result.push(generateEnum(domain.domain + "." + type.id, type["enum"]));
-                else if (type["type"] === "object") {
-                    var properties = type["properties"] || [];
-                    for (var k = 0; k < properties.length; ++k) {
-                        var property = properties[k];
-                        if ((property["type"] === "string") && property["enum"])
-                            result.push(generateEnum(domain.domain + "." + type.id + property["name"].toTitleCase(), property["enum"]));
-                    }
+        var commands = domain["commands"] || [];
+        for (var j = 0; j < commands.length; ++j) {
+            var command = commands[j];
+            var parameters = command["parameters"];
+            var paramsText = [];
+            for (var k = 0; parameters && k < parameters.length; ++k) {
+                var parameter = parameters[k];
+
+                var type;
+                if (parameter.type)
+                    type = jsTypes[parameter.type] || parameter.type;
+                else {
+                    var ref = parameter["$ref"];
+                    if (ref.indexOf(".") !== -1)
+                        type = rawTypes[ref];
+                    else
+                        type = rawTypes[domain.domain + "." + ref];
                 }
+
+                var text = "{\"name\": \"" + parameter.name + "\", \"type\": \"" + type + "\", \"optional\": " + (parameter.optional ? "true" : "false") + "}";
+                paramsText.push(text);
             }
 
-            var commands = domain["commands"] || [];    
-            for (var j = 0; j < commands.length; ++j) {
-                var command = commands[j];
-                var parameters = command["parameters"];
-                var paramsText = [];
-                for (var k = 0; parameters && k < parameters.length; ++k) {
-                    var parameter = parameters[k];
-    
-                    var type;
-                    if (parameter.type)
-                        type = jsTypes[parameter.type] || parameter.type;
-                    else {
-                        var ref = parameter["$ref"];
-                        if (ref.indexOf(".") !== -1)
-                            type = rawTypes[ref];
-                        else
-                            type = rawTypes[domain.domain + "." + ref];
-                    }
-    
-                    var text = "{\"name\": \"" + parameter.name + "\", \"type\": \"" + type + "\", \"optional\": " + (parameter.optional ? "true" : "false") + "}";
-                    paramsText.push(text);
-                }
-    
-                var returnsText = [];
-                var returns = command["returns"] || [];
-                for (var k = 0; k < returns.length; ++k) {
-                    var parameter = returns[k];
-                    returnsText.push("\"" + parameter.name + "\"");
-                }
-                result.push("InspectorBackend.registerCommand(\"" + domain.domain + "." + command.name + "\", [" + paramsText.join(", ") + "], [" + returnsText.join(", ") + "]);");
+            var returnsText = [];
+            var returns = command["returns"] || [];
+            for (var k = 0; k < returns.length; ++k) {
+                var parameter = returns[k];
+                returnsText.push("\"" + parameter.name + "\"");
             }
-    
-            for (var j = 0; domain.events && j < domain.events.length; ++j) {
-                var event = domain.events[j];
-                var paramsText = [];
-                for (var k = 0; event.parameters && k < event.parameters.length; ++k) {
-                    var parameter = event.parameters[k];
-                    paramsText.push("\"" + parameter.name + "\"");
-                }
-                result.push("InspectorBackend.registerEvent(\"" + domain.domain + "." + event.name + "\", [" + paramsText.join(", ") + "]);");
+            result.push("InspectorBackend.registerCommand(\"" + domain.domain + "." + command.name + "\", [" + paramsText.join(", ") + "], [" + returnsText.join(", ") + "]);");
+        }
+
+        for (var j = 0; domain.events && j < domain.events.length; ++j) {
+            var event = domain.events[j];
+            var paramsText = [];
+            for (var k = 0; event.parameters && k < event.parameters.length; ++k) {
+                var parameter = event.parameters[k];
+                paramsText.push("\"" + parameter.name + "\"");
             }
-    
-            result.push("InspectorBackend.register" + domain.domain + "Dispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, \"" + domain.domain + "\");");
+            result.push("InspectorBackend.registerEvent(\"" + domain.domain + "." + event.name + "\", [" + paramsText.join(", ") + "]);");
         }
-        eval(result.join("\n"));
+
+        result.push("InspectorBackend.register" + domain.domain + "Dispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, \"" + domain.domain + "\");");
     }
+    return result.join("\n");
 }
 
 InspectorBackend = new InspectorBackendClass();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to