Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
*/
const LINES = 800; // should be enough for any reasonable viewport on automation.
const CONTENT = (() => {
let c = "";
for (let i = 1; i <= LINES; ++i) {
c += `line ${i}\n`;
}
return c;
})();
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [["test.wait300msAfterTabSwitch", true]],
});
});
add_task(async function () {
// First test with text with the text/html mimetype.
info("Testing text/html");
let tab = await openDocument("data:text/html," + encodeURIComponent(CONTENT));
await checkViewSource(tab);
gBrowser.removeTab(tab);
info("Testing text/plain");
tab = await openDocument("data:text/plain," + encodeURIComponent(CONTENT));
await checkViewSource(tab);
gBrowser.removeTab(tab);
});
var checkViewSource = async function (aTab) {
let browser = aTab.linkedBrowser;
await SpecialPowers.spawn(browser, [CONTENT], async function (text) {
is(content.document.body.textContent, text, "Correct content loaded");
});
// Let's cover beginning and end, forwards and backwards.
for (let lineNumber of [1, 100, 800, 100, 1]) {
info(`Going to line ${lineNumber}`);
browser.sendMessageToActor(
"ViewSource:GoToLine",
{
lineNumber,
},
"ViewSourcePage"
);
await SpecialPowers.spawn(browser, [lineNumber], async function (i) {
let selection = content.getSelection();
Assert.equal(
selection.toString().trim(),
"line " + i,
"Correct text selected"
);
// Scrolling to the selection is async.
await new Promise(r => {
content.requestAnimationFrame(() => content.requestAnimationFrame(r));
});
let foundNonEmptyRect = false;
for (let rect of selection.getRangeAt(0).getClientRects()) {
if (rect.width == 0 || rect.height == 0) {
continue;
}
info(`Testing selection rect: ${JSON.stringify(rect)}`);
info(`Current scroll position: ${content.scrollY}`);
foundNonEmptyRect = true;
Assert.greaterOrEqual(
rect.top,
0,
"Top of the selection should be in viewport (top)"
);
Assert.lessOrEqual(
rect.bottom,
content.innerHeight,
"Top of the selection should be in viewport (bottom)"
);
}
Assert.ok(foundNonEmptyRect, "Should have some non-empty rects");
});
}
};