Bug 922934 - Hide Metro context menus on touchstart, scroll, or mousedown [r=emtwo]

This commit is contained in:
Matt Brubeck 2013-10-02 14:24:18 -07:00
parent e048ae4084
commit b09a4177a9
4 changed files with 17 additions and 12 deletions

View File

@ -432,9 +432,10 @@ MenuPopup.prototype = {
let deferred = Promise.defer(); let deferred = Promise.defer();
window.addEventListener("keypress", this, true); window.addEventListener("keypress", this, true);
window.addEventListener("click", this, true); window.addEventListener("mousedown", this, true);
window.addEventListener("touchstart", this, true);
window.addEventListener("scroll", this, true);
Elements.stack.addEventListener("PopupChanged", this, false); Elements.stack.addEventListener("PopupChanged", this, false);
Elements.browsers.addEventListener("PanBegin", this, false);
this._panel.hidden = false; this._panel.hidden = false;
let popupFrom = !aPositionOptions.bottomAligned ? "above" : "below"; let popupFrom = !aPositionOptions.bottomAligned ? "above" : "below";
@ -461,9 +462,10 @@ MenuPopup.prototype = {
let deferred = Promise.defer(); let deferred = Promise.defer();
window.removeEventListener("keypress", this, true); window.removeEventListener("keypress", this, true);
window.removeEventListener("click", this, true); window.removeEventListener("mousedown", this, true);
window.removeEventListener("touchstart", this, true);
window.removeEventListener("scroll", this, true);
Elements.stack.removeEventListener("PopupChanged", this, false); Elements.stack.removeEventListener("PopupChanged", this, false);
Elements.browsers.removeEventListener("PanBegin", this, false);
let self = this; let self = this;
this._panel.addEventListener("transitionend", function popuphidden() { this._panel.addEventListener("transitionend", function popuphidden() {
@ -499,7 +501,9 @@ MenuPopup.prototype = {
this.hide(); this.hide();
} }
break; break;
case "click": case "mousedown":
case "touchstart":
case "scroll":
if (!this._popup.contains(aEvent.target)) { if (!this._popup.contains(aEvent.target)) {
aEvent.stopPropagation(); aEvent.stopPropagation();
this.hide(); this.hide();
@ -517,9 +521,6 @@ MenuPopup.prototype = {
this.hide(); this.hide();
} }
break; break;
case "PanBegin":
this.hide();
break;
} }
} }
}; };

View File

@ -98,9 +98,11 @@ gTests.push({
"context-copy-link"]); "context-copy-link"]);
promise = waitForEvent(document, "popuphidden"); promise = waitForEvent(document, "popuphidden");
ContextMenuUI.hide(); win.scrollBy(0, 1);
yield promise; let hidden = yield promise;
ok(hidden && !(hidden instanceof Error), "scrolling hides the context menu");
win.getSelection().removeAllRanges(); win.getSelection().removeAllRanges();
win.scrollBy(0, -1);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Context menu in content on a link // Context menu in content on a link

View File

@ -23,7 +23,7 @@
<br /> <br />
<br /> <br />
<br /> <br />
<div style="margin: 0; padding: 5px;"> <div style="margin: 0; padding: 5px; margin-bottom: 9999px;">
<span id="text4">hello, I'm sorry but I must be going.</span> <span id="text4">hello, I'm sorry but I must be going.</span>
</div> </div>
</body> </body>

View File

@ -91,6 +91,7 @@ gTests.push({
tearDown: setUpAndTearDown, tearDown: setUpAndTearDown,
run: function test() { run: function test() {
gInput.selectionStart = gInput.selectionEnd = gInput.value.length; gInput.selectionStart = gInput.selectionEnd = gInput.value.length;
yield waitForEvent(window, "scroll");
let promise = waitForEvent(document, "popupshown"); let promise = waitForEvent(document, "popupshown");
sendContextMenuClick(190, 17); sendContextMenuClick(190, 17);
@ -137,6 +138,7 @@ gTests.push({
tearDown: setUpAndTearDown, tearDown: setUpAndTearDown,
run: function test() { run: function test() {
gInput.selectionStart = gInput.selectionEnd = 0; gInput.selectionStart = gInput.selectionEnd = 0;
yield waitForEvent(window, "scroll");
let promise = waitForEvent(document, "popupshown"); let promise = waitForEvent(document, "popupshown");
sendContextMenuClick(230, 17); sendContextMenuClick(230, 17);