const FRAME_URL = "http://example.org/";

const METHODS = {
  setVisible: {},
  getVisible: {},
  setActive: {},
  getActive: {},
  addNextPaintListener: {},
  removeNextPaintListener: {},
  sendMouseEvent: {},
  sendTouchEvent: {},
  goBack: {},
  goForward: {},
  reload: {},
  stop: {},
  download: {},
  purgeHistory: {},
  getScreenshot: {},
  zoom: {},
  getCanGoBack: {},
  getCanGoForward: {},
  getContentDimensions: {},
  setInputMethodActive: {},
  findAll: {},
  findNext: {},
  clearMatch: {},
  executeScript: {},
  getWebManifest: {},
  mute: {},
  unmute: {},
  getMuted: {},
  setVolume: {},
  getVolume: {},
};

const ATTRIBUTES = [
  "allowedAudioChannels",
];

function once(target, eventName, useCapture = false) {
  info("Waiting for event: '" + JSON.stringify(eventName) + "' on " + target + ".");

  return new Promise(resolve => {
    for (let [add, remove] of [
      ["addEventListener", "removeEventListener"],
      ["addMessageListener", "removeMessageListener"],
    ]) {
      if ((add in target) && (remove in target)) {
        eventName.forEach(evName => {
          target[add](evName, function onEvent(...aArgs) {
            info("Got event: '" + evName + "' on " + target + ".");
            target[remove](evName, onEvent, useCapture);
            resolve(aArgs);
          }, useCapture);
	});
        break;
      }
    }
  });
}

function* loadFrame(attributes = {}) {
  let iframe = document.createElement("iframe");
  iframe.setAttribute("src", FRAME_URL);
  for (let key in attributes) {
    iframe.setAttribute(key, attributes[key]);
  }
  let loaded = once(iframe, [ "load", "mozbrowserloadend" ]);
  document.body.appendChild(iframe);
  yield loaded;
  return iframe;
}
