<!DOCTYPE html>
<!--
  Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/
-->

<html>

  <head>
    <meta charset="utf8">
    <title></title>

    <script type="application/javascript"
            src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
    <link rel="stylesheet" type="text/css"
          href="chrome://mochikit/content/tests/SimpleTest/test.css">

    <script type="application/javascript;version=1.8">
      const { classes: Cc, interfaces: Ci, utils: Cu } = Components;

      let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
      const contentGlobals  = require("devtools/server/content-globals");
      const Services = require("Services");
      const tabs = require('sdk/tabs');
      const { getMostRecentBrowserWindow, getInnerId } = require('sdk/window/utils');
      const { PageMod } = require('sdk/page-mod');

      var _tests = [];
      function addTest(test) {
        _tests.push(test);
      }

      function runNextTest() {
        if (_tests.length == 0) {
          SimpleTest.finish()
          return;
        }
        _tests.shift()();
      }

      window.onload = function() {
        SimpleTest.waitForExplicitFinish();
        runNextTest();
      }

      addTest(function () {
        let TEST_URL = 'data:text/html;charset=utf-8,test';

        let mod = PageMod({
          include: TEST_URL,
          contentScriptWhen: 'ready',
          contentScript: 'null;'
        });

        tabs.open({
          url: TEST_URL,
          onLoad: function(tab) {
            let id = getInnerId(getMostRecentBrowserWindow().gBrowser.selectedBrowser.contentWindow);

            // getting
            is(contentGlobals.getContentGlobals({
              'inner-window-id': id
            }).length, 1, 'found a global for inner-id = ' + id);

            Services.obs.addObserver(function observer(subject, topic, data) {
              if (id == subject.QueryInterface(Components.interfaces.nsISupportsPRUint64).data) {
                Services.obs.removeObserver(observer, 'inner-window-destroyed');
                setTimeout(function() {
                  // closing the tab window should have removed the global
                  is(contentGlobals.getContentGlobals({
                    'inner-window-id': id
                  }).length, 0, 'did not find a global for inner-id = ' + id);

                  mod.destroy();
                  runNextTest();
                })
              }
            }, 'inner-window-destroyed', false);

            tab.close();
          }
        });
      })

      addTest(function testAddRemoveGlobal() {
        let global = {};
        let globalDetails = {
          global: global,
          'inner-window-id': 5
        };

        // adding
        contentGlobals.addContentGlobal(globalDetails);

        // getting
        is(contentGlobals.getContentGlobals({
          'inner-window-id': 5
        }).length, 1, 'found a global for inner-id = 5');
        is(contentGlobals.getContentGlobals({
          'inner-window-id': 4
        }).length, 0, 'did not find a global for inner-id = 4');

        // remove
        contentGlobals.removeContentGlobal(globalDetails);

        // getting again
        is(contentGlobals.getContentGlobals({
          'inner-window-id': 5
        }).length, 0, 'did not find a global for inner-id = 5');

        runNextTest();
      });

    </script>
  </head>
  <body></body>
</html>