summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/general/browser_tabs_isActive.js
blob: 0725757e7097ab2ae81ff41d2dbb73e65ef25b3d (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

// Test for the docshell active state of local and remote browsers.

const kTestPage = "http://example.org/browser/browser/base/content/test/general/dummy_page.html";

function promiseNewTabSwitched() {
  return new Promise(resolve => {
    gBrowser.addEventListener("TabSwitchDone", function onSwitch() {
      gBrowser.removeEventListener("TabSwitchDone", onSwitch);
      executeSoon(resolve);
    });
  });
}

function getParentTabState(aTab) {
  return aTab.linkedBrowser.docShellIsActive;
}

function getChildTabState(aTab) {
  return ContentTask.spawn(aTab.linkedBrowser, {}, function* () {
    return docShell.isActive;
  });
}

function checkState(parentSide, childSide, value, message) {
  is(parentSide, value, message + " (parent side)");
  is(childSide, value, message + " (child side)");
}

function waitForMs(aMs) {
  return new Promise((resolve) => {
    setTimeout(done, aMs);
    function done() {
      resolve(true);
    }
  });
}

add_task(function *() {
  let url = kTestPage;
  let originalTab = gBrowser.selectedTab; // test tab
  let newTab = gBrowser.addTab(url, {skipAnimation: true});
  let parentSide, childSide;

  // new tab added but not selected checks
  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, false, "newly added " + url + " tab is not active");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, true, "original tab is active initially");

  // select the newly added tab and wait  for TabSwitchDone event
  let tabSwitchedPromise = promiseNewTabSwitched();
  gBrowser.selectedTab = newTab;
  yield tabSwitchedPromise;

  if (Services.appinfo.browserTabsRemoteAutostart) {
    ok(newTab.linkedBrowser.isRemoteBrowser, "for testing we need a remote tab");
  }

  // check active state of both tabs
  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, true, "newly added " + url + " tab is active after selection");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, false, "original tab is not active while unselected");

  // switch back to the original test tab and wait for TabSwitchDone event
  tabSwitchedPromise = promiseNewTabSwitched();
  gBrowser.selectedTab = originalTab;
  yield tabSwitchedPromise;

  // check active state of both tabs
  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, false, "newly added " + url + " tab is not active after switch back");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, true, "original tab is active again after switch back");

  // switch to the new tab and wait for TabSwitchDone event
  tabSwitchedPromise = promiseNewTabSwitched();
  gBrowser.selectedTab = newTab;
  yield tabSwitchedPromise;

  // check active state of both tabs
  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, true, "newly added " + url + " tab is not active after switch back");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, false, "original tab is active again after switch back");

  gBrowser.removeTab(newTab);
});

add_task(function *() {
  let url = "about:about";
  let originalTab = gBrowser.selectedTab; // test tab
  let newTab = gBrowser.addTab(url, {skipAnimation: true});
  let parentSide, childSide;

  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, false, "newly added " + url + " tab is not active");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, true, "original tab is active initially");

  let tabSwitchedPromise = promiseNewTabSwitched();
  gBrowser.selectedTab = newTab;
  yield tabSwitchedPromise;

  if (Services.appinfo.browserTabsRemoteAutostart) {
    ok(!newTab.linkedBrowser.isRemoteBrowser, "for testing we need a local tab");
  }

  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, true, "newly added " + url + " tab is active after selection");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, false, "original tab is not active while unselected");

  tabSwitchedPromise = promiseNewTabSwitched();
  gBrowser.selectedTab = originalTab;
  yield tabSwitchedPromise;

  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, false, "newly added " + url + " tab is not active after switch back");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, true, "original tab is active again after switch back");

  tabSwitchedPromise = promiseNewTabSwitched();
  gBrowser.selectedTab = newTab;
  yield tabSwitchedPromise;

  parentSide = getParentTabState(newTab);
  childSide = yield getChildTabState(newTab);
  checkState(parentSide, childSide, true, "newly added " + url + " tab is not active after switch back");
  parentSide = getParentTabState(originalTab);
  childSide = yield getChildTabState(originalTab);
  checkState(parentSide, childSide, false, "original tab is active again after switch back");

  gBrowser.removeTab(newTab);
});