From a361d764b17e273b57dbdab7be3aea5caf6e59ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 23 May 2020 17:26:56 +0000 Subject: [PATCH] Bug 1639057 - Simplify Bug 426082.html to not depend on paint events. r=mstange I removed some outlines in gtk which causes some repaints not to show up. However I think this test should be simplified a bit instead. When this test landed in bug 426082, snapshots and such were the only way to test this because it was a widget hack, effectively. Nowadays, that "forward hover and active state from label to labeled element" happens at the event state manager level, and thus we can test it much more easily using simple selector-matching. Differential Revision: https://phabricator.services.mozilla.com/D76602 --- dom/events/test/bug426082.html | 176 ++++++++++++--------------------- 1 file changed, 63 insertions(+), 113 deletions(-) diff --git a/dom/events/test/bug426082.html b/dom/events/test/bug426082.html index fe91b31fcbef..b8bf5cb2434e 100644 --- a/dom/events/test/bug426082.html +++ b/dom/events/test/bug426082.html @@ -7,19 +7,12 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=426082 Test for Bug 426082 - - - + Mozilla Bug 426082

@@ -29,136 +22,93 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=426082 /** Test for Bug 426082 **/ -var normalButtonCanvas, pressedButtonCanvas, normalFocusedButtonCanvas, - pressedFocusedButtonCanvas, currentSnapshot, button, label, outside; - function runTests() { - button = $("button"); - label = $("label"); - outside = $("outside"); - SimpleTest.executeSoon(executeTests); + SimpleTest.executeSoon(tests); } SimpleTest.waitForFocus(runTests); -function isRectContainedInRectFromRegion(rect, region) { - return Array.prototype.some.call(region, function (r) { - return rect.left >= r.left && - rect.top >= r.top && - rect.right <= r.right && - rect.bottom <= r.bottom; - }); +function oneTick() { + return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); } -function paintListener(e) { - if (isRectContainedInRectFromRegion(buttonRect(), SpecialPowers.wrap(e).clientRects)) { - gNeedsPaint = false; - currentSnapshot = takeSnapshot(); - } +function sendMouseEvent(t, elem) { + let r = elem.getBoundingClientRect(); + synthesizeMouse(elem, r.width / 2, r.height / 2, {type: t}); } -var gNeedsPaint = false; -function executeTests() { - var testYielder = tests(); - function execNext() { - if (!gNeedsPaint) { - let {done} = testYielder.next(); - if (done) { - return; - } - button.getBoundingClientRect(); // Flush. - gNeedsPaint = true; - } - SimpleTest.executeSoon(execNext); - } - execNext(); -} +async function tests() { + let button = document.getElementById("button"); + let label = document.getElementById("label"); + let outside = document.getElementById("outside"); -function* tests() { - window.addEventListener("MozAfterPaint", paintListener); - normalButtonCanvas = takeSnapshot(); - // Press the button. - sendMouseEvent("mousemove", button); - sendMouseEvent("mousedown", button); - yield undefined; - pressedFocusedButtonCanvas = takeSnapshot(); - compareSnapshots_(normalButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal buttons."); - // Release. - sendMouseEvent("mouseup", button); - yield undefined; - // make sure the button is focused as this doesn't happen on click on Mac - button.focus(); - normalFocusedButtonCanvas = takeSnapshot(); - compareSnapshots_(normalFocusedButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal focused buttons."); - // Unfocus the button. - sendMouseEvent("mousedown", outside); - sendMouseEvent("mouseup", outside); - yield undefined; + let is = window.opener.is; + let ok = window.opener.ok; // Press the label. sendMouseEvent("mousemove", label); sendMouseEvent("mousedown", label); - yield undefined; - compareSnapshots_(normalButtonCanvas, currentSnapshot, false, "Pressing the label should have pressed the button."); - pressedButtonCanvas = takeSnapshot(); + + await oneTick(); + + ok(label.matches(":hover"), "Label is hovered"); + ok(button.matches(":hover"), "Button should be hovered too"); + + ok(label.matches(":active"), "Label is active"); + ok(button.matches(":active"), "Button should be active too"); + // Move the mouse down from the label. sendMouseEvent("mousemove", outside); - yield undefined; - compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Moving the mouse down from the label should have unpressed the button."); - // ... and up again. + + await oneTick(); + + ok(!label.matches(":hover"), "Label is no longer hovered"); + ok(!button.matches(":hover"), "Button should not be hovered too"); + + ok(label.matches(":active"), "Label is still active"); + ok(button.matches(":active"), "Button is still active too"); + + // And up again. sendMouseEvent("mousemove", label); - yield undefined; - compareSnapshots_(pressedButtonCanvas, currentSnapshot, true, "Moving the mouse back on top of the label should have pressed the button."); + + await oneTick(); + + + ok(label.matches(":hover"), "Label hovered again"); + ok(button.matches(":hover"), "Button be hovered again"); + ok(label.matches(":active"), "Label is still active"); + ok(button.matches(":active"), "Button is still active too"); + // Release. sendMouseEvent("mouseup", label); - yield undefined; - var focusOnMouse = (navigator.platform.indexOf("Mac") != 0); - compareSnapshots_(focusOnMouse ? normalFocusedButtonCanvas : normalButtonCanvas, - currentSnapshot, true, "Releasing the mouse over the label should have unpressed" + - (focusOnMouse ? " (and focused)" : "") + " the button."); + + await oneTick(); + + ok(!label.matches(":active"), "Label is no longer active"); + ok(!button.matches(":active"), "Button is no longer active"); + + ok(label.matches(":hover"), "Label is still hovered"); + ok(button.matches(":hover"), "Button is still hovered"); + // Press the label and remove it. sendMouseEvent("mousemove", label); sendMouseEvent("mousedown", label); - yield undefined; + + await oneTick(); + label.remove(); - yield undefined; - compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Removing the label should have unpressed the button."); + + await oneTick(); + + ok(!label.matches(":active"), "Removing label should have unpressed it"); + ok(!label.matches(":focus"), "Removing label should have unpressed it"); + ok(!label.matches(":hover"), "Removing label should have unhovered it"); + ok(!button.matches(":active"), "Removing label should have unpressed the button"); + ok(!button.matches(":focus"), "Removing label should have unpressed the button"); + ok(!button.matches(":hover"), "Removing label should have unhovered the button"); + sendMouseEvent("mouseup", label); - window.removeEventListener("MozAfterPaint", paintListener); window.opener.finishTests(); - } - -function sendMouseEvent(t, elem) { - var r = elem.getBoundingClientRect(); - synthesizeMouse(elem, r.width / 2, r.height / 2, {type: t}); -} - -function compareSnapshots_(c1, c2, shouldBeIdentical, msg) { - var [correct, c1url, c2url] = compareSnapshots(c1, c2, shouldBeIdentical); - if (correct) { - if (shouldBeIdentical) { - window.opener.ok(true, msg + " - expected " + c1url); - } else { - window.opener.ok(true, msg + " - got " + c1url + " and " + c2url); - } - } else { - if (shouldBeIdentical) { - window.opener.ok(false, msg + " - expected " + c1url + " but got " + c2url); - } else { - window.opener.ok(false, msg + " - expected something other than " + c1url); - } - } -} - -function takeSnapshot() { - var r = buttonRect(); - adjustedRect = { left: r.left - 2, top: r.top - 2, - width: r.width + 4, height: r.height + 4 }; - return SpecialPowers.snapshotRect(window, adjustedRect); -} - -function buttonRect() { - return button.getBoundingClientRect(); }