Bug 1300784 - Update single-process firefox to implement new e10s select-dropdown
MozReview-Commit-ID: GmqTaXYyYQe
***
Remove .lldbinit changes from review
MozReview-Commit-ID: IHh1p5NLnar
***
Remove unnecesary whitespace additions from prev commit
MozReview-Commit-ID: IZFTQ7Y9aJD
***
Previous version was buggy
--- a/layout/forms/nsListControlFrame.cpp
+++ b/layout/forms/nsListControlFrame.cpp
@@ -136,18 +136,17 @@ nsListControlFrame::DestroyFrom(nsIFrame
mEventListener, false);
mContent->RemoveSystemEventListener(NS_LITERAL_STRING("mousedown"),
mEventListener, false);
mContent->RemoveSystemEventListener(NS_LITERAL_STRING("mouseup"),
mEventListener, false);
mContent->RemoveSystemEventListener(NS_LITERAL_STRING("mousemove"),
mEventListener, false);
- if (XRE_IsContentProcess() &&
- Preferences::GetBool("browser.tabs.remote.desktopbehavior", false)) {
+ if (Preferences::GetBool("browser.tabs.remote.desktopbehavior", false)) {
nsContentUtils::AddScriptRunner(
new AsyncEventDispatcher(mContent,
NS_LITERAL_STRING("mozhidedropdown"), true,
true));
}
nsFormControlFrame::RegUnRegAccessKey(static_cast<nsIFrame*>(this), false);
nsHTMLScrollFrame::DestroyFrom(aDestructRoot);
@@ -1776,17 +1775,19 @@ nsListControlFrame::GetIndexFromDOMEvent
return NS_ERROR_FAILURE;
}
static bool
FireShowDropDownEvent(nsIContent* aContent, bool aShow, bool aIsSourceTouchEvent)
{
if (XRE_IsContentProcess() &&
- Preferences::GetBool("browser.tabs.remote.desktopbehavior", false)) {
+ Preferences::GetBool("browser.tabs.remote.desktopbehavior", false) ||
+ Preferences::GetBool("dom.select_popup_in_parent.enabled"))
+ ) {
nsString eventName;
if (aShow) {
eventName = aIsSourceTouchEvent ? NS_LITERAL_STRING("mozshowdropdown-sourcetouch") :
NS_LITERAL_STRING("mozshowdropdown");
} else {
eventName = NS_LITERAL_STRING("mozhidedropdown");
}
nsContentUtils::DispatchChromeEvent(aContent->OwnerDoc(), aContent,
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -14,16 +14,17 @@
/*
* SYNTAX HINTS:
*
* - Dashes are delimiters; use underscores instead.
* - The first character after a period must be alphabetic.
* - Computed values (e.g. 50 * 1024) don't work.
*/
+pref("dom.select_popup_in_parent.enabled", false);
pref("keyword.enabled", false);
pref("general.useragent.locale", "chrome://global/locale/intl.properties");
pref("general.useragent.compatMode.firefox", false);
// This pref exists only for testing purposes. In order to disable all
// overrides by default, don't initialize UserAgentOverrides.jsm.
pref("general.useragent.site_specific_overrides", true);
--- a/toolkit/content/browser-content.js
+++ b/toolkit/content/browser-content.js
@@ -10,16 +10,18 @@ var Cr = Components.results;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
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;
// Lazily load the finder code
addMessageListener("Finder:Initialize", function () {
let {RemoteFinderListener} = Cu.import("resource://gre/modules/RemoteFinder.jsm", {});
new RemoteFinderListener(global);
@@ -1716,8 +1718,17 @@ let DateTimePickerListener = {
}
default:
break;
}
},
}
DateTimePickerListener.init();
+
+addEventListener("mozshowdropdown", event => {
+ if (!event.isTrusted)
+ return;
+
+ if (!SelectContentHelper.open) {
+ new SelectContentHelper(event.target, this);
+ }
+});
--- a/toolkit/content/jar.mn
+++ b/toolkit/content/jar.mn
@@ -56,17 +56,16 @@ toolkit.jar:
content/global/filepicker.properties
content/global/globalOverlay.js
content/global/mozilla.xhtml
content/global/process-content.js
content/global/resetProfile.css
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
content/global/viewZoomOverlay.js
content/global/bindings/autocomplete.xml (widgets/autocomplete.xml)
content/global/bindings/browser.xml (widgets/browser.xml)
content/global/bindings/button.xml (widgets/button.xml)
content/global/bindings/checkbox.xml (widgets/checkbox.xml)
@@ -113,9 +112,9 @@ toolkit.jar:
content/global/bindings/videocontrols.css (widgets/videocontrols.css)
* content/global/bindings/wizard.xml (widgets/wizard.xml)
#ifdef XP_MACOSX
content/global/macWindowMenu.js
#endif
content/global/svg/svgBindings.xml (/layout/svg/resources/content/svgBindings.xml)
content/global/gmp-sources/eme-adobe.json (gmp-sources/eme-adobe.json)
content/global/gmp-sources/openh264.json (gmp-sources/openh264.json)
- content/global/gmp-sources/widevinecdm.json (gmp-sources/widevinecdm.json)
\ No newline at end of file
+ content/global/gmp-sources/widevinecdm.json (gmp-sources/widevinecdm.json)
deleted file mode 100644
--- a/toolkit/content/select-child.js
+++ /dev/null
@@ -1,26 +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/. */
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SelectContentHelper",
- "resource://gre/modules/SelectContentHelper.jsm");
-
-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);
- }
-});
--- a/toolkit/content/widgets/browser.xml
+++ b/toolkit/content/widgets/browser.xml
@@ -917,16 +917,22 @@
}
if (this.messageManager) {
this.messageManager.addMessageListener("PopupBlocking:UpdateBlockedPopups", this);
this.messageManager.addMessageListener("Autoscroll:Start", this);
this.messageManager.addMessageListener("Autoscroll:Cancel", this);
this.messageManager.addMessageListener("AudioPlayback:Start", this);
this.messageManager.addMessageListener("AudioPlayback:Stop", this);
+
+ if (this.hasAttribute("selectmenulist")) {
+ this.messageManager.addMessageListener("Forms:ShowDropDown", this);
+ this.messageManager.addMessageListener("Forms:HideDropDown", this);
+ }
+
}
]]>
</constructor>
<destructor>
<![CDATA[
this.destroy();
]]>
@@ -935,16 +941,21 @@
<!-- This is necessary because the destructor doesn't always get called when
we are removed from a tabbrowser. This will be explicitly called by tabbrowser.
Note: this function is overriden in remote-browser.xml, so any clean-up that
also applies to browser.isRemoteBrowser = true must be duplicated there. -->
<method name="destroy">
<body>
<![CDATA[
+ // Make sure that any open select is closed.
+ if (this._selectParentHelper) {
+ let menulist = document.getElementById(this.getAttribute("selectmenulist"));
+ this._selectParentHelper.hide(menulist, this);
+ }
if (this.mDestroyed)
return;
this.mDestroyed = true;
if (this.docShell && this.webNavigation.sessionHistory) {
var os = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
try {
@@ -1003,16 +1014,38 @@
this._autoScrollPopup.hidePopup();
break;
case "AudioPlayback:Start":
this.audioPlaybackStarted();
break;
case "AudioPlayback:Stop":
this.audioPlaybackStopped();
break;
+
+ case "Forms:ShowDropDown": {
+ if (!this._selectParentHelper) {
+ this._selectParentHelper =
+ Cu.import("resource://gre/modules/SelectParentHelper.jsm", {}).SelectParentHelper;
+ }
+
+ let menulist = document.getElementById(this.getAttribute("selectmenulist"));
+ menulist.menupopup.style.direction = data.direction;
+ this._selectParentHelper.populate(menulist, data.options, data.selectedIndex, this._fullZoom);
+ this._selectParentHelper.open(this, menulist, data.rect);
+ break;
+ }
+
+ case "Forms:HideDropDown": {
+ if (this._selectParentHelper) {
+ let menulist = document.getElementById(this.getAttribute("selectmenulist"));
+ this._selectParentHelper.hide(menulist, this);
+ }
+ break;
+ }
+
}
return undefined;
]]></body>
</method>
<method name="receiveMessage">
<parameter name="aMessage"/>
<body><![CDATA[
--- a/toolkit/content/widgets/remote-browser.xml
+++ b/toolkit/content/widgets/remote-browser.xml
@@ -384,17 +384,16 @@
this.messageManager.addMessageListener("DOMFullscreen:RequestExit", this);
this.messageManager.addMessageListener("DOMFullscreen:RequestRollback", this);
this.messageManager.addMessageListener("MozApplicationManifest", this);
this.messageManager.loadFrameScript("chrome://global/content/browser-child.js", true);
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")) {
Services.obs.addObserver(this, "browser:purge-session-history", true);
}
let jsm = "resource://gre/modules/RemoteController.jsm";
let RemoteController = Components.utils.import(jsm, {}).RemoteController;
@@ -492,24 +491,16 @@
case "ZoomChangeUsingMouseWheel": {
let event = document.createEvent("Events");
event.initEvent("ZoomChangeUsingMouseWheel", true, false);
this.dispatchEvent(event);
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);
windowUtils.exitFullscreen();
break;
}
case "DOMFullscreen:RequestRollback": {