зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1653160 test - Test clicking and already-focused OOP iframe and test moving focus between nested OOP iframes. r=nika
Differential Revision: https://phabricator.services.mozilla.com/D88039
This commit is contained in:
Родитель
38bcf98586
Коммит
1d5044a238
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div style="width:100%;height:100%;background-color:blue;"></div>
|
||||||
|
<script>
|
||||||
|
document.querySelector("div").addEventListener("click", event => {
|
||||||
|
parent.postMessage("click", "*");
|
||||||
|
});
|
||||||
|
window.onload = () => {
|
||||||
|
parent.postMessage("ready", "*");
|
||||||
|
};
|
||||||
|
document.body.onfocus = () => {
|
||||||
|
parent.postMessage("focus", "*");
|
||||||
|
};
|
||||||
|
document.body.onblur = () => {
|
||||||
|
parent.postMessage("blur", "*");
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div style="width:100%;height:100%;background-color:blue;"></div>
|
||||||
|
<script>
|
||||||
|
document.querySelector("div").addEventListener("click", event => {
|
||||||
|
parent.postMessage("innerclick", "*");
|
||||||
|
});
|
||||||
|
window.onload = () => {
|
||||||
|
parent.postMessage("innerready", "*");
|
||||||
|
};
|
||||||
|
document.body.onfocus = () => {
|
||||||
|
parent.postMessage("innerfocus", "*");
|
||||||
|
};
|
||||||
|
document.body.onblur = () => {
|
||||||
|
parent.postMessage("innerblur", "*");
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -0,0 +1,30 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
height: 200px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
window.addEventListener("message", event => {
|
||||||
|
parent.postMessage(event.data, "*");
|
||||||
|
});
|
||||||
|
window.onload = () => {
|
||||||
|
parent.postMessage("middleready", "*");
|
||||||
|
};
|
||||||
|
document.body.onfocus = () => {
|
||||||
|
parent.postMessage("middlefocus", "*");
|
||||||
|
};
|
||||||
|
document.body.onblur = () => {
|
||||||
|
parent.postMessage("middleblur", "*");
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<div style="width:100px;height:100px;background-color:gray;"></div>
|
||||||
|
<iframe width="100" height="100" src="https://example.org/tests/dom/events/test/file_focus_blur_on_click_in_deep_cross_origin_iframe_inner.html"></iframe>
|
||||||
|
<script>
|
||||||
|
document.querySelector("div").addEventListener("click", event => {
|
||||||
|
parent.postMessage("middleclick", "*");
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -236,3 +236,10 @@ skip-if = toolkit == 'android' # Bug 1312791
|
||||||
[test_unbound_before_in_active_chain.html]
|
[test_unbound_before_in_active_chain.html]
|
||||||
[test_wheel_zoom_on_form_controls.html]
|
[test_wheel_zoom_on_form_controls.html]
|
||||||
skip-if = verify
|
skip-if = verify
|
||||||
|
[test_focus_blur_on_click_in_cross_origin_iframe.html]
|
||||||
|
support-files =
|
||||||
|
file_focus_blur_on_click_in_cross_origin_iframe.html
|
||||||
|
[test_focus_blur_on_click_in_deep_cross_origin_iframe.html]
|
||||||
|
support-files =
|
||||||
|
file_focus_blur_on_click_in_deep_cross_origin_iframe_inner.html
|
||||||
|
file_focus_blur_on_click_in_deep_cross_origin_iframe_middle.html
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title></title>
|
||||||
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
||||||
|
<script src="/tests/SimpleTest/paint_listener.js"></script>
|
||||||
|
<script src="/tests/gfx/layers/apz/test/mochitest/apz_test_utils.js"></script>
|
||||||
|
<script src="/tests/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js"></script>
|
||||||
|
<iframe width=100></iframe>
|
||||||
|
<script>
|
||||||
|
let state = "start";
|
||||||
|
|
||||||
|
const utils = SpecialPowers.DOMWindowUtils;
|
||||||
|
|
||||||
|
function synthesizeNativeMouseClick(aElement, aScreenX, aScreenY) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
utils.sendNativeMouseEvent(aScreenX, aScreenY,
|
||||||
|
nativeMouseDownEventMsg(), 0, aElement, () => {
|
||||||
|
utils.sendNativeMouseEvent(aScreenX, aScreenY,
|
||||||
|
nativeMouseUpEventMsg(),
|
||||||
|
0,
|
||||||
|
aElement, resolve);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getScreenPosition(aElement, aOffsetX, aOffsetY) {
|
||||||
|
const rect = aElement.getBoundingClientRect();
|
||||||
|
const x = aOffsetX + window.mozInnerScreenX + rect.left;
|
||||||
|
const y = aOffsetY + window.mozInnerScreenY + rect.top;
|
||||||
|
const scale = utils.screenPixelsPerCSSPixel;
|
||||||
|
return [Math.round(x * scale), Math.round(y * scale)];
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(async () => {
|
||||||
|
await SimpleTest.promiseFocus();
|
||||||
|
|
||||||
|
const loadsPromise = new Promise((resolve, reject) => {
|
||||||
|
window.addEventListener("message", function listener(event) {
|
||||||
|
if (event.data == "ready") {
|
||||||
|
is(state, "start");
|
||||||
|
state = "ready";
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
|
reject("Unexpected message");
|
||||||
|
}
|
||||||
|
}, { once: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
const iframe = document.querySelectorAll("iframe")[0];
|
||||||
|
iframe.src = "https://example.com/tests/dom/events/test/file_focus_blur_on_click_in_cross_origin_iframe.html";
|
||||||
|
|
||||||
|
await loadsPromise;
|
||||||
|
|
||||||
|
// Wait for APZ state stable so that mouse event handling APZ works properly
|
||||||
|
// in out-of-process iframes.
|
||||||
|
await new Promise(resolve => waitForApzFlushedRepaints(resolve));
|
||||||
|
|
||||||
|
// NOTE: synthesizeMouseAtCenter doesn't work for OOP iframes (bug 1528935),
|
||||||
|
// so we use synthesizeNativeMouseClick instead.
|
||||||
|
const [expectedScreenX, expectedScreenY] =
|
||||||
|
getScreenPosition(iframe, 10, 10);
|
||||||
|
|
||||||
|
const firstClickPromise = new Promise((resolve, reject) => {
|
||||||
|
window.addEventListener("message", function listener(event) {
|
||||||
|
if (state == "ready") {
|
||||||
|
if (event.data == "focus") {
|
||||||
|
// Non-Fission case
|
||||||
|
state = "focusbeforeclick";
|
||||||
|
} else if (event.data == "click") {
|
||||||
|
// Fission case: https://bugzilla.mozilla.org/show_bug.cgi?id=1660805
|
||||||
|
state = "clickbeforefocus";
|
||||||
|
} else {
|
||||||
|
ok(false, "Unexpected event");
|
||||||
|
}
|
||||||
|
} else if (state == "focusbeforeclick") {
|
||||||
|
is(event.data, "click", "The second event should be 'click'");
|
||||||
|
state = "firstclick";
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve();
|
||||||
|
} else if (state == "clickbeforefocus") {
|
||||||
|
is(event.data, "focus", "The second event should be 'click'");
|
||||||
|
state = "firstclick";
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
|
reject("Unexpected message");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await synthesizeNativeMouseClick(iframe, expectedScreenX, expectedScreenY);
|
||||||
|
|
||||||
|
await firstClickPromise;
|
||||||
|
|
||||||
|
SimpleTest.requestFlakyTimeout("Waiting for unwanted events that don't exist on success.");
|
||||||
|
|
||||||
|
const secondClickPromise = new Promise((resolve, reject) => {
|
||||||
|
window.addEventListener("message", function listener(event) {
|
||||||
|
if (state == "firstclick") {
|
||||||
|
is(event.data, "click", "The third event should be 'click' again, not 'blur' or 'focus'.");
|
||||||
|
state = "secondclick";
|
||||||
|
setTimeout(function() {
|
||||||
|
// Wait for potential other unwanted events
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve()
|
||||||
|
}, 200);
|
||||||
|
} else {
|
||||||
|
reject("Unexpected message " + event.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await synthesizeNativeMouseClick(iframe, expectedScreenX, expectedScreenY);
|
||||||
|
|
||||||
|
await secondClickPromise;
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -0,0 +1,148 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title></title>
|
||||||
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
||||||
|
<script src="/tests/SimpleTest/paint_listener.js"></script>
|
||||||
|
<script src="/tests/gfx/layers/apz/test/mochitest/apz_test_utils.js"></script>
|
||||||
|
<script src="/tests/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js"></script>
|
||||||
|
<iframe width=100 height=200 scrolling="no"></iframe>
|
||||||
|
<script>
|
||||||
|
let state = "start";
|
||||||
|
|
||||||
|
const utils = SpecialPowers.DOMWindowUtils;
|
||||||
|
|
||||||
|
function synthesizeNativeMouseClick(aElement, aScreenX, aScreenY) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
utils.sendNativeMouseEvent(aScreenX, aScreenY,
|
||||||
|
nativeMouseDownEventMsg(), 0, aElement, () => {
|
||||||
|
utils.sendNativeMouseEvent(aScreenX, aScreenY,
|
||||||
|
nativeMouseUpEventMsg(),
|
||||||
|
0,
|
||||||
|
aElement, resolve);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getScreenPosition(aElement, aOffsetX, aOffsetY) {
|
||||||
|
const rect = aElement.getBoundingClientRect();
|
||||||
|
const x = aOffsetX + window.mozInnerScreenX + rect.left;
|
||||||
|
const y = aOffsetY + window.mozInnerScreenY + rect.top;
|
||||||
|
const scale = utils.screenPixelsPerCSSPixel;
|
||||||
|
return [Math.round(x * scale), Math.round(y * scale)];
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(async () => {
|
||||||
|
await SimpleTest.promiseFocus();
|
||||||
|
|
||||||
|
const loadsPromise = new Promise((resolve, reject) => {
|
||||||
|
let readyMiddle = false;
|
||||||
|
let readyInner = false;
|
||||||
|
window.addEventListener("message", function listener(event) {
|
||||||
|
if (event.data == "middleready") {
|
||||||
|
readyMiddle = true;
|
||||||
|
} else if (event.data == "innerready") {
|
||||||
|
readyInner = true;
|
||||||
|
} else {
|
||||||
|
reject("Unexpected message when waiting for ready " + event.data);
|
||||||
|
}
|
||||||
|
if (readyInner && readyMiddle) {
|
||||||
|
state = "ready";
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const iframe = document.querySelectorAll("iframe")[0];
|
||||||
|
iframe.src = "https://example.com/tests/dom/events/test/file_focus_blur_on_click_in_deep_cross_origin_iframe_middle.html";
|
||||||
|
|
||||||
|
await loadsPromise;
|
||||||
|
|
||||||
|
// Wait for APZ state stable so that mouse event handling APZ works properly
|
||||||
|
// in out-of-process iframes.
|
||||||
|
await new Promise(resolve => waitForApzFlushedRepaints(resolve));
|
||||||
|
|
||||||
|
// NOTE: synthesizeMouseAtCenter doesn't work for OOP iframes (bug 1528935),
|
||||||
|
// so we use synthesizeNativeMouseClick instead.
|
||||||
|
const [expectedScreenX, expectedScreenY] =
|
||||||
|
getScreenPosition(iframe, 10, 10);
|
||||||
|
|
||||||
|
const firstClickPromise = new Promise((resolve, reject) => {
|
||||||
|
window.addEventListener("message", function listener(event) {
|
||||||
|
if (state == "ready") {
|
||||||
|
if (event.data == "innerfocus") {
|
||||||
|
// Non-Fission case
|
||||||
|
state = "innerfocusbeforeclick";
|
||||||
|
} else if (event.data == "innerclick") {
|
||||||
|
// Fission case: https://bugzilla.mozilla.org/show_bug.cgi?id=1660805
|
||||||
|
state = "innerclickbeforefocus";
|
||||||
|
} else if (event.data == "middlefocus") {
|
||||||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1661227
|
||||||
|
todo(false, "Ignoring extra middlefocus.");
|
||||||
|
} else {
|
||||||
|
is(event.data, "neverthisevent", "Unexpected event (first click)");
|
||||||
|
}
|
||||||
|
} else if (state == "innerfocusbeforeclick") {
|
||||||
|
is(event.data, "innerclick", "The second event should be 'innerclick'");
|
||||||
|
state = "firstclick";
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve();
|
||||||
|
} else if (state == "innerclickbeforefocus") {
|
||||||
|
is(event.data, "innerfocus", "The second event should be 'innerfocus'");
|
||||||
|
state = "firstclick";
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
|
reject("Unexpected message in firstClickPromise " + event.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await synthesizeNativeMouseClick(iframe, expectedScreenX, expectedScreenY + 110);
|
||||||
|
|
||||||
|
await firstClickPromise;
|
||||||
|
|
||||||
|
SimpleTest.requestFlakyTimeout("Waiting for unwanted events that don't exist on success.");
|
||||||
|
|
||||||
|
const secondClickPromise = new Promise((resolve, reject) => {
|
||||||
|
window.addEventListener("message", function listener(event) {
|
||||||
|
if (state == "firstclick") {
|
||||||
|
is(event.data, "middlefocus", "The third event should be 'middlefocus'.");
|
||||||
|
state = "middlefocusbeforeclick";
|
||||||
|
} else if (state == "middlefocusbeforeclick") {
|
||||||
|
// The order of blur and click is non-deterministic even in the non-Fission case.
|
||||||
|
if (event.data == "middleclick") {
|
||||||
|
state = "waitingforinnerblurafterclick";
|
||||||
|
} else if (event.data == "innerblur") {
|
||||||
|
state = "innerblurbeforeclick";
|
||||||
|
} else {
|
||||||
|
is(event.data, "neverthisevent", "Unexpected event (first click)");
|
||||||
|
}
|
||||||
|
} else if (state == "waitingforinnerblurafterclick") {
|
||||||
|
is(event.data, "innerblur", "The fifth event should be 'innerblur'.");
|
||||||
|
state = "secondclick";
|
||||||
|
setTimeout(function() {
|
||||||
|
// Wait for potential other unwanted events
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve()
|
||||||
|
}, 200);
|
||||||
|
} else if (state == "innerblurbeforeclick") {
|
||||||
|
is(event.data, "middleclick", "The fifth event should be 'middleclick'.");
|
||||||
|
state = "secondclick";
|
||||||
|
setTimeout(function() {
|
||||||
|
// Wait for potential other unwanted events
|
||||||
|
window.removeEventListener("message", listener);
|
||||||
|
resolve()
|
||||||
|
}, 200);
|
||||||
|
} else {
|
||||||
|
reject("Unexpected message in secondClickPromise " + event.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await synthesizeNativeMouseClick(iframe, expectedScreenX, expectedScreenY);
|
||||||
|
|
||||||
|
await secondClickPromise;
|
||||||
|
});
|
||||||
|
</script>
|
Загрузка…
Ссылка в новой задаче