mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-03 12:35:58 +00:00
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:
parent
416cb4633e
commit
894febc41a
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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>";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user