summaryrefslogtreecommitdiffstats
path: root/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_ui.js
blob: f51d43951abc54752c58adc0490ff35bf9cbee15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/* 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/. */

// This test makes sure that the gPrivateBrowsingUI object, the Private Browsing
// menu item and its XUL <command> element work correctly.

function test() {
  // initialization
  waitForExplicitFinish();
  SpecialPowers.pushPrefEnv({
    set: [["security.allow_eval_with_system_principal", true]],
  });
  let windowsToClose = [];
  let testURI = "about:blank";
  let pbMenuItem;
  let cmd;

  function doTest(aIsPrivateMode, aWindow, aCallback) {
    BrowserTestUtils.browserLoaded(aWindow.gBrowser.selectedBrowser).then(
      function () {
        ok(aWindow.gPrivateBrowsingUI, "The gPrivateBrowsingUI object exists");

        pbMenuItem = aWindow.document.getElementById("menu_newPrivateWindow");
        ok(pbMenuItem, "The Private Browsing menu item exists");

        cmd = aWindow.document.getElementById("Tools:PrivateBrowsing");
        isnot(
          cmd,
          null,
          "XUL command object for the private browsing service exists"
        );

        is(
          pbMenuItem.getAttribute("label"),
          "New Private Window",
          'The Private Browsing menu item should read "New Private Window"'
        );
        is(
          PrivateBrowsingUtils.isWindowPrivate(aWindow),
          aIsPrivateMode,
          "PrivateBrowsingUtils should report the correct per-window private browsing status (privateBrowsing should be " +
            aIsPrivateMode +
            ")"
        );

        aCallback();
      }
    );

    BrowserTestUtils.loadURIString(aWindow.gBrowser.selectedBrowser, testURI);
  }

  function openPrivateBrowsingModeByUI(aWindow, aCallback) {
    Services.obs.addObserver(function observer(aSubject, aTopic, aData) {
      aSubject.addEventListener(
        "load",
        function () {
          Services.obs.removeObserver(observer, "domwindowopened");
          windowsToClose.push(aSubject);
          aCallback(aSubject);
        },
        { once: true }
      );
    }, "domwindowopened");

    cmd = aWindow.document.getElementById("Tools:PrivateBrowsing");
    var func = new Function("", cmd.getAttribute("oncommand"));
    func.call(cmd);
  }

  function testOnWindow(aOptions, aCallback) {
    whenNewWindowLoaded(aOptions, function (aWin) {
      windowsToClose.push(aWin);
      // execute should only be called when need, like when you are opening
      // web pages on the test. If calling executeSoon() is not necesary, then
      // call whenNewWindowLoaded() instead of testOnWindow() on your test.
      executeSoon(() => aCallback(aWin));
    });
  }

  // this function is called after calling finish() on the test.
  registerCleanupFunction(function () {
    windowsToClose.forEach(function (aWin) {
      aWin.close();
    });
  });

  // test first when not on private mode
  testOnWindow({}, function (aWin) {
    doTest(false, aWin, function () {
      // then test when on private mode, opening a new private window from the
      // user interface.
      openPrivateBrowsingModeByUI(aWin, function (aPrivateWin) {
        doTest(true, aPrivateWin, finish);
      });
    });
  });
}