summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/event-timing/crossiframe.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/event-timing/crossiframe.html')
-rw-r--r--testing/web-platform/tests/event-timing/crossiframe.html94
1 files changed, 94 insertions, 0 deletions
diff --git a/testing/web-platform/tests/event-timing/crossiframe.html b/testing/web-platform/tests/event-timing/crossiframe.html
new file mode 100644
index 0000000000..df4d94f09a
--- /dev/null
+++ b/testing/web-platform/tests/event-timing/crossiframe.html
@@ -0,0 +1,94 @@
+<!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, 'button', 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.
+ assert_equals(childFrameData.target, 'iframe_div');
+ verifyClickEvent(childFrameData, null, false, 104, 'mousedown');
+ assert_less_than(childFrameData.processingStart, childFrameData.clickDone,
+ "The entry's processing start should be before than the child frame's clickDone.");
+ }
+
+ promise_test(async t => {
+ assert_implements(window.PerformanceEventTiming, "Event Timing is not supported");
+ // Wait for load event so we can interact with the iframe.
+ await new Promise(resolve => {
+ window.addEventListener('load', resolve);
+ });
+ clickTimeMin = performance.now();
+ let observedPointerDown = false;
+ const observerPromise = new Promise(resolve => {
+ new PerformanceObserver(t.step_func(entries => {
+ const pointerDowns = entries.getEntriesByName('pointerdown');
+ // Ignore the callback if there were no pointerdown entries.
+ if (pointerDowns.length === 0)
+ return;
+
+ assert_false(observedPointerDown,
+ "Observer of main frames should only capture main-frame event-timing entries");
+ validateEntries(pointerDowns);
+ observedPointerDown = true;
+ resolve();
+ })).observe({type: 'event'});
+ });
+ clickAndBlockMain('button').then(() => {
+ clickDone = performance.now();
+ });
+ const childFrameEntriesPromise = new Promise(resolve => {
+ window.addEventListener("message", (event) => {
+ // testdriver-complete is a webdriver internal event
+ if (event.data.type != "testdriver-complete") {
+ t.step(() => {
+ validateChildFrameEntries(event.data);
+ });
+ resolve();
+ }
+ }, false);
+ });
+ // Tap on the iframe, with an offset of 10 to target the div inside it.
+ const actions = new test_driver.Actions()
+ .pointerMove(10, 10, { origin: document.getElementById("iframe") })
+ .pointerDown()
+ .pointerUp();
+ actions.send();
+ return Promise.all([observerPromise, childFrameEntriesPromise]);
+ }, "Event Timing: entries should only be observable by its own frame.");
+
+</script>
+</body>
+</html>