text: <!DOCTYPE HTML>
  <html>
  <!--
  https://bugzilla.mozilla.org/show_bug.cgi?id=248970
  -->
  <head>
    <title>Test for Bug 248970</title>
    <script type="application/javascript"
            src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
    <script type="text/javascript" src="notification_common.js"></script>
    <link rel="stylesheet" type="text/css"
          href="chrome://mochikit/content/tests/SimpleTest/test.css">
  </head>
  <body>
  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=248970">Mozilla Bug 248970</a>
  <p id="display"></p>
  <pre id="test">
  <script class="testbody" type="text/javascript">
  
  /** Test for Bug 248970 **/
  // based on test_notifications.html
  
  const Ci = SpecialPowers.Ci;
  const Cc = SpecialPowers.Cc;
  const Cr = SpecialPowers.Cr;
  
  Components.utils.import("resource://gre/modules/Services.jsm");
  
  var testpath = "/tests/toolkit/components/passwordmgr/test/";
  var prefix = "http://test2.example.com" + testpath;
  var subtests = [
                     "subtst_privbrowsing_1.html", // 1
                     "subtst_privbrowsing_1.html", // 2
                     "subtst_privbrowsing_1.html", // 3
                     "subtst_privbrowsing_2.html", // 4
                     "subtst_privbrowsing_2.html", // 5
                     "subtst_privbrowsing_2.html", // 6
                     "subtst_privbrowsing_3.html", // 7
                     "subtst_privbrowsing_3.html", // 8
                     "subtst_privbrowsing_4.html", // 9
                     "subtst_privbrowsing_3.html" // 10
                 ];
  var observer;
  
  var testNum = 0;
  function loadNextTest() {
    // run the initialization code for each test
    switch (++ testNum) {
      case 1:
        popupNotifications = normalWindowPopupNotifications;
        iframe = normalWindowIframe;
        break;
  
      case 2:
        popupNotifications = privateWindowPopupNotifications;
        iframe = privateWindowIframe;
        break;
  
      case 3:
        popupNotifications = normalWindowPopupNotifications;
        iframe = normalWindowIframe;
        break;
  
      case 4:
        pwmgr.addLogin(login);
        break;
  
      case 5:
        popupNotifications = privateWindowPopupNotifications;
        iframe = privateWindowIframe;
        break;
  
      case 6:
        popupNotifications = normalWindowPopupNotifications;
        iframe = normalWindowIframe;
        break;
  
      case 7:
        pwmgr.addLogin(login);
        break;
  
      case 8:
        popupNotifications = privateWindowPopupNotifications;
        iframe = privateWindowIframe;
        break;
  
      case 9:
        break;
  
      case 10:
        popupNotifications = normalWindowPopupNotifications;
        iframe = normalWindowIframe;
        break;
  
      default:
        ok(false, "Unexpected call to loadNextTest for test #" + testNum);
    }
  
    if (testNum === 7) {
      observer = SpecialPowers.wrapCallback(function(subject, topic, data) {
        SimpleTest.executeSoon(() => { iframe.contentWindow.postMessage("go", "*"); });
      });
      SpecialPowers.addObserver(observer, "passwordmgr-found-logins", false);
    }
  
    ok(true, "Starting test #" + testNum);
    iframe.src = prefix + subtests[testNum-1];
  }
  
  function checkTest() {
    var popup;
  
    switch (testNum) {
      case 1:
        // run outside of private mode, popup notification should appear
        popup = getPopup(popupNotifications, "password-save");
        ok(popup, "got popup notification");
        popup.remove();
        break;
  
      case 2:
        // run inside of private mode, popup notification should not appear
        popup = getPopup(popupNotifications, "password-save");
        ok(!popup, "checking for no popup notification");
        break;
  
      case 3:
        // run outside of private mode, popup notification should appear
        popup = getPopup(popupNotifications, "password-save");
        ok(popup, "got popup notification");
        popup.remove();
        break;
  
      case 4:
        // run outside of private mode, popup notification should appear
        popup = getPopup(popupNotifications, "password-change");
        ok(popup, "got popup notification");
        popup.remove();
        break;
  
      case 5:
        // run inside of private mode, popup notification should not appear
        popup = getPopup(popupNotifications, "password-change");
        ok(!popup, "checking for no popup notification");
        break;
  
      case 6:
        // run outside of private mode, popup notification should appear
        popup = getPopup(popupNotifications, "password-change");
        ok(popup, "got popup notification");
        popup.remove();
        pwmgr.removeLogin(login);
        break;
  
      case 7:
        // verify that the user/pass pair was autofilled
        var gotUser = iframe.contentDocument.getElementById("user").textContent;
        var gotPass = iframe.contentDocument.getElementById("pass").textContent;
        is(gotUser, "notifyu1", "Checking submitted username");
        is(gotPass, "notifyp1", "Checking submitted password");
        break;
  
      case 8:
        // verify that the user/pass pair was not autofilled
        var gotUser = iframe.contentDocument.getElementById("user").textContent;
        var gotPass = iframe.contentDocument.getElementById("pass").textContent;
        is(gotUser, "", "Checking submitted username");
        is(gotPass, "", "Checking submitted password");
        break;
  
      case 9:
        // verify that the user/pass pair was available for autocomplete
        var gotUser = iframe.contentDocument.getElementById("user").textContent;
        var gotPass = iframe.contentDocument.getElementById("pass").textContent;
        is(gotUser, "notifyu1", "Checking submitted username");
        is(gotPass, "notifyp1", "Checking submitted password");
        break;
  
      case 10:
        // verify that the user/pass pair was autofilled
        var gotUser = iframe.contentDocument.getElementById("user").textContent;
        var gotPass = iframe.contentDocument.getElementById("pass").textContent;
        is(gotUser, "notifyu1", "Checking submitted username");
        is(gotPass, "notifyp1", "Checking submitted password");
        pwmgr.removeLogin(login);
        break;
  
      default:
        ok(false, "Unexpected call to checkTest for test #" + testNum);
  
    }
  }
  
  var mainWindow = window.QueryInterface(Ci.nsIInterfaceRequestor)
                      .getInterface(Ci.nsIWebNavigation)
                      .QueryInterface(Ci.nsIDocShellTreeItem)
                      .rootTreeItem
                      .QueryInterface(Ci.nsIInterfaceRequestor)
                      .getInterface(Ci.nsIDOMWindow);
  var contentPage = "http://mochi.test:8888/tests/toolkit/components/passwordmgr/test/privbrowsing_perwindowpb_iframe.html";
  var testWindows = [];
  
  function whenDelayedStartupFinished(aWindow, aCallback) {
    Services.obs.addObserver(function observer(aSubject, aTopic) {
      if (aWindow == aSubject) {
        Services.obs.removeObserver(observer, aTopic);
        setTimeout(aCallback, 0);
      }
    }, "browser-delayed-startup-finished", false);
  }
  
  function testOnWindow(aIsPrivate, aCallback) {
    var win = mainWindow.OpenBrowserWindow({private: aIsPrivate});
    win.addEventListener("load", function onLoad() {
      win.removeEventListener("load", onLoad, false);
      whenDelayedStartupFinished(win, function() {
        win.addEventListener("DOMContentLoaded", function onInnerLoad() {
          if (win.content.location.href != contentPage) {
            win.gBrowser.loadURI(contentPage);
            return;
          }
          win.removeEventListener("DOMContentLoaded", onInnerLoad, true);
  
          win.content.addEventListener('load', function innerLoad2() {
            win.content.removeEventListener('load', innerLoad2, false);
            testWindows.push(win);
            SimpleTest.executeSoon(function() { aCallback(win); });
          }, false, true);
        }, true);
        SimpleTest.executeSoon(function() { win.gBrowser.loadURI(contentPage); });
      });
    }, true);
  }
  
  var ignoreLoad = false;
  function handleLoad(aEvent) {
    // ignore every other load event ... We get one for loading the subtest (which
    // we want to ignore), and another when the subtest's form submits itself
    // (which we want to handle, to start the next test).
    ignoreLoad = !ignoreLoad;
    if (ignoreLoad) {
      ok(true, "Ignoring load of subtest #" + testNum);
      return;
    }
    ok(true, "Processing submission of subtest #" + testNum);
  
    checkTest();
  
    if (testNum < subtests.length) {
      loadNextTest();
    } else {
      ok(true, "private browsing notification tests finished.");
  
      testWindows.forEach(function(aWin) {
        aWin.close();
      });
  
      SpecialPowers.removeObserver(observer, "passwordmgr-found-logins");
      SimpleTest.finish();
    }
  }
  
  var pwmgr = Cc["@mozilla.org/login-manager;1"].
              getService(Ci.nsILoginManager);
  ok(pwmgr != null, "Access pwmgr");
  
  // We need to make sure no logins have been stored by previous tests
  // for forms in |url|, otherwise the change password notification
  // would turn into a prompt, and the test will fail.
  var url = "http://test2.example.com";
  is(pwmgr.countLogins(url, "", null), 0, "No logins should be stored for " + url);
  
  var nsLoginInfo = new SpecialPowers.wrap(SpecialPowers.Components).Constructor("@mozilla.org/login-manager/loginInfo;1",
                                               Ci.nsILoginInfo, "init");
  var login = new nsLoginInfo(url, url, null, "notifyu1", "notifyp1", "user", "pass");
  
  var normalWindow;
  var privateWindow;
  
  var iframe;
  var normalWindowIframe;
  var privateWindowIframe;
  
  var popupNotifications;
  var normalWindowPopupNotifications;
  var privateWindowPopupNotifications;
  
  testOnWindow(false, function(aWin) {
    var selectedBrowser = aWin.gBrowser.selectedBrowser;
    normalWindowIframe = selectedBrowser.contentDocument.getElementById("iframe");
    normalWindowIframe.onload = handleLoad;
    selectedBrowser.focus();
  
    normalWindowPopupNotifications = getPopupNotifications(selectedBrowser.contentWindow.top);
    ok(normalWindowPopupNotifications, "Got popupNotifications in normal window");
    // ignore the first load for this window;
    ignoreLoad = false;
  
    testOnWindow(true, function(aPrivateWin) {
      selectedBrowser = aPrivateWin.gBrowser.selectedBrowser;
      privateWindowIframe = selectedBrowser.contentDocument.getElementById("iframe");
      privateWindowIframe.onload = handleLoad;
      selectedBrowser.focus();
  
      privateWindowPopupNotifications = getPopupNotifications(selectedBrowser.contentWindow.top);
      ok(privateWindowPopupNotifications, "Got popupNotifications in private window");
      // ignore the first load for this window;
      ignoreLoad = false;
  
      SimpleTest.executeSoon(loadNextTest);
    });
  });
  
  SimpleTest.waitForExplicitFinish();
  </script>
  </pre>
  </body>
  </html>
  
  