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 };