Index: sky/framework/inspector/page-agent.sky |
diff --git a/sky/framework/inspector/page-agent.sky b/sky/framework/inspector/page-agent.sky |
index 875d5719301ef3179c79eb802451230b75aa9904..2157b770bd0983519ffb9e6e3c6509e79131b15a 100644 |
--- a/sky/framework/inspector/page-agent.sky |
+++ b/sky/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()), |
} |
}; |
}; |