/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";

const { Ci, Cu, Cc, components } = require("chrome");
const self = require("sdk/self");
const { before, after } = require("sdk/test/utils");
const fixtures = require("./fixtures");
const { Loader } = require("sdk/test/loader");
const { merge } = require("sdk/util/object");

exports["test changing result from addon extras in panel"] = function(assert, done) {
  let loader = Loader(module, null, null, {
    modules: {
      "sdk/self": merge({}, self, {
        data: merge({}, self.data, {url: fixtures.url})
      })
    }
  });

  const { Panel } = loader.require("sdk/panel");
  const { getActiveView } = loader.require("sdk/view/core");
  const { events } = loader.require("sdk/content/sandbox/events");
  const { on } = loader.require("sdk/event/core");
  const { isAddonContent } = loader.require("sdk/content/utils");

  var result = 1;
  var extrasVal = {
    test: function() {
      return result;
    }
  };

  on(events, "content-script-before-inserted", ({ window, worker }) => {
    assert.pass("content-script-before-inserted");

    if (isAddonContent({ contentURL: window.location.href })) {
      let extraStuff = Cu.cloneInto(extrasVal, window, {
        cloneFunctions: true
      });
      getUnsafeWindow(window).extras = extraStuff;

      assert.pass("content-script-before-inserted done!");
    }
  });

  let panel = Panel({
    contentURL: "./test-addon-extras.html"
  });

  // Force the panel view to actually load.
  getActiveView(panel);

  panel.port.once("result1", (result) => {
    assert.equal(result, 1, "result is a number");
    result = true;
    panel.port.emit("get-result");
  });

  panel.port.once("result2", (result) => {
    assert.equal(result, true, "result is a boolean");
    loader.unload();
    done();
  });

  panel.port.emit("get-result");
}

function getUnsafeWindow (win) {
  return win.wrappedJSObject || win;
}

require("sdk/test").run(exports);
