MozillaZine

UserChrome.js/General

From MozillaZine Knowledge Base

This page contains sample userChrome.js scripts that work in most or all Mozilla applications. Unless otherwise stated, they are self-contained so that you can copy any script from here and paste it in your userChrome.js file, and it will work without modification.

Copy user-interface text

This userChrome.js script copies text from a Mozilla application's user interface to the clipboard when you click the text. It will capture text from most user-interface elements, including menu items, labels, text fields, buttons, checkboxes, popups and alerts.

As supplied here, the script works on mouse button 2 ("right-click"). The copied text flashes yellow.

If you hold down the Shift key while you click, the copied text accumulates. For example, to accumulate the string "Advanced – General – Config Editor...", click once on "Advanced" then Shift+Click twice to accumulate the other parts.

If you copy a menu item, the script automatically climbs the menus to the top and accumulates all the choices. For example, if you click the menu item "Release Notes", you automatically get "Help – Release Notes".

Trees have only limited support: there is no color flash, and only the first column of the row you click is copied.

Configuration:

mouseButton  The mouse button to activate the copy: 0, 1 or 2
ctrlKeyWhether to require the Ctrl key to activate the copy
separatorThe separator for accumulated strings (\u2013 is an en-dash)
flashColorThe flash color (any CSS color)
flashTimeThe flash time in milliseconds

When you copy the script from this web page, make sure that you scroll to get all of it:

UICopy = {

  // configure...
  mouseButton: 2,
  ctrlKey: false,
  separator: " \u2013 ",
  flashColor: "yellow",
  flashTime: 200,

  // private:
  sofar: "",

  click: function (event) {
    if (event.button != UICopy.mouseButton) return
    if (UICopy.ctrlKey && !event.ctrlKey) return

    var elem = event.target
    var pcl = elem.ownerDocument.location.protocol
    if (pcl == "mailbox:" || pcl == "view-source:") return

    var text = UICopy.extract(elem)
    if (!text) {
      elem = event.originalTarget
      text = UICopy.extract(elem)
      }
    if (!text) return

    if (event.shiftKey) {
      if (UICopy.sofar) UICopy.sofar += UICopy.separator
      UICopy.sofar += text
      text = UICopy.sofar
      }
    else {
      if (elem.localName == "menuitem" || elem.localName == "menu") {
        var menu = elem.parentNode.parentNode
        while (menu.localName == "menu") {
          text = menu.getAttribute("label") + UICopy.separator + text
          menu = menu.parentNode.parentNode
          }
        }
      UICopy.sofar = text
      }

    Components
      .classes["@mozilla.org/widget/clipboardhelper;1"]
      .getService(Components.interfaces.nsIClipboardHelper)
      .copyString(text)

    if (elem.localName == "treechildren") return

    var nodes = elem.ownerDocument.getAnonymousNodes(elem)
    for each (var node in nodes) {
       if (node.localName == "label") {
        elem = node
        break
        }
      }

    var was = elem.style.color
    elem.style.color = UICopy.flashColor
    setTimeout(UICopy.clear, UICopy.flashTime, elem, was)
    },

  clear: function (elem, was) {
    elem.style.color = was
    },

  extract: function (elem) {
    var tag = elem.localName
    if (tag == "prefwindow" || tag == "wizard" || tag == "dialog") return ""
    if ((elem.localName == "label" || elem.localName == "description")
      && elem.textContent) return elem.textContent
    if (elem.firstChild && elem.firstChild.nodeType == 3)
      return elem.firstChild.nodeValue
    if (elem.hasAttribute("label")) return elem.getAttribute("label")
    if (elem.hasAttribute("value")) return elem.getAttribute("value")
    if (elem.hasAttribute("title")) return elem.getAttribute("title")
    if (elem.localName == "treechildren") {
      var min = {}, tree = elem.parentNode
      tree.view.selection.getRangeAt(0, min, {});
      return tree.view.getCellText(min.value, tree.columns[0])
      }
    return ""
    },

  load: function (win) {
    win.addEventListener("click", UICopy.click, true)
    },

  observe: function (win, act) {
    if (act = "domwindowopened")
      win.QueryInterface(Components.interfaces.nsIDOMEventTarget)
        .addEventListener(
          "load",
          function () {UICopy.load(
            win.QueryInterface(Components.interfaces.nsIDOMWindow))},
          false
          )
    }

  }


UICopy.load(self)

Components
  .classes["@mozilla.org/embedcomp/window-watcher;1"]
  .getService(Components.interfaces.nsIWindowWatcher)
  .registerNotification(UICopy)