blob: 0b7b99cdd806a6c57480bc472cc32aff283955ca [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<script>
"use strict";
const CHILD_URL = "./resources/reference-css-no-cache.xhtml";
const EXPECTED_STYLE = "rgb(255, 0, 0) rgb(0, 128, 0)";
const queuedMessages = [];
const callbacksAwaitingMessages = [];
window.addEventListener("message", function(ev) {
if (callbacksAwaitingMessages.length > 0) {
const nextCallback = callbacksAwaitingMessages.shift();
nextCallback(ev.data);
} else {
queuedMessages.push(ev.data);
}
});
function dequeueMessage() {
return new Promise((resolve, reject) => {
if (queuedMessages.length === 0) {
callbacksAwaitingMessages.push(resolve);
} else {
resolve(queuedMessages.shift());
}
});
}
function createFrame(name) {
return new Promise((resolve, reject) => {
const iframe = document.createElement("iframe");
iframe.name = name;
iframe.addEventListener("load", () => resolve(iframe), {once: true});
iframe.src = CHILD_URL;
window.document.documentElement.appendChild(iframe);
});
}
function reloadFrame(frame) {
return new Promise(resolve => {
frame.addEventListener("load", () => resolve(frame), {once: true});
frame.src = frame.src;
});
}
promise_test(() => {
var frameA, frameB;
return Promise.resolve()
.then(() => createFrame("A")).then(result => {
frameA = result;
frameA.contentWindow.postMessage("query applied style", "*");
})
.then(dequeueMessage).then(styleInfoA => {
assert_equals(styleInfoA, "A " + EXPECTED_STYLE, "frame A should have the style applied");
})
.then(() => createFrame("B")).then(result => {
frameB = result;
frameB.contentWindow.postMessage("query applied style", "*");
})
.then(dequeueMessage).then(styleInfoB => {
assert_equals(styleInfoB, "B " + EXPECTED_STYLE, "frame B should have the style applied");
})
.then(() => reloadFrame(frameA))
.then(() => frameA.contentWindow.postMessage("query applied style", "*"))
.then(dequeueMessage).then(styleInfoA => {
assert_equals(styleInfoA, "A " + EXPECTED_STYLE, "frame A should have the style applied");
})
.then(() => frameB.contentWindow.postMessage("query applied style", "*"))
.then(dequeueMessage).then(styleInfoB => {
assert_equals(styleInfoB, "B " + EXPECTED_STYLE, "frame B should have the style applied");
})
.then(() => reloadFrame(frameB))
.then(() => frameA.contentWindow.postMessage("query applied style", "*"))
.then(dequeueMessage).then(styleInfoA => {
assert_equals(styleInfoA, "A " + EXPECTED_STYLE, "frame A should have the style applied");
})
.then(() => frameB.contentWindow.postMessage("query applied style", "*"))
.then(dequeueMessage).then(styleInfoB => {
assert_equals(styleInfoB, "B " + EXPECTED_STYLE, "frame B should have the style applied");
});
}, 'Revalidated CSS should not be unapplied on existing clients.');
</script>