<import src="/sky/framework/xmlhttprequest.sky" as="XMLHttpRequest" />
<script>
class Page {
  constructor(delegate) {
    this.delegate_ = delegate;
    Object.preventExtensions(this);
  }

  enable() {
  }

  canScreencast() {
    return {
      result: false
    };
  }

  canEmulate() {
    return {
      result: false
    };
  }

  getResourceContent(params, messageId) {
    var request = new XMLHttpRequest;
    request.onload = function() {
      var message = {
        'content' : request.responseText,
      };
      this.delegate_.sendResponse(messageId, message);
    }.bind(this);
    request.open("GET", params.url);
    request.send();

    return this.delegate_.ASYNC_RESPONSE;
  }

  getResourceTree() {
    // Unclear if this is all needed, but if we don't return something here
    // the inspector hits an exception in WebInspector.ResourceTreeModel.
    return {
      "frameTree": {
        "frame": {
          "id": "1",
          "loaderId": "1",
          "url": String(document.URL),
          "mimeType": "text/html",
          "securityOrigin": String(document.URL),
        },
        "resources": arrayFromIterator(resourcesMapForSubtree(document).values()),
      }
    };
  }
}

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

module.exports = Page;
</script>
