diff --git a/engine/web/ChromeClientImpl.cpp b/engine/web/ChromeClientImpl.cpp
index 489cbdf7361..a2c6dac461e 100644
--- a/engine/web/ChromeClientImpl.cpp
+++ b/engine/web/ChromeClientImpl.cpp
@@ -249,6 +249,7 @@ void ChromeClientImpl::addMessageToConsole(LocalFrame* localFrame, MessageSource
printf("ERROR: %s \nSOURCE: %s:%u\n", message.utf8().data(), sourceID.utf8().data(), lineNumber);
else
printf("CONSOLE: %s: %s\n", messageLevelAsString(level).utf8().data(), message.utf8().data());
+ fflush(stdout);
WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(localFrame);
if (frame && frame->client()) {
diff --git a/framework/inspector/page-agent.sky b/framework/inspector/page-agent.sky
index 875d5719301..2157b770bd0 100644
--- a/framework/inspector/page-agent.sky
+++ b/framework/inspector/page-agent.sky
@@ -19,13 +19,13 @@ Page.prototype.canEmulate = function() {
};
};
-Page.prototype.getResourceContent = function(params, message_id) {
+Page.prototype.getResourceContent = function(params, messageId) {
var request = new XMLHttpRequest;
request.onload = function() {
var message = {
'content' : request.responseText,
};
- this.delegate_.sendResponse(message_id, message);
+ this.delegate_.sendResponse(messageId, message);
}.bind(this);
request.open("GET", params.url);
request.send();
@@ -33,6 +33,57 @@ Page.prototype.getResourceContent = function(params, message_id) {
return this.delegate_.ASYNC_RESPONSE;
};
+// FIXME: ES6 has Array.from which theoretically does this.
+function arrayFromIterator(iterator) {
+ var a = [];
+ for (var e of iterator)
+ a.push(e);
+ return a;
+}
+
+// FIXME: NodeList will soon inherit from array.
+function forEachInNodeList(array, callback, scope) {
+ for (var i = 0; i < array.length; i++) {
+ callback.call(scope, array[i]);
+ }
+};
+
+function addResource(map, url, type, mimeType) {
+ // Be sure to string the url object since has(new Object)
+ // will always return false.
+ var absoluteURL = String(new URL(url, document.URL));
+ if (map.has(absoluteURL))
+ return;
+ map.set(absoluteURL, {
+ 'url': String(absoluteURL),
+ 'type': type,
+ 'mimeType': mimeType,
+ })
+}
+
+function resourcesMapForSubtree(root_doc) {
+ var map = new Map;
+ var roots = [root_doc];
+ while (roots.length) {
+ var root = roots.pop();
+ var elements = root.querySelectorAll('*');
+ forEachInNodeList(elements, function(element) {
+ if (element.tagName == "import") {
+ // FIXME: It's no longer possible to walk into an import. :(
+ // roots.push(element.import);
+ addResource(map, element.getAttribute('src'), 'Document', 'text/html');
+ } else if (element.tagName == "img") {
+ // FIXME: Can't determine the type of an image from the DOM.
+ addResource(map, element.getAttribute('src'), 'Image', 'image/unknown');
+ }
+ if (element.shadowRoot) {
+ roots.push(element.shadowRoot);
+ }
+ });
+ }
+ return map;
+}
+
Page.prototype.getResourceTree = function() {
// Unclear if this is all needed, but if we don't return something here
// the inspector hits an exception in WebInspector.ResourceTreeModel.
@@ -41,11 +92,11 @@ Page.prototype.getResourceTree = function() {
"frame": {
"id": "1",
"loaderId": "1",
- "url": document.URL,
+ "url": String(document.URL),
"mimeType": "text/html",
- "securityOrigin": document.URL,
+ "securityOrigin": String(document.URL),
},
- "resources": [], // FIXME
+ "resources": arrayFromIterator(resourcesMapForSubtree(document).values()),
}
};
};
diff --git a/tests/inspector/page-agent-get-resource-tree-expected.txt b/tests/inspector/page-agent-get-resource-tree-expected.txt
new file mode 100644
index 00000000000..c00763c60a2
--- /dev/null
+++ b/tests/inspector/page-agent-get-resource-tree-expected.txt
@@ -0,0 +1,5 @@
+Running 1 tests
+ok 1 PageAgent.getResourceTree should dump the current resource tree
+1 tests
+1 pass
+0 fail
diff --git a/tests/inspector/page-agent-get-resource-tree.sky b/tests/inspector/page-agent-get-resource-tree.sky
new file mode 100644
index 00000000000..99646824ed3
--- /dev/null
+++ b/tests/inspector/page-agent-get-resource-tree.sky
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/tests/resources/chai.sky b/tests/resources/chai.sky
index c26d2f67934..05b2c7e9b6a 100644
--- a/tests/resources/chai.sky
+++ b/tests/resources/chai.sky
@@ -967,7 +967,7 @@ module.exports = {
* @api public
*/
- includeStack: false,
+ includeStack: true,
/**
* ### config.showDiff
@@ -999,7 +999,7 @@ module.exports = {
* @api public
*/
- truncateThreshold: 40
+ truncateThreshold: 0
};