Mypal/dom/tests/mochitest/general/test_contentViewer_override...

359 lines
10 KiB
HTML

<!DOCTYPE HTML>
<html>
<head>
<title>nsIContentViewer::overrideDPPX test</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
</head>
<body>
<iframe></iframe>
<script type="application/javascript;version=1.8">
SimpleTest.waitForExplicitFinish();
const frameWindow = document.querySelector("iframe").contentWindow;
const originalDPR = window.devicePixelRatio;
const originalZoom = SpecialPowers.getFullZoom(window);
const dppx = originalDPR * 1.5;
const zoom = originalZoom * 0.5;
const setOverrideDPPX = (value) => {
if (value > 0) {
info(`override window's dppx to ${value}`);
} else {
info(`restore window's dppx to default value`);
}
SpecialPowers.setOverrideDPPX(window, value);
}
const setFullZoom = (value) => {
info(`set window's fullZoom to ${value}`);
SpecialPowers.setFullZoom(window, value);
}
const createFontStyleForDPPX = (doc, value, size) => {
info(`adding a stylesheet that set font size to ${size}px for ${value}dppx`);
let style = doc.createElement("style");
style.setAttribute("media", `(resolution: ${value}dppx)`);
doc.head.appendChild(style);
style.sheet.insertRule(`body {font-size: ${size}px}`, 0);
return style;
}
const getBodyFontSize = (w) => w.getComputedStyle(w.document.body).fontSize;
const assertValuesAreInitial = () => {
is(window.devicePixelRatio, originalDPR,
"devicePixelRatio has the original value.");
is(SpecialPowers.getFullZoom(window), originalZoom,
"fullZoom has the original value.");
is(frameWindow.devicePixelRatio, originalDPR,
"devicePixelRatio has the original value.");
is(SpecialPowers.getFullZoom(frameWindow), originalZoom,
"fullZoom has the original value.");
}
const gTests = {
"test overrideDPPX with devicePixelRatio": (done) => {
assertValuesAreInitial();
setOverrideDPPX(dppx);
is(window.devicePixelRatio, dppx,
"devicePixelRatio overridden.");
is(frameWindow.devicePixelRatio, dppx,
"frame's devicePixelRatio overridden.");
setOverrideDPPX(0);
is(window.devicePixelRatio, originalDPR,
"devicePixelRatio back to default.");
is(frameWindow.devicePixelRatio, originalDPR,
"frame's devicePixelRatio back to default.");
done();
},
"test overrideDPPX with devicePixelRatio and fullZoom": (done) => {
assertValuesAreInitial();
setFullZoom(zoom);
setOverrideDPPX(dppx);
is(window.devicePixelRatio, dppx,
"devicePixelRatio overridden; fullZoom ignored");
is(frameWindow.devicePixelRatio, dppx,
"frame's devicePixelRatio overridden; fullZoom ignored");
setOverrideDPPX(0);
is(window.devicePixelRatio, originalDPR * zoom,
"devicePixelRatio now is affected by fullZoom");
is(frameWindow.devicePixelRatio, originalDPR * zoom,
"frame's devicePixelRatio now is affected by fullZoom");
isnot(dppx, originalDPR * zoom,
"test is no longer testing what it should be");
setFullZoom(originalZoom);
is(window.devicePixelRatio, originalDPR,
"devicePixelRatio back to default.");
is(frameWindow.devicePixelRatio, originalDPR,
"frame's devicePixelRatio back to default.");
done();
},
"test overrideDPPX with media queries": (done) => {
assertValuesAreInitial();
let frameDoc = frameWindow.document;
let originalFontSize = getBodyFontSize(window);
let frameOriginalFontSize = getBodyFontSize(frameWindow);
let style = createFontStyleForDPPX(document, dppx, "32");
let frameStyle = createFontStyleForDPPX(frameDoc, dppx, "32");
let currentFontSize = getBodyFontSize(window);
let frameCurrentFontSize = getBodyFontSize(frameWindow);
is(currentFontSize, originalFontSize,
"media queries are not applied yet");
is(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are not applied yet");
setOverrideDPPX(dppx);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
isnot(currentFontSize, originalFontSize,
"media queries are applied.");
isnot(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are applied.");
is(currentFontSize, "32px",
"font size has the expected value.");
is(frameCurrentFontSize, "32px",
"frame's font size has the expected value.");
setOverrideDPPX(0);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
is(currentFontSize, originalFontSize,
"media queries are not applied anymore.");
is(frameCurrentFontSize, frameOriginalFontSize,
"media queries are not applied anymore.");
style.remove();
frameStyle.remove();
done();
},
"test overrideDPPX with media queries and fullZoom": (done) => {
assertValuesAreInitial();
let frameDoc = frameWindow.document;
let styles = [
createFontStyleForDPPX(document, originalDPR, "23"),
createFontStyleForDPPX(document, dppx, "32"),
createFontStyleForDPPX(document, originalDPR * zoom, "48"),
createFontStyleForDPPX(frameDoc, originalDPR, "23"),
createFontStyleForDPPX(frameDoc, dppx, "32"),
createFontStyleForDPPX(frameDoc, originalDPR * zoom, "48")
];
let currentFontSize = getBodyFontSize(window);
let frameCurrentFontSize = getBodyFontSize(frameWindow);
is(currentFontSize, "23px",
"media queries are not applied yet");
is(frameCurrentFontSize, "23px",
"frame's media queries are not applied yet");
setFullZoom(zoom);
setOverrideDPPX(dppx);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
is(currentFontSize, "32px",
"media queries are applied for overridden DDPX; fullZoom ignored.");
is(frameCurrentFontSize, "32px",
"frame's media queries are applied for overridden DDPX; fullZoom ignored.");
setOverrideDPPX(0);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
is(currentFontSize, "48px",
"media queries are applied for fullZoom.");
is(frameCurrentFontSize, "48px",
"frame's media queries are applied for fullZoom.");
setFullZoom(originalZoom);
currentFontSize = getBodyFontSize(window);
frameCurrentFontSize = getBodyFontSize(frameWindow);
is(currentFontSize, "23px",
"media queries are not applied anymore.");
is(frameCurrentFontSize, "23px",
"frame's media queries are not applied anymore.");
styles.forEach(style => style.remove());
done();
},
"test OverrideDPPX with MediaQueryList": (done) => {
assertValuesAreInitial();
let promises = [
new Promise(resolve => {
let mql = window.matchMedia(`(resolution: ${dppx}dppx)`);
mql.addListener(function listener() {
ok("MediaQueryList's listener invoked.")
mql.removeListener(listener);
resolve();
});
}),
new Promise(resolve => {
let mql = frameWindow.matchMedia(`(resolution: ${dppx}dppx)`);
mql.addListener(function listener() {
ok("frame's MediaQueryList's listener invoked.")
mql.removeListener(listener);
resolve();
});
})
];
Promise.all(promises)
.then(() => setOverrideDPPX(0))
.then(done, e => {throw e});
setOverrideDPPX(dppx);
},
"test OverrideDPPX with MediaQueryList and fullZoom": (done) => {
assertValuesAreInitial();
let overridden = false;
let promises = [
new Promise(resolve => {
let mql = window.matchMedia(`(resolution: ${dppx}dppx)`);
mql.addListener(function listener() {
ok("MediaQueryList's listener for dppx invoked.");
mql.removeListener(listener);
overridden = true;
resolve();
});
}),
new Promise(resolve => {
let mql = window.matchMedia(`(resolution: ${originalDPR * zoom}dppx)`);
mql.addListener(function listener() {
ok(overridden,
"MediaQueryList's listener for zoom invoked in the right order");
mql.removeListener(listener);
resolve();
});
})
];
promises[0]
.then(() => setOverrideDPPX(0))
.then(promises[1])
.then(() => setFullZoom(originalZoom))
.then(done, e => {throw e});
setOverrideDPPX(dppx);
setFullZoom(zoom);
},
"test OverrideDPPX is kept on document navigation": (done) => {
assertValuesAreInitial();
let frameOriginalFontSize = getBodyFontSize(frameWindow);
let frameStyle = createFontStyleForDPPX(frameWindow.document, dppx, "32");
let frameCurrentFontSize = getBodyFontSize(frameWindow);
is(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are not applied yet");
setOverrideDPPX(dppx);
frameCurrentFontSize = getBodyFontSize(frameWindow);
is(frameWindow.devicePixelRatio, dppx,
"frame's devicePixelRatio overridden.");
isnot(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are applied.");
is(frameCurrentFontSize, "32px",
"frame's font size has the expected value.");
frameWindow.frameElement.addEventListener("load", function listener() {
this.removeEventListener("load", listener);
frameStyle = createFontStyleForDPPX(frameWindow.document, dppx, "32");
frameCurrentFontSize = getBodyFontSize(frameWindow);
is(frameWindow.devicePixelRatio, dppx,
"frame's devicePixelRatio is still overridden.");
isnot(frameCurrentFontSize, frameOriginalFontSize,
"frame's media queries are still applied.");
is(frameCurrentFontSize, "32px",
"frame's font size has still the expected value.");
frameStyle.remove();
setOverrideDPPX(0);
done();
});
frameWindow.location.reload(true);
}
};
function* runner(tests) {
for (let name of Object.keys(tests)) {
info(name);
tests[name](next);
yield undefined;
}
};
const gTestRunner = runner(gTests);
function next() {
SimpleTest.executeSoon(function() {
if (gTestRunner.next().done) {
SimpleTest.finish();
}
});
}
// Run the tests
addLoadEvent(next);
</script>
</body>
</html>