blob: 711408684340ef27d48d0ff36ce41c70e1424d12 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Event Timing: entries should be observable by its own frame.</title>
<meta name="timeout" content="long">
</head>
<body>
<button id='button'>Generate a 'click' event</button>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-actions.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=resources/event-timing-test-utils.js></script>
<iframe id='iframe' src=resources/crossiframe-childframe.html></iframe>
<script>
let clickTimeMin;
let clickDone;
function validateEntries(entries) {
assert_equals(entries.length, 1, "Only 1 entry should be received");
const entry = entries[0];
verifyClickEvent(entry, true);
assert_less_than(entry.processingStart, clickDone,
"The entry's processing start should be before clickDone.");
assert_greater_than(entry.startTime, clickTimeMin,
"The entry's start time should be later than clickTimeMin.");
}
function validateChildFrameEntries(childFrameData) {
if (childFrameData === "failed") {
assert_unreached("Did not receive exactly one entry from child as expected");
}
// |childFrameData| has properties with the same names as its
// PerformanceEventTiming counterpart.
verifyClickEvent(childFrameData);
assert_less_than(childFrameData.processingStart, childFrameData.clickDone,
"The entry's processing start should be before than the child frame's clickDone.");
assert_greater_than(childFrameData.startTime, childFrameData.clickTimeMin,
"The entry's start time should be later than the child frame's \
clickTimeMin.");
}
promise_test(async t => {
assert_implements(window.PerformanceEventTiming, "Event Timing is not supported");
clickTimeMin = performance.now();
let observedEntries = false;
const observerPromise = new Promise(resolve => {
new PerformanceObserver(t.step_func(entries => {
assert_false(observedEntries,
"Observer of main frames should only capture main-frame event-timing entries");
validateEntries(entries.getEntriesByName('mousedown'));
observedEntries = true;
resolve();
})).observe({type: 'event'});
});
await clickAndBlockMain('button');
clickDone = performance.now();
await observerPromise;
const childFrameEntriesPromise = new Promise(resolve => {
window.addEventListener("message", (event) => {
resolve(event.data);
}, false);
});
let iframe = document.getElementById('iframe');
const iframeX = document.getElementById('iframe').offsetLeft;
const iframeY = document.getElementById('iframe').offsetTop;
// Tap on the iframe, with an offset of 10 to target the div inside it.
const actions = new test_driver.Actions()
.pointerMove(iframeX + 10, iframeY + 10)
.pointerDown()
.pointerUp()
actions.send();
const childFrameData = await childFrameEntriesPromise;
t.step(() => {
validateChildFrameEntries(childFrameData);
});
}, "Event Timing: entries should only be observable by its own frame.");
</script>
</body>
</html>