fune/docshell/test/navigation/browser_bug343515.js
Andrew McCreight 2b7c6b4c81 Bug 1592465 - Modernize browser_bug343515.js. r=bzbarsky
I rewrote BrowserUtils.addContentEventListener(), and that caused an
intermittent failure in browser_bug343515.js. The use of
addContentEventListener in the test is questionable, and the test as a
whole is old, so I freshened it up.

Instead of nShotsListener (and oneShotListener, which is a special
case of that) which waits for a hard coded number of load events to
fire to ensure that a page and its subframes are all loaded, I use
BrowserTestUtils.browserLoaded().

Instead of waitForPageshow, which runs a script in the content process
that waits for an event, it uses BrowserTestUtils.waitForContentEvent,
which does the same thing in a hopefully more resilient fashion.

The largest change in terms of number of characters changed is that I
rewrote the test so that it is written inside of a single add_task
async function, instead of being split into a chain of async
functions. I also used await to flatten a lot of .then() chained
things.

I fixed up some variable shadowing. There was some trickiness around
shadowed variable names being used as field names, so I introduced an
intermediate 'data' variable to hold the structure.

Finally, I call BrowserTestUtils.removeTab() instead of calling
removeTab() directly on the browser. I figured that was probably
better, though maybe it does not matter.

I added a check after each step that the URI is correct, where
missing, which would have caught a bug in an earlier version of this
patch.

Differential Revision: https://phabricator.services.mozilla.com/D51183

--HG--
extra : moz-landing-system : lando
2019-10-31 02:47:08 +00:00

267 lines
7.9 KiB
JavaScript

// Test for bug 343515 - Need API for tabbrowsers to tell docshells they're visible/hidden
// Globals
var testPath = "http://mochi.test:8888/browser/docshell/test/navigation/";
var ctx = {};
add_task(async function() {
// Step 1.
// Get a handle on the initial tab
ctx.tab0 = gBrowser.selectedTab;
ctx.tab0Browser = gBrowser.getBrowserForTab(ctx.tab0);
await BrowserTestUtils.waitForCondition(
() => ctx.tab0Browser.docShellIsActive,
"Timed out waiting for initial tab to be active."
);
// Open a New Tab
ctx.tab1 = BrowserTestUtils.addTab(gBrowser, testPath + "bug343515_pg1.html");
ctx.tab1Browser = gBrowser.getBrowserForTab(ctx.tab1);
await BrowserTestUtils.browserLoaded(ctx.tab1Browser);
// Step 2.
is(
testPath + "bug343515_pg1.html",
ctx.tab1Browser.currentURI.spec,
"Got expected tab 1 url in step 2"
);
// Our current tab should still be active
ok(ctx.tab0Browser.docShellIsActive, "Tab 0 should still be active");
ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should not be active");
// Switch to tab 1
await BrowserTestUtils.switchTab(gBrowser, ctx.tab1);
// Tab 1 should now be active
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
// Open another tab
ctx.tab2 = BrowserTestUtils.addTab(gBrowser, testPath + "bug343515_pg2.html");
ctx.tab2Browser = gBrowser.getBrowserForTab(ctx.tab2);
await BrowserTestUtils.browserLoaded(ctx.tab2Browser);
// Step 3.
is(
testPath + "bug343515_pg2.html",
ctx.tab2Browser.currentURI.spec,
"Got expected tab 2 url in step 3"
);
// Tab 0 should be inactive, Tab 1 should be active
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
// Tab 2's window _and_ its iframes should be inactive
ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
await ContentTask.spawn(ctx.tab2Browser, null, async function() {
Assert.equal(content.frames.length, 2, "Tab 2 should have 2 iframes");
for (var i = 0; i < content.frames.length; i++) {
info("step 3, frame " + i + " info: " + content.frames[i].location);
let docShell = content.frames[i].docShell;
Assert.ok(!docShell.isActive, `Tab2 iframe ${i} should be inactive`);
}
});
// Navigate tab 2 to a different page
await BrowserTestUtils.loadURI(
ctx.tab2Browser,
testPath + "bug343515_pg3.html"
);
await BrowserTestUtils.browserLoaded(ctx.tab2Browser);
// Step 4.
async function checkTab2Active(outerExpected) {
await ContentTask.spawn(ctx.tab2Browser, outerExpected, async function(
expected
) {
function isActive(aWindow) {
var docshell = aWindow.docShell;
return docshell.isActive;
}
let active = expected ? "active" : "inactive";
Assert.equal(content.frames.length, 2, "Tab 2 should have 2 iframes");
for (var i = 0; i < content.frames.length; i++) {
info("step 4, frame " + i + " info: " + content.frames[i].location);
}
Assert.equal(
content.frames[0].frames.length,
1,
"Tab 2 iframe 0 should have 1 iframes"
);
Assert.equal(
isActive(content.frames[0]),
expected,
`Tab2 iframe 0 should be ${active}`
);
Assert.equal(
isActive(content.frames[0].frames[0]),
expected,
`Tab2 iframe 0 subiframe 0 should be ${active}`
);
Assert.equal(
isActive(content.frames[1]),
expected,
`Tab2 iframe 1 should be ${active}`
);
});
}
is(
testPath + "bug343515_pg3.html",
ctx.tab2Browser.currentURI.spec,
"Got expected tab 2 url in step 4"
);
// Tab 0 should be inactive, Tab 1 should be active
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
// Tab2 and all descendants should be inactive
await checkTab2Active(false);
// Switch to Tab 2
await BrowserTestUtils.switchTab(gBrowser, ctx.tab2);
// Check everything
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should be inactive");
ok(ctx.tab2Browser.docShellIsActive, "Tab 2 should be active");
await checkTab2Active(true);
// Go back
let backDone = BrowserTestUtils.waitForContentEvent(
ctx.tab2Browser,
"pageshow"
);
ctx.tab2Browser.goBack();
await backDone;
// Step 5.
// Check everything
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should be inactive");
ok(ctx.tab2Browser.docShellIsActive, "Tab 2 should be active");
is(
testPath + "bug343515_pg2.html",
ctx.tab2Browser.currentURI.spec,
"Got expected tab 2 url in step 5"
);
await ContentTask.spawn(ctx.tab2Browser, null, async function() {
for (var i = 0; i < content.frames.length; i++) {
let docShell = content.frames[i].docShell;
Assert.ok(docShell.isActive, `Tab2 iframe ${i} should be active`);
}
});
// Switch to tab 1
await BrowserTestUtils.switchTab(gBrowser, ctx.tab1);
// Navigate to page 3
await BrowserTestUtils.loadURI(
ctx.tab1Browser,
testPath + "bug343515_pg3.html"
);
await BrowserTestUtils.browserLoaded(ctx.tab1Browser);
// Step 6.
// Check everything
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
is(
testPath + "bug343515_pg3.html",
ctx.tab1Browser.currentURI.spec,
"Got expected tab 1 url in step 6"
);
await ContentTask.spawn(ctx.tab1Browser, null, async function() {
function isActive(aWindow) {
var docshell = aWindow.docShell;
return docshell.isActive;
}
Assert.ok(isActive(content.frames[0]), "Tab1 iframe 0 should be active");
Assert.ok(
isActive(content.frames[0].frames[0]),
"Tab1 iframe 0 subiframe 0 should be active"
);
Assert.ok(isActive(content.frames[1]), "Tab1 iframe 1 should be active");
});
ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
await ContentTask.spawn(ctx.tab2Browser, null, async function() {
for (var i = 0; i < content.frames.length; i++) {
let docShell = content.frames[i].docShell;
Assert.ok(!docShell.isActive, `Tab2 iframe ${i} should be inactive`);
}
});
// Go forward on tab 2
let forwardDone = BrowserTestUtils.waitForContentEvent(
ctx.tab2Browser,
"pageshow"
);
ctx.tab2Browser.goForward();
await forwardDone;
// Step 7.
async function checkBrowser(browser, outerTabNum, outerActive) {
let data = { tabNum: outerTabNum, active: outerActive };
await ContentTask.spawn(browser, data, async function({ tabNum, active }) {
function isActive(aWindow) {
var docshell = aWindow.docShell;
return docshell.isActive;
}
let activestr = active ? "active" : "inactive";
Assert.equal(
isActive(content.frames[0]),
active,
`Tab${tabNum} iframe 0 should be ${activestr}`
);
Assert.equal(
isActive(content.frames[0].frames[0]),
active,
`Tab${tabNum} iframe 0 subiframe 0 should be ${activestr}`
);
Assert.equal(
isActive(content.frames[1]),
active,
`Tab${tabNum} iframe 1 should be ${activestr}`
);
});
}
// Check everything
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
is(
testPath + "bug343515_pg3.html",
ctx.tab2Browser.currentURI.spec,
"Got expected tab 2 url in step 7"
);
await checkBrowser(ctx.tab1Browser, 1, true);
ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
await checkBrowser(ctx.tab2Browser, 2, false);
// Close the tabs we made
BrowserTestUtils.removeTab(ctx.tab1);
BrowserTestUtils.removeTab(ctx.tab2);
});