[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 : "iVBORw0KGgoAAAANSUhEUgAAAEwAAABnCAIAAAAlnjOJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nG18aWwc53n/zOzM7MzsfS93eR+ieIikpEhRSMmWLceKbTlHHcWuEzvNl7Qogh6figJFgaJo+6kFCjRAg7b/wklQF01huGkVqXIdybUs6qYkkuIlLsVdcsnl3vfs7Bz/Dz/O65Hc+UAs95h53/e5fs/ved6XvnLliiAIkiSxLGsYhqqqmqYZhiFJEsMwDMPQNE1RFE3T+FfTNI7jNE1rNpsMwzgcDk3TarWaLMs2m42m6Xa73W63dV2naZqmaUVROI4zDEOWZVVVbTYbwzC6rquq6nQ6OY5rNpuqqgqCIIoiwzA2m81ms2EkuImu6+12u9VqsSzL8zzHcbgJhtRsNvHCZrkwDF3XDcPQdZ1lWZZhGIqiDMPQNA0zpCiK4zhMDx/hTYqiWJbFg202myiKgiBUKpVSqeTxeDRNoyjKbrczDFOv19vtNsMwdrsd70uSRFGUpmk0TbMs22g02u22oig2m83lcgmCYBiGoiiGYdA0bbPZsDT4ia7ruC0mQFEUmT9GRZsXmTxkhnmyeJdMmqIoSMxms+H3+IjIs91u22w2QRAwiHa7LQjCwMBAtVptNBqqqjIMYxgGFpvneciEpmmsWqvVwqdutxsyxDex8HgcGQOeqKqqYRj4OdEsiAQDI9MjI8c7hnntTxcLg5uyLAuFwb3IJHEjv99fr9cpioJ2lctlWZYZhnE6nTzPNxqNer2uqipugl9BWaClPM9jmXme53kez1VVVVEUu93ucrlqtZr1t0RuWDvKvMgEiOiIxhKzIprIkg8wdXIXVVXJ7awqkc1mY7GYJEk7OzuJRKLRaDidTrfbnclkfD6fIAiQm91u13W9VqsxDCMIAsuyWHioAEVRiqJomsYwDGyMoij8FUURiwKREtUlOgU54yNi+WRu5IKN7IsNC0AsDZdVy5957fV6DcO4efPme++99z//8z+GYYTDYZ7nR0ZGRkZGhoaG4E4wdLvdDj9EURTxGUQOeBZUl6IoWZZbrZYkSRAjRkkEiL+YFfGIEBcRI9784rBZuAee562W+owd4wcYmcfj+cUvfvH3f//3d+/edTgcsVis2WxmMpnNzc21tbXR0dFoNMrzvCAIoVAoHA7LspzL5QzDiEajDoejVCoVi0Vd191uN5RFkqRQKBQMBiEuKDP+4l/MBIqAsWFW+BcrQgRIZmhVeFaWZWgX+SWmBF2CYhC91XV9Z2dndnZ2aWnJ4/H4/f69vT1ZlgOBAMdxe3t7qqqur6/XarV2uz04OHj48OGtra3FxUVZlg8cOOByuVZXVzc2NnRdj0ajoijyPC+KYiwWGx0dHRgY8Hq9fr8fM7QKBMqFAdCWC6tg/ZdcVlulP/roIyy83W6HOkHuNput3W5rmoZ/8TOO44rF4uuvv64oSr1e9/l8HMeFw2GfzyfLcnd39+DgoMfjKZfLiUQikUjk8/ne3l5YYLFYzGaz5XIZHlWW5Xg8PjU1NTw8zDBMPp+nadrv9/M8H4/H3W63KIrxeDwajXIcp+u6LMuVSsXlcum6Xq1WodXQBSIMCBZ2QQx4P4QQr0OcOJQEVvGMiW5vb1erVV3XFUVpNBpYdVVVh4aGstlsKpXyer09PT39/f3d3d3VanVzc3Nvby+VSuVyORinruu4eblczmQyTqdT1/VkMpnL5XRdFwTBZrPV6/Vms+n1esfGxs6cOfP888+Louh2u3Vd5zjO7/djAoqiQPusUyIeFFPbRwK0JfLAAPA9q+pzHIfVymazxGspigK/Ui6XHz16JEkSx3F40+l09vb2dnZ2QrC6rrdaLcRYso6FQmFhYWF3d9dmsxWLRQiZ53m73W6321mW3draSiQS8/Pzs7Oz3/3udw8ePNhqtfDoSqUiCAKRkDUQYBEhVfhU1rBcVgDRbrdhqMShIaBls1m8Cd1GrG+32wQhYV1KpdLi4uLa2trk5GS9XoccKpUK5mm32ymKajQa+Xy+UCgg5DIMI4oiQBzDMA6HQxTFbDabSCTq9fqhQ4cOHjyIRzudTk3TXC4X4ASxQ6uzhNZAcp+DASussYYgMkng1fX19Waz2W63eZ4n8VBRFNgMYADmgH8rlQr0BTLHGuNuUA34GEgAklQUpVKp5PN5j8eDGNhoNBKJBOAxVBSBqlgs4llEOa2KSZu4l7Xa2zOOi3wbr2VZLhaLGxsbBDrjqbiRLMtOp5PgdSAYt9tdKBTISkP4WBTgZswTYJCoGcwSC0dRVLvdrtVqxWKRoqiOjo56vd5qter1OsIeFIc2MToJB0CduCdrxQpWR0wsk8DaZrOZz+eTySRN05IkSZJUq9XgfgVBCIfD0AiGYdxuN/KGSqXi8XhgpbQJX9vtNlARAhXcG8/zUP5WqwU5Q+wYrtPp3NnZWVhYiEQigiDAcCiKikajlUqFwF3ERowWd8Pkn4J1VgsmYsQk8fhqtbq1tdVut91ut9vthspJkiSKIoTZarVkWSbQmef5arVKVAjo/Bm8BuNhGAZAD+CWYRgAQNyNoqibN2/+5Cc/efLkyeTk5OjoqM/nKxQK9XqdRAvc8IvhgAJ2pU1Ah9kTcCcIQrPZhEpkMhmPx1MqlTiO83g8rVZrb28PobXZbBYKBSIiEog1TVNVleM4uERJkmCWHo+nu7v71KlTHo/HbrdnMpmHDx8uLy9DsRGfobGyLPM873K54Ic2NjZ+/OMfd3d3/8mf/MmhQ4fcbne9Xif6iVlggaCrJJywBBnQT+M9hmGq1SrBVj6fr9lsrqys1Go1Ak0Nw2g0Go1GA6OxomcSDAnCajabFEUNDg5+61vfeu211wKBgNPpZFm2XC4/efLkzp07Fy9evHnzJmMmaLVazTAMh8Oh63qpVIK3p2k6mUx+8MEHkUhEFEWHw/FM/mAN+5+DAZLFWMEAHGC9Xvd4PO12Gy7+8ePH169fR8Akwoc/FAQBVoeI0mq1cFugtna77ff7jx07dubMmampqWAwiPAF6woGg7FYbHx8fHBwcHx8/Fe/+lWtVqMoyuv11uv1vb09SZK6uroqlQpuW61WL1y48Oabb4bDYbgx6yS/6DgpimKx2AQlkIUh6wG3ubW19fHHHy8tLTmdTiS4RE8Q91qtFuaPp9rt9mAw6Pf7jxw5Mjo6OjU1FY1GYfxgOoANcCuHw+H3+7/61a9OTU2NjY1dvHjx008/bbVayE5UVS2VSg6HQ1VVGGEmk0mn07FYDA+1Yh2M2TpJmqZZ4t8JJMBXVVUVRREq12637969e/XqVQwLnl2SJOgPbtTT0+P1ej0eD5TT4/H09fV1dXW99tprZAU5jmNZVpblUqkUCAQMwyCcCHLlrq6uH/zgB4cPH37//fcvXbpULpcFQdA0rdVqwYBrtRrP861Wa3Z2dnx8nCCQZ5SWMrNTiGo/n8RbJIWDE2dZFjRUrVa7f//+9vY2LARenud5n88niqLP5wsEArFYLBgMRiIRl8vF87zb7e7o6AiHw6VSSRAEnufhh3Bbn8+H8AO/wnEcqBObzaZp2pe+9CW/3z8yMnL16tU7d+7IstzX15fP5wOBgKIoFEUpivLZZ59B8iRBsc6TspAJNE2zRImJJPE9nuehS5IkbWxsJBIJOGvIMBAIDA8Pd3d3e73eeDze1dXFcZwkSU6nU5IkUBvgphwOB5YPtqppGshBxNJ92MWy0Bo8vVwui6L42muvjY6O/vM///OVK1dKpRJE7XA46vW6ruuZTOb27ds9PT0+n49Mz7AwG1YagSUEjzVjhuVUKhW8yGazhULB6XSm02me5/1+/8TExMmTJ7u7uxEng8FgKBQCEoJHYVlW1/VGo2G32xVFAX7AxPA1wF3DMBAeRVG02WytVksQBIfDgfjp8/mCwSByFIZhIG1ZliGlhw8fQua0mXBaDfKpdARrjGfDqbIsC/0BebO7u8txXCAQqFQqTqezXq8fPnz4lVdeOXLkiMfjcblc8XgcYifTw63hQkneoCgKwdMkm8P6apqG3ApfQ0Byu91er3dwcLC/v98wDI/Hk0wmX331VQg8mUw+efJkfn4+k8k0Gg08FJQaQjdtITT2n0S0lMhdFEUomN1uD4fDSGTB5Rw7diwajbIsG4lEEA9gV4RlgxJi7axYioBJ60Otl2EYPM8DG0ELRkdHDx8+3NHRAQNjGOadd95BYgmxA98DDCPAgoaG/eMvQyjzZ9wsISAEQXC73WArGIZB+i9JkizLdrtdFEXDzMeRCsLkoAUej4cgB+sKGpY01wqSCcWGrN8wjL6+vhMnToyOjrbb7f7+/mq1OjMzMz09HYvFEokEQBISS8pk+mD2Vui2P8ln1pWsh91ux7eDwSCSPUmSYLSA7BRFQVdbT18knyYSfoZNszo5q6iBb51Op91uB//U2dk5OjoaDAZpml5eXq7VaiMjI8PDw5FIZGVlJZ/PI1ATnpHgWHLtJzhk0sTHwvWpqgr4euDAgXA4TDIMEMGNRkPTNEmSms0mSXNwQ+gqYBD9Baz/TEwjF8FM0FsAGkmSOjs7z549u76+Pj8/f+fOnUKhwHHcq6++2mg0lpeXK5UKYg/KLcAP1mVliMO1XlgMWZar1aqmaR6PZ3h4OBgMIqxhAojglUql2WxWKpVGo9FsNlutFoaIDAOFEHKRxSZh2jo9KAh0p16vI/dHcux2u8+ePXvo0KFSqXTx4sVCobC7u9tsNn0+3/LycjKZVBQFIBEB3Jo667r+1D+k4IMLrh/8v2EYKGOBfSkUCiB74BjtdnulUqlUKtVqtVarYcKKoiB2k4sADyjwM/MECKHM0pAsy6gmIIxFIpHf+q3f6ujoePz4MVb58uXL29vbGxsbCwsLe3t7giDAFAlX/jl2tU6SsoBYCMThcDidzkajsb29nU6nkX+5XC4QdvF4HP4NGTMcoJX8hz8ksZdMhjLRlVWSmKSiKD6fz2azweAZs4LSarVGRkb6+vqazWaxWAwGg48ePdrb2zt8+PDy8vLw8HA0GsXSwAta6at94MZYWEkk+4qiuN3uarVqs9lCodDs7Cwkw7JsMpnM5/Oqqnq93oMHD1IUBSEjgquq6nA4kCsHg0GGYSqVCrw0SaYhrmKxCJWGSQPWNhoNSE+SpHQ6TVEUGMByufzgwYNHjx5xHJdOpwOBANidlZUVlmWdTmdHRwfoQiwWKBVcLBYeb1FmmAY6J5a5srJy//79TCaj63o6nUbkwILBQyC1I3U7VVVhWgBokiQhF2s2mxzHORwOeBSPx4MnQuaKoqiqGgwGm80mYlg+n9/Y2Ojp6Tl69Giz2Uwmk6VSSdd1QBSWZZvNZr1eX1paMgxjfHz82LFjkUhEluVCoYBUc1+SEB1jKRDAQSGjp2m6VqvdvXv3xo0bmUzG6/Vms9mBgYGhoSGfz9fZ2QlKG7XnVquFeFitVj0eD8uy0GpS9BVFEWlKsViUZRl4A/kqFgWhGNELA5ibm8tms0ePHl1eXp6fnwdG7+7ubrVa4XB4e3u7VqupqprP54vFoqqqwP12u93KXT1lkzBWTBuJOc/z+Xx+YWFhc3MTEbXZbCJ8YRCQPH4iSRIMW1VVfBkEKZTT4XDIspxKpRYWFh4+fFgqlaanp0dGRkjBr1QqwQtguWVZxiOWl5d3dnYkSYJ/LhaLoiiePXt2aGioUqn89Kc/3d7ehhEKglAul1mWxVoQj82S+PZMUEaIU1U1lUptbm4C32matra21mw2FxYWoLRutzsQCPj9/p6envHxcaQv8HJQ7Eqlks1mq9VqsVhcXFx8+PAhtA41EiSiWE24R1mW4b1kWUaOBr+dy+VqtZrb7Q6FQocPHx4YGLh169adO3egd+12u1QqAXUR0E8gx+eSNL5QWqYoql6vl0olVVUBdHRdz2azxWIRSYZhGAB9kiSBm3K73WBfOjs7l5eXnzx54nK55ubmVlZWcrlcOp0G1+x0Ojc2Nj788ENkEi+++OLY2BjHcdVqFXgdBS+PxwMGhKKobDar67rX6xVF8d69e7u7u9euXdve3vZ6vUhWZFluNpvo50Bu/bm6WqMzYylZkyDm8Xh6enoKhUIqlUL6g4QDtJqiKKjkoCjgdDq7u7vD4fC7774ry/KHH36Yy+VSqZSiKBg3ypLValUUxe3tbYqiotHo1tZWR0dHMBiE6yLppSAIrVYrl8vJspzJZFwu17Fjx+r1+tzcnCiKL7/8siRJV65cAc8CWgxBm8Thz70rwatWeWqaBmwdi8VqtdrW1lYqldJ1HeDGZrOJokhRFDwEbAmU7O7ubjQa/Z3f+Z2urq5UKoUg5HQ6KYqq1Wo0TYPIRIqzs7Nz4cKFX//61ydPnnznnXemp6fRD0LTdLFYbLVacM7lchmDGRoaWl5ehgv8xje+AZJ6e3u72WzyPB8KhcB3kRT88zhJ0zSoR6SzHMcRZgVLcuDAgUwm8+DBA57nQc/BMSLnRD+Ew+HAp5qmzczMgBQ+f/78+++/Xy6XEQY1TfN6vaVSqa+v7+DBg4IgoGglCMLNmzcFQUA1HiQgSpQ2m21nZ4em6Xa7PTAwkM1mk8lkNBoNBAKITMeOHWu32+Fw+Etf+lK1WkWstgqMoijbm2++yViqCAQWEcoU4spms48ePUIRjjBAbrcbX/D5fPl8niQcfX19wWDQ5/PF43G4omQyWa/XCWjO5/OyLI+Ojo6Pj4OVLxaLTqfz4MGD0WgUfoum6VKpdOvWrUQiIYpib2+vpmnpdBr17FgsNjIy4vf7Ozo6hoaGRkdHA4EAbbLyGB6Zl+3NN98k2IpkdEhDCfYDFbKysrK7u0vEiDQKxSyKovAmgM758+dPnjzZ1dWFfBoVdTjGbDaL2km9Xr93797KygpN0+FwGPrcarWmpqYcDgeqZtVqtVAolMvlAwcOnDx5slgszs3NIcDCx0ajUVmWI5GIJEn7msmyYNuesknK0o5EcgU4Zagf6Bm/3x+Px9fW1gjjhkzK6XQiL6lUKsCr7XYbmAYPiMViL730Ur1e/+ijjyiKisVikUhkfX29v7//+PHjp06darfb+XxeEASoTLPZBH5ASjk1NVUoFHp7eycnJ1VVvXnzZqVSQe0MvgDkoCzLKLCTVBaVRYzB9p3vfEc3a2YkFUK0QDYM2EnTNIIVwBpN06IoglMCeoYkWZaNx+NvvPEGXGWj0UBVY3h4GFAeYbC7u7tWq+VyuWAwePz48UOHDoVCIa/X29/f73Q6UQgD9e5wOPL5/MDAwODgIMMwCwsL6+vruq6Pjo4+99xzSGtRMgKZqJvtaKTVgwa5bLVRImJIHFoOYQ4MDBw8eDCVSoGb8nq9dru9Wq22Wi2XywX17unpeeWVV7785S8zDFMsFgFE+vv78/k8OPUTJ05Uq9Xd3d3Tp08fOHDg6NGjSOLAryNsIMOiKMputyNaBoNBu90+MDAwMTFx//59u93e1dXl9/vBHuTz+XA43Gq1arWa1+slZU+S39jeeOMNoLBnsj4gQFJLQ9KEeNDb24uhdHZ2ut1uvEgkEmNjY+fOnXvxxRf9fn+pVFIUBZoMKONyuTY2NtbW1qLR6Pe+972pqSm/3+/z+UD5YTRdXV2ot5OsTZblzc3NeDwOnrJQKOzs7HR1dX3ta18bGRlBI+L169dBKRmG4Xa70a5hZdBt3/zmN0mV25raoVSMgGGYTYDFYjEUCr344ouqqq6urqIat7q6WigUXn755eeee25iYgJrGQ6H7XZ7sVjEcjQaja985Ss9PT2qqm5tbc3OzgJYgzcCbAK0APOPul2j0chmsysrK8Fg0OVyGYZRrVbz+XxPT8/09LTf71dV9eOPP/7bv/1bXddRp3C5XOVyGV8mc2EbjQZBrftmarMhkAAKwywlSUJ3ZzgcpijqzJkzLMsuLCwcPHjwhRdecDqdMzMz6+vrGxsbBw4cQOBOJpPo7wElkUqlent7z549+8Ybb+Tz+d3dXThVkhJAgKQIrSjK+vr67u7ur3/960OHDoGYjUajf/iHfwhoCkxy//79UCiEEIAV9Hq9yJ+I0rKAASSEUCbbRcgIw+xEZFlWkqTbt2+Lojg8PDw5OTk4OIi0mOO41dXVXC73wgsvkB5CAEBFUbq6utbX1x0OR6VSgVV7PJ54PI56EQYEIkLXdaxLPp9fXV29evXqjRs3QPOUSiWfzwdfSpkMxubmZjAYfPnll48fP+7xeIDpEfDgXfcNkHr6IlgBgduw9L2wLItF2tnZKRaLfr8/FosBJ0UikcHBwXa7jWKBYRhggARB6OzsvH//Pjq+sFijo6MoLYIKJM9CXp/JZFRVTafTq6ur169f39zcHBwcrFardrvd7/e7XC58MxAIoBA+ODh46tSpQ4cOwS5IbGMspDZjJdFos+cXRBBJFCmTMUCL5Pb2dqVSQWKKJMvlcv3yl7/c2dlByw5QC4IH5FatVi9dugS8trGxgTCIXBnEPGqPW1tb5XK5UqnIstxut3d2dpxOZzweB35Akom8DKsvSdLY2Fg4HEYU8Xq9DMOgMYTED4qiTODzf/WAQJIEJxhmcXtzcxOtcDzPRyIRXdc//PDDTz/99Pjx4x0dHaIooubRbrez2WypVMIq5PP5n/zkJwAowIPwMdDYcrlcLBbX1tYWFxevX7+u6zpqzJFIZGBgYHR0lHDqLpdLFMVGo1Gr1VwuVzQaRWoOeIApwF1TZpK831hkPF3cM0wSGqknXiCIjY2N/exnPwNVIQgCWInLly+Pj4+HQqFkMtnV1YX6LFFXQJZwOPznf/7niUTir/7qr3w+HywZ2l6r1VCiKRQKq6urXq+3u7v78ePH4+PjIyMjXq/3ypUrzz//PEgDQP9CoaDrOhwsSiPNZrNUKoF5slofTdP7AP2LF2A6TBFoBh4/GAxevXp1aWkJmeSdO3fu3bvXbrcbjcbCwsKDBw8g/EajgZwAOSGauHp6ej788MNEIhGLxQgcA6yD656bm2NZdnBwMBqNZjKZ8fHx8fHx27dv//Vf/3UoFHI6ndVqdWNjI5/PI4EG3EHuBieH1A8RgciMNZ4m7YnGAuzCs5NaFcMwkUjk9OnT//Vf/3X58mWwVZVKxe12+/3++fl5iqI+/vhju93e398PmJrNZtHf86d/+qfvvPPO+vr6+++/v7a29tZbb3V2dlIUJUkS6AK0fA8ODoqimEqlXn/9dWTn9+7dUxTlz/7sz37v936vp6cnn8+HQqHR0VFJkkCLQrakvM9YyEdIkoWiA0mRZgqb2dwDD4T+A9yCpunTp09/8MEHSCn8fj9SrcnJyUajsbm5abPZyuXyrVu3kFXzPO90Ot944w2Hw8Gy7He/+12O437+85//3d/9XW9v78TExK1btwYGBl566SVBEI4ePepwOFCQhHImk0nQJbFYrNFo+Hy+kZERQRDA+gGvwjR0y2YEeCYSBVnCczNmQw9lNkUTeIULVqQoSjgcPnLkyOzsLJLacDg8Pj5OGvnQJYa6iNfrPXLkyAsvvHD69GkQH0eOHNF1vVqt/ud//ifDMF1dXd/+9rf/4i/+Ynl5+R//8R9DoRCcOUILlml0dLSrqysWi/X39/f09Ljdbqw4nL9haSanLdVBYncURdneeustEjnIDCFSABfyJsqPILWKxeK1a9dEUQSd0d3dPTAwsLOzg9ZORVHQPPHlL3/5/PnzJ06c6O7ups1qDFDxiy++uLa2dufOnWPHjmUymSdPngwNDQUCATheURThlnZ3d71e74kTJ8bHxzs6OuBaEehJ5eYZnhHztMYL22/+5m+S5IMYq+3pC9YM+xZFERXvzz77DL/CHqa9vT1d1yORCH5CUVQ4HD5//vzRo0dBmeLLCGLj4+Oqqk5MTExOTl66dKlYLJ47d25kZCSbzYZCIYZh0PiN6mAkEkEQwhyQtaI6SKzu/5wkefOpfS4kKtJmIyvkjq5uqC52BPT29p46deru3bs2m61WqyWTSXQUqKpaLBbD4TDw5NbWVj6fhxusVqtgJUF2QErf/va3GYb5f//v/4Hd7OzsxFOAzoPBIEh6xuyBgh0SQhRlc0JwW6egWzq1WILdiELvB1CWbZtbi0jmous6AH00Gh0fH79//z5FUWhi8fl8Pp8vlUo1m81sNlupVDRNy+Vyly9fRtMLzJVhmN3d3UQiMTIycuTIEUVRhoeH2+12PB73+Xx43+l0KoqSSCRWVlZA4cDBYHpQY8rC+lslZFjaXcjFkmaNz5Eew8DxGGaXCHQDrxuNBohmlJkB0ND8fubMGfRU5/P5ubk5t9vd09MTiUSQKMbjcU3Tstns0tLSvXv3DMP41re+FYvFHj9+rOt6JpNJpVLY2KSq6u7u7pMnT/b29jiO6+zsJHVVZCdES0HE0JYmJMPs3bFOeH83wTM+CqGGBFMSZuCfUPZJJpMURSGr5jju8ePH9XpdluXz58+fO3fu3LlzsVgMZTws/+rq6vz8vNfrffXVV7/2ta8BLdRqNTSBXr16lef5l19+2W6353I59K7wPN/b24s8mDSoIQaC4NHMbQGUhfu3Tmd/kgiGpERJfA9t7kzb98KmMWBWHo8nFAopiiJJUqPR6Orq4nl+eXlZFMWf/vSnV65c6evrw6c2my0ej3/yySd2u/3dd9/9yle+sre3p2laPp9PpVKhUOjKlSterzcYDKbTaXBQyWRS07RUKtXT00Oql7B5VI2azSYqi+intbofDNXqdWiaZrWn90h8/oGpxkRpcaHDJhAI7OzsRCKRTCajaRryklgsVq1Ws9lsq9V6/PhxpVKp1+uxWCyfz09MTPzoRz8aHh4ul8toD0kkEltbW/fv30c1Ce2iyWRSlmVZlh8+fLi5uYkOHo7jUqkU3A/gIaAvtiEgrmJsutlaZjzdycJaMZ7VMq3ithq63+8vFAoo1oMcQfoTiUTQoDA2NlYqlQqFwvPPPx+Px7u7u+12+8TExMjISDKZdLlcpVLp5s2bV65cAfptNmOG1FkAAA94SURBVJtut9tut8fj8VQqtbi4WKlUrl+/3t/fPz4+DsNBEgPKt1qtulwuTdPAIcFE6ae7eI2n26BYku/Qlm2k5K/1I/weE/vXf/3XdDpdq9V6e3tBRmCBHQ7HK6+80tnZ+emnn3Z2dv7whz9E/z8WZX19/cGDB//7v/8riuLS0hIADWATdKdSqXzyySe41cmTJwcGBtC45vf7Z2dnZVk+fPgwx3EojSDDtJrl/3nRNM1aExPr9Ej8pC3N2/Cudrt9ZWUFbZGhUAjLjJ2wL7300sGDB2u12sTEhCiKc3Nz+Xx+eXn5xo0biL3z8/OPHj06c+YMAr3dbocCcxy3tra2u7u7t7fn9Xq//vWvz8zMQHQ8z2PLxNLSks/ni0QiaDIDH/lFBbTi033nQjJjq/lRZtvFM8qt6zosHu0eYEO6urp0Xd/a2urs7CwWi//93/8diUQMw9ja2jp48OBnn30GrIfi4YEDB4g/q9frWDVM4+7du4gZKHWgykBRFPKmYDD43nvvOZ3O1157rbOzE0R7q9UiTDmZrVWGxIOypEeJsmx1oZ6OtuRf8BRTU1O//OUvQVVQFFUul0OhULlc3t3djcfjDx8+LBaLmqatr6/Lslyr1Xp6egKBQL1eT6fT2GmI9I+iKFQvKpVKsVjM5XIdHR3Yb+ZwOFwuFzYPYwfe9vb2r371K1VVX3/9db/fj/zYKkPiHa3DpsiWCTIr6+svThKEEM/zp06dmpiYePDggaZpiUQCUMHr9W5sbJRKJZqmc7mcz+djWTadTkuSRLxuMBjE/iRsLgEh0G63UXIEMJ6enu7p6cEcGIYB2eFwOARBWFlZQcSanp52u92CIDQajWf8jW7uuyKTtP3u7/6ubrbXMZaOKbIFwmZuvsXzHA4HOsJDoVCpVFpfX0c7PJp+gN3hGOx2ez6fBzeB1mNshEJpDUgNThLlGjxubGzs9OnTg4ODsVgMXQ4YdzKZvHTpkqIopVIplUohE3Q6nbBniPQZIX0uSfgY0vpBfAzpkiOKSlEUGofRnnf48GFZlre3t5eXl2G94NQY85ABBHFi2Na/FEXhSAHDbInAtAOBgM/ni0aj0EaScGDhQKuCAfyXf/mX+fn5r371qydPnoRxAqmjXQNBnkxnH8VbJ/MMCHwmbEJzEEheeukllmUvXry4tLS0sbFBWdJzTdNQq0TUQcHP6sMQ/aCrSJE9Hs/AwAB2vzqdTsyfMU8t2Nvbg/1LkqQoyu7uLlzx4uJif3//oUOHent70Y9eq9Xq9Tq4+X2gZk2uiWYTko4kzcBDUF3U6prNZkdHx+uvvz44OHjz5s2/+Zu/qVarsiyjYRFlVs3cc61bmkDJC+iqYRhIvuF1gXLAxKLeSNM0x3EbGxvwkbVaTRAE7Di6fv36vXv34vH40NDQgQMHhoaGhoaGurq6gsEg4QAA4lmrw4X/BM4ApiVBBX4fbgD7JUqlktvt9vl8oFttNpvD4SgWi81mE5vvCaxnLH0l8OSoAsGYcYYC+sBnZmZCoZBhdmaQLWerq6tut9vpdGYyGWyhJIPc3t5OJBKXLl2KRCJTU1PHjh3r6+uLxWJ+vx+9yKxu2aNmjS2UpenFeJoyMcyqNeQ2Pz//s5/9rFwud3Z2Tk9PP3nyBOgE4eGLmkKZPe6NRgOtdmhHnJyc/P73vx+LxYjV2Gw2lCjT6TQaXFELaLfbaGVxuVxoCEekTafT+Xz+xo0bgiBMT08PDg5OTk729/ezJKWyzoGykCBwP8SIDcMA2wlbR9Xp4sWLTqfT7/fPzMw4nc5PP/0U0rbGXsosYIObIbtIAV9mZmbefvvtkydPgiICLwEL1HV9cXEReRl+aM2esbkGvAz8TbPZbDQaP//5z8GbRKNRxsrT4UIthBA81k9JWQaMaKVSuXTp0kcffQQ2HXsGoWyU2SxvRb/kWTRNV6tVwzDgdcbGxv7gD/7g3Llzm5ub0CDgUlhspVK5ffs2MCCsACkBqUwT/0SMHwhJVdXHjx9fu3ZtnymHfhOpGuYhHSRmWmke4IGlpaXLly9fvnwZUbHVao2Pj6N4jvo+Foj0vYD7g9IibAQCAVmW+/v7/+iP/ujs2bP1eh0RH4EnEAigLUGW5WvXrlEUhZoHGq4cDgdcINkvZuUpAcuAB2022/5+AWQSmCQppJHOSkyYYRhFUdCDurS0tLq6+ujRI+zjhlsHmI5GoyMjIysrK6VSKRwO7+3t+Xw+UD4oQrfbbZfLtbe3t7Oz89xzz/3oRz964YUXqtWqqqp+v79arTqdTuA+TdP8fv+FCxfQPYhFR+5imHsYSRZCm+0NcGxoV9hnMwBlIDF4FKw35oxghZ2D2WwWfVkrKytLS0u5XK7RaMDF46Yov4bD4W984xutVuvChQt7e3tutxtFdUwAAaZcLr/11ls8z3/zm99EOQAtsoqiICtCaczhcJTL5Y8++ghwHJ6MuGhoLAnyxMoIH/s54gGDwJqnuJDkQzfPTgLpmEgk7t27t7a2trCwkMvlUMqFryOdPTB9lmWnpqYCgQCojZWVFUgmn8+jlD82Nvbbv/3bMzMzYEbQjuf3+x0Ox97eXiAQIBsPaZr+4IMP0HZqM9vnNfOgBJQ3yQYUEtut0Z4yWQ7WZh6iZE0+EI5LpVI2m0Wy+/Dhw62tLWAoqDTRcCihzWYDKK/VakePHu3v7z9z5sytW7euXLny6NEjVVU9Hs/3vve9d999d3JyEn4F3TI41KRer6PTAnemKOrGjRvvv/9+qVQi8IUIgIAH2qTantFba/BnGcvZGSzLAnyiXAFcuri4uLKyAvqY3AgOTTV3Y7HmXiAUQmA/6LA7e/bsm2+++d577yUSie985zvnzp2z2WylUokxS6UMwzgcDkVRwGs0Gg2v14tTEmZnZzc3NzEZOGr4Z1gdARu0JcWnzI1wT3VJkleM2b6DvdgPHjxYXV2dm5vDlih0aPI8j40DJKIQgAZsjWegJQBN8YIgTE5O/uVf/iW6CFDxhpME+kNZGquDZaLM6j26EAk8JBGIsOMEsRD4SXIRxkIdP7VJFOdRpNPpTCZz/fr19fX19fV1hHUU0kFkoX+NYCsojCAIPT09DocDDgMdZl6vF57GZrORYiaYaGB9zArRC9qBSeLv9PT0L37xCxSVyRlUuGjz6C2CN2E7RJ+hklB7lpiiLMvpdHphYWFubm5jY2NjYwP3QrkGO/ph6BRFhcNhdC2oqgrIQpuVBVmWFxYW/uEf/uHRo0cAsUNDQ/F4vFAoLC8vt1qt0dHRycnJkZGRUCjU29uLdlHN3IzA8/zt27ebzebhw4cvXLiAOIHTxzRNQzaLjevIE6C9iJwIj1AT0v0IlWZRk1pbWwPLRE7cIYUQkkPo5mYz+N56vY4UAQfNLC0tdXV1ZbPZP/7jP37w4IHf789kMg6Hg3DtWIt0Ov3JJ58UCoVoNNrR0XHgwIHp6Wmg6kAgcPHixffee29+fj4Wi8EbuVyuTCbDmYduYTDgB9HWR1sOAuPMbYyGueGVpmkW29kXFxfv37+/srKSzWZV8yw5kvtRJj9AURQcDO6OlmSO47xe7zvvvDMxMaFp2vz8/N27dwEk0NBFFMxm7hpB9RvtvLdu3fqP//gPFCT9fj86WyRJymQynZ2duVwO/kkzT30hWMowm+8QWlVzszHeh+/Y967Xr1/f2NiYn5/f3NxELs9ZzpQgjpggWABXPAlYj6Koc+fO/eAHP+jo6Mhms48fPwbDjUQBZQzOPMkPgR54DUoFGIwVcTqdlUoFFZ6dnR14XbRhw/MBGyJEQ8nxPlYBoqbNsx1JdGQ//vjjXC6XyWTQPs2YJ6gQ1uSZFKRer8OXoLkDX/v+978fCoVkWUbTGHwYEk7AWrTYY5MsECZlHjtQrVYFQYDqdnZ2plIphmFKpRJYHxghaipEoRCxOPNIQ9wQk8SWCQyMdF2xDx48QGTHURCkpqmZm0fwLyGUSLyq1WroIMZOVaC/9fX127dv0zQNh0mOl8BtCQ+CgaLXHIejwCAzmczs7CwkGQgE4MaBZhmzPYxwbkDkECl8BCmi0jSNHVH72JXoHkFD+DawCGVpXCLZOpaTFM+OHDkC0T18+PCf/umfPvnkExxRhhozfCa4RhR2oAhkazbP8zgLrdVq4aAtnDKl6zo2idI0TQybRD8SJ9GroZp74ciRm2RDGsMwbDAYRNAjEtPNU6qIX2UslWaQ1oqikGTn1KlTEMiPf/zjf/u3f3O5XDAGdCuCidsnWszTVSuVis/n29vb83g8oigC93u93kKh4PF4kIVhDwbMGBAKDt94mv6mzQ4Jm3nwJmaOg1/2K6uIFoaFL9TN6jxuAdUn9CSIBvBUoii6XK4jR45wHJfL5WZnZ3ESEUVR1WoV5I0kSbBJxH3gaYQfELboU4dpdHR0BAKBRCLR0dEB/gahGJ13uBUgHkCl1+vFeTpYPtwcrrVcLmNDrqqq+5QkgUiUSTQBGVJfqOEBJWMEuq6j7YRlWVQEEHWxscnn8yFeo2yKwI3td3D9LMui5N7V1RUKhTDVer3e39+/srISCoUQ0CuVCnwvyjCwTHRh4YQZMuBarVYul+GukR4BirGk+5yx8OqGpSBLdIO2lI2QSePwRHDk2GxGKEag3L29vUgkgv3tiOMohIEQOnHixCuvvDI5OYnJAEs1m83l5eXf//3fRxc/9kYz5mGB1uU2TMrbMDvKyDtkI8c+3LEO3QoASN2S3BTfMcyyD8qvw8PDHMc1m83PPvtMURQIpFqtlstlNJzB142Ojn79618/ceIEWlYo83RRGDkyb9o8dbRSqWCl4H4QhAgYoCyHamKDraqqdrsdZ6ugSwNNaaBOdF1nyaysAAAOjUzbePpUVZL4CIIwMDAAc4dDyuVyOL4Zg/B4PI1G4+zZs2+//fbMzAz291JmfwMkQ8IAYGqtVrt27Rp8I8dxbrfb4XDUajXEQzhn2jwYFaEIt4LnBxjAO3BCNpvt8/4QzdLTAnRijTyUuW+LsP2gZHp6ehCyfvjDH3q93g8++ADNSn6/H24gHo+//fbbv/Ebv6FpGjYiYw8bUSJVVQH0UDy22+3ZbDYajWJfGEVRrLlNBH9J2Qb2RlAXY1arMD3MgpRGWKgfZSndWXWYepqJxS5cGEkwGAwGg4Zh8Dx/+vTpvr4+p9P57//+76BkBEHo7u4+d+7c8ePHDcPY2dnBQXCKooAEQEuM3W5HkqnreqPRePjwYTqdRij2+XzYI4F0jzYJGoRoZEi6rgMqIBBgIdrtdqFQMEzu5/8DJc+cUchdTDsAAAAASUVORK5CYII="
+ 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