diff --git a/browser/base/content/test/general/browser.ini b/browser/base/content/test/general/browser.ini index 577334c749e0..5231098d7903 100644 --- a/browser/base/content/test/general/browser.ini +++ b/browser/base/content/test/general/browser.ini @@ -392,7 +392,6 @@ support-files = contentSearchUI.html contentSearchUI.js [browser_selectpopup.js] -run-if = e10s [browser_selectTabAtIndex.js] [browser_ssl_error_reports.js] [browser_star_hsts.js] diff --git a/browser/base/content/test/general/browser_selectpopup.js b/browser/base/content/test/general/browser_selectpopup.js index 6918b6c34036..40777581fd96 100644 --- a/browser/base/content/test/general/browser_selectpopup.js +++ b/browser/base/content/test/general/browser_selectpopup.js @@ -195,6 +195,14 @@ function* doSelectTests(contentType, dtd) { yield BrowserTestUtils.removeTab(tab); } +add_task(function* setup() { + yield SpecialPowers.pushPrefEnv({ + "set": [ + ["dom.select_popup_in_parent.enabled", true], + ] + }); +}); + add_task(function*() { yield doSelectTests("text/html", ""); }); diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index 7f4f742228ec..47603ab2026b 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -118,6 +118,12 @@ nsListControlFrame::~nsListControlFrame() mComboboxFrame = nullptr; } +static bool ShouldFireDropDownEvent() { + return (XRE_IsContentProcess() && + Preferences::GetBool("browser.tabs.remote.desktopbehavior", false)) || + Preferences::GetBool("dom.select_popup_in_parent.enabled", false); +} + // for Bug 47302 (remove this comment later) void nsListControlFrame::DestroyFrom(nsIFrame* aDestructRoot) @@ -141,8 +147,7 @@ nsListControlFrame::DestroyFrom(nsIFrame* aDestructRoot) mContent->RemoveSystemEventListener(NS_LITERAL_STRING("mousemove"), mEventListener, false); - if (XRE_IsContentProcess() && - Preferences::GetBool("browser.tabs.remote.desktopbehavior", false)) { + if (ShouldFireDropDownEvent()) { nsContentUtils::AddScriptRunner( new AsyncEventDispatcher(mContent, NS_LITERAL_STRING("mozhidedropdown"), true, @@ -1789,8 +1794,7 @@ nsListControlFrame::GetIndexFromDOMEvent(nsIDOMEvent* aMouseEvent, static bool FireShowDropDownEvent(nsIContent* aContent, bool aShow, bool aIsSourceTouchEvent) { - if (XRE_IsContentProcess() && - Preferences::GetBool("browser.tabs.remote.desktopbehavior", false)) { + if (ShouldFireDropDownEvent()) { nsString eventName; if (aShow) { eventName = aIsSourceTouchEvent ? NS_LITERAL_STRING("mozshowdropdown-sourcetouch") : diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 43c99e24bb01..7324fc28d398 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -117,6 +117,7 @@ pref("browser.download.forbid_open_with", false); // Whether or not testing features are enabled. pref("dom.quotaManager.testing", false); +pref("dom.select_popup_in_parent.enabled", false); // Whether or not indexedDB is enabled. pref("dom.indexedDB.enabled", true); diff --git a/toolkit/content/browser-content.js b/toolkit/content/browser-content.js index 0e65e81ef73d..606920cda348 100644 --- a/toolkit/content/browser-content.js +++ b/toolkit/content/browser-content.js @@ -15,6 +15,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode", "resource://gre/modules/ReaderMode.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils", "resource://gre/modules/BrowserUtils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "SelectContentHelper", + "resource://gre/modules/SelectContentHelper.jsm"); var global = this; @@ -1825,3 +1827,22 @@ let TelemetryScrollTracker = { }; TelemetryScrollTracker.init(); + +addEventListener("mozshowdropdown", event => { + if (!event.isTrusted) + return; + + if (!SelectContentHelper.open) { + new SelectContentHelper(event.target, {isOpenedViaTouch: false}, this); + } +}); + +addEventListener("mozshowdropdown-sourcetouch", event => { + if (!event.isTrusted) + return; + + if (!SelectContentHelper.open) { + new SelectContentHelper(event.target, {isOpenedViaTouch: true}, this); + } +}); + diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn index ff42d0d325c4..8fa234faa2e2 100644 --- a/toolkit/content/jar.mn +++ b/toolkit/content/jar.mn @@ -62,7 +62,6 @@ toolkit.jar: content/global/resetProfile.js content/global/resetProfile.xul content/global/resetProfileProgress.xul - content/global/select-child.js content/global/TopLevelVideoDocument.js content/global/timepicker.xhtml content/global/treeUtils.js diff --git a/toolkit/content/widgets/browser.xml b/toolkit/content/widgets/browser.xml index c1987dd3cce7..5d493c77a27d 100644 --- a/toolkit/content/widgets/browser.xml +++ b/toolkit/content/widgets/browser.xml @@ -956,6 +956,12 @@ this.messageManager.addMessageListener("AudioPlayback:Start", this); this.messageManager.addMessageListener("AudioPlayback:Stop", this); this.messageManager.addMessageListener("AudioPlayback:Block", this); + + if (this.hasAttribute("selectmenulist")) { + this.messageManager.addMessageListener("Forms:ShowDropDown", this); + this.messageManager.addMessageListener("Forms:HideDropDown", this); + } + } ]]> @@ -974,6 +980,11 @@ diff --git a/toolkit/content/widgets/remote-browser.xml b/toolkit/content/widgets/remote-browser.xml index 4d81a1a68c3c..32a4024b9e71 100644 --- a/toolkit/content/widgets/remote-browser.xml +++ b/toolkit/content/widgets/remote-browser.xml @@ -389,7 +389,6 @@ if (this.hasAttribute("selectmenulist")) { this.messageManager.addMessageListener("Forms:ShowDropDown", this); this.messageManager.addMessageListener("Forms:HideDropDown", this); - this.messageManager.loadFrameScript("chrome://global/content/select-child.js", true); } if (!this.hasAttribute("disablehistory")) { @@ -500,14 +499,6 @@ break; } - case "Forms:HideDropDown": { - if (this._selectParentHelper) { - let menulist = document.getElementById(this.getAttribute("selectmenulist")); - this._selectParentHelper.hide(menulist, this); - } - break; - } - case "DOMFullscreen:RequestExit": { let windowUtils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindowUtils);