[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

caseq at chromium.org caseq at chromium.org
Wed Dec 22 16:29:37 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit da50e9550894fd59045a8032c044784ddd914131
Author: caseq at chromium.org <caseq at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Nov 24 18:03:41 2010 +0000

    2010-11-24  Andrey Kosyakov  <caseq at chromium.org>
    
            Reviewed by Pavel Feldman.
    
            Web Inspector: extension API cleanup
            https://bugs.webkit.org/show_bug.cgi?id=50019
    
            * inspector/front-end/ElementsPanel.js:
            (WebInspector.ElementsPanel.this.treeOutline.focusedNodeChanged):
            (WebInspector.ElementsPanel):
            * inspector/front-end/ExtensionAPI.js: See bug for summary of extension API changes.
            (WebInspector.injectedExtensionAPI.Resources.resourceDispatch):
            (WebInspector.injectedExtensionAPI):
            (WebInspector.injectedExtensionAPI.Resources.prototype.getHAR):
            (WebInspector.injectedExtensionAPI.ResourceImpl.prototype.getContent):
            (WebInspector.injectedExtensionAPI.Panels.prototype.create):
            (WebInspector.injectedExtensionAPI.PanelImpl):
            (WebInspector.injectedExtensionAPI.PanelWithSidebarImpl):
            (WebInspector.injectedExtensionAPI.PanelWithSidebarImpl.prototype.createSidebarPane):
            (WebInspector.injectedExtensionAPI.PanelWithSidebarImpl.prototype.createWatchExpressionSidebarPane):
            (WebInspector.injectedExtensionAPI.ElementsPanel):
            (WebInspector.injectedExtensionAPI.ExtensionSidebarPaneImpl.prototype.setHeight):
            (WebInspector.injectedExtensionAPI.Audits.prototype.addCategory):
            (WebInspector.injectedExtensionAPI.AuditCategoryImpl.auditResultDispatch):
            (WebInspector.injectedExtensionAPI.AuditCategoryImpl):
            (WebInspector.injectedExtensionAPI.AuditResultImpl.prototype.get Severity):
            (WebInspector.injectedExtensionAPI.InspectedWindow):
            (WebInspector.injectedExtensionAPI.InspectedWindow.prototype.eval):
            * inspector/front-end/ExtensionCommon.js:
            (WebInspector.commonExtensionSymbols):
            * inspector/front-end/ExtensionServer.js:
            (WebInspector.ExtensionServer):
            (WebInspector.ExtensionServer.prototype.notifyObjectSelected):
            (WebInspector.ExtensionServer.prototype.notifyResourceFinished):
            (WebInspector.ExtensionServer.prototype.notifyPageLoaded):
            (WebInspector.ExtensionServer.prototype.notifyPageDOMContentLoaded):
            (WebInspector.ExtensionServer.prototype._onCreatePanel):
            (WebInspector.ExtensionServer.prototype._onReload):
            (WebInspector.ExtensionServer.prototype._onGetHAR):
            (WebInspector.ExtensionServer.prototype._onGetResourceContent):
            (WebInspector.ExtensionServer.prototype._onAddAuditCategory):
            (WebInspector.ExtensionServer.prototype._buildExtensionAPIInjectedScript):
            * inspector/front-end/HAREntry.js:
            (WebInspector.HARLog):
            (WebInspector.HARLog.prototype.build):
            (WebInspector.HARLog.prototype._convertResource):
            * inspector/front-end/inspector.js:
            (WebInspector.domContentEventFired):
            (WebInspector.loadEventFired):
            (WebInspector.didCommitLoad):
    
    2010-11-24  Andrey Kosyakov  <caseq at chromium.org>
    
            Reviewed by Pavel Feldman.
    
            Web Inspector: extension API cleanup
            Improve synchronization between different parts of the test to reduce flakiness.
            https://bugs.webkit.org/show_bug.cgi?id=50019
    
            * http/tests/inspector/inspector-test2.js: Clean inspected page test output before pushing output from front-end.
            (initialize_InspectorTest.InspectorTest.completeTest): Delay test completion until page's onload is completed after reload.
            (initialize_InspectorTest.InspectorTest.addResult.clearResults):
            (initialize_InspectorTest.InspectorTest.reloadPageIfNeeded):
            (output):
            * inspector/extensions-api-expected.txt:
            * inspector/extensions-audits-api-expected.txt:
            * inspector/extensions-audits-expected.txt:
            * inspector/extensions-audits-tests.js:
            (extension_runAudits):
            (initialize_ExtensionsAuditsTest.InspectorTest.startExtensionAudits.onAuditsDone):
            (initialize_ExtensionsAuditsTest.InspectorTest.startExtensionAudits):
            (initialize_ExtensionsAuditsTest):
            (test):
            * inspector/extensions-eval-expected.txt:
            * inspector/extensions-eval.html:
            * inspector/extensions-events-expected.txt:
            * inspector/extensions-events.html:
            * inspector/extensions-resources-expected.txt:
            * inspector/extensions-resources.html:
            * inspector/extensions-test.js:
            (initialize_ExtensionsTest.InspectorTest.dispatchOnMessage):
            (initialize_ExtensionsTest.InspectorTest.runExtensionTests):
            (initialize_ExtensionsTest.extensionOutput):
            (initialize_ExtensionsTest.dumpSidebarContent):
            (initialize_ExtensionsTest.reloadPage):
            * inspector/extensions.html:
            * inspector/resources/extension-main.html:
            * inspector/resources/extension-main.js:
            (fetchTests.callback):
            (fetchTests):
            (onTestsDone):
            (dispatchOnFrontend):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72683 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 6b5f759..954b2ab 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,45 @@
+2010-11-24  Andrey Kosyakov  <caseq at chromium.org>
+
+        Reviewed by Pavel Feldman.
+
+        Web Inspector: extension API cleanup
+        Improve synchronization between different parts of the test to reduce flakiness.
+        https://bugs.webkit.org/show_bug.cgi?id=50019
+
+        * http/tests/inspector/inspector-test2.js: Clean inspected page test output before pushing output from front-end.
+        (initialize_InspectorTest.InspectorTest.completeTest): Delay test completion until page's onload is completed after reload.
+        (initialize_InspectorTest.InspectorTest.addResult.clearResults):
+        (initialize_InspectorTest.InspectorTest.reloadPageIfNeeded):
+        (output):
+        * inspector/extensions-api-expected.txt:
+        * inspector/extensions-audits-api-expected.txt:
+        * inspector/extensions-audits-expected.txt:
+        * inspector/extensions-audits-tests.js:
+        (extension_runAudits):
+        (initialize_ExtensionsAuditsTest.InspectorTest.startExtensionAudits.onAuditsDone):
+        (initialize_ExtensionsAuditsTest.InspectorTest.startExtensionAudits):
+        (initialize_ExtensionsAuditsTest):
+        (test):
+        * inspector/extensions-eval-expected.txt:
+        * inspector/extensions-eval.html:
+        * inspector/extensions-events-expected.txt:
+        * inspector/extensions-events.html:
+        * inspector/extensions-resources-expected.txt:
+        * inspector/extensions-resources.html:
+        * inspector/extensions-test.js:
+        (initialize_ExtensionsTest.InspectorTest.dispatchOnMessage):
+        (initialize_ExtensionsTest.InspectorTest.runExtensionTests):
+        (initialize_ExtensionsTest.extensionOutput):
+        (initialize_ExtensionsTest.dumpSidebarContent):
+        (initialize_ExtensionsTest.reloadPage):
+        * inspector/extensions.html:
+        * inspector/resources/extension-main.html:
+        * inspector/resources/extension-main.js:
+        (fetchTests.callback):
+        (fetchTests):
+        (onTestsDone):
+        (dispatchOnFrontend):
+
 2010-11-23  Jeremy Orlow  <jorlow at chromium.org>
 
         Reviewed by Steve Block.
diff --git a/LayoutTests/http/tests/inspector/inspector-test2.js b/LayoutTests/http/tests/inspector/inspector-test2.js
index 6db579c..9a130ee 100644
--- a/LayoutTests/http/tests/inspector/inspector-test2.js
+++ b/LayoutTests/http/tests/inspector/inspector-test2.js
@@ -38,11 +38,17 @@ InspectorTest.addResult = function(text)
     if (resultsSynchronized)
         addResultToPage(text);
     else {
+        clearResults();
         for (var i = 0; i < results.length; ++i)
             addResultToPage(results[i]);
         resultsSynchronized = true;
     }
 
+    function clearResults()
+    {
+        InspectorTest.evaluateInPage("Array.prototype.forEach.call(document.body.querySelectorAll('div.output'), function(node) { node.parentNode.removeChild(node); })");
+    }
+
     function addResultToPage(text)
     {
         InspectorTest.evaluateInPage("output(unescape('" + escape(text) + "'))");
@@ -87,8 +93,10 @@ InspectorTest.reloadPageIfNeeded = function(callback)
     if (!InspectorTest._pageWasReloaded) {
         InspectorTest._pageWasReloaded = true;
         InspectorTest.reloadPage(callback);
-    } else
-        callback();
+    } else {
+        if (callback)
+            callback();
+    }
 }
 
 InspectorTest.pageReloaded = function()
@@ -229,7 +237,7 @@ function didEvaluateForTestInFrontend(callId)
 function output(text)
 {
     var outputElement = document.createElement("div");
-    outputElement.id = "output";
+    outputElement.className = "output";
     outputElement.style.whiteSpace = "pre";
     outputElement.appendChild(document.createTextNode(text));
     outputElement.appendChild(document.createElement("br"));
diff --git a/LayoutTests/inspector/extensions-api-expected.txt b/LayoutTests/inspector/extensions-api-expected.txt
index 5657eea..c941f63 100644
--- a/LayoutTests/inspector/extensions-api-expected.txt
+++ b/LayoutTests/inspector/extensions-api-expected.txt
@@ -1,6 +1,5 @@
 Tests public interface of WebInspector Extensions API
 
-Page reloaded.
 Started extension.
 Running tests...
 RUNNING TEST: extension_testAPI
@@ -9,37 +8,29 @@ RUNNING TEST: extension_testAPI
         addCategory : <function>
     }
     inspectedWindow : {
-        onLoaded : {
+        onDOMContentLoaded : {
             addListener : <function>
             removeListener : <function>
         }
-        onNavigated : {
+        onLoaded : {
             addListener : <function>
             removeListener : <function>
         }
-        onDOMContentLoaded : {
+        onNavigated : {
             addListener : <function>
             removeListener : <function>
         }
         reload : <function>
-        evaluate : <function>
+        eval : <function>
     }
     panels : {
         elements : {
-            onSelectionChanged : {
-                addListener : <function>
-                removeListener : <function>
-            }
             createSidebarPane : <function>
             createWatchExpressionSidebarPane : <function>
-        }
-        scripts : {
             onSelectionChanged : {
                 addListener : <function>
                 removeListener : <function>
             }
-            createSidebarPane : <function>
-            createWatchExpressionSidebarPane : <function>
         }
         create : <function>
     }
@@ -59,10 +50,7 @@ RUNNING TEST: extension_testAPI
             WebSocket : "websocket"
             Other : "other"
         }
-        getAll : <function>
-        get : <function>
-        getPageTimings : <function>
-        getContent : <function>
+        getHAR : <function>
     }
     onReset : {
         addListener : <function>
diff --git a/LayoutTests/inspector/extensions-audits-api-expected.txt b/LayoutTests/inspector/extensions-audits-api-expected.txt
index f14b6bb..034aafd 100644
--- a/LayoutTests/inspector/extensions-audits-api-expected.txt
+++ b/LayoutTests/inspector/extensions-audits-api-expected.txt
@@ -1,6 +1,5 @@
 Tests audits support in WebInspector Extensions API
 
-Page reloaded.
 Started extension.
 Running tests...
 RUNNING TEST: extension_testAuditsAPI
@@ -11,6 +10,7 @@ Added audit category, result dump follows:
         removeListener : <function>
     }
 }
+  Extension audits
 category.onAuditStarted fired, results dump follows:
 {
     url : <function>
@@ -34,6 +34,5 @@ category.onAuditStarted fired, results dump follows:
     expanded : false
     addChild : <function>
 }
-  Extension audits
 All tests done.
 
diff --git a/LayoutTests/inspector/extensions-audits-expected.txt b/LayoutTests/inspector/extensions-audits-expected.txt
index e25f32c..894a7ea 100644
--- a/LayoutTests/inspector/extensions-audits-expected.txt
+++ b/LayoutTests/inspector/extensions-audits-expected.txt
@@ -1,12 +1,9 @@
 Tests audits support in WebInspector Extensions API
 
-Page reloaded.
 Started extension.
 Running tests...
 RUNNING TEST: extension_testAudits
 Added audit category.
-category.onAuditStarted fired
-failedCategory.onAuditStarted fired, throwing exception
   Extension audits
     Failed rule (42)
      this rule always fails
@@ -25,5 +22,7 @@ failedCategory.onAuditStarted fired, throwing exception
     Passed rule
      this rule always passes ok
   Extension audits that fail
+category.onAuditStarted fired
+failedCategory.onAuditStarted fired, throwing exception
 All tests done.
 
diff --git a/LayoutTests/inspector/extensions-audits-tests.js b/LayoutTests/inspector/extensions-audits-tests.js
index 3bb1fc2..b2064fc 100644
--- a/LayoutTests/inspector/extensions-audits-tests.js
+++ b/LayoutTests/inspector/extensions-audits-tests.js
@@ -1,18 +1,12 @@
 function extension_runAudits(callback)
 {
-    function onMessage(event)
-    {
-        if (event.data === "audits-complete")
-            callback();
-    }
-    window.addEventListener("message", onMessage, false);
-    top.postMessage("run-audits", "*");
+    dispatchOnFrontend({ command: "run-audits" }, callback);
 }
 
 // runs in front-end
 var initialize_ExtensionsAuditsTest = function()
 {
-    InspectorTest.startExtensionAudits = function() 
+    InspectorTest.startExtensionAudits = function(message, port)
     {
         const launcherView = WebInspector.panels.audits._launcherView;
         launcherView._selectAllClicked(false);
@@ -27,11 +21,10 @@ var initialize_ExtensionsAuditsTest = function()
         function onAuditsDone()
         {
             InspectorTest.collectAuditResults();
-            for (var i = 0; i < frames.length; ++i)
-                frames[i].postMessage("audits-complete", "*");
+            port.postMessage("");
         }
-
         InspectorTest._addSniffer(WebInspector.panels.audits, "_auditFinishedCallback", onAuditsDone, true);
+
         launcherView._launchButtonClicked();
     }
 }
@@ -41,4 +34,3 @@ var test = function()
     InspectorTest.dispatchOnMessage("run-audits", InspectorTest.startExtensionAudits);
     InspectorTest.runExtensionTests();
 }
-
diff --git a/LayoutTests/inspector/extensions-eval-expected.txt b/LayoutTests/inspector/extensions-eval-expected.txt
index 4c589f5..3d39f2f 100644
--- a/LayoutTests/inspector/extensions-eval-expected.txt
+++ b/LayoutTests/inspector/extensions-eval-expected.txt
@@ -1,6 +1,5 @@
 Tests WebInspector extension API
 
-Page reloaded.
 Started extension.
 Running tests...
 RUNNING TEST: extension_testEvalConsoleAPI
diff --git a/LayoutTests/inspector/extensions-eval.html b/LayoutTests/inspector/extensions-eval.html
index ed54e8a..4fd3f9c 100755
--- a/LayoutTests/inspector/extensions-eval.html
+++ b/LayoutTests/inspector/extensions-eval.html
@@ -8,39 +8,39 @@ window.inspectedValue = { str: "foo", num: 42 };
 
 function extension_testEvalOk(nextTest)
 {
-    webInspector.inspectedWindow.evaluate("inspectedValue", callbackAndNextTest(extension_onEvaluate, nextTest));
+    webInspector.inspectedWindow.eval("inspectedValue", callbackAndNextTest(extension_onEval, nextTest));
 }
 
 function extension_testEvalFailed(nextTest)
 {
-    webInspector.inspectedWindow.evaluate("document.body", callbackAndNextTest(extension_onEvaluate, nextTest));
+    webInspector.inspectedWindow.eval("document.body", callbackAndNextTest(extension_onEval, nextTest));
 }
 
 function extension_testEvalDefinesGlobalSymbols(nextTest)
 {
-    webInspector.inspectedWindow.evaluate("function extensionFunc() {}");
-    webInspector.inspectedWindow.evaluate("extensionVar = 42;");
-    webInspector.inspectedWindow.evaluate("({ func: typeof window.extensionFunc, variable: window.extensionVar })", callbackAndNextTest(extension_onEvaluate, nextTest));
+    webInspector.inspectedWindow.eval("function extensionFunc() {}");
+    webInspector.inspectedWindow.eval("extensionVar = 42;");
+    webInspector.inspectedWindow.eval("({ func: typeof window.extensionFunc, variable: window.extensionVar })", callbackAndNextTest(extension_onEval, nextTest));
 }
 
 function extension_testEvalStatement(nextTest)
 {
-    webInspector.inspectedWindow.evaluate("var x = 3; while (--x); x", callbackAndNextTest(extension_onEvaluate, nextTest));
+    webInspector.inspectedWindow.eval("var x = 3; while (--x); x", callbackAndNextTest(extension_onEval, nextTest));
 }
 
 function extension_testEvalUndefined(nextTest)
 {
-    webInspector.inspectedWindow.evaluate("undefined", callbackAndNextTest(extension_onEvaluate, nextTest));
+    webInspector.inspectedWindow.eval("undefined", callbackAndNextTest(extension_onEval, nextTest));
 }
 
 function extension_testEvalConsoleAPI(nextTest)
 {
-    webInspector.inspectedWindow.evaluate("typeof inspect", callbackAndNextTest(extension_onEvaluate, nextTest));
+    webInspector.inspectedWindow.eval("typeof inspect", callbackAndNextTest(extension_onEval, nextTest));
 }
 
-function extension_onEvaluate(result)
+function extension_onEval(value, isException)
 {
-    output("Evaluate: " + JSON.stringify(result.value) + " (exception: " + result.isException + ")");
+    output("Evaluate: " + JSON.stringify(value) + " (exception: " + isException + ")");
 }
 
 </script>
diff --git a/LayoutTests/inspector/extensions-events-expected.txt b/LayoutTests/inspector/extensions-events-expected.txt
index ca143a8..29be03a 100644
--- a/LayoutTests/inspector/extensions-events-expected.txt
+++ b/LayoutTests/inspector/extensions-events-expected.txt
@@ -1,23 +1,15 @@
 CONSOLE MESSAGE: line 669: [object HTMLParagraphElement]
 Tests WebInspector extension API
 
-Page reloaded.
 Started extension.
 Running tests...
 RUNNING TEST: extension_testOnResourceFinished
-Got callback, arguments dump follows:
-{
-    0 : {
-        id : <number>
-        type : "other"
-        har : <object>
-    }
-}
+onFinished fired
 RUNNING TEST: extension_testOnSelectionChanged
-Got callback, arguments dump follows:
-{
-    0 : "DOMNode"
-    1 : undefined
-}
+onSelectionChanged fired
+RUNNING TEST: extension_testPageLoadEvents
+onDOMContentLoaded fired: number
+onLoaded fired: number
+Page reloaded.
 All tests done.
 
diff --git a/LayoutTests/inspector/extensions-events.html b/LayoutTests/inspector/extensions-events.html
index 99fe534..3d61701 100755
--- a/LayoutTests/inspector/extensions-events.html
+++ b/LayoutTests/inspector/extensions-events.html
@@ -4,26 +4,46 @@
 <script src="extensions-test.js"></script>
 <script type="text/javascript">
 
-function extension_callback(nondetermenisticProps)
-{
-    output("Got callback, arguments dump follows:");
-    dumpObject(Array.prototype.slice.call(arguments, 1), nondetermenisticProps);
-}
 
 function extension_testOnSelectionChanged(nextTest)
 {
-    webInspector.panels.elements.onSelectionChanged.addListener(callbackAndNextTest(bind(extension_callback, null, null), nextTest));
-    webInspector.inspectedWindow.evaluate("inspect(document.body.children[0])");
+    function onSelectionChanged()
+    {
+        webInspector.panels.elements.onSelectionChanged.removeListener(onSelectionChanged);
+        output("onSelectionChanged fired");
+        nextTest();
+    }
+    webInspector.panels.elements.onSelectionChanged.addListener(onSelectionChanged);
+    webInspector.inspectedWindow.eval("inspect(document.body.children[0])");
 }
 
 function extension_testOnResourceFinished(nextTest)
 {
-    var nondetermenisticProps = {
-        har: 1,
-        id: 1
-    };
-    webInspector.resources.onFinished.addListener(callbackAndNextTest(bind(extension_callback, null, nondetermenisticProps), nextTest));
-    webInspector.inspectedWindow.evaluate("var xhr = new XMLHttpRequest(); xhr.open('GET', '" + location.href + "', false); xhr.send(null);");
+    function onFinished()
+    {
+        webInspector.resources.onFinished.removeListener(onFinished);
+        output("onFinished fired");
+        nextTest();
+    }
+    webInspector.resources.onFinished.addListener(onFinished);
+    webInspector.inspectedWindow.eval("var xhr = new XMLHttpRequest(); xhr.open('GET', '" + location.href + "', false); xhr.send(null);");
+}
+
+function extension_testPageLoadEvents(nextTest)
+{
+    var callbackCount = 0;
+    webInspector.inspectedWindow.onDOMContentLoaded.addListener(function(time) {
+        output("onDOMContentLoaded fired: " + typeof time);
+    });
+    webInspector.inspectedWindow.onLoaded.addListener(function(time) {
+        output("onLoaded fired: " + typeof time);
+        if (++callbackCount > 1)
+            nextTest();
+    });
+    dispatchOnFrontend({ command: "reload" }, function() {
+        if (++callbackCount > 1)
+            nextTest();
+    });
 }
 
 </script>
diff --git a/LayoutTests/inspector/extensions-expected.txt b/LayoutTests/inspector/extensions-expected.txt
index 87bb928..033d69c 100644
--- a/LayoutTests/inspector/extensions-expected.txt
+++ b/LayoutTests/inspector/extensions-expected.txt
@@ -1,18 +1,11 @@
 Tests WebInspector extension API
 
-Page reloaded.
 Started extension.
 Running tests...
 RUNNING TEST: extension_testCreatePanel
 done createPanel
 Panel created
 {
-    onSelectionChanged : {
-        addListener : <function>
-        removeListener : <function>
-    }
-    createSidebarPane : <function>
-    createWatchExpressionSidebarPane : <function>
     onSearch : {
         addListener : <function>
         removeListener : <function>
@@ -22,10 +15,9 @@ RUNNING TEST: extension_testCreateSidebar
 Sidebar created
 {
     setHeight : <function>
-    setExpanded : <function>
 }
 RUNNING TEST: extension_testExtensionWatchSidebarExpression
-Sidebar content: titlef0: "expression"f1: undefinedf2: nullf3: Objectf4: Array[0]f5: Array[3]f6: Objectf7: 42f8: Locationf9: HTMLCollection[26]f10: function () {}__proto__: Object
+Sidebar content: titlef0: "expression"f1: undefinedf2: nullf3: Objectf4: Array[0]f5: Array[3]f6: Objectf7: 42f8: Locationf9: HTMLCollection[18]f10: function () {}__proto__: Object
 RUNNING TEST: extension_testExtensionWatchSidebarObject
 Watch sidebar created, callback arguments dump follows:
 {
@@ -37,7 +29,6 @@ Watch sidebar created, callback arguments dump follows:
         setExpression : <function>
         setObject : <function>
         setHeight : <function>
-        setExpanded : <function>
     }
 }
 Sidebar content: f0: "object"f1: undefinedf2: nullf3: { }f4: [0]f5: [3]f6: {...}f7: 42
diff --git a/LayoutTests/inspector/extensions-resources-expected.txt b/LayoutTests/inspector/extensions-resources-expected.txt
index e9b47af..b1e3b9a 100644
--- a/LayoutTests/inspector/extensions-resources-expected.txt
+++ b/LayoutTests/inspector/extensions-resources-expected.txt
@@ -4,50 +4,26 @@ Tests WebInspector extension API
 Page reloaded.
 Started extension.
 Running tests...
-RUNNING TEST: extension_testGetAllResources
-resource: .../tests/inspector/inspector-test2.js, type: script
-resource: .../LayoutTests/inspector/extensions-resources.html, type: document
-resource: .../LayoutTests/inspector/extensions-resources.html, type: xhr
-resource: .../LayoutTests/inspector/extensions-test.js, type: script
-resource: .../inspector/resources/abe.png, type: image
-resource: .../inspector/resources/Ahem.ttf, type: font
-resource: .../inspector/resources/audits-style1.css, type: stylesheet
-resource: .../inspector/resources/missing-image.png, type: other
-RUNNING TEST: extension_testGetInvalidResource
-Attempted to retrieve invalid resource: {"code":"E_NOTFOUND","description":"Object not found: %s","details":[2128506],"isError":true}
-RUNNING TEST: extension_testGetPageTimings
-Got callback from getPageTimings, pageTimings dump follows
-{
-    onContentLoad : <number>
-    onLoad : <number>
-}
+RUNNING TEST: extension_testGetHAR
+resource: .../tests/inspector/inspector-test2.js
+resource: .../LayoutTests/inspector/extensions-resources.html
+resource: .../LayoutTests/inspector/extensions-resources.html
+resource: .../LayoutTests/inspector/extensions-test.js
+resource: .../inspector/resources/abe.png
+resource: .../inspector/resources/Ahem.ttf
+resource: .../inspector/resources/audits-style1.css
+resource: .../inspector/resources/missing-image.png
 RUNNING TEST: extension_testGetResourceContent
 {
-    0 : {
-        code : "E_NOTFOUND"
-        description : "Object not found: %s"
-        details : {
-            0 : 2126506
-        }
-        isError : true
-    }
-    1 : {
-        id : <number>
-        encoding : ""
-        content : ".some-style {
+    0 : ".some-style {
     vertical-align: middle;
 }"
-    }
-    2 : {
-        id : <number>
-        encoding : "base64"
-        content : "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"
-    }
-    3 : {
-        id : <number>
-        encoding : "base64"
-        content : ""
-    }
+    1 : ""
+}
+RUNNING TEST: extension_testGetResourceContentEncoded
+{
+    0 : "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"
+    1 : "base64"
 }
 RUNNING TEST: extension_testResourceNotification
 Resource finished: .../LayoutTests/inspector/extensions-resources.html
diff --git a/LayoutTests/inspector/extensions-resources.html b/LayoutTests/inspector/extensions-resources.html
index 02f33a2..046086f 100755
--- a/LayoutTests/inspector/extensions-resources.html
+++ b/LayoutTests/inspector/extensions-resources.html
@@ -14,44 +14,25 @@ p { font-family: 'test'; }
 <script src="extensions-test.js"></script>
 <script type="text/javascript">
 
-function extension_testGetAllResources(nextTest)
+function extension_testGetHAR(nextTest)
 {
-    function compareResources(a, b)
+    function compareEntries(a, b)
     {
-        return a.har.request.url.toLowerCase().localeCompare(b.har.request.url.toLowerCase());
+        return a.request.url.toLowerCase().localeCompare(b.request.url.toLowerCase());
     }
 
-    function onResource(result)
+    function onHAR(result)
     {
-        var resources = result.sort(compareResources);
+        result.entries.sort(compareEntries);
 
-        for (var i = 0; i < resources.length; ++i)
-            output("resource: " + resources[i].har.request.url.replace(/.*((\/[^/]*){3}$)/,"...$1") + ", type: " + resources[i].type);
+        for (var i = 0; i < result.entries.length; ++i)
+            output("resource: " + result.entries[i].request.url.replace(/.*((\/[^/]*){3}$)/,"...$1"));
     }
     extension_doXHR(function() {
-        webInspector.resources.getAll(callbackAndNextTest(onResource, nextTest));
+        webInspector.resources.getHAR(callbackAndNextTest(onHAR, nextTest));
     });
 }
 
-function extension_testGetInvalidResource(nextTest)
-{
-    function onResource(result)
-    {
-        output("Attempted to retrieve invalid resource: " + JSON.stringify(result));
-    }
-    webInspector.resources.get(2128506, callbackAndNextTest(onResource, nextTest));
-}
-
-function extension_testGetPageTimings(nextTest)
-{
-    function onTimings(result)
-    {
-        output("Got callback from getPageTimings, pageTimings dump follows");
-        dumpObject(result, { onContentLoad: 1, onLoad: 1 });
-    }
-    webInspector.resources.getPageTimings(callbackAndNextTest(onTimings, nextTest));
-}
-
 function doXHR()
 {
     var xhr = new XMLHttpRequest();
@@ -61,14 +42,14 @@ function doXHR()
 
 function extension_doXHR(callback)
 {
-    webInspector.inspectedWindow.evaluate("doXHR()", callback);
+    webInspector.inspectedWindow.eval("doXHR()", callback);
 }
 
 function extension_testResourceNotification(nextTest)
 {
     function onResourceFinished(resource)
     {
-        output("Resource finished: " + resource.har.request.url.replace(/.*((\/[^/]*){3}$)/,"...$1"));
+        output("Resource finished: " + resource.request.url.replace(/.*((\/[^/]*){3}$)/,"...$1"));
     }
 
     webInspector.resources.onFinished.addListener(callbackAndNextTest(onResourceFinished, nextTest));
@@ -77,44 +58,45 @@ function extension_testResourceNotification(nextTest)
 
 function extension_getResourceByUrl(urls, callback)
 {
-    function onGotResources(response)
+    function onHAR(response)
     {
-        var ids = [];
-        for (var i = 0; i < response.length; ++i) {
+        var entries = response.entries;
+        for (var i = 0; i < entries.length; ++i) {
             for (var url = 0; url < urls.length; ++url) {
-                if (urls[url].test(response[i].har.request.url))
-                    ids.push(response[i].id);
+                if (urls[url].test(entries[i].request.url)) {
+                    callback(entries[i]);
+                    return;
+                }
             }
         }
-        callback(ids);
     }
-    webInspector.resources.getAll(onGotResources);
+    webInspector.resources.getHAR(onHAR);
 }
 
-function extension_onResourceBodies(response)
+function extension_onResourceBody(content, encoding)
 {
-    function compareBodies(a, b)
-    {
-        return ((a.response && a.response.content) || "").localeCompare((b.response && b.response.content) || "");
-    }
-    dumpObject(response, { id: 1 });
+    dumpObject(Array.prototype.slice.call(arguments));
 }
 
 function extension_testGetResourceContent(nextTest)
 {
-    extension_getResourceByUrl([/audits-style1.css$/], function(ids) {
-        webInspector.resources.getContent(ids[0], callbackAndNextTest(extension_onResourceBodies, nextTest));
+    extension_getResourceByUrl([/audits-style1.css$/], function(resource) {
+        resource.getContent(callbackAndNextTest(extension_onResourceBody, nextTest));
     });
 }
 
-function extension_testGetResourceContent(nextTest)
+function extension_testGetResourceContentEncoded(nextTest)
 {
-    extension_getResourceByUrl([/abe.png$/, /missing-image.png$/, /audits-style1.css$/ ], function(ids) {
-        ids.push(2126506); // Non-existent resource id.
-        webInspector.resources.getContent(ids, callbackAndNextTest(extension_onResourceBodies, nextTest));
+    extension_getResourceByUrl([/abe.png$/ ], function(resource) {
+        resource.getContent(callbackAndNextTest(extension_onResourceBody, nextTest));
     });
 }
 
+var test = function()
+{
+    InspectorTest.reloadPage(InspectorTest.runExtensionTests);
+}
+
 </script>
 </head>
 <body onload="runTest()">
diff --git a/LayoutTests/inspector/extensions-test.js b/LayoutTests/inspector/extensions-test.js
index a51f712..79c848d 100644
--- a/LayoutTests/inspector/extensions-test.js
+++ b/LayoutTests/inspector/extensions-test.js
@@ -21,43 +21,50 @@ InspectorTest.dispatchOnMessage = function(messageId, callback, recurring)
 {
     function onMessage(event)
     {
-        if (event.data !== messageId)
+        if (typeof(event.data) !== "object" || event.data.command !== messageId)
             return;
         if (!recurring)
             window.removeEventListener("message", onMessage, false);
-        callback();
-        if (event.ports && event.ports[0])
-            event.ports[0].postMessage("");
+        var port = event.ports && event.ports[0];
+        if (callback(event.data, port) && port)
+            port.postMessage("");
     }
     window.addEventListener("message", onMessage, false);
 }
 
 InspectorTest.runExtensionTests = function()
 {
-    function addExtension(callback)
-    {
-        InjectedScriptAccess.getDefault().evaluate("location.href", "console", function(result) {
-            var extensionURL = result.description.replace(/\/[^/]*$/, "/resources/extension-main.html");
-            WebInspector.addExtensions([{ startPage: extensionURL }]);
-            if (callback)
-                callback();
-        });
-    } 
-    InspectorTest.dispatchOnMessage("extension-tests-done", function() {
-        InspectorTest.completeTest();
+    InjectedScriptAccess.getDefault().evaluate("location.href", "console", function(result) {
+        var extensionURL = result.description.replace(/\/[^/]*$/, "/resources/extension-main.html");
+        WebInspector.addExtensions([{ startPage: extensionURL }]);
     });
-    InspectorTest.reloadPageIfNeeded(addExtension);
 }
 
-InspectorTest.dumpSidebarContent = function()
+InspectorTest.dispatchOnMessage("extension-tests-done", InspectorTest.completeTest, true);
+
+function extensionOutput(message)
+{
+    InspectorTest.addResult(message.text);
+}
+InspectorTest.dispatchOnMessage("output", extensionOutput, true);
+
+function dumpSidebarContent()
 {
-    var sidebarPanes = WebInspector.panels.scripts.sidebarPanes;
+    var sidebarPanes = WebInspector.panels.elements.sidebarPanes;
     // the sidebar of interest is presumed to always be last.
     var sidebar = sidebarPanes[Object.keys(sidebarPanes).pop()];
     InspectorTest.addResult("Sidebar content: " + sidebar.bodyElement.textContent);
+    return true;
 }
+InspectorTest.dispatchOnMessage("dump-sidebar-content", dumpSidebarContent, true);
 
-InspectorTest.dispatchOnMessage("dump-sidebar-content", InspectorTest.dumpSidebarContent, true);
+function reloadPage(data, port)
+{
+    InspectorTest.reloadPage(function() {
+        port.postMessage("");
+    });
+}
+InspectorTest.dispatchOnMessage("reload", reloadPage, true);
 
 }
 
diff --git a/LayoutTests/inspector/extensions.html b/LayoutTests/inspector/extensions.html
index 08f0238..0ee2919 100644
--- a/LayoutTests/inspector/extensions.html
+++ b/LayoutTests/inspector/extensions.html
@@ -11,7 +11,7 @@ function extension_testCreatePanel(nextTest)
         output("Panel created");
         dumpObject(panel);
     }
-    webInspector.panels.create("Test Panel", "extension-panel.html", "extension-panel.png", callbackAndNextTest(onPanelCreated, nextTest));
+    webInspector.panels.create("Test Panel", "extension-panel.png", "extension-panel.html", callbackAndNextTest(onPanelCreated, nextTest));
     output("done createPanel");
 }
 
@@ -22,12 +22,12 @@ function extension_testCreateSidebar(nextTest)
         output("Sidebar created");
         dumpObject(sidebar);
     }
-    webInspector.panels.scripts.createSidebarPane("Test Sidebar", "extension-sidebar.html", callbackAndNextTest(onSidebarCreated, nextTest));
+    webInspector.panels.elements.createSidebarPane("Test Sidebar", "extension-sidebar.html", callbackAndNextTest(onSidebarCreated, nextTest));
 }
 
 function extension_dumpSidebarContent(nextTest)
 {
-    dispatchOnFrontend("dump-sidebar-content", nextTest);
+    dispatchOnFrontend({ command: "dump-sidebar-content" }, nextTest);
 }
 
 function extension_testExtensionWatchSidebarObject(nextTest)
@@ -48,7 +48,7 @@ function extension_testExtensionWatchSidebarObject(nextTest)
             f7: 42
         });
     }
-    webInspector.panels.scripts.createWatchExpressionSidebarPane("Watch Test: Object", onSidebarCreated);
+    webInspector.panels.elements.createWatchExpressionSidebarPane("Watch Test: Object", onSidebarCreated);
 }
 
 function extension_testExtensionWatchSidebarExpression(nextTest)
@@ -74,7 +74,7 @@ function extension_testExtensionWatchSidebarExpression(nextTest)
         }
         sidebar.setExpression("(" + expression.toString() + ")();", "title");
     }
-    webInspector.panels.scripts.createWatchExpressionSidebarPane("Watch Test: Expression", onSidebarCreated);
+    webInspector.panels.elements.createWatchExpressionSidebarPane("Watch Test: Expression", onSidebarCreated);
 }
 
 </script>
diff --git a/LayoutTests/inspector/resources/extension-main.html b/LayoutTests/inspector/resources/extension-main.html
index 82d17cc..1d0b54e 100644
--- a/LayoutTests/inspector/resources/extension-main.html
+++ b/LayoutTests/inspector/resources/extension-main.html
@@ -2,14 +2,13 @@
 <head>
 <script src="../../http/tests/inspector/inspector-test.js"></script>
 <script type="text/javascript">
-function output(message, callback)
+function output(message)
 {
-    webInspector.inspectedWindow.evaluate("output(unescape('" + escape(message) + "'));", callback);
+    top.postMessage({ command: "output", text: message }, "*");
 }
 
 output("Started extension.");
 </script>
-
 <script src="extension-main.js"></script>
 </head>
 </html>
diff --git a/LayoutTests/inspector/resources/extension-main.js b/LayoutTests/inspector/resources/extension-main.js
index d0f1c2e..e94bd23 100644
--- a/LayoutTests/inspector/resources/extension-main.js
+++ b/LayoutTests/inspector/resources/extension-main.js
@@ -2,10 +2,10 @@ function fetchTests()
 {
     function callback(result)
     {
-         window.eval(result.value);
+         window.eval(result);
          runTests();
     }
-    webInspector.inspectedWindow.evaluate("extensionFunctions()", callback);
+    webInspector.inspectedWindow.eval("extensionFunctions()", callback);
 }
 
 function runTests()
@@ -25,9 +25,8 @@ function runTests()
 
 function onTestsDone()
 {
-    output("All tests done.", function() {
-        top.postMessage("extension-tests-done","*");
-    });
+    output("All tests done.");
+    top.postMessage({ command: "extension-tests-done" }, "*");
 }
 
 function runTest(test, name)
@@ -49,7 +48,8 @@ function dispatchOnFrontend(message, callback)
     }
     var channel = new MessageChannel();
     channel.port1.start();
-    channel.port1.addEventListener("message", callbackWrapper, false);
+    if (callback)
+        channel.port1.addEventListener("message", callbackWrapper, false);
     top.postMessage(message, [ channel.port2 ], "*");
 }
 
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index d76f0c8..a3ffc21 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,54 @@
+2010-11-24  Andrey Kosyakov  <caseq at chromium.org>
+
+        Reviewed by Pavel Feldman.
+
+        Web Inspector: extension API cleanup
+        https://bugs.webkit.org/show_bug.cgi?id=50019
+
+        * inspector/front-end/ElementsPanel.js:
+        (WebInspector.ElementsPanel.this.treeOutline.focusedNodeChanged):
+        (WebInspector.ElementsPanel):
+        * inspector/front-end/ExtensionAPI.js: See bug for summary of extension API changes.
+        (WebInspector.injectedExtensionAPI.Resources.resourceDispatch):
+        (WebInspector.injectedExtensionAPI):
+        (WebInspector.injectedExtensionAPI.Resources.prototype.getHAR):
+        (WebInspector.injectedExtensionAPI.ResourceImpl.prototype.getContent):
+        (WebInspector.injectedExtensionAPI.Panels.prototype.create):
+        (WebInspector.injectedExtensionAPI.PanelImpl):
+        (WebInspector.injectedExtensionAPI.PanelWithSidebarImpl):
+        (WebInspector.injectedExtensionAPI.PanelWithSidebarImpl.prototype.createSidebarPane):
+        (WebInspector.injectedExtensionAPI.PanelWithSidebarImpl.prototype.createWatchExpressionSidebarPane):
+        (WebInspector.injectedExtensionAPI.ElementsPanel):
+        (WebInspector.injectedExtensionAPI.ExtensionSidebarPaneImpl.prototype.setHeight):
+        (WebInspector.injectedExtensionAPI.Audits.prototype.addCategory):
+        (WebInspector.injectedExtensionAPI.AuditCategoryImpl.auditResultDispatch):
+        (WebInspector.injectedExtensionAPI.AuditCategoryImpl):
+        (WebInspector.injectedExtensionAPI.AuditResultImpl.prototype.get Severity):
+        (WebInspector.injectedExtensionAPI.InspectedWindow):
+        (WebInspector.injectedExtensionAPI.InspectedWindow.prototype.eval):
+        * inspector/front-end/ExtensionCommon.js:
+        (WebInspector.commonExtensionSymbols):
+        * inspector/front-end/ExtensionServer.js:
+        (WebInspector.ExtensionServer):
+        (WebInspector.ExtensionServer.prototype.notifyObjectSelected):
+        (WebInspector.ExtensionServer.prototype.notifyResourceFinished):
+        (WebInspector.ExtensionServer.prototype.notifyPageLoaded):
+        (WebInspector.ExtensionServer.prototype.notifyPageDOMContentLoaded):
+        (WebInspector.ExtensionServer.prototype._onCreatePanel):
+        (WebInspector.ExtensionServer.prototype._onReload):
+        (WebInspector.ExtensionServer.prototype._onGetHAR):
+        (WebInspector.ExtensionServer.prototype._onGetResourceContent):
+        (WebInspector.ExtensionServer.prototype._onAddAuditCategory):
+        (WebInspector.ExtensionServer.prototype._buildExtensionAPIInjectedScript):
+        * inspector/front-end/HAREntry.js:
+        (WebInspector.HARLog):
+        (WebInspector.HARLog.prototype.build):
+        (WebInspector.HARLog.prototype._convertResource):
+        * inspector/front-end/inspector.js:
+        (WebInspector.domContentEventFired):
+        (WebInspector.loadEventFired):
+        (WebInspector.didCommitLoad):
+
 2010-11-23  Jeremy Orlow  <jorlow at chromium.org>
 
         Reviewed by Steve Block.
diff --git a/WebCore/inspector/front-end/ElementsPanel.js b/WebCore/inspector/front-end/ElementsPanel.js
index 76c22c5..61ba33e 100644
--- a/WebCore/inspector/front-end/ElementsPanel.js
+++ b/WebCore/inspector/front-end/ElementsPanel.js
@@ -58,7 +58,7 @@ WebInspector.ElementsPanel = function()
 
         if (this._focusedDOMNode) {
             InspectorBackend.addInspectedNode(this._focusedDOMNode.id);
-            WebInspector.extensionServer.notifyObjectSelected(this.panel.name, "DOMNode");
+            WebInspector.extensionServer.notifyObjectSelected(this.panel.name);
         }
     };
 
diff --git a/WebCore/inspector/front-end/ExtensionAPI.js b/WebCore/inspector/front-end/ExtensionAPI.js
index e526cf5..0234994 100644
--- a/WebCore/inspector/front-end/ExtensionAPI.js
+++ b/WebCore/inspector/front-end/ExtensionAPI.js
@@ -104,109 +104,130 @@ InspectorExtensionAPI.prototype = {
 
 function Resources()
 {
-    this.onFinished = new EventSink("resource-finished");
+    function resourceDispatch(request)
+    {
+        var resource = request.arguments[1];
+        resource.__proto__ = new Resource(request.arguments[0]);
+        this._fire(resource);
+    }
+    this.onFinished = new EventSink("resource-finished", resourceDispatch);
 }
 
 Resources.prototype = {
-    getAll: function(callback)
-    {
-        return extensionServer.sendRequest({ command: "getResources" }, callback);
-    },
-
-    get: function(id, callback)
+    getHAR: function(callback)
     {
-        return extensionServer.sendRequest({ command: "getResources", id: id }, callback);
-    },
+        function callbackWrapper(result)
+        {
+            var entries = (result && result.entries) || [];
+            for (var i = 0; i < entries.length; ++i) {
+                entries[i].__proto__ = new Resource(entries[i]._resourceId);
+                delete entries[i]._resourceId;
+            }
+            callback(result);
+        }
+        return extensionServer.sendRequest({ command: "getHAR" }, callback && callbackWrapper);
+    }
+}
 
-    getPageTimings: function(callback)
-    {
-        return extensionServer.sendRequest({ command: "getPageTimings" }, callback);
-    },
+function ResourceImpl(id)
+{
+    this._id = id;
+}
 
-    getContent: function(ids, callback)
+ResourceImpl.prototype = {
+    getContent: function(callback)
     {
-        return extensionServer.sendRequest({ command: "getResourceContent", ids: ids }, callback);
+        function callbackWrapper(response)
+        {
+            callback(response.content, response.encoding);
+        }
+        extensionServer.sendRequest({ command: "getResourceContent", id: this._id }, callback && callbackWrapper);
     }
-}
-
-var wellKnownPanelNames = [
-    "elements",
-    "scripts"
-];
+};
 
 function Panels()
 {
-    var panels = [];
+    var panels = {
+        elements: new ElementsPanel()
+    };
+
     function panelGetter(name)
     {
         return panels[name];
     }
-
-    for (var i = 0; i < wellKnownPanelNames.length; ++i) {
-        var name = wellKnownPanelNames[i];
-        panels[name] = new Panel(name);
-        this.__defineGetter__(name, bind(panelGetter, null, name));
-    }
+    for (var panel in panels)
+        this.__defineGetter__(panel, bind(panelGetter, null, panel));
 }
 
 Panels.prototype = {
-    create: function(label, pageURL, iconURL, callback)
+    create: function(title, iconURL, pageURL, callback)
     {
         var id = "extension-panel-" + extensionServer.nextObjectId();
-        function callbackWrapper(result)
-        {
-            if (result.isError)
-                callback(result);
-            else {
-                panel = new ExtensionPanel(id);
-                callback(panel);
-            }
-        }
         var request = {
             command: "createPanel",
             id: id,
-            label: label,
-            url: expandURL(pageURL),
-            icon: expandURL(iconURL)
+            title: title,
+            icon: expandURL(iconURL),
+            url: expandURL(pageURL)
         };
-        extensionServer.sendRequest(request, callback && bind(callbackWrapper, this));
+        extensionServer.sendRequest(request, callback && bind(callback, this, new ExtensionPanel(id)));
     }
 }
 
 function PanelImpl(id)
 {
     this._id = id;
-    this.onSelectionChanged = new EventSink("panel-objectSelected-" + id);
 }
 
-PanelImpl.prototype = {
+function PanelWithSidebarImpl(id)
+{
+    PanelImpl.call(this, id);
+}
+
+PanelWithSidebarImpl.prototype = {
     createSidebarPane: function(title, url, callback)
     {
         var id = "extension-sidebar-" + extensionServer.nextObjectId();
-        function callbackWrapper(result)
+        var request = {
+            command: "createSidebarPane",
+            panel: this._id,
+            id: id,
+            title: title,
+            url: expandURL(url)
+        };
+        function callbackWrapper()
         {
-            if (result.isError)
-                callback(result);
-            else
-                callback(new ExtensionSidebarPane(id));
+            callback(new ExtensionSidebarPane(id));
         }
-        extensionServer.sendRequest({ command: "createSidebarPane", panel: this._id, id: id, title: title, url: expandURL(url) }, callback && callbackWrapper);
+        extensionServer.sendRequest(request, callback && callbackWrapper);
     },
 
     createWatchExpressionSidebarPane: function(title, callback)
     {
         var id = "watch-sidebar-" + extensionServer.nextObjectId();
-        function callbackWrapper(result)
+        var request = {
+            command: "createWatchExpressionSidebarPane",
+            panel: this._id,
+            id: id,
+            title: title
+        };
+        function callbackWrapper()
         {
-            if (result.isError)
-                callback(result);
-            else
-                callback(new WatchExpressionSidebarPane(id));
+            callback(new WatchExpressionSidebarPane(id));
         }
-        extensionServer.sendRequest({ command: "createWatchExpressionSidebarPane", panel: this._id, id: id, title: title }, callback && callbackWrapper);
+        extensionServer.sendRequest(request, callback && callbackWrapper);
     }
 }
 
+PanelWithSidebarImpl.prototype.__proto__ = PanelImpl.prototype;
+
+function ElementsPanel()
+{
+    var id = "elements";
+    PanelWithSidebar.call(this, id);
+    this.onSelectionChanged = new EventSink("panel-objectSelected-" + id);
+}
+
 function ExtensionPanel(id)
 {
     Panel.call(this, id);
@@ -222,11 +243,6 @@ ExtensionSidebarPaneImpl.prototype = {
     setHeight: function(height)
     {
         extensionServer.sendRequest({ command: "setSidebarHeight", id: this._id, height: height });
-    },
-
-    setExpanded: function(expanded)
-    {
-        extensionServer.sendRequest({ command: "setSidebarExpanded", id: this._id, expanded: expanded });
     }
 }
 
@@ -261,17 +277,17 @@ function Audits()
 }
 
 Audits.prototype = {
-    addCategory: function(displayName, ruleCount)
+    addCategory: function(displayName, resultCount)
     {
         var id = "extension-audit-category-" + extensionServer.nextObjectId();
-        extensionServer.sendRequest({ command: "addAuditCategory", id: id, displayName: displayName, ruleCount: ruleCount });
+        extensionServer.sendRequest({ command: "addAuditCategory", id: id, displayName: displayName, resultCount: resultCount });
         return new AuditCategory(id);
     }
 }
 
 function AuditCategoryImpl(id)
 {
-    function customDispatch(request)
+    function auditResultDispatch(request)
     {
         var auditResult = new AuditResult(request.arguments[0]);
         try {
@@ -282,7 +298,7 @@ function AuditCategoryImpl(id)
         }
     }
     this._id = id;
-    this.onAuditStarted = new EventSink("audit-started-" + id, customDispatch);
+    this.onAuditStarted = new EventSink("audit-started-" + id, auditResultDispatch);
 }
 
 function AuditResultImpl(id)
@@ -330,7 +346,7 @@ AuditResultImpl.prototype = {
 
     get Severity()
     {
-        return private.audits.Severity;
+        return apiPrivate.audits.Severity;
     },
 
     _nodeFactory: function(type)
@@ -360,9 +376,9 @@ AuditResultNode.prototype = {
 
 function InspectedWindow()
 {
+    this.onDOMContentLoaded = new EventSink("inspectedPageDOMContentLoaded");
     this.onLoaded = new EventSink("inspectedPageLoaded");
     this.onNavigated = new EventSink("inspectedURLChanged");
-    this.onDOMContentLoaded = new EventSink("DOMContentLoaded");
 }
 
 InspectedWindow.prototype = {
@@ -371,13 +387,14 @@ InspectedWindow.prototype = {
         return extensionServer.sendRequest({ command: "reload" });
     },
 
-    evaluate: function(expression, callback)
+    eval: function(expression, callback)
     {
         function callbackWrapper(result)
         {
-            if (result && !result.isException)
-                result.value = result.value === "undefined" ? undefined : JSON.parse(result.value);
-            callback(result);
+            var value = result.value;
+            if (!result.isException)
+                value = value === "undefined" ? undefined : JSON.parse(value);
+            callback(value, result.isException);
         }
         return extensionServer.sendRequest({ command: "evaluateOnInspectedPage", expression: expression }, callback && callbackWrapper);
     }
@@ -481,12 +498,14 @@ function declareInterfaceClass(implConstructor)
     }
 }
 
+var AuditCategory = declareInterfaceClass(AuditCategoryImpl);
+var AuditResult = declareInterfaceClass(AuditResultImpl);
 var EventSink = declareInterfaceClass(EventSinkImpl);
-var Panel = declareInterfaceClass(PanelImpl);
 var ExtensionSidebarPane = declareInterfaceClass(ExtensionSidebarPaneImpl);
+var Panel = declareInterfaceClass(PanelImpl);
+var PanelWithSidebar = declareInterfaceClass(PanelWithSidebarImpl);
+var Resource = declareInterfaceClass(ResourceImpl);
 var WatchExpressionSidebarPane = declareInterfaceClass(WatchExpressionSidebarPaneImpl);
-var AuditCategory = declareInterfaceClass(AuditCategoryImpl);
-var AuditResult = declareInterfaceClass(AuditResultImpl);
 
 var extensionServer = new ExtensionServerClient();
 
diff --git a/WebCore/inspector/front-end/ExtensionCommon.js b/WebCore/inspector/front-end/ExtensionCommon.js
index b04c18c..8034001 100644
--- a/WebCore/inspector/front-end/ExtensionCommon.js
+++ b/WebCore/inspector/front-end/ExtensionCommon.js
@@ -28,13 +28,13 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-WebInspector.commonExtensionSymbols = function(private)
+WebInspector.commonExtensionSymbols = function(apiPrivate)
 {
     
-    if (!private.audits)
-        private.audits = {};
+    if (!apiPrivate.audits)
+        apiPrivate.audits = {};
 
-    private.audits.Severity = {
+    apiPrivate.audits.Severity = {
         Info: "info",
         Warning: "warning",
         Severe: "severe"
diff --git a/WebCore/inspector/front-end/ExtensionServer.js b/WebCore/inspector/front-end/ExtensionServer.js
index 7229785..1050c6f 100644
--- a/WebCore/inspector/front-end/ExtensionServer.js
+++ b/WebCore/inspector/front-end/ExtensionServer.js
@@ -35,23 +35,22 @@ WebInspector.ExtensionServer = function()
     this._subscribers = {};
     this._status = new WebInspector.ExtensionStatus();
 
-    this._registerHandler("subscribe", this._onSubscribe.bind(this));
-    this._registerHandler("unsubscribe", this._onUnsubscribe.bind(this));
-    this._registerHandler("getResources", this._onGetResources.bind(this));
-    this._registerHandler("getResourceContent", this._onGetResourceContent.bind(this));
-    this._registerHandler("getPageTimings", this._onGetPageTimings.bind(this));
+    this._registerHandler("addAuditCategory", this._onAddAuditCategory.bind(this));
+    this._registerHandler("addAuditResult", this._onAddAuditResult.bind(this));
     this._registerHandler("createPanel", this._onCreatePanel.bind(this));
     this._registerHandler("createSidebarPane", this._onCreateSidebar.bind(this));
     this._registerHandler("createWatchExpressionSidebarPane", this._onCreateWatchExpressionSidebarPane.bind(this));
-    this._registerHandler("log", this._onLog.bind(this));
     this._registerHandler("evaluateOnInspectedPage", this._onEvaluateOnInspectedPage.bind(this));
+    this._registerHandler("getHAR", this._onGetHAR.bind(this));
+    this._registerHandler("getResourceContent", this._onGetResourceContent.bind(this));
+    this._registerHandler("log", this._onLog.bind(this));
+    this._registerHandler("reload", this._onReload.bind(this));
     this._registerHandler("setSidebarHeight", this._onSetSidebarHeight.bind(this));
-    this._registerHandler("setSidebarExpanded", this._onSetSidebarExpansion.bind(this));
     this._registerHandler("setWatchSidebarContent", this._onSetWatchSidebarContent.bind(this));
-
-    this._registerHandler("addAuditCategory", this._onAddAuditCategory.bind(this));
-    this._registerHandler("addAuditResult", this._onAddAuditResult.bind(this));
     this._registerHandler("stopAuditCategoryRun", this._onStopAuditCategoryRun.bind(this));
+    this._registerHandler("subscribe", this._onSubscribe.bind(this));
+    this._registerHandler("unsubscribe", this._onUnsubscribe.bind(this));
+
 
     window.addEventListener("message", this._onWindowMessage.bind(this), false);
 }
@@ -62,14 +61,14 @@ WebInspector.ExtensionServer.prototype = {
         this._postNotification("panel-shown-" + panelName);
     },
 
-    notifyObjectSelected: function(panelId, objectType, objectId)
+    notifyObjectSelected: function(panelId, objectId)
     {
-        this._postNotification("panel-objectSelected-" + panelId, objectType, objectId);
+        this._postNotification("panel-objectSelected-" + panelId, objectId);
     },
 
     notifyResourceFinished: function(resource)
     {
-        this._postNotification("resource-finished", this._convertResource(resource));
+        this._postNotification("resource-finished", resource.identifier, (new WebInspector.HAREntry(resource)).build());
     },
 
     notifySearchAction: function(panelId, action, searchString)
@@ -77,9 +76,14 @@ WebInspector.ExtensionServer.prototype = {
         this._postNotification("panel-search-" + panelId, action, searchString);
     },
 
-    notifyInspectedPageLoaded: function()
+    notifyPageLoaded: function(milliseconds)
+    {
+        this._postNotification("inspectedPageLoaded", milliseconds);
+    },
+
+    notifyPageDOMContentLoaded: function(milliseconds)
     {
-        this._postNotification("inspectedPageLoaded");
+        this._postNotification("inspectedPageDOMContentLoaded", milliseconds);
     },
 
     notifyInspectedURLChanged: function()
@@ -108,15 +112,6 @@ WebInspector.ExtensionServer.prototype = {
         delete this._clientObjects[auditRun.id];
     },
 
-    _convertResource: function(resource)
-    {
-        return {
-            id: resource.identifier,
-            type: WebInspector.Resource.Type.toString(resource.type),
-            har: (new WebInspector.HAREntry(resource)).build(),
-        };
-    },
-
     _postNotification: function(type, details)
     {
         var subscribers = this._subscribers[type];
@@ -156,7 +151,7 @@ WebInspector.ExtensionServer.prototype = {
         // shouldn't be hit unless someone is bypassing the API.
         if (id in this._clientObjects || id in WebInspector.panels)
             return this._status.E_EXISTS(id);
-        var panel = new WebInspector.ExtensionPanel(id, message.label, message.icon);
+        var panel = new WebInspector.ExtensionPanel(id, message.title, message.icon);
         this._clientObjects[id] = panel;
 
         var toolbarElement = document.getElementById("toolbar");
@@ -216,17 +211,6 @@ WebInspector.ExtensionServer.prototype = {
         sidebar.bodyElement.firstChild.style.height = message.height;
     },
 
-    _onSetSidebarExpansion: function(message)
-    {
-        var sidebar = this._clientObjects[message.id];
-        if (!sidebar)
-            return this._status.E_NOTFOUND(message.id);
-        if (message.expanded)
-            sidebar.expand();
-        else
-            sidebar.collapse();
-    },
-
     _onSetWatchSidebarContent: function(message)
     {
         var sidebar = this._clientObjects[message.id];
@@ -243,6 +227,12 @@ WebInspector.ExtensionServer.prototype = {
         WebInspector.log(message.message);
     },
 
+    _onReload: function()
+    {
+        InspectorBackend.reloadPage();
+        return this._status.OK();
+    },
+
     _onEvaluateOnInspectedPage: function(message, port)
     {
         function callback(resultPayload)
@@ -286,66 +276,32 @@ WebInspector.ExtensionServer.prototype = {
         port.postMessage({ command: "callback", requestId: requestId, result: result });
     },
 
-    _onGetResources: function(request)
+    _onGetHAR: function(request)
     {
-        function resourceWrapper(id)
-        {
-            return WebInspector.extensionServer._convertResource(WebInspector.networkResources[id]);
-        }
-
-        var response;
-        if (request.id)
-            response = WebInspector.networkResources[request.id] ? resourceWrapper(request.id) : this._status.E_NOTFOUND(request.id);
-        else
-            response = Object.keys(WebInspector.networkResources).map(resourceWrapper);
-        return response;
+        var harLog = new WebInspector.HARLog();
+        harLog.includeResourceIds = true;
+        return harLog.build();
     },
 
     _onGetResourceContent: function(message, port)
     {
-        var ids;
-        var response = [];
-
-        function onContentAvailable(id, content, encoded)
+        function onContentAvailable(content, encoded)
         {
-            var resourceContent = {
-                id: id,
+            var response = {
                 encoding: encoded ? "base64" : "",
                 content: content
             };
-            response.push(resourceContent);
-            if (response.length === ids.length)
-                this._dispatchCallback(message.requestId, port, response);
-        }
-
-        if (typeof message.ids === "number")
-            ids = [ message.ids ];
-        else if (message.ids instanceof Array)
-            ids = message.ids;
-        else
-            return this._status.E_BADARGTYPE("message.ids", "Array", typeof message.ids);
-
-        for (var i = 0; i < ids.length; ++i) {
-            var id = ids[i];
-            var resource = WebInspector.networkResources[id];
- 
-            if (!resource)
-                response.push(this._status.E_NOTFOUND(id));
-            else
-                resource.requestContent(onContentAvailable.bind(this, id));
-        }
-        if (response.length === ids.length)
             this._dispatchCallback(message.requestId, port, response);
-    },
-
-    _onGetPageTimings: function()
-    {
-        return (new WebInspector.HARLog()).buildMainResourceTimings();
+        }
+        var resource = WebInspector.networkResources[message.id];
+        if (!resource)
+            return this._status.E_NOTFOUND(message.id);
+        resource.requestContent(onContentAvailable.bind(this));
     },
 
     _onAddAuditCategory: function(request)
     {
-        var category = new WebInspector.ExtensionAuditCategory(request.id, request.displayName, request.ruleCount);
+        var category = new WebInspector.ExtensionAuditCategory(request.id, request.displayName, request.resultCount);
         if (WebInspector.panels.audits.getCategory(category.id))
             return this._status.E_EXISTS(category.id);
         this._clientObjects[request.id] = category;
@@ -409,8 +365,8 @@ WebInspector.ExtensionServer.prototype = {
         }
         var platformAPI = WebInspector.buildPlatformExtensionAPI ? WebInspector.buildPlatformExtensionAPI() : "";
         return "(function(){ " +
-            "var private = {};" +
-            "(" + WebInspector.commonExtensionSymbols.toString() + ")(private);" +
+            "var apiPrivate = {};" +
+            "(" + WebInspector.commonExtensionSymbols.toString() + ")(apiPrivate);" +
             "(" + WebInspector.injectedExtensionAPI.toString() + ").apply(this, arguments);" +
             "webInspector.resources.Types = " + JSON.stringify(resourceTypes) + ";" +
             platformAPI +
diff --git a/WebCore/inspector/front-end/HAREntry.js b/WebCore/inspector/front-end/HAREntry.js
index f3bfb06..6dfbd1b 100644
--- a/WebCore/inspector/front-end/HAREntry.js
+++ b/WebCore/inspector/front-end/HAREntry.js
@@ -189,6 +189,7 @@ WebInspector.HAREntry._toMilliseconds = function(time)
 
 WebInspector.HARLog = function()
 {
+    this.includeResourceIds = false;
 }
 
 WebInspector.HARLog.prototype = {
@@ -203,7 +204,7 @@ WebInspector.HARLog.prototype = {
                 version: webKitVersion ? webKitVersion[1] : "n/a"
             },
             pages: this._buildPages(),
-            entries: Object.keys(WebInspector.networkResources).map(this._convertResource)
+            entries: Object.keys(WebInspector.networkResources).map(this._convertResource.bind(this))
         }
     },
 
@@ -229,7 +230,10 @@ WebInspector.HARLog.prototype = {
 
     _convertResource: function(id)
     {
-        return (new WebInspector.HAREntry(WebInspector.networkResources[id])).build();
+        var entry = (new WebInspector.HAREntry(WebInspector.networkResources[id])).build();
+        if (this.includeResourceIds)
+            entry._resourceId = id;
+        return entry;
     },
 
     _pageEventTime: function(time)
diff --git a/WebCore/inspector/front-end/inspector.js b/WebCore/inspector/front-end/inspector.js
index 92807e6..78592ff 100644
--- a/WebCore/inspector/front-end/inspector.js
+++ b/WebCore/inspector/front-end/inspector.js
@@ -1231,6 +1231,7 @@ WebInspector.domContentEventFired = function(time)
     this.panels.audits.mainResourceDOMContentTime = time;
     if (this.panels.network)
         this.panels.network.mainResourceDOMContentTime = time;
+    this.extensionServer.notifyPageDOMContentLoaded((time - WebInspector.mainResource.startTime) * 1000);
     this.mainResourceDOMContentTime = time;
 }
 
@@ -1239,6 +1240,7 @@ WebInspector.loadEventFired = function(time)
     this.panels.audits.mainResourceLoadTime = time;
     if (this.panels.network)
         this.panels.network.mainResourceLoadTime = time;
+    this.extensionServer.notifyPageLoaded((time - WebInspector.mainResource.startTime) * 1000);
     this.mainResourceLoadTime = time;
 }
 
@@ -1403,7 +1405,6 @@ WebInspector.didCommitLoad = function()
 {
     // Cleanup elements panel early on inspected page refresh.
     WebInspector.setDocument(null);
-    this.extensionServer.notifyInspectedPageLoaded();
 }
 
 WebInspector.updateConsoleMessageExpiredCount = function(count)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list