From 124eaea6e38d58baa16d8c4396102c6cf7f7abf1 Mon Sep 17 00:00:00 2001 From: Neil Deakin Date: Tue, 21 Apr 2015 20:09:14 -0400 Subject: [PATCH] Bug 1155355, e10s, rewrite and reenable browser tests in layout/xul/test, don't show tooltips during a drag, use system event listeners for tooltips, r=billm --- browser/base/content/browser.js | 5 + embedding/browser/nsDocShellTreeOwner.cpp | 30 ++-- layout/xul/test/browser.ini | 3 - layout/xul/test/browser_bug685470.js | 52 ++---- layout/xul/test/browser_bug703210.js | 103 ++++------- layout/xul/test/browser_bug706743.js | 204 +++++++--------------- 6 files changed, 136 insertions(+), 261 deletions(-) diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index f5fe439aa7f..79e0a0b3d8c 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -3994,6 +3994,11 @@ var XULBrowserWindow = { }, showTooltip: function (x, y, tooltip) { + if (Cc["@mozilla.org/widget/dragservice;1"].getService(Ci.nsIDragService). + getCurrentSession()) { + return; + } + // The x,y coordinates are relative to the element using // the chrome zoom level. let elt = document.getElementById("remoteBrowserTooltip"); diff --git a/embedding/browser/nsDocShellTreeOwner.cpp b/embedding/browser/nsDocShellTreeOwner.cpp index 21a3d4e028f..2dc54edbe02 100644 --- a/embedding/browser/nsDocShellTreeOwner.cpp +++ b/embedding/browser/nsDocShellTreeOwner.cpp @@ -1174,17 +1174,17 @@ NS_IMETHODIMP ChromeTooltipListener::AddTooltipListener() { if (mEventTarget) { - nsresult rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("keydown"), - this, false, false); + nsresult rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("keydown"), + this, false, false); NS_ENSURE_SUCCESS(rv, rv); - rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("mousedown"), this, - false, false); + rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("mousedown"), this, + false, false); NS_ENSURE_SUCCESS(rv, rv); - rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("mouseout"), this, - false, false); + rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("mouseout"), this, + false, false); NS_ENSURE_SUCCESS(rv, rv); - rv = mEventTarget->AddEventListener(NS_LITERAL_STRING("mousemove"), this, - false, false); + rv = mEventTarget->AddSystemEventListener(NS_LITERAL_STRING("mousemove"), this, + false, false); NS_ENSURE_SUCCESS(rv, rv); mTooltipListenerInstalled = true; @@ -1226,17 +1226,17 @@ ChromeTooltipListener::RemoveTooltipListener() { if (mEventTarget) { nsresult rv = - mEventTarget->RemoveEventListener(NS_LITERAL_STRING("keydown"), this, - false); + mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("keydown"), this, + false); NS_ENSURE_SUCCESS(rv, rv); - rv = mEventTarget->RemoveEventListener(NS_LITERAL_STRING("mousedown"), - this, false); + rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("mousedown"), + this, false); NS_ENSURE_SUCCESS(rv, rv); - rv = mEventTarget->RemoveEventListener(NS_LITERAL_STRING("mouseout"), this, + rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("mouseout"), this, false); NS_ENSURE_SUCCESS(rv, rv); - rv = mEventTarget->RemoveEventListener(NS_LITERAL_STRING("mousemove"), - this, false); + rv = mEventTarget->RemoveSystemEventListener(NS_LITERAL_STRING("mousemove"), + this, false); NS_ENSURE_SUCCESS(rv, rv); mTooltipListenerInstalled = false; diff --git a/layout/xul/test/browser.ini b/layout/xul/test/browser.ini index f6a2feb5fa8..3998b637482 100644 --- a/layout/xul/test/browser.ini +++ b/layout/xul/test/browser.ini @@ -1,8 +1,5 @@ [DEFAULT] [browser_bug685470.js] -skip-if = e10s # Bug ?????? - test touches content (TypeError: doc.documentElement is null) [browser_bug703210.js] -skip-if = e10s # Bug 933103 - mochitest's EventUtils.synthesizeMouse functions not e10s friendly [browser_bug706743.js] -skip-if = e10s # Bug 933103 - mochitest's EventUtils.synthesizeMouse functions not e10s friendly diff --git a/layout/xul/test/browser_bug685470.js b/layout/xul/test/browser_bug685470.js index 6559f25de99..8bd3ba21ad2 100644 --- a/layout/xul/test/browser_bug685470.js +++ b/layout/xul/test/browser_bug685470.js @@ -1,9 +1,10 @@ -function test() { - waitForExplicitFinish(); +add_task(function* () { + const html = "

This paragraph has a tooltip.

"; + yield BrowserTestUtils.openNewForegroundTab(gBrowser, "data:text/html," + html); - gBrowser.selectedTab = gBrowser.addTab(); - - SpecialPowers.setIntPref("ui.tooltipDelay", 0); + yield new Promise(resolve => { + SpecialPowers.pushPrefEnv({"set": [["ui.tooltipDelay", 0]]}, resolve); + }); var popup = false; var doc; @@ -13,39 +14,20 @@ function test() { let onPopupShown = function(aEvent) { popup = true; } + document.addEventListener("popupshown", onPopupShown, true); - // test that a mouse click prior to the tooltip appearing blocks it - let runTest = function() { - EventUtils.synthesizeMouseAtCenter(p1, { type: "mousemove" }, win); - EventUtils.sendMouseEvent({type:'mousedown'}, p1, win); - EventUtils.sendMouseEvent({type:'mouseup'}, p1, win); + // Send a mousemove at a known position to start the test. + BrowserTestUtils.synthesizeMouseAtCenter("#p1", { type: "mousemove" }, + gBrowser.selectedBrowser); + BrowserTestUtils.synthesizeMouseAtCenter("#p1", { }, gBrowser.selectedBrowser); + yield new Promise(resolve => { setTimeout(function() { is(popup, false, "shouldn't get tooltip after click"); - - document.removeEventListener("popupshown", onPopupShown, true); - SpecialPowers.clearUserPref("ui.tooltipDelay"); - - gBrowser.removeCurrentTab(); - finish(); + resolve(); }, 200); - } + }); - let onLoad = function (aEvent) { - doc = gBrowser.contentDocument; - win = gBrowser.contentWindow; - p1 = doc.getElementById("p1"); - - document.addEventListener("popupshown", onPopupShown, true); - - runTest(); - } - - gBrowser.selectedBrowser.addEventListener("load", function loadListener() { - gBrowser.selectedBrowser.removeEventListener("load", loadListener, true); - setTimeout(onLoad, 0); - }, true); - - content.location = "data:text/html," + - "

This paragraph has a tooltip.

"; -} + document.removeEventListener("popupshown", onPopupShown, true); + gBrowser.removeCurrentTab(); +}); diff --git a/layout/xul/test/browser_bug703210.js b/layout/xul/test/browser_bug703210.js index c6a61e7ba7d..728d2adbfd8 100644 --- a/layout/xul/test/browser_bug703210.js +++ b/layout/xul/test/browser_bug703210.js @@ -1,72 +1,33 @@ -function test() { - waitForExplicitFinish(); - - gBrowser.selectedTab = gBrowser.addTab(); - - SpecialPowers.setIntPref("ui.tooltipDelay", 0); - - let doStopPropagation = function (aEvent) - { - aEvent.stopPropagation(); - } - - let onPopupShown = function (aEvent) - { - is(aEvent.originalTarget.localName, "tooltip", "tooltip is showing"); - - let doc = gBrowser.contentDocument; - let win = gBrowser.contentWindow; - let p2 = doc.getElementById("p2"); - setTimeout(function () { - EventUtils.synthesizeMouseAtCenter(p2, { type: "mousemove" }, win); }, 0); - } - - let onPopupHiding = function (aEvent) - { - is(aEvent.originalTarget.localName, "tooltip", "tooltip is hiding"); - - let doc = gBrowser.contentDocument; - - doc.removeEventListener("mousemove", doStopPropagation, true); - doc.removeEventListener("mouseenter", doStopPropagation, true); - doc.removeEventListener("mouseleave", doStopPropagation, true); - doc.removeEventListener("mouseover", doStopPropagation, true); - doc.removeEventListener("mouseout", doStopPropagation, true); - document.removeEventListener("popupshown", onPopupShown, true); - document.removeEventListener("popuphiding", onPopupHiding, true); - - SpecialPowers.clearUserPref("ui.tooltipDelay"); - - gBrowser.removeCurrentTab(); - finish(); - } - - let onLoad = function (aEvent) - { - let doc = gBrowser.contentDocument; - let win = gBrowser.contentWindow; - let p1 = doc.getElementById("p1"); - let p2 = doc.getElementById("p2"); - - EventUtils.synthesizeMouseAtCenter(p2, { type: "mousemove" }, win); - - doc.addEventListener("mousemove", doStopPropagation, true); - doc.addEventListener("mouseenter", doStopPropagation, true); - doc.addEventListener("mouseleave", doStopPropagation, true); - doc.addEventListener("mouseover", doStopPropagation, true); - doc.addEventListener("mouseout", doStopPropagation, true); - document.addEventListener("popupshown", onPopupShown, true); - document.addEventListener("popuphiding", onPopupHiding, true); - - EventUtils.synthesizeMouseAtCenter(p1, { type: "mousemove" }, win); - } - - gBrowser.selectedBrowser.addEventListener("load", function loadListener() { - gBrowser.selectedBrowser.removeEventListener("load", loadListener, true); - setTimeout(onLoad, 0); - }, true); - - content.location = "data:text/html," + +add_task(function* () { + const url = "data:text/html," + + "" + "

This paragraph has a tooltip.

" + - "

This paragraph doesn't have tooltip.

"; -} + "

This paragraph doesn't have tooltip.

"; + + let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, url); + let browser = gBrowser.selectedBrowser; + + yield new Promise(resolve => { + SpecialPowers.pushPrefEnv({"set": [["ui.tooltipDelay", 0]]}, resolve); + }); + + // Send a mousemove at a known position to start the test. + yield BrowserTestUtils.synthesizeMouseAtCenter("#p2", { type: "mousemove" }, browser); + let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown", event => { + is(event.originalTarget.localName, "tooltip", "tooltip is showing"); + return true; + }); + yield BrowserTestUtils.synthesizeMouseAtCenter("#p1", { type: "mousemove" }, browser); + yield popupShownPromise; + + let popupHiddenPromise = BrowserTestUtils.waitForEvent(document, "popuphidden", event => { + is(event.originalTarget.localName, "tooltip", "tooltip is hidden"); + return true; + }); + yield BrowserTestUtils.synthesizeMouseAtCenter("#p2", { type: "mousemove" }, browser); + yield popupHiddenPromise; + + gBrowser.removeCurrentTab(); +}); diff --git a/layout/xul/test/browser_bug706743.js b/layout/xul/test/browser_bug706743.js index 6bb3ccce718..b7262e812bc 100644 --- a/layout/xul/test/browser_bug706743.js +++ b/layout/xul/test/browser_bug706743.js @@ -1,154 +1,84 @@ -function test() { - waitForExplicitFinish(); - gBrowser.selectedTab = gBrowser.addTab(); +add_task(function* () { + const url = "data:text/html," + + "here is an anchor element"; - SpecialPowers.setIntPref("ui.tooltipDelay", 0); + let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, url); + let browser = gBrowser.selectedBrowser; + + yield new Promise(resolve => { + SpecialPowers.pushPrefEnv({"set": [["ui.tooltipDelay", 0]]}, resolve); + }); + + // Send a mousemove at a known position to start the test. + yield BrowserTestUtils.synthesizeMouse("#target", -5, -5, { type: "mousemove" }, browser); + + // show tooltip by mousemove into target. + let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown"); + yield BrowserTestUtils.synthesizeMouse("#target", 5, 15, { type: "mousemove" }, browser); + yield popupShownPromise; + + // hide tooltip by mousemove to outside. + let popupHiddenPromise = BrowserTestUtils.waitForEvent(document, "popuphidden"); + yield BrowserTestUtils.synthesizeMouse("#target", -5, 15, { type: "mousemove" }, browser); + yield popupHiddenPromise; + + // mousemove into the target and start drag by emulation via nsIDragService. + // Note that on some platforms, we cannot actually start the drag by + // synthesized events. E.g., Windows waits an actual mousemove event after + // dragstart. + + // Emulate a buggy mousemove event. widget might dispatch mousemove event + // during drag. + + function tooltipNotExpected() + { + ok(false, "tooltip is shown during drag"); + } + addEventListener("popupshown", tooltipNotExpected, true); - let target; - let doc; - let win; - let callbackOnPopupShown; - let callbackOnPopupHidden; let dragService = Components.classes["@mozilla.org/widget/dragservice;1"]. getService(Components.interfaces.nsIDragService); + dragService.startDragSession(); + yield BrowserTestUtils.synthesizeMouse("#target", 5, 15, { type: "mousemove" }, browser); - let onPopupHidden = function (aEvent) - { - if (aEvent.originalTarget.localName != "tooltip") { - return; - } - if (callbackOnPopupHidden) { - setTimeout(callbackOnPopupHidden, 0); - } - } + yield new Promise(resolve => setTimeout(resolve, 100)); + removeEventListener("popupshown", tooltipNotExpected, true); + dragService.endDragSession(true); - let onPopupShown = function (aEvent) - { - if (aEvent.originalTarget.localName != "tooltip") { - return; - } - if (callbackOnPopupShown) { - setTimeout(callbackOnPopupShown, 0); - } - } + yield BrowserTestUtils.synthesizeMouse("#target", -5, -5, { type: "mousemove" }, browser); - let finishTest = function () - { - document.removeEventListener("popupshown", onPopupShown, true); - document.removeEventListener("popuphidden", onPopupHidden, true); + // If tooltip listener used a flag for managing D&D state, we would need + // to test if the tooltip is shown after drag. - SpecialPowers.clearUserPref("ui.tooltipDelay"); + // show tooltip by mousemove into target. + popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown"); + yield BrowserTestUtils.synthesizeMouse("#target", 5, 15, { type: "mousemove" }, browser); + yield popupShownPromise; - gBrowser.removeCurrentTab(); - finish(); - } + // hide tooltip by mousemove to outside. + popupHiddenPromise = BrowserTestUtils.waitForEvent(document, "popuphidden"); + yield BrowserTestUtils.synthesizeMouse("#target", -5, 15, { type: "mousemove" }, browser); + yield popupHiddenPromise; - let testHideTooltipByMouseDown = function () - { - callbackOnPopupShown = function () { - callbackOnPopupShown = null; - ok(true, "tooltip is shown before testing mousedown"); + // Show tooltip after mousedown + popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown"); + yield BrowserTestUtils.synthesizeMouse("#target", 5, 15, { type: "mousemove" }, browser); + yield popupShownPromise; - // hide tooltip by mousemove to outside. - callbackOnPopupHidden = function () { - callbackOnPopupHidden = null; - ok(true, "The tooltip is hidden by mousedown"); + popupHiddenPromise = BrowserTestUtils.waitForEvent(document, "popuphidden"); + yield BrowserTestUtils.synthesizeMouse("#target", 5, 15, { type: "mousedown" }, browser); + yield popupHiddenPromise; - EventUtils.synthesizeMouse(target, 5, 15, { type: "mouseup" }, win); - EventUtils.synthesizeMouse(target, -5, 15, { type: "mousemove" }, win); + yield BrowserTestUtils.synthesizeMouse("#target", 5, 15, { type: "mouseup" }, browser); + yield BrowserTestUtils.synthesizeMouse("#target", -5, 15, { type: "mousemove" }, browser); - setTimeout(finishTest, 0); - } - EventUtils.synthesizeMouse(target, 5, 15, { type: "mousedown" }, win); - } - EventUtils.synthesizeMouse(target, 5, 15, { type: "mousemove" }, win); - } + ok(true, "tooltips appear properly"); + + gBrowser.removeCurrentTab(); +}); - let testShowTooltipAgain = function () - { - // If tooltip listener used a flag for managing D&D state, we would need - // to test if the tooltip is shown after drag. - callbackOnPopupShown = function () { - callbackOnPopupShown = null; - ok(true, "tooltip is shown after drag"); - - // hide tooltip by mousemove to outside. - callbackOnPopupHidden = function () { - callbackOnPopupHidden = null; - ok(true, "The tooltip is hidden again"); - - setTimeout(testHideTooltipByMouseDown, 0); - } - EventUtils.synthesizeMouse(target, -5, 15, { type: "mousemove" }, win); - } - EventUtils.synthesizeMouse(target, 5, 15, { type: "mousemove" }, win); - } - - let testDuringDnD = function () - { - // mousemove into the target and start drag by emulation via nsIDragService. - // Note that on some platforms, we cannot actually start the drag by - // synthesized events. E.g., Windows waits an actual mousemove event after - // dragstart. - callbackOnPopupShown = function () { - callbackOnPopupShown = null; - ok(false, "tooltip is shown during drag"); - } - dragService.startDragSession(); - // Emulate a buggy mousemove event. widget might dispatch mousemove event - // during drag. - EventUtils.synthesizeMouse(target, 5, 15, { type: "mousemove" }, win); - setTimeout(function () { - callbackOnPopupShown = null; - ok(true, "tooltip isn't shown during drag"); - dragService.endDragSession(true); - EventUtils.synthesizeMouse(target, -5, -5, { type: "mousemove" }, win); - - setTimeout(testShowTooltipAgain, 0); - }, 100); - } - - let onLoad = function (aEvent) - { - doc = gBrowser.contentDocument; - win = gBrowser.contentWindow; - target = doc.getElementById("target"); - - document.addEventListener("popupshown", onPopupShown, true); - document.addEventListener("popuphidden", onPopupHidden, true); - - EventUtils.synthesizeMouse(target, -5, -5, { type: "mousemove" }, win); - - // show tooltip by mousemove into target. - callbackOnPopupShown = function () - { - callbackOnPopupShown = null; - ok(true, "The tooltip is shown"); - - // hide tooltip by mousemove to outside. - callbackOnPopupHidden = function () { - callbackOnPopupHidden = null; - ok(true, "The tooltip is hidden"); - - setTimeout(testDuringDnD, 0); - } - EventUtils.synthesizeMouse(target, -5, 15, { type: "mousemove" }, win); - } - EventUtils.synthesizeMouse(target, 5, 15, { type: "mousemove" }, win); - } - - gBrowser.selectedBrowser.addEventListener("load", - function () { - gBrowser.selectedBrowser. - removeEventListener("load", arguments.callee, true); - setTimeout(onLoad, 0); - }, true); - - content.location = "data:text/html," + - "here is an anchor element"; -}