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

This commit is contained in:
Neil Deakin 2015-04-21 20:09:14 -04:00
parent 4859f0e9ed
commit 124eaea6e3
6 changed files with 136 additions and 261 deletions

View File

@ -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 <browser> element using
// the chrome zoom level.
let elt = document.getElementById("remoteBrowserTooltip");

View File

@ -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;

View File

@ -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

View File

@ -1,9 +1,10 @@
function test() {
waitForExplicitFinish();
add_task(function* () {
const html = "<p id=\"p1\" title=\"tooltip is here\">This paragraph has a tooltip.</p>";
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," +
"<p id=\"p1\" title=\"tooltip is here\">This paragraph has a tooltip.</p>";
}
document.removeEventListener("popupshown", onPopupShown, true);
gBrowser.removeCurrentTab();
});

View File

@ -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," +
"<html onmousemove='event.stopPropagation()'" +
" onmouseenter='event.stopPropagation()' onmouseleave='event.stopPropagation()'" +
" onmouseover='event.stopPropagation()' onmouseout='event.stopPropagation()'>" +
"<p id=\"p1\" title=\"tooltip is here\">This paragraph has a tooltip.</p>" +
"<p id=\"p2\">This paragraph doesn't have tooltip.</p>";
}
"<p id=\"p2\">This paragraph doesn't have tooltip.</p></html>";
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();
});

View File

@ -1,154 +1,84 @@
function test() {
waitForExplicitFinish();
gBrowser.selectedTab = gBrowser.addTab();
add_task(function* () {
const url = "data:text/html,<html><head></head><body>" +
"<a id=\"target\" href=\"about:blank\" title=\"This is tooltip text\" " +
"style=\"display:block;height:20px;margin:10px;\" " +
"onclick=\"return false;\">here is an anchor element</a></body></html>";
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,<html><head></head><body>" +
"<a id=\"target\" href=\"about:blank\" title=\"This is tooltip text\" " +
"style=\"display:block;height:20px;margin:10px;\" " +
"onclick=\"return false;\">here is an anchor element</a></body></html>";
}