/* 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/. */ "use strict"; this.EXPORTED_SYMBOLS = [ "SelectParentHelper" ]; let currentBrowser = null; this.SelectParentHelper = { populate: function(menulist, items, selectedIndex) { // Clear the current contents of the popup menulist.menupopup.textContent = ""; populateChildren(menulist, items, selectedIndex); }, open: function(browser, menulist, rect) { menulist.hidden = false; currentBrowser = browser; this._registerListeners(menulist.menupopup); menulist.menupopup.openPopupAtScreenRect("after_start", rect.left, rect.top, rect.width, rect.height, false, false); menulist.selectedItem.scrollIntoView(); }, hide: function(menulist) { menulist.menupopup.hidePopup(); }, handleEvent: function(event) { let popup = event.currentTarget; let menulist = popup.parentNode; switch (event.type) { case "command": if (event.target.hasAttribute("value")) { currentBrowser.messageManager.sendAsyncMessage("Forms:SelectDropDownItem", { value: event.target.value }); } popup.hidePopup(); break; case "popuphidden": currentBrowser.messageManager.sendAsyncMessage("Forms:DismissedDropDown", {}); currentBrowser = null; this._unregisterListeners(popup); menulist.hidden = true; break; } }, _registerListeners: function(popup) { popup.addEventListener("command", this); popup.addEventListener("popuphidden", this); }, _unregisterListeners: function(popup) { popup.removeEventListener("command", this); popup.removeEventListener("popuphidden", this); }, }; function populateChildren(menulist, options, selectedIndex, startIndex = 0, isInGroup = false) { let index = startIndex; let element = menulist.menupopup; for (let option of options) { let isOptGroup = (option.tagName == 'OPTGROUP'); let item = element.ownerDocument.createElement(isOptGroup ? "menucaption" : "menuitem"); item.setAttribute("label", option.textContent); item.style.direction = option.textDirection; element.appendChild(item); if (isOptGroup) { index = populateChildren(menulist, option.children, selectedIndex, index, true); } else { if (index == selectedIndex) { // We expect the parent element of the popup to be a that // has the popuponly attribute set to "true". This is necessary in order // for a to act like a proper dropdown, as // the does things like remember state and set the // _moz-menuactive attribute on the selected . menulist.selectedItem = item; } item.setAttribute("value", index++); if (isInGroup) { item.classList.add("contentSelectDropdown-ingroup") } } } return index; }