<?xml version="1.0"?>
<!-- ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Mozilla Toolkit.
 *
 * The Initial Developer of the Original Code is
 * the Mozilla Foundation.
 * Portions created by the Initial Developer are Copyright (C) 2010
 * the Initial Developer. All Rights Reserved.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** -->
<bindings id="textBindings"
   xmlns="http://www.mozilla.org/xbl"
   xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml">
   
  <binding id="text-link" extends="chrome://global/content/bindings/text.xml#text-label">
    <implementation implements="nsIAccessibleProvider">
      <property name="accessibleType" readonly="true">
        <getter>
          <![CDATA[
            return Components.interfaces.nsIAccessibleProvider.XULLink;
          ]]>
        </getter>
      </property>
      <property name="href" onget="return this.getAttribute('href');"
                            onset="this.setAttribute('href', val); return val;" />
      <method name="open">
        <parameter name="aEvent"/>
        <body>
        <![CDATA[
          var href = this.href;
          if (!href || this.disabled || aEvent.defaultPrevented)
            return;

          var uri = null;
          try {
            const nsISSM = Components.interfaces.nsIScriptSecurityManager;
            const secMan =
                     Components.classes["@mozilla.org/scriptsecuritymanager;1"]
                               .getService(nsISSM);

            const ioService =
                     Components.classes["@mozilla.org/network/io-service;1"]
                               .getService(Components.interfaces.nsIIOService);

            uri = ioService.newURI(href, null, null);

            var nullPrincipal =
              Components.classes["@mozilla.org/nullprincipal;1"]
                        .createInstance(Components.interfaces.nsIPrincipal);
            try {
              secMan.checkLoadURIWithPrincipal(nullPrincipal, uri,
                                               nsISSM.DISALLOW_INHERIT_PRINCIPAL)
            }
            catch (ex) {
              var msg = "Error: Cannot open a " + uri.scheme + ": link using \
                         the text-link binding.";
              Components.utils.reportError(msg);
              return;
            }

            // Open HTTP URLs externally
            if (window.Zotero && ["http", "https"].includes(uri.scheme)) {
              Zotero.launchURL(uri.spec);
              aEvent.preventDefault();
              return;
            }

          }
          catch (ex) {
            Components.utils.reportError(ex);
          }

          // otherwise, fall back to opening the anchor directly
          var win = window;
          if (window instanceof Components.interfaces.nsIDOMChromeWindow) {
            while (win.opener && !win.opener.closed)
              win = win.opener;
          }

          if (uri)
            win.open(uri.spec);
          else
            win.open(href);

          aEvent.preventDefault();
        ]]>
        </body>
      </method>
    </implementation>

    <handlers>
      <handler event="click" phase="capturing" button="0" action="this.open(event)"/>
      <handler event="keypress" preventdefault="true" keycode="VK_ENTER"  action="this.click()" />
      <handler event="keypress" preventdefault="true" keycode="VK_RETURN" action="this.click()" />
    </handlers>
  </binding>

</bindings>
