toolkit/modules/SelectParentHelper.jsm

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 "use strict";
     7 this.EXPORTED_SYMBOLS = [
     8   "SelectParentHelper"
     9 ];
    11 let currentBrowser = null;
    13 this.SelectParentHelper = {
    14   populate: function(popup, items, selectedIndex) {
    15     // Clear the current contents of the popup
    16     popup.textContent = "";
    17     populateChildren(popup, items, selectedIndex);
    18   },
    20   open: function(browser, popup, rect) {
    21     currentBrowser = browser;
    22     this._registerListeners(popup);
    23     popup.hidden = false;
    25     let {x, y} = browser.mapScreenCoordinatesFromContent(rect.left, rect.top + rect.height);
    26     popup.openPopupAtScreen(x, y);
    27   },
    29   hide: function(popup) {
    30     popup.hidePopup();
    31   },
    33   handleEvent: function(event) {
    34     let popup = event.currentTarget;
    36     switch (event.type) {
    37       case "command":
    38         if (event.target.hasAttribute("value")) {
    39           currentBrowser.messageManager.sendAsyncMessage("Forms:SelectDropDownItem", {
    40             value: event.target.value
    41           });
    42         }
    43         popup.hidePopup();
    44         break;
    46       case "popuphidden":
    47         currentBrowser.messageManager.sendAsyncMessage("Forms:DismissedDropDown", {});
    48         currentBrowser = null;
    49         this._unregisterListeners(popup);
    50         break;
    51     }
    52   },
    54   _registerListeners: function(popup) {
    55     popup.addEventListener("command", this);
    56     popup.addEventListener("popuphidden", this);
    57   },
    59   _unregisterListeners: function(popup) {
    60     popup.removeEventListener("command", this);
    61     popup.removeEventListener("popuphidden", this);
    62   },
    64 };
    66 function populateChildren(element, options, selectedIndex, startIndex = 0, isGroup = false) {
    67   let index = startIndex;
    69   for (let option of options) {
    70     let item = element.ownerDocument.createElement("menuitem");
    71     item.setAttribute("label", option.textContent);
    72     item.setAttribute("type", "radio");
    74     if (index == selectedIndex) {
    75       item.setAttribute("checked", "true");
    76     }
    78     element.appendChild(item);
    80     if (option.children.length > 0) {
    81       item.classList.add("contentSelectDropdown-optgroup");
    82       item.setAttribute("disabled", "true");
    83       index = populateChildren(element, option.children, selectedIndex, index, true);
    84     } else {
    85       item.setAttribute("value", index++);
    87       if (isGroup) {
    88         item.classList.add("contentSelectDropdown-ingroup")
    89       }
    90     }
    91   }
    93   return index;
    94 }

mercurial