зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 3 changesets (bug 1364896) for causing bug 1376466.
Backed out changeset 5c870a786e94 (bug 1364896) Backed out changeset 134d9ee1e545 (bug 1364896) Backed out changeset 8f52f28a9eaa (bug 1364896)
This commit is contained in:
Родитель
fdb811340a
Коммит
309d4a291b
|
@ -1634,10 +1634,6 @@ var gBrowserInit = {
|
||||||
FullScreen.init();
|
FullScreen.init();
|
||||||
PointerLock.init();
|
PointerLock.init();
|
||||||
|
|
||||||
if (AppConstants.isPlatformAndVersionAtLeast("win", "10")) {
|
|
||||||
ContextMenuTouchModeObserver.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize the sync UI
|
// initialize the sync UI
|
||||||
gSync.init();
|
gSync.init();
|
||||||
|
|
||||||
|
@ -1847,9 +1843,6 @@ var gBrowserInit = {
|
||||||
this.gmpInstallManager.uninit();
|
this.gmpInstallManager.uninit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AppConstants.isPlatformAndVersionAtLeast("win", "10")) {
|
|
||||||
ContextMenuTouchModeObserver.uninit();
|
|
||||||
}
|
|
||||||
BrowserOffline.uninit();
|
BrowserOffline.uninit();
|
||||||
IndexedDBPromptHelper.uninit();
|
IndexedDBPromptHelper.uninit();
|
||||||
PanelUI.uninit();
|
PanelUI.uninit();
|
||||||
|
@ -8226,77 +8219,6 @@ function restoreLastSession() {
|
||||||
SessionStore.restoreLastSession();
|
SessionStore.restoreLastSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Observes context menus and adjusts their size for better
|
|
||||||
* usability when opened via a touch screen. */
|
|
||||||
var ContextMenuTouchModeObserver = {
|
|
||||||
get _searchBarContextMenu() {
|
|
||||||
let searchbar = document.getElementById("searchbar");
|
|
||||||
let textBox = document.getAnonymousElementByAttribute(searchbar,
|
|
||||||
"anonid", "searchbar-textbox");
|
|
||||||
let inputBox = document.getAnonymousElementByAttribute(textBox,
|
|
||||||
"anonid", "textbox-input-box");
|
|
||||||
let menu = document.getAnonymousElementByAttribute(inputBox,
|
|
||||||
"anonid", "input-box-contextmenu");
|
|
||||||
return menu;
|
|
||||||
},
|
|
||||||
|
|
||||||
get _urlBarContextMenu() {
|
|
||||||
let urlbar = document.getElementById("urlbar");
|
|
||||||
let textBox = document.getAnonymousElementByAttribute(urlbar,
|
|
||||||
"anonid", "textbox-input-box");
|
|
||||||
let menu = document.getAnonymousElementByAttribute(textBox,
|
|
||||||
"anonid", "input-box-contextmenu");
|
|
||||||
return menu;
|
|
||||||
},
|
|
||||||
|
|
||||||
_addListener(el) {
|
|
||||||
el.addEventListener("popupshowing", this);
|
|
||||||
},
|
|
||||||
|
|
||||||
_removeListener(el) {
|
|
||||||
el.removeEventListener("popupshowing", this);
|
|
||||||
},
|
|
||||||
|
|
||||||
init() {
|
|
||||||
// Start observing different context menus for popupshowing.
|
|
||||||
|
|
||||||
// The main popup set, which contains several context menus,
|
|
||||||
// e.g. the page content area context menu.
|
|
||||||
this._addListener(document.getElementById("mainPopupSet"));
|
|
||||||
|
|
||||||
// The navigation context menu of the back and forward button.
|
|
||||||
this._addListener(document.getElementById("back-button"));
|
|
||||||
this._addListener(document.getElementById("forward-button"));
|
|
||||||
|
|
||||||
// The search bar context menu.
|
|
||||||
this._addListener(this._searchBarContextMenu);
|
|
||||||
|
|
||||||
// The url bar context menu.
|
|
||||||
this._addListener(this._urlBarContextMenu);
|
|
||||||
},
|
|
||||||
|
|
||||||
handleEvent(event) {
|
|
||||||
let target = event.target;
|
|
||||||
if (target.localName != "menupopup") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.mozInputSource == MouseEvent.MOZ_SOURCE_TOUCH) {
|
|
||||||
target.setAttribute("touchmode", "true");
|
|
||||||
} else {
|
|
||||||
target.removeAttribute("touchmode");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
uninit() {
|
|
||||||
this._removeListener(document.getElementById("mainPopupSet"));
|
|
||||||
this._removeListener(document.getElementById("back-button"));
|
|
||||||
this._removeListener(document.getElementById("forward-button"));
|
|
||||||
this._removeListener(this._searchBarContextMenu);
|
|
||||||
this._removeListener(this._urlBarContextMenu);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
var TabContextMenu = {
|
var TabContextMenu = {
|
||||||
contextTab: null,
|
contextTab: null,
|
||||||
_updateToggleMuteMenuItem(aTab, aConditionFn) {
|
_updateToggleMuteMenuItem(aTab, aConditionFn) {
|
||||||
|
|
|
@ -62,14 +62,14 @@ function openContextMenu(aMessage) {
|
||||||
let popup = browser.ownerDocument.getElementById("contentAreaContextMenu");
|
let popup = browser.ownerDocument.getElementById("contentAreaContextMenu");
|
||||||
let event = gContextMenuContentData.event;
|
let event = gContextMenuContentData.event;
|
||||||
|
|
||||||
// The event is a CPOW that can't be passed into the native openPopupAtScreen
|
// Set touch mode to get larger menu items.
|
||||||
// function. Therefore we synthesize a new MouseEvent to propagate the
|
if (event.mozInputSource == MouseEvent.MOZ_SOURCE_TOUCH) {
|
||||||
// inputSource to the subsequently triggered popupshowing event.
|
popup.setAttribute("touchmode", "true");
|
||||||
var newEvent = document.createEvent("MouseEvent");
|
} else {
|
||||||
newEvent.initNSMouseEvent("contextmenu", true, true, null, 0, event.screenX, event.screenY,
|
popup.removeAttribute("touchmode");
|
||||||
0, 0, false, false, false, false, 0, null, 0, event.mozInputSource);
|
}
|
||||||
|
|
||||||
popup.openPopupAtScreen(newEvent.screenX, newEvent.screenY, true, newEvent);
|
popup.openPopupAtScreen(event.screenX, event.screenY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function nsContextMenu(aXulMenu, aIsShift) {
|
function nsContextMenu(aXulMenu, aIsShift) {
|
||||||
|
|
|
@ -4,5 +4,3 @@ support-files =
|
||||||
subtst_contextmenu_webext.html
|
subtst_contextmenu_webext.html
|
||||||
|
|
||||||
[browser_contextmenu_mozextension.js]
|
[browser_contextmenu_mozextension.js]
|
||||||
[browser_contextmenu_touch.js]
|
|
||||||
skip-if = !(os == 'win' && os_version == '10.0')
|
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
/* This test checks that context menus are in touchmode
|
|
||||||
* when opened through a touch event (long tap). */
|
|
||||||
|
|
||||||
async function openAndCheckContextMenu(contextMenu, target) {
|
|
||||||
is(contextMenu.state, "closed", "Context menu is initally closed.");
|
|
||||||
|
|
||||||
let popupshown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
|
|
||||||
EventUtils.synthesizeNativeTapAtCenter(target, true);
|
|
||||||
await popupshown;
|
|
||||||
|
|
||||||
is(contextMenu.state, "open", "Context menu is open.");
|
|
||||||
is(contextMenu.getAttribute("touchmode"), "true", "Context menu is in touchmode.");
|
|
||||||
|
|
||||||
contextMenu.hidePopup();
|
|
||||||
|
|
||||||
popupshown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
|
|
||||||
EventUtils.synthesizeMouseAtCenter(target, {type: "contextmenu"});
|
|
||||||
await popupshown;
|
|
||||||
|
|
||||||
is(contextMenu.state, "open", "Context menu is open.");
|
|
||||||
ok(!contextMenu.hasAttribute("touchmode"), "Context menu is not in touchmode.");
|
|
||||||
|
|
||||||
contextMenu.hidePopup();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test the content area context menu.
|
|
||||||
add_task(async function test_contentarea_contextmenu_touch() {
|
|
||||||
await BrowserTestUtils.withNewTab("about:blank", async function(browser) {
|
|
||||||
let contextMenu = document.getElementById("contentAreaContextMenu");
|
|
||||||
await openAndCheckContextMenu(contextMenu, browser);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Test the back and forward buttons.
|
|
||||||
add_task(async function test_back_forward_button_contextmenu_touch() {
|
|
||||||
await BrowserTestUtils.withNewTab("http://example.com", async function(browser) {
|
|
||||||
let contextMenu = document.getElementById("backForwardMenu");
|
|
||||||
|
|
||||||
let backbutton = document.getElementById("back-button");
|
|
||||||
let notDisabled = BrowserTestUtils.waitForCondition(() => !backbutton.hasAttribute("disabled"));
|
|
||||||
BrowserTestUtils.loadURI(browser, "http://example.org");
|
|
||||||
await notDisabled;
|
|
||||||
await openAndCheckContextMenu(contextMenu, backbutton);
|
|
||||||
|
|
||||||
|
|
||||||
let forwardbutton = document.getElementById("forward-button");
|
|
||||||
notDisabled = BrowserTestUtils.waitForCondition(() => !forwardbutton.hasAttribute("disabled"));
|
|
||||||
backbutton.click();
|
|
||||||
await notDisabled;
|
|
||||||
await openAndCheckContextMenu(contextMenu, forwardbutton);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Test the toolbar context menu.
|
|
||||||
add_task(async function test_toolbar_contextmenu_touch() {
|
|
||||||
let toolbarContextMenu = document.getElementById("toolbar-context-menu");
|
|
||||||
let target = document.getElementById("PanelUI-menu-button");
|
|
||||||
await openAndCheckContextMenu(toolbarContextMenu, target);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Test the urlbar input context menu.
|
|
||||||
add_task(async function test_urlbar_contextmenu_touch() {
|
|
||||||
let urlbar = document.getElementById("urlbar");
|
|
||||||
let textBox = document.getAnonymousElementByAttribute(urlbar,
|
|
||||||
"anonid", "textbox-input-box");
|
|
||||||
let menu = document.getAnonymousElementByAttribute(textBox,
|
|
||||||
"anonid", "input-box-contextmenu");
|
|
||||||
await openAndCheckContextMenu(menu, textBox);
|
|
||||||
});
|
|
|
@ -1970,8 +1970,8 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
|
||||||
%include ../shared/contextmenu.inc.css
|
%include ../shared/contextmenu.inc.css
|
||||||
|
|
||||||
/* Make context menu items larger when opened through touch. */
|
/* Make context menu items larger when opened through touch. */
|
||||||
menupopup[touchmode] menu,
|
#contentAreaContextMenu[touchmode] menu,
|
||||||
menupopup[touchmode] menuitem {
|
#contentAreaContextMenu[touchmode] menuitem {
|
||||||
padding-top: 12px;
|
padding-top: 12px;
|
||||||
padding-bottom: 12px;
|
padding-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -771,7 +771,7 @@ nsXULPopupManager::ShowMenu(nsIContent *aMenu,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nsCOMPtr<nsIContent> popupContent = popupFrame->GetContent();
|
nsCOMPtr<nsIContent> popupContent = popupFrame->GetContent();
|
||||||
FirePopupShowingEvent(popupContent, parentIsContextMenu, aSelectFirstItem, nullptr);
|
FirePopupShowingEvent(popupContent, parentIsContextMenu, aSelectFirstItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -795,7 +795,7 @@ nsXULPopupManager::ShowPopup(nsIContent* aPopup,
|
||||||
popupFrame->InitializePopup(aAnchorContent, triggerContent, aPosition,
|
popupFrame->InitializePopup(aAnchorContent, triggerContent, aPosition,
|
||||||
aXPos, aYPos, MenuPopupAnchorType_Node, aAttributesOverride);
|
aXPos, aYPos, MenuPopupAnchorType_Node, aAttributesOverride);
|
||||||
|
|
||||||
FirePopupShowingEvent(aPopup, aIsContextMenu, aSelectFirstItem, aTriggerEvent);
|
FirePopupShowingEvent(aPopup, aIsContextMenu, aSelectFirstItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -812,7 +812,7 @@ nsXULPopupManager::ShowPopupAtScreen(nsIContent* aPopup,
|
||||||
InitTriggerEvent(aTriggerEvent, aPopup, getter_AddRefs(triggerContent));
|
InitTriggerEvent(aTriggerEvent, aPopup, getter_AddRefs(triggerContent));
|
||||||
|
|
||||||
popupFrame->InitializePopupAtScreen(triggerContent, aXPos, aYPos, aIsContextMenu);
|
popupFrame->InitializePopupAtScreen(triggerContent, aXPos, aYPos, aIsContextMenu);
|
||||||
FirePopupShowingEvent(aPopup, aIsContextMenu, false, aTriggerEvent);
|
FirePopupShowingEvent(aPopup, aIsContextMenu, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -833,7 +833,7 @@ nsXULPopupManager::ShowPopupAtScreenRect(nsIContent* aPopup,
|
||||||
popupFrame->InitializePopupAtRect(triggerContent, aPosition,
|
popupFrame->InitializePopupAtRect(triggerContent, aPosition,
|
||||||
aRect, aAttributesOverride);
|
aRect, aAttributesOverride);
|
||||||
|
|
||||||
FirePopupShowingEvent(aPopup, aIsContextMenu, false, aTriggerEvent);
|
FirePopupShowingEvent(aPopup, aIsContextMenu, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -862,7 +862,7 @@ nsXULPopupManager::ShowTooltipAtScreen(nsIContent* aPopup,
|
||||||
|
|
||||||
popupFrame->InitializePopupAtScreen(aTriggerContent, aXPos, aYPos, false);
|
popupFrame->InitializePopupAtScreen(aTriggerContent, aXPos, aYPos, false);
|
||||||
|
|
||||||
FirePopupShowingEvent(aPopup, false, false, nullptr);
|
FirePopupShowingEvent(aPopup, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -881,7 +881,7 @@ nsXULPopupManager::ShowPopupWithAnchorAlign(nsIContent* aPopup,
|
||||||
|
|
||||||
popupFrame->InitializePopupWithAnchorAlign(aAnchorContent, aAnchor,
|
popupFrame->InitializePopupWithAnchorAlign(aAnchorContent, aAnchor,
|
||||||
aAlign, aXPos, aYPos);
|
aAlign, aXPos, aYPos);
|
||||||
FirePopupShowingEvent(aPopup, aIsContextMenu, false, nullptr);
|
FirePopupShowingEvent(aPopup, aIsContextMenu, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1429,8 +1429,7 @@ nsXULPopupManager::ExecuteMenu(nsIContent* aMenu, nsXULMenuCommandEvent* aEvent)
|
||||||
void
|
void
|
||||||
nsXULPopupManager::FirePopupShowingEvent(nsIContent* aPopup,
|
nsXULPopupManager::FirePopupShowingEvent(nsIContent* aPopup,
|
||||||
bool aIsContextMenu,
|
bool aIsContextMenu,
|
||||||
bool aSelectFirstItem,
|
bool aSelectFirstItem)
|
||||||
nsIDOMEvent* aTriggerEvent)
|
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIContent> popup = aPopup; // keep a strong reference to the popup
|
nsCOMPtr<nsIContent> popup = aPopup; // keep a strong reference to the popup
|
||||||
|
|
||||||
|
@ -1476,14 +1475,6 @@ nsXULPopupManager::FirePopupShowingEvent(nsIContent* aPopup,
|
||||||
event.mWidget = nullptr;
|
event.mWidget = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aTriggerEvent) {
|
|
||||||
WidgetMouseEventBase* mouseEvent =
|
|
||||||
aTriggerEvent->WidgetEventPtr()->AsMouseEventBase();
|
|
||||||
if (mouseEvent) {
|
|
||||||
event.inputSource = mouseEvent->inputSource;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.mRefPoint = mCachedMousePoint;
|
event.mRefPoint = mCachedMousePoint;
|
||||||
event.mModifiers = mCachedModifiers;
|
event.mModifiers = mCachedModifiers;
|
||||||
EventDispatcher::Dispatch(popup, presContext, &event, nullptr, &status);
|
EventDispatcher::Dispatch(popup, presContext, &event, nullptr, &status);
|
||||||
|
@ -2749,7 +2740,7 @@ nsXULPopupShowingEvent::Run()
|
||||||
{
|
{
|
||||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||||
if (pm) {
|
if (pm) {
|
||||||
pm->FirePopupShowingEvent(mPopup, mIsContextMenu, mSelectFirstItem, nullptr);
|
pm->FirePopupShowingEvent(mPopup, mIsContextMenu, mSelectFirstItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
@ -731,14 +731,10 @@ protected:
|
||||||
* aPopup - the popup to open
|
* aPopup - the popup to open
|
||||||
* aIsContextMenu - true for context menus
|
* aIsContextMenu - true for context menus
|
||||||
* aSelectFirstItem - true to select the first item in the menu
|
* aSelectFirstItem - true to select the first item in the menu
|
||||||
* aTriggerEvent - the event that triggered the showing event.
|
|
||||||
* This is currently used to propagate the
|
|
||||||
* inputSource attribute. May be null.
|
|
||||||
*/
|
*/
|
||||||
void FirePopupShowingEvent(nsIContent* aPopup,
|
void FirePopupShowingEvent(nsIContent* aPopup,
|
||||||
bool aIsContextMenu,
|
bool aIsContextMenu,
|
||||||
bool aSelectFirstItem,
|
bool aSelectFirstItem);
|
||||||
nsIDOMEvent* aTriggerEvent);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fire a popuphiding event and then hide the popup. This will be called
|
* Fire a popuphiding event and then hide the popup. This will be called
|
||||||
|
|
|
@ -633,31 +633,6 @@ function sendWheelAndPaint(aTarget, aOffsetX, aOffsetY, aEvent, aCallback, aWind
|
||||||
synthesizeWheel(aTarget, aOffsetX, aOffsetY, aEvent, aWindow);
|
synthesizeWheel(aTarget, aOffsetX, aOffsetY, aEvent, aWindow);
|
||||||
}
|
}
|
||||||
|
|
||||||
function synthesizeNativeTapAtCenter(aTarget, aLongTap = false, aCallback = null, aWindow = window) {
|
|
||||||
let rect = aTarget.getBoundingClientRect();
|
|
||||||
return synthesizeNativeTap(aTarget, rect.width / 2, rect.height / 2, aLongTap, aCallback, aWindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
function synthesizeNativeTap(aTarget, aOffsetX, aOffsetY, aLongTap = false, aCallback = null, aWindow = window) {
|
|
||||||
let utils = _getDOMWindowUtils(aWindow);
|
|
||||||
if (!utils)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let scale = utils.screenPixelsPerCSSPixel;
|
|
||||||
let rect = aTarget.getBoundingClientRect();
|
|
||||||
let x = (aWindow.mozInnerScreenX + rect.left + aOffsetX) * scale;
|
|
||||||
let y = (aWindow.mozInnerScreenY + rect.top + aOffsetY) * scale;
|
|
||||||
|
|
||||||
let observer = {
|
|
||||||
observe: (subject, topic, data) => {
|
|
||||||
if (aCallback && topic == "mouseevent") {
|
|
||||||
aCallback(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
utils.sendNativeTouchTap(x, y, aLongTap, observer);
|
|
||||||
}
|
|
||||||
|
|
||||||
function synthesizeNativeMouseMove(aTarget, aOffsetX, aOffsetY, aCallback, aWindow = window) {
|
function synthesizeNativeMouseMove(aTarget, aOffsetX, aOffsetY, aCallback, aWindow = window) {
|
||||||
var utils = _getDOMWindowUtils(aWindow);
|
var utils = _getDOMWindowUtils(aWindow);
|
||||||
if (!utils)
|
if (!utils)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче