2011-04-13 Ilya Tikhonovsky <loislo@chromium.org>
authorloislo@chromium.org <loislo@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Apr 2011 15:44:38 +0000 (15:44 +0000)
committerloislo@chromium.org <loislo@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Apr 2011 15:44:38 +0000 (15:44 +0000)
        Reviewed by Yury Semikhatsky.

        Web Inspector: there is a problem if an optional param is not at the end of a params list.
        https://bugs.webkit.org/show_bug.cgi?id=58440

        In InspectorBackend.dispatch method we are converting the message's params object into array of arguments
        for a callback. But in some cases the optional parameter is declared in the middle of the params list.
        That gets us into a problem if this param has been skipped in the message. In that case the tail of the
        event params will be shifted. We can slightly modify dispatcher and it will put the params in right places.

        * inspector/CodeGeneratorInspector.pm:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@83739 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/inspector/CodeGeneratorInspector.pm

index 1f38afd76de2af63000a1059770e67c177389708..bc8118acc89e61e08290dc3355fa8355277da436 100644 (file)
@@ -1,3 +1,17 @@
+2011-04-13  Ilya Tikhonovsky  <loislo@chromium.org>
+
+        Reviewed by Yury Semikhatsky.
+
+        Web Inspector: there is a problem if an optional param is not at the end of a params list.
+        https://bugs.webkit.org/show_bug.cgi?id=58440
+
+        In InspectorBackend.dispatch method we are converting the message's params object into array of arguments
+        for a callback. But in some cases the optional parameter is declared in the middle of the params list.
+        That gets us into a problem if this param has been skipped in the message. In that case the tail of the
+        event params will be shifted. We can slightly modify dispatcher and it will put the params in right places.
+
+        * inspector/CodeGeneratorInspector.pm:
+
 2011-04-13  Ben Taylor  <bentaylor.solx86@gmail.com>
 
         Reviewed by Eric Seidel.
index 454d911f55fc93c464a684ea8b0f6996bffc4519..de8e1db4925c647f56d12bf536b80368a81ec499 100644 (file)
@@ -223,6 +223,7 @@ my @backendConstantDeclarations;
 my @backendConstantDefinitions;
 my @backendFooter;
 my @backendJSStubs;
+my @backendJSEvents;
 my %backendDomains;
 
 my $frontendClassName;
@@ -348,6 +349,7 @@ sub generateFunctions
     }
 
     collectBackendJSStubFunctions($interface);
+    collectBackendJSStubEvents($interface);
 }
 
 sub generateFrontendFunction
@@ -681,9 +683,24 @@ sub collectBackendJSStubFunctions
     }
 }
 
+sub collectBackendJSStubEvents
+{
+    my $interface = shift;
+    my @functions = grep($_->signature->extendedAttributes->{"event"}, @{$interface->functions});
+    my $domain = $interface->name;
+
+    foreach my $function (@functions) {
+        my $name = $domain . "." . $function->signature->name;
+        my @outArgs = grep($_->direction eq "out", @{$function->parameters});
+        my $argumentNames = join(",", map("\"" . $_->name . "\"" , @outArgs));
+        push(@backendJSEvents, "    this._eventArgs[\"" . $name . "\"] = [" . $argumentNames ."];");
+    }
+}
+
 sub generateBackendStubJS
 {
     my $JSStubs = join("\n", @backendJSStubs);
+    my $JSEvents = join("\n", @backendJSEvents);
     my $inspectorBackendStubJS = << "EOF";
 $licenseTemplate
 
@@ -693,7 +710,9 @@ InspectorBackendStub = function()
     this._pendingResponsesCount = 0;
     this._callbacks = {};
     this._domainDispatchers = {};
+    this._eventArgs = {};
 $JSStubs
+$JSEvents
 }
 
 InspectorBackendStub.prototype = {
@@ -811,10 +830,16 @@ InspectorBackendStub.prototype = {
                 return;
             }
 
+            if (!this._eventArgs[messageObject.method]) {
+                console.error("Protocol Error: Attempted to dispatch an unspecified method '" + messageObject.method + "'");
+                return;
+            }
+
             var params = [];
             if (messageObject.params) {
-                for (var key in messageObject.params)
-                    params.push(messageObject.params[key]);
+                var paramNames = this._eventArgs[messageObject.method];
+                for (var i = 0; i < paramNames.length; ++i)
+                    params.push(messageObject.params[paramNames[i]]);
             }
 
             dispatcher[functionName].apply(dispatcher, params);