/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

/**
 * Tests that the debugger does show up even if a progress listener reads the
 * WebProgress argument's DOMWindow property in onStateChange() (bug 771655).
 */

var gTab, gPanel, gDebugger;
var gOldListener;

const TAB_URL = EXAMPLE_URL + "doc_inline-script.html";

function test() {
  installListener();

  let options = {
    source: TAB_URL,
    line: 1
  };
  initDebugger(TAB_URL, options).then(([aTab,, aPanel]) => {
    gTab = aTab;
    gPanel = aPanel;
    gDebugger = gPanel.panelWin;

    is(!!gDebugger.DebuggerController._startup, true,
      "Controller should be initialized after starting the test.");

    testPause();
  });
}

function testPause() {
  let onCaretUpdated = waitForCaretUpdated(gPanel, 16);
  callInTab(gTab, "runDebuggerStatement");
  onCaretUpdated.then(() => {
    is(gDebugger.gThreadClient.state, "paused",
      "The debugger statement was reached.");

    resumeDebuggerThenCloseAndFinish(gPanel);
  });
}

// This is taken almost verbatim from bug 771655.
function installListener() {
  if ("_testPL" in window) {
    gOldListener = _testPL;

    Cc["@mozilla.org/docloaderservice;1"]
      .getService(Ci.nsIWebProgress)
      .removeProgressListener(_testPL);
  }

  window._testPL = {
    START_DOC: Ci.nsIWebProgressListener.STATE_START |
               Ci.nsIWebProgressListener.STATE_IS_DOCUMENT,
    onStateChange: function (wp, req, stateFlags, status) {
      if ((stateFlags & this.START_DOC) === this.START_DOC) {
        // This DOMWindow access triggers the unload event.
        wp.DOMWindow;
      }
    },
    QueryInterface: function (iid) {
      if (iid.equals(Ci.nsISupportsWeakReference) ||
          iid.equals(Ci.nsIWebProgressListener))
        return this;
      throw Cr.NS_ERROR_NO_INTERFACE;
    }
  };

  Cc["@mozilla.org/docloaderservice;1"]
    .getService(Ci.nsIWebProgress)
    .addProgressListener(_testPL, Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
}

registerCleanupFunction(function () {
  if (gOldListener) {
    window._testPL = gOldListener;
  } else {
    delete window._testPL;
  }

  gTab = null;
  gPanel = null;
  gDebugger = null;
  gOldListener = null;
});
