mozilla-kde.patch
changeset 916 2f9f2e040647
parent 909 c6717354928b
child 918 0f93e8da34b6
equal deleted inserted replaced
915:e969636be188 916:2f9f2e040647
     1 # HG changeset patch
     1 # HG changeset patch
     2 # Parent  61cdc9af8ceaf75083e751e0d6497feddc26f7ba
     2 # Parent  f2726ebfae7cdded8e7ca6030829b0a3fae4e438
     3 Description: Add KDE integration to Firefox (toolkit parts)
     3 Description: Add KDE integration to Firefox (toolkit parts)
     4 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org>
     4 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org>
     5 Author: Lubos Lunak <lunak@suse.com>
     5 Author: Lubos Lunak <lunak@suse.com>
     6 Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751
     6 Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751
     7      https://bugzilla.novell.com/show_bug.cgi?id=170055
     7      https://bugzilla.novell.com/show_bug.cgi?id=170055
    25  
    25  
    26  #include "prefapi.h"
    26  #include "prefapi.h"
    27  #include "prefread.h"
    27  #include "prefread.h"
    28  #include "prefapi_private_data.h"
    28  #include "prefapi_private_data.h"
    29  
    29  
    30 @@ -1135,16 +1136,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char 
    30 @@ -1138,16 +1139,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char 
    31  
    31  
    32  static nsresult pref_LoadPrefsInDirList(const char *listId)
    32  static nsresult pref_LoadPrefsInDirList(const char *listId)
    33  {
    33  {
    34    nsresult rv;
    34    nsresult rv;
    35    nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
    35    nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
    60                getter_AddRefs(list));
    60                getter_AddRefs(list));
    61    if (!list)
    61    if (!list)
    62      return NS_OK;
    62      return NS_OK;
    63  
    63  
    64    bool hasMore;
    64    bool hasMore;
    65 @@ -1160,17 +1179,17 @@ static nsresult pref_LoadPrefsInDirList(
    65 @@ -1163,17 +1182,17 @@ static nsresult pref_LoadPrefsInDirList(
    66  
    66  
    67      nsAutoCString leaf;
    67      nsAutoCString leaf;
    68      path->GetNativeLeafName(leaf);
    68      path->GetNativeLeafName(leaf);
    69  
    69  
    70      // Do we care if a file provided by this process fails to load?
    70      // Do we care if a file provided by this process fails to load?
    79  
    79  
    80  static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name)
    80  static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name)
    81  {
    81  {
    82    nsZipItemPtr<char> manifest(jarReader, name, true);
    82    nsZipItemPtr<char> manifest(jarReader, name, true);
    83    NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE);
    83    NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE);
    84 @@ -1264,24 +1283,36 @@ static nsresult pref_InitInitialObjects(
    84 @@ -1267,24 +1286,36 @@ static nsresult pref_InitInitialObjects(
    85    /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */
    85    /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */
    86    static const char* specialFiles[] = {
    86    static const char* specialFiles[] = {
    87  #if defined(XP_MACOSX)
    87  #if defined(XP_MACOSX)
    88      "macprefs.js"
    88      "macprefs.js"
    89  #elif defined(XP_WIN)
    89  #elif defined(XP_WIN)
   323 +
   323 +
   324 +<bindings id="dialogBindings"
   324 +<bindings id="dialogBindings"
   325 +          xmlns="http://www.mozilla.org/xbl"
   325 +          xmlns="http://www.mozilla.org/xbl"
   326 +          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   326 +          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   327 +          xmlns:xbl="http://www.mozilla.org/xbl">
   327 +          xmlns:xbl="http://www.mozilla.org/xbl">
   328 +  
   328 +
   329 +  <binding id="dialog" extends="chrome://global/content/bindings/general.xml#root-element">
   329 +  <binding id="dialog" extends="chrome://global/content/bindings/general.xml#root-element">
   330 +    <resources>
   330 +    <resources>
   331 +      <stylesheet src="chrome://global/skin/dialog.css"/>
   331 +      <stylesheet src="chrome://global/skin/dialog.css"/>
   332 +    </resources>
   332 +    </resources>
   333 +    <content>
   333 +    <content>
   334 +      <xul:vbox class="box-inherit dialog-content-box" flex="1">
   334 +      <xul:vbox class="box-inherit dialog-content-box" flex="1">
   335 +        <children/>
   335 +        <children/>
   336 +      </xul:vbox>
   336 +      </xul:vbox>
   337 +          
   337 +
   338 +      <xul:hbox class="dialog-button-box" anonid="buttons"
   338 +      <xul:hbox class="dialog-button-box" anonid="buttons"
   339 +                xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient"
   339 +                xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient"
   340 +#ifdef XP_UNIX_GNOME
   340 +#ifdef XP_UNIX
   341 +                >
   341 +                >
   342 +        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
   342 +        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
   343 +        <xul:button dlgtype="help" class="dialog-button" hidden="true"/>
   343 +        <xul:button dlgtype="help" class="dialog-button" hidden="true"/>
   344 +        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
   344 +        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
   345 +        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
   345 +        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
   347 +        <xul:button dlgtype="cancel" class="dialog-button"/>
   347 +        <xul:button dlgtype="cancel" class="dialog-button"/>
   348 +        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
   348 +        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
   349 +#elif XP_UNIX
   349 +#elif XP_UNIX
   350 +                >
   350 +                >
   351 +        <xul:button dlgtype="help" class="dialog-button" hidden="true"/>
   351 +        <xul:button dlgtype="help" class="dialog-button" hidden="true"/>
   352 +	<xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
   352 +        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
   353 +	<xul:spacer anonid="spacer" flex="1"/>
   353 +        <xul:spacer anonid="spacer" flex="1"/>
   354 +	<xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
   354 +        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
   355 +	<xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
   355 +        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
   356 +	<xul:button dlgtype="cancel" class="dialog-button"/>
   356 +        <xul:button dlgtype="cancel" class="dialog-button"/>
   357 +	<xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
   357 +        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
   358 +#else
   358 +#else
   359 +                pack="end">
   359 +                pack="end">
   360 +        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
   360 +        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
   361 +        <xul:spacer anonid="spacer" flex="1" hidden="true"/>
   361 +        <xul:spacer anonid="spacer" flex="1" hidden="true"/>
   362 +        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
   362 +        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
   401 +        <![CDATA[
   401 +        <![CDATA[
   402 +          return this._doButtonCommand("accept");
   402 +          return this._doButtonCommand("accept");
   403 +        ]]>
   403 +        ]]>
   404 +        </body>
   404 +        </body>
   405 +      </method>
   405 +      </method>
   406 +      
   406 +
   407 +      <method name="cancelDialog">
   407 +      <method name="cancelDialog">
   408 +        <body>
   408 +        <body>
   409 +        <![CDATA[
   409 +        <![CDATA[
   410 +          return this._doButtonCommand("cancel");
   410 +          return this._doButtonCommand("cancel");
   411 +        ]]>
   411 +        ]]>
   412 +        </body>
   412 +        </body>
   413 +      </method>
   413 +      </method>
   414 +      
   414 +
   415 +      <method name="getButton">
   415 +      <method name="getButton">
   416 +        <parameter name="aDlgType"/>
   416 +        <parameter name="aDlgType"/>
   417 +        <body>
   417 +        <body>
   418 +        <![CDATA[
   418 +        <![CDATA[
   419 +          return this._buttons[aDlgType];
   419 +          return this._buttons[aDlgType];
   460 +      <method name="centerWindowOnScreen">
   460 +      <method name="centerWindowOnScreen">
   461 +        <body>
   461 +        <body>
   462 +        <![CDATA[
   462 +        <![CDATA[
   463 +          var xOffset = screen.availWidth/2 - window.outerWidth/2;
   463 +          var xOffset = screen.availWidth/2 - window.outerWidth/2;
   464 +          var yOffset = screen.availHeight/2 - window.outerHeight/2; //(opener.outerHeight *2)/10;
   464 +          var yOffset = screen.availHeight/2 - window.outerHeight/2; //(opener.outerHeight *2)/10;
   465 +  
   465 +
   466 +          xOffset = xOffset > 0 ? xOffset : 0;
   466 +          xOffset = xOffset > 0 ? xOffset : 0;
   467 +          yOffset = yOffset > 0 ? yOffset : 0;
   467 +          yOffset = yOffset > 0 ? yOffset : 0;
   468 +          window.moveTo(xOffset, yOffset);
   468 +          window.moveTo(xOffset, yOffset);
   469 +        ]]>
   469 +        ]]>
   470 +        </body>
   470 +        </body>
   532 +
   532 +
   533 +          // Give focus after onload completes, see bug 103197.
   533 +          // Give focus after onload completes, see bug 103197.
   534 +          setTimeout(focusInit, 0);
   534 +          setTimeout(focusInit, 0);
   535 +        ]]>
   535 +        ]]>
   536 +        </body>
   536 +        </body>
   537 +      </method>                
   537 +      </method>
   538 +
   538 +
   539 +      <property name="mStrBundle">
   539 +      <property name="mStrBundle">
   540 +        <getter>
   540 +        <getter>
   541 +        <![CDATA[
   541 +        <![CDATA[
   542 +          if (!this._mStrBundle) {
   542 +          if (!this._mStrBundle) {
   547 +                                         .createBundle("chrome://global/locale/dialog.properties");
   547 +                                         .createBundle("chrome://global/locale/dialog.properties");
   548 +          }
   548 +          }
   549 +          return this._mStrBundle;
   549 +          return this._mStrBundle;
   550 +        ]]></getter>
   550 +        ]]></getter>
   551 +      </property>
   551 +      </property>
   552 +      
   552 +
   553 +      <method name="_configureButtons">
   553 +      <method name="_configureButtons">
   554 +        <parameter name="aButtons"/>
   554 +        <parameter name="aButtons"/>
   555 +        <body>
   555 +        <body>
   556 +        <![CDATA[
   556 +        <![CDATA[
   557 +          // by default, get all the anonymous button elements
   557 +          // by default, get all the anonymous button elements
   619 +            }
   619 +            }
   620 +          }
   620 +          }
   621 +
   621 +
   622 +          // ensure that hitting enter triggers the default button command
   622 +          // ensure that hitting enter triggers the default button command
   623 +          this.defaultButton = this.defaultButton;
   623 +          this.defaultButton = this.defaultButton;
   624 +          
   624 +
   625 +          // if there is a special button configuration, use it
   625 +          // if there is a special button configuration, use it
   626 +          if (aButtons) {
   626 +          if (aButtons) {
   627 +            // expect a comma delimited list of dlgtype values
   627 +            // expect a comma delimited list of dlgtype values
   628 +            var list = aButtons.split(",");
   628 +            var list = aButtons.split(",");
   629 +
   629 +
   632 +                          disclosure: false, extra1: false, extra2: false };
   632 +                          disclosure: false, extra1: false, extra2: false };
   633 +            for (i = 0; i < list.length; ++i)
   633 +            for (i = 0; i < list.length; ++i)
   634 +              shown[list[i].replace(/ /g, "")] = true;
   634 +              shown[list[i].replace(/ /g, "")] = true;
   635 +
   635 +
   636 +            // hide/show the buttons we want
   636 +            // hide/show the buttons we want
   637 +            for (dlgtype in buttons) 
   637 +            for (dlgtype in buttons)
   638 +              buttons[dlgtype].hidden = !shown[dlgtype];
   638 +              buttons[dlgtype].hidden = !shown[dlgtype];
   639 +
   639 +
   640 +            let { AppConstants } =
   640 +            let { AppConstants } =
   641 +                Components.utils.import("resource://gre/modules/AppConstants.jsm", {});
   641 +                Components.utils.import("resource://gre/modules/AppConstants.jsm", {});
   642 +            // show the spacer on Windows only when the extra2 button is present
   642 +            // show the spacer on Windows only when the extra2 button is present
   680 +          return document.documentElement._doButtonCommand(
   680 +          return document.documentElement._doButtonCommand(
   681 +                                        aEvent.target.getAttribute("dlgtype"));
   681 +                                        aEvent.target.getAttribute("dlgtype"));
   682 +        ]]>
   682 +        ]]>
   683 +        </body>
   683 +        </body>
   684 +      </method>
   684 +      </method>
   685 +      
   685 +
   686 +      <method name="_doButtonCommand">
   686 +      <method name="_doButtonCommand">
   687 +        <parameter name="aDlgType"/>
   687 +        <parameter name="aDlgType"/>
   688 +        <body>
   688 +        <body>
   689 +        <![CDATA[
   689 +        <![CDATA[
   690 +          var button = this.getButton(aDlgType);
   690 +          var button = this.getButton(aDlgType);
   704 +          }
   704 +          }
   705 +          return true;
   705 +          return true;
   706 +        ]]>
   706 +        ]]>
   707 +        </body>
   707 +        </body>
   708 +      </method>
   708 +      </method>
   709 +      
   709 +
   710 +      <method name="_fireButtonEvent">
   710 +      <method name="_fireButtonEvent">
   711 +        <parameter name="aDlgType"/>
   711 +        <parameter name="aDlgType"/>
   712 +        <body>
   712 +        <body>
   713 +        <![CDATA[
   713 +        <![CDATA[
   714 +          var event = document.createEvent("Events");
   714 +          var event = document.createEvent("Events");
   715 +          event.initEvent("dialog"+aDlgType, true, true);
   715 +          event.initEvent("dialog"+aDlgType, true, true);
   716 +          
   716 +
   717 +          // handle dom event handlers
   717 +          // handle dom event handlers
   718 +          var noCancel = this.dispatchEvent(event);
   718 +          var noCancel = this.dispatchEvent(event);
   719 +          
   719 +
   720 +          // handle any xml attribute event handlers
   720 +          // handle any xml attribute event handlers
   721 +          var handler = this.getAttribute("ondialog"+aDlgType);
   721 +          var handler = this.getAttribute("ondialog"+aDlgType);
   722 +          if (handler != "") {
   722 +          if (handler != "") {
   723 +            var fn = new Function("event", handler);
   723 +            var fn = new Function("event", handler);
   724 +            var returned = fn(event);
   724 +            var returned = fn(event);
   725 +            if (returned == false)
   725 +            if (returned == false)
   726 +              noCancel = false;
   726 +              noCancel = false;
   727 +          }
   727 +          }
   728 +          
   728 +
   729 +          return noCancel;
   729 +          return noCancel;
   730 +        ]]>
   730 +        ]]>
   731 +        </body>
   731 +        </body>
   732 +      </method>
   732 +      </method>
   733 +
   733 +
   744 +        ]]>
   744 +        ]]>
   745 +        </body>
   745 +        </body>
   746 +      </method>
   746 +      </method>
   747 +
   747 +
   748 +    </implementation>
   748 +    </implementation>
   749 +    
   749 +
   750 +    <handlers>
   750 +    <handlers>
   751 +      <handler event="keypress" keycode="VK_RETURN"
   751 +      <handler event="keypress" keycode="VK_RETURN"
   752 +               group="system" action="this._hitEnter(event);"/>
   752 +               group="system" action="this._hitEnter(event);"/>
   753 +      <handler event="keypress" keycode="VK_ESCAPE" group="system">
   753 +      <handler event="keypress" keycode="VK_ESCAPE" group="system">
   754 +        if (!event.defaultPrevented)
   754 +        if (!event.defaultPrevented)
   780 +</bindings>
   780 +</bindings>
   781 diff --git a/toolkit/content/widgets/preferences-kde.xml b/toolkit/content/widgets/preferences-kde.xml
   781 diff --git a/toolkit/content/widgets/preferences-kde.xml b/toolkit/content/widgets/preferences-kde.xml
   782 new file mode 100644
   782 new file mode 100644
   783 --- /dev/null
   783 --- /dev/null
   784 +++ b/toolkit/content/widgets/preferences-kde.xml
   784 +++ b/toolkit/content/widgets/preferences-kde.xml
   785 @@ -0,0 +1,1406 @@
   785 @@ -0,0 +1,1408 @@
   786 +<?xml version="1.0"?>
   786 +<?xml version="1.0"?>
   787 +
   787 +
   788 +<!DOCTYPE bindings [
   788 +<!DOCTYPE bindings [
   789 +  <!ENTITY % preferencesDTD SYSTEM "chrome://global/locale/preferences.dtd">
   789 +  <!ENTITY % preferencesDTD SYSTEM "chrome://global/locale/preferences.dtd">
   790 +  %preferencesDTD;
   790 +  %preferencesDTD;
   847 +            }
   847 +            }
   848 +          }
   848 +          }
   849 +        ]]>
   849 +        ]]>
   850 +        </body>
   850 +        </body>
   851 +      </method>
   851 +      </method>
   852 +      
   852 +
   853 +      <method name="fireChangedEvent">
   853 +      <method name="fireChangedEvent">
   854 +        <parameter name="aPreference"/>
   854 +        <parameter name="aPreference"/>
   855 +        <body>
   855 +        <body>
   856 +        <![CDATA[
   856 +        <![CDATA[
   857 +          // Value changed, synthesize an event
   857 +          // Value changed, synthesize an event
   864 +            Components.utils.reportError(e);
   864 +            Components.utils.reportError(e);
   865 +          }
   865 +          }
   866 +        ]]>
   866 +        ]]>
   867 +        </body>
   867 +        </body>
   868 +      </method>
   868 +      </method>
   869 +      
   869 +
   870 +      <field name="service">
   870 +      <field name="service">
   871 +        Components.classes["@mozilla.org/preferences-service;1"]
   871 +        Components.classes["@mozilla.org/preferences-service;1"]
   872 +                  .getService(Components.interfaces.nsIPrefService);
   872 +                  .getService(Components.interfaces.nsIPrefService);
   873 +      </field>
   873 +      </field>
   874 +      <field name="rootBranch">
   874 +      <field name="rootBranch">
   914 +
   914 +
   915 +        this.preferences.rootBranchInternal
   915 +        this.preferences.rootBranchInternal
   916 +            .addObserver(this.name, this.preferences, false);
   916 +            .addObserver(this.name, this.preferences, false);
   917 +        // In non-instant apply mode, we must try and use the last saved state
   917 +        // In non-instant apply mode, we must try and use the last saved state
   918 +        // from any previous opens of a child dialog instead of the value from
   918 +        // from any previous opens of a child dialog instead of the value from
   919 +        // preferences, to pick up any edits a user may have made. 
   919 +        // preferences, to pick up any edits a user may have made.
   920 +
   920 +
   921 +        var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
   921 +        var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
   922 +                    .getService(Components.interfaces.nsIScriptSecurityManager);
   922 +                    .getService(Components.interfaces.nsIScriptSecurityManager);
   923 +        if (this.preferences.type == "child" && 
   923 +        if (this.preferences.type == "child" &&
   924 +            !this.instantApply && window.opener &&
   924 +            !this.instantApply && window.opener &&
   925 +            secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) {
   925 +            secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) {
   926 +          var pdoc = window.opener.document;
   926 +          var pdoc = window.opener.document;
   927 +
   927 +
   928 +          // Try to find a preference element for the same preference.
   928 +          // Try to find a preference element for the same preference.
   959 +      <property name="preferences" onget="return this.parentNode"/>
   959 +      <property name="preferences" onget="return this.parentNode"/>
   960 +      <property name="name" onget="return this.getAttribute('name');">
   960 +      <property name="name" onget="return this.getAttribute('name');">
   961 +        <setter>
   961 +        <setter>
   962 +          if (val == this.name)
   962 +          if (val == this.name)
   963 +            return val;
   963 +            return val;
   964 +            
   964 +
   965 +          this.preferences.rootBranchInternal
   965 +          this.preferences.rootBranchInternal
   966 +              .removeObserver(this.name, this.preferences);
   966 +              .removeObserver(this.name, this.preferences);
   967 +          this.setAttribute('name', val);
   967 +          this.setAttribute('name', val);
   968 +          this.preferences.rootBranchInternal
   968 +          this.preferences.rootBranchInternal
   969 +              .addObserver(val, this.preferences, false);
   969 +              .addObserver(val, this.preferences, false);
   970 +              
   970 +
   971 +          return val;
   971 +          return val;
   972 +        </setter>
   972 +        </setter>
   973 +      </property>
   973 +      </property>
   974 +      <property name="type" onget="return this.getAttribute('type');"
   974 +      <property name="type" onget="return this.getAttribute('type');"
   975 +                            onset="this.setAttribute('type', val); return val;"/>
   975 +                            onset="this.setAttribute('type', val); return val;"/>
   992 +          return aValue;
   992 +          return aValue;
   993 +        ]]>
   993 +        ]]>
   994 +        </body>
   994 +        </body>
   995 +      </method>
   995 +      </method>
   996 +      <property name="value" onget="return this._value" onset="return this._setValue(val);"/>
   996 +      <property name="value" onget="return this._value" onset="return this._setValue(val);"/>
   997 +      
   997 +
   998 +      <property name="locked">
   998 +      <property name="locked">
   999 +        <getter>
   999 +        <getter>
  1000 +          return this.preferences.rootBranch.prefIsLocked(this.name);
  1000 +          return this.preferences.rootBranch.prefIsLocked(this.name);
  1001 +        </getter>
  1001 +        </getter>
  1002 +      </property>
  1002 +      </property>
  1003 +      
  1003 +
  1004 +      <property name="disabled">
  1004 +      <property name="disabled">
  1005 +        <getter>
  1005 +        <getter>
  1006 +          return this.getAttribute("disabled") == "true";
  1006 +          return this.getAttribute("disabled") == "true";
  1007 +        </getter>
  1007 +        </getter>
  1008 +        <setter>
  1008 +        <setter>
  1009 +        <![CDATA[
  1009 +        <![CDATA[
  1010 +          if (val) 
  1010 +          if (val)
  1011 +            this.setAttribute("disabled", "true");
  1011 +            this.setAttribute("disabled", "true");
  1012 +          else
  1012 +          else
  1013 +            this.removeAttribute("disabled");
  1013 +            this.removeAttribute("disabled");
  1014 +
  1014 +
  1015 +          if (!this.id)
  1015 +          if (!this.id)
  1016 +            return val;
  1016 +            return val;
  1017 +
  1017 +
  1018 +          var elements = document.getElementsByAttribute("preference", this.id);
  1018 +          var elements = document.getElementsByAttribute("preference", this.id);
  1019 +          for (var i = 0; i < elements.length; ++i) {
  1019 +          for (var i = 0; i < elements.length; ++i) {
  1020 +            elements[i].disabled = val;
  1020 +            elements[i].disabled = val;
  1021 +            
  1021 +
  1022 +            var labels = document.getElementsByAttribute("control", elements[i].id);
  1022 +            var labels = document.getElementsByAttribute("control", elements[i].id);
  1023 +            for (var j = 0; j < labels.length; ++j)
  1023 +            for (var j = 0; j < labels.length; ++j)
  1024 +              labels[j].disabled = val;
  1024 +              labels[j].disabled = val;
  1025 +          }
  1025 +          }
  1026 +            
  1026 +
  1027 +          return val;
  1027 +          return val;
  1028 +        ]]>
  1028 +        ]]>
  1029 +        </setter>
  1029 +        </setter>
  1030 +      </property>
  1030 +      </property>
  1031 +      
  1031 +
  1032 +      <property name="tabIndex">
  1032 +      <property name="tabIndex">
  1033 +        <getter>
  1033 +        <getter>
  1034 +          return parseInt(this.getAttribute("tabindex"));
  1034 +          return parseInt(this.getAttribute("tabindex"));
  1035 +        </getter>
  1035 +        </getter>
  1036 +        <setter>
  1036 +        <setter>
  1037 +        <![CDATA[
  1037 +        <![CDATA[
  1038 +          if (val) 
  1038 +          if (val)
  1039 +            this.setAttribute("tabindex", val);
  1039 +            this.setAttribute("tabindex", val);
  1040 +          else
  1040 +          else
  1041 +            this.removeAttribute("tabindex");
  1041 +            this.removeAttribute("tabindex");
  1042 +
  1042 +
  1043 +          if (!this.id)
  1043 +          if (!this.id)
  1044 +            return val;
  1044 +            return val;
  1045 +
  1045 +
  1046 +          var elements = document.getElementsByAttribute("preference", this.id);
  1046 +          var elements = document.getElementsByAttribute("preference", this.id);
  1047 +          for (var i = 0; i < elements.length; ++i) {
  1047 +          for (var i = 0; i < elements.length; ++i) {
  1048 +            elements[i].tabIndex = val;
  1048 +            elements[i].tabIndex = val;
  1049 +            
  1049 +
  1050 +            var labels = document.getElementsByAttribute("control", elements[i].id);
  1050 +            var labels = document.getElementsByAttribute("control", elements[i].id);
  1051 +            for (var j = 0; j < labels.length; ++j)
  1051 +            for (var j = 0; j < labels.length; ++j)
  1052 +              labels[j].tabIndex = val;
  1052 +              labels[j].tabIndex = val;
  1053 +          }
  1053 +          }
  1054 +            
  1054 +
  1055 +          return val;
  1055 +          return val;
  1056 +        ]]>
  1056 +        ]]>
  1057 +        </setter>
  1057 +        </setter>
  1058 +      </property>
  1058 +      </property>
  1059 +
  1059 +
  1063 +          return this.preferences.rootBranch.prefHasUserValue(this.name) &&
  1063 +          return this.preferences.rootBranch.prefHasUserValue(this.name) &&
  1064 +                 this.value !== undefined;
  1064 +                 this.value !== undefined;
  1065 +        ]]>
  1065 +        ]]>
  1066 +        </getter>
  1066 +        </getter>
  1067 +      </property>
  1067 +      </property>
  1068 +      
  1068 +
  1069 +      <method name="reset">
  1069 +      <method name="reset">
  1070 +        <body>
  1070 +        <body>
  1071 +          // defer reset until preference update
  1071 +          // defer reset until preference update
  1072 +          this.value = undefined;
  1072 +          this.value = undefined;
  1073 +        </body>
  1073 +        </body>
  1074 +      </method>
  1074 +      </method>
  1075 +
  1075 +
  1076 +      <field name="_useDefault">false</field>      
  1076 +      <field name="_useDefault">false</field>
  1077 +      <property name="defaultValue">
  1077 +      <property name="defaultValue">
  1078 +        <getter>
  1078 +        <getter>
  1079 +        <![CDATA[
  1079 +        <![CDATA[
  1080 +          this._useDefault = true;
  1080 +          this._useDefault = true;
  1081 +          var val = this.valueFromPreferences;
  1081 +          var val = this.valueFromPreferences;
  1082 +          this._useDefault = false;
  1082 +          this._useDefault = false;
  1083 +          return val;
  1083 +          return val;
  1084 +        ]]>
  1084 +        ]]>
  1085 +        </getter>
  1085 +        </getter>
  1086 +      </property>
  1086 +      </property>
  1087 +      
  1087 +
  1088 +      <property name="_branch">
  1088 +      <property name="_branch">
  1089 +        <getter>
  1089 +        <getter>
  1090 +          return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch;
  1090 +          return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch;
  1091 +        </getter>
  1091 +        </getter>
  1092 +      </property>
  1092 +      </property>
  1093 +      
  1093 +
  1094 +      <field name="batching">false</field>
  1094 +      <field name="batching">false</field>
  1095 +      
  1095 +
  1096 +      <method name="_reportUnknownType">
  1096 +      <method name="_reportUnknownType">
  1097 +        <body>
  1097 +        <body>
  1098 +        <![CDATA[
  1098 +        <![CDATA[
  1099 +          var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
  1099 +          var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
  1100 +                                         .getService(Components.interfaces.nsIConsoleService);
  1100 +                                         .getService(Components.interfaces.nsIConsoleService);
  1101 +          var msg = "<preference> with id='" + this.id + "' and name='" + 
  1101 +          var msg = "<preference> with id='" + this.id + "' and name='" +
  1102 +                    this.name + "' has unknown type '" + this.type + "'.";
  1102 +                    this.name + "' has unknown type '" + this.type + "'.";
  1103 +          consoleService.logStringMessage(msg);
  1103 +          consoleService.logStringMessage(msg);
  1104 +        ]]>
  1104 +        ]]>
  1105 +        </body>
  1105 +        </body>
  1106 +      </method>
  1106 +      </method>
  1107 +      
  1107 +
  1108 +      <property name="valueFromPreferences">
  1108 +      <property name="valueFromPreferences">
  1109 +        <getter>
  1109 +        <getter>
  1110 +        <![CDATA[
  1110 +        <![CDATA[
  1111 +          try {
  1111 +          try {
  1112 +            // Force a resync of value with preferences.
  1112 +            // Force a resync of value with preferences.
  1187 +                             .createInstance(Components.interfaces.nsILocalFile);
  1187 +                             .createInstance(Components.interfaces.nsILocalFile);
  1188 +              lf.persistentDescriptor = val;
  1188 +              lf.persistentDescriptor = val;
  1189 +              if (!lf.exists())
  1189 +              if (!lf.exists())
  1190 +                lf.initWithPath(val);
  1190 +                lf.initWithPath(val);
  1191 +            }
  1191 +            }
  1192 +            else 
  1192 +            else
  1193 +              lf = val.QueryInterface(Components.interfaces.nsILocalFile);
  1193 +              lf = val.QueryInterface(Components.interfaces.nsILocalFile);
  1194 +            this.preferences.rootBranch
  1194 +            this.preferences.rootBranch
  1195 +                .setComplexValue(this.name, Components.interfaces.nsILocalFile, lf);
  1195 +                .setComplexValue(this.name, Components.interfaces.nsILocalFile, lf);
  1196 +            break;
  1196 +            break;
  1197 +          default:
  1197 +          default:
  1201 +            this.preferences.service.savePrefFile(null);
  1201 +            this.preferences.service.savePrefFile(null);
  1202 +          return val;
  1202 +          return val;
  1203 +        ]]>
  1203 +        ]]>
  1204 +        </setter>
  1204 +        </setter>
  1205 +      </property>
  1205 +      </property>
  1206 +      
  1206 +
  1207 +      <method name="setElementValue">
  1207 +      <method name="setElementValue">
  1208 +        <parameter name="aElement"/>
  1208 +        <parameter name="aElement"/>
  1209 +        <body>
  1209 +        <body>
  1210 +        <![CDATA[
  1210 +        <![CDATA[
  1211 +          if (this.locked)
  1211 +          if (this.locked)
  1218 +          if (aElement.hasAttribute("onsyncfrompreference")) {
  1218 +          if (aElement.hasAttribute("onsyncfrompreference")) {
  1219 +            // Value changed, synthesize an event
  1219 +            // Value changed, synthesize an event
  1220 +            try {
  1220 +            try {
  1221 +              var event = document.createEvent("Events");
  1221 +              var event = document.createEvent("Events");
  1222 +              event.initEvent("syncfrompreference", true, true);
  1222 +              event.initEvent("syncfrompreference", true, true);
  1223 +              var f = new Function ("event", 
  1223 +              var f = new Function ("event",
  1224 +                                    aElement.getAttribute("onsyncfrompreference"));
  1224 +                                    aElement.getAttribute("onsyncfrompreference"));
  1225 +              rv = f.call(aElement, event);
  1225 +              rv = f.call(aElement, event);
  1226 +            }
  1226 +            }
  1227 +            catch (e) {
  1227 +            catch (e) {
  1228 +              Components.utils.reportError(e);
  1228 +              Components.utils.reportError(e);
  1229 +            }
  1229 +            }
  1230 +          }
  1230 +          }
  1231 +          var val = rv !== undefined ? rv : (this.instantApply ? this.valueFromPreferences : this.value);
  1231 +          var val = rv;
       
  1232 +          if (val === undefined)
       
  1233 +            val = this.instantApply ? this.valueFromPreferences : this.value;
  1232 +          // if the preference is marked for reset, show default value in UI
  1234 +          // if the preference is marked for reset, show default value in UI
  1233 +          if (val === undefined)
  1235 +          if (val === undefined)
  1234 +            val = this.defaultValue;
  1236 +            val = this.defaultValue;
  1235 +
  1237 +
  1236 +          /**
  1238 +          /**
  1237 +           * Initialize a UI element property with a value. Handles the case 
  1239 +           * Initialize a UI element property with a value. Handles the case
  1238 +           * where an element has not yet had a XBL binding attached for it and
  1240 +           * where an element has not yet had a XBL binding attached for it and
  1239 +           * the property setter does not yet exist by setting the same attribute
  1241 +           * the property setter does not yet exist by setting the same attribute
  1240 +           * on the XUL element using DOM apis and assuming the element's 
  1242 +           * on the XUL element using DOM apis and assuming the element's
  1241 +           * constructor or property getters appropriately handle this state. 
  1243 +           * constructor or property getters appropriately handle this state.
  1242 +           */
  1244 +           */
  1243 +          function setValue(element, attribute, value) {
  1245 +          function setValue(element, attribute, value) {
  1244 +            if (attribute in element) 
  1246 +            if (attribute in element)
  1245 +              element[attribute] = value;
  1247 +              element[attribute] = value;
  1246 +            else
  1248 +            else
  1247 +              element.setAttribute(attribute, value);
  1249 +              element.setAttribute(attribute, value);
  1248 +          }
  1250 +          }
  1249 +          if (aElement.localName == "checkbox" ||
  1251 +          if (aElement.localName == "checkbox" ||
  1271 +          if (aElement.hasAttribute("onsynctopreference")) {
  1273 +          if (aElement.hasAttribute("onsynctopreference")) {
  1272 +            // Value changed, synthesize an event
  1274 +            // Value changed, synthesize an event
  1273 +            try {
  1275 +            try {
  1274 +              var event = document.createEvent("Events");
  1276 +              var event = document.createEvent("Events");
  1275 +              event.initEvent("synctopreference", true, true);
  1277 +              event.initEvent("synctopreference", true, true);
  1276 +              var f = new Function ("event", 
  1278 +              var f = new Function ("event",
  1277 +                                    aElement.getAttribute("onsynctopreference"));
  1279 +                                    aElement.getAttribute("onsynctopreference"));
  1278 +              var rv = f.call(aElement, event);
  1280 +              var rv = f.call(aElement, event);
  1279 +              if (rv !== undefined) 
  1281 +              if (rv !== undefined)
  1280 +                return rv;
  1282 +                return rv;
  1281 +            }
  1283 +            }
  1282 +            catch (e) {
  1284 +            catch (e) {
  1283 +              Components.utils.reportError(e);
  1285 +              Components.utils.reportError(e);
  1284 +            }
  1286 +            }
  1285 +          }
  1287 +          }
  1286 +          
  1288 +
  1287 +          /**
  1289 +          /**
  1288 +           * Read the value of an attribute from an element, assuming the 
  1290 +           * Read the value of an attribute from an element, assuming the
  1289 +           * attribute is a property on the element's node API. If the property
  1291 +           * attribute is a property on the element's node API. If the property
  1290 +           * is not present in the API, then assume its value is contained in
  1292 +           * is not present in the API, then assume its value is contained in
  1291 +           * an attribute, as is the case before a binding has been attached.
  1293 +           * an attribute, as is the case before a binding has been attached.
  1292 +           */
  1294 +           */
  1293 +          function getValue(element, attribute) {
  1295 +          function getValue(element, attribute) {
  1311 +          }
  1313 +          }
  1312 +          return value;
  1314 +          return value;
  1313 +        ]]>
  1315 +        ]]>
  1314 +        </body>
  1316 +        </body>
  1315 +      </method>
  1317 +      </method>
  1316 +      
  1318 +
  1317 +      <method name="isElementEditable">
  1319 +      <method name="isElementEditable">
  1318 +        <parameter name="aElement"/>
  1320 +        <parameter name="aElement"/>
  1319 +        <body>
  1321 +        <body>
  1320 +        <![CDATA[
  1322 +        <![CDATA[
  1321 +          switch (aElement.localName) {
  1323 +          switch (aElement.localName) {
  1327 +          case "listbox":
  1329 +          case "listbox":
  1328 +          case "menulist":
  1330 +          case "menulist":
  1329 +            return true;
  1331 +            return true;
  1330 +          }
  1332 +          }
  1331 +          return aElement.getAttribute("preference-editable") == "true";
  1333 +          return aElement.getAttribute("preference-editable") == "true";
  1332 +        ]]> 
  1334 +        ]]>
  1333 +        </body>
  1335 +        </body>
  1334 +      </method>
  1336 +      </method>
  1335 +      
  1337 +
  1336 +      <method name="updateElements">
  1338 +      <method name="updateElements">
  1337 +        <body>
  1339 +        <body>
  1338 +        <![CDATA[
  1340 +        <![CDATA[
  1339 +          if (!this.id)
  1341 +          if (!this.id)
  1340 +            return;
  1342 +            return;
  1341 +
  1343 +
  1342 +          // This "change" event handler tracks changes made to preferences by 
  1344 +          // This "change" event handler tracks changes made to preferences by
  1343 +          // sources other than the user in this window. 
  1345 +          // sources other than the user in this window.
  1344 +          var elements = document.getElementsByAttribute("preference", this.id);
  1346 +          var elements = document.getElementsByAttribute("preference", this.id);
  1345 +          for (var i = 0; i < elements.length; ++i) 
  1347 +          for (var i = 0; i < elements.length; ++i)
  1346 +            this.setElementValue(elements[i]);
  1348 +            this.setElementValue(elements[i]);
  1347 +        ]]>
  1349 +        ]]>
  1348 +        </body>
  1350 +        </body>
  1349 +      </method>
  1351 +      </method>
  1350 +    </implementation>
  1352 +    </implementation>
  1351 +    
  1353 +
  1352 +    <handlers>
  1354 +    <handlers>
  1353 +      <handler event="change">
  1355 +      <handler event="change">
  1354 +        this.updateElements();
  1356 +        this.updateElements();
  1355 +      </handler>
  1357 +      </handler>
  1356 +    </handlers>
  1358 +    </handlers>
  1421 +                Components.utils.import("resource://gre/modules/AppConstants.jsm", {});
  1423 +                Components.utils.import("resource://gre/modules/AppConstants.jsm", {});
  1422 +            if (AppConstants.platform == "macosx") {
  1424 +            if (AppConstants.platform == "macosx") {
  1423 +              // no buttons on Mac except Help
  1425 +              // no buttons on Mac except Help
  1424 +              cancelButton.hidden = true;
  1426 +              cancelButton.hidden = true;
  1425 +              // Move Help button to the end
  1427 +              // Move Help button to the end
  1426 +              document.getAnonymousElementByAttribute(this, "anonid", "spacer").hidden = true;         
  1428 +              document.getAnonymousElementByAttribute(this, "anonid", "spacer").hidden = true;
  1427 +              // Also, don't fire onDialogAccept on enter
  1429 +              // Also, don't fire onDialogAccept on enter
  1428 +              acceptButton.disabled = true;
  1430 +              acceptButton.disabled = true;
  1429 +            } else {
  1431 +            } else {
  1430 +              // morph the Cancel button into the Close button
  1432 +              // morph the Cancel button into the Close button
  1431 +              cancelButton.setAttribute ("icon", "close");
  1433 +              cancelButton.setAttribute ("icon", "close");
  1498 +                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'paneDeck');"/>
  1500 +                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'paneDeck');"/>
  1499 +      <property name="_paneDeckContainer"
  1501 +      <property name="_paneDeckContainer"
  1500 +                onget="return document.getAnonymousElementByAttribute(this, 'class', 'paneDeckContainer');"/>
  1502 +                onget="return document.getAnonymousElementByAttribute(this, 'class', 'paneDeckContainer');"/>
  1501 +      <property name="_selector"
  1503 +      <property name="_selector"
  1502 +                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'selector');"/>
  1504 +                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'selector');"/>
  1503 +      <property name="lastSelected" 
  1505 +      <property name="lastSelected"
  1504 +                onget="return this.getAttribute('lastSelected');">
  1506 +                onget="return this.getAttribute('lastSelected');">
  1505 +        <setter>
  1507 +        <setter>
  1506 +          this.setAttribute("lastSelected", val); 
  1508 +          this.setAttribute("lastSelected", val);
  1507 +          document.persist(this.id, "lastSelected");
  1509 +          document.persist(this.id, "lastSelected");
  1508 +          return val;
  1510 +          return val;
  1509 +        </setter>          
  1511 +        </setter>
  1510 +      </property>
  1512 +      </property>
  1511 +      <property name="currentPane"
  1513 +      <property name="currentPane"
  1512 +                onset="return this._currentPane = val;">
  1514 +                onset="return this._currentPane = val;">
  1513 +        <getter>
  1515 +        <getter>
  1514 +          if (!this._currentPane)
  1516 +          if (!this._currentPane)
  1515 +            this._currentPane = this.preferencePanes[0];
  1517 +            this._currentPane = this.preferencePanes[0];
  1516 +          
  1518 +
  1517 +          return this._currentPane;
  1519 +          return this._currentPane;
  1518 +        </getter> 
  1520 +        </getter>
  1519 +      </property>
  1521 +      </property>
  1520 +      <field name="_currentPane">null</field>
  1522 +      <field name="_currentPane">null</field>
  1521 +      
  1523 +
  1522 +      
  1524 +
  1523 +      <method name="_makePaneButton">
  1525 +      <method name="_makePaneButton">
  1524 +        <parameter name="aPaneElement"/>
  1526 +        <parameter name="aPaneElement"/>
  1525 +        <body>
  1527 +        <body>
  1526 +        <![CDATA[
  1528 +        <![CDATA[
  1527 +          var radio = document.createElement("radio");
  1529 +          var radio = document.createElement("radio");
  1549 +          if (!aPaneElement.loaded) {
  1551 +          if (!aPaneElement.loaded) {
  1550 +            let OverlayLoadObserver = function(aPane)
  1552 +            let OverlayLoadObserver = function(aPane)
  1551 +            {
  1553 +            {
  1552 +              this._pane = aPane;
  1554 +              this._pane = aPane;
  1553 +            }
  1555 +            }
  1554 +            OverlayLoadObserver.prototype = { 
  1556 +            OverlayLoadObserver.prototype = {
  1555 +              _outer: this,
  1557 +              _outer: this,
  1556 +              observe: function (aSubject, aTopic, aData) 
  1558 +              observe: function (aSubject, aTopic, aData)
  1557 +              {
  1559 +              {
  1558 +                this._pane.loaded = true;
  1560 +                this._pane.loaded = true;
  1559 +                this._outer._fireEvent("paneload", this._pane);
  1561 +                this._outer._fireEvent("paneload", this._pane);
  1560 +                this._outer._selectPane(this._pane);
  1562 +                this._outer._selectPane(this._pane);
  1561 +              }
  1563 +              }
  1562 +            };
  1564 +            };
  1563 +            
  1565 +
  1564 +            var obs = new OverlayLoadObserver(aPaneElement);
  1566 +            var obs = new OverlayLoadObserver(aPaneElement);
  1565 +            document.loadOverlay(aPaneElement.src, obs);
  1567 +            document.loadOverlay(aPaneElement.src, obs);
  1566 +          }
  1568 +          }
  1567 +          else
  1569 +          else
  1568 +            this._selectPane(aPaneElement);
  1570 +            this._selectPane(aPaneElement);
  1569 +        ]]>
  1571 +        ]]>
  1570 +        </body>
  1572 +        </body>
  1571 +      </method>
  1573 +      </method>
  1572 +      
  1574 +
  1573 +      <method name="_fireEvent">
  1575 +      <method name="_fireEvent">
  1574 +        <parameter name="aEventName"/>
  1576 +        <parameter name="aEventName"/>
  1575 +        <parameter name="aTarget"/>
  1577 +        <parameter name="aTarget"/>
  1576 +        <body>
  1578 +        <body>
  1577 +        <![CDATA[
  1579 +        <![CDATA[
  1578 +          // Panel loaded, synthesize a load event. 
  1580 +          // Panel loaded, synthesize a load event.
  1579 +          try {
  1581 +          try {
  1580 +            var event = document.createEvent("Events");
  1582 +            var event = document.createEvent("Events");
  1581 +            event.initEvent(aEventName, true, true);
  1583 +            event.initEvent(aEventName, true, true);
  1582 +            var cancel = !aTarget.dispatchEvent(event);
  1584 +            var cancel = !aTarget.dispatchEvent(event);
  1583 +            if (aTarget.hasAttribute("on" + aEventName)) {
  1585 +            if (aTarget.hasAttribute("on" + aEventName)) {
  1584 +              var fn = new Function ("event", aTarget.getAttribute("on" + aEventName));
  1586 +              var fn = new Function ("event", aTarget.getAttribute("on" + aEventName));
  1585 +              var rv = fn.call(aTarget, event);
  1587 +              var rv = fn.call(aTarget, event);
  1586 +              if (rv == false)
  1588 +              if (rv == false)
  1587 +                cancel = true;
  1589 +                cancel = true;
  1588 +            }
  1590 +            }
  1589 +            return !cancel;  
  1591 +            return !cancel;
  1590 +          }
  1592 +          }
  1591 +          catch (e) { 
  1593 +          catch (e) {
  1592 +            Components.utils.reportError(e);
  1594 +            Components.utils.reportError(e);
  1593 +          }
  1595 +          }
  1594 +          return false;
  1596 +          return false;
  1595 +        ]]>
  1597 +        ]]>
  1596 +        </body>
  1598 +        </body>
  1597 +      </method>
  1599 +      </method>
  1598 +      
  1600 +
  1599 +      <field name="_initialized">false</field>
  1601 +      <field name="_initialized">false</field>
  1600 +      <method name="_selectPane">
  1602 +      <method name="_selectPane">
  1601 +        <parameter name="aPaneElement"/>
  1603 +        <parameter name="aPaneElement"/>
  1602 +        <body>
  1604 +        <body>
  1603 +        <![CDATA[
  1605 +        <![CDATA[
  1612 +          if (aPaneElement.helpTopic)
  1614 +          if (aPaneElement.helpTopic)
  1613 +            helpButton.hidden = false;
  1615 +            helpButton.hidden = false;
  1614 +          else
  1616 +          else
  1615 +            helpButton.hidden = true;
  1617 +            helpButton.hidden = true;
  1616 +
  1618 +
  1617 +          // Find this pane's index in the deck and set the deck's 
  1619 +          // Find this pane's index in the deck and set the deck's
  1618 +          // selectedIndex to that value to switch to it.
  1620 +          // selectedIndex to that value to switch to it.
  1619 +          var prefpanes = this.preferencePanes;
  1621 +          var prefpanes = this.preferencePanes;
  1620 +          for (var i = 0; i < prefpanes.length; ++i) {
  1622 +          for (var i = 0; i < prefpanes.length; ++i) {
  1621 +            if (prefpanes[i] == aPaneElement) {
  1623 +            if (prefpanes[i] == aPaneElement) {
  1622 +              this._paneDeck.selectedIndex = i;
  1624 +              this._paneDeck.selectedIndex = i;
  1623 +              
  1625 +
  1624 +              if (this.type != "child") {
  1626 +              if (this.type != "child") {
  1625 +                if (aPaneElement.hasAttribute("flex") && this._shouldAnimate &&
  1627 +                if (aPaneElement.hasAttribute("flex") && this._shouldAnimate &&
  1626 +                    prefpanes.length > 1)
  1628 +                    prefpanes.length > 1)
  1627 +                  aPaneElement.removeAttribute("flex");
  1629 +                  aPaneElement.removeAttribute("flex");
  1628 +                // Calling sizeToContent after the first prefpane is loaded
  1630 +                // Calling sizeToContent after the first prefpane is loaded
  1671 +            }
  1673 +            }
  1672 +          }
  1674 +          }
  1673 +        ]]>
  1675 +        ]]>
  1674 +        </body>
  1676 +        </body>
  1675 +      </method>
  1677 +      </method>
  1676 +      
  1678 +
  1677 +      <property name="_shouldAnimate">
  1679 +      <property name="_shouldAnimate">
  1678 +        <getter>
  1680 +        <getter>
  1679 +        <![CDATA[
  1681 +        <![CDATA[
  1680 +          let { AppConstants } =
  1682 +          let { AppConstants } =
  1681 +              Components.utils.import("resource://gre/modules/AppConstants.jsm", {});
  1683 +              Components.utils.import("resource://gre/modules/AppConstants.jsm", {});
  1688 +          catch (e) { }
  1690 +          catch (e) { }
  1689 +          return animate;
  1691 +          return animate;
  1690 +        ]]>
  1692 +        ]]>
  1691 +        </getter>
  1693 +        </getter>
  1692 +      </property>
  1694 +      </property>
  1693 +      
  1695 +
  1694 +      <method name="animate">
  1696 +      <method name="animate">
  1695 +        <parameter name="aOldPane"/>
  1697 +        <parameter name="aOldPane"/>
  1696 +        <parameter name="aNewPane"/>
  1698 +        <parameter name="aNewPane"/>
  1697 +        <body>
  1699 +        <body>
  1698 +        <![CDATA[
  1700 +        <![CDATA[
  1699 +          // if we are already resizing, use currentHeight
  1701 +          // if we are already resizing, use currentHeight
  1700 +          var oldHeight = this._currentHeight ? this._currentHeight : aOldPane.contentHeight;
  1702 +          var oldHeight = this._currentHeight ? this._currentHeight : aOldPane.contentHeight;
  1701 +          
  1703 +
  1702 +          this._multiplier = aNewPane.contentHeight > oldHeight ? 1 : -1;
  1704 +          this._multiplier = aNewPane.contentHeight > oldHeight ? 1 : -1;
  1703 +          var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight);
  1705 +          var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight);
  1704 +          this._animateRemainder = sizeDelta % this._animateIncrement;
  1706 +          this._animateRemainder = sizeDelta % this._animateIncrement;
  1705 +
  1707 +
  1706 +          this._setUpAnimationTimer(oldHeight);
  1708 +          this._setUpAnimationTimer(oldHeight);
  1707 +        ]]>
  1709 +        ]]>
  1708 +        </body>
  1710 +        </body>
  1709 +      </method>
  1711 +      </method>
  1710 +      
  1712 +
  1711 +      <property name="_sizeIncrement">
  1713 +      <property name="_sizeIncrement">
  1712 +        <getter>
  1714 +        <getter>
  1713 +        <![CDATA[
  1715 +        <![CDATA[
  1714 +          var lastSelectedPane = document.getElementById(this.lastSelected);
  1716 +          var lastSelectedPane = document.getElementById(this.lastSelected);
  1715 +          var increment = this._animateIncrement * this._multiplier;
  1717 +          var increment = this._animateIncrement * this._multiplier;
  1716 +          var newHeight = this._currentHeight + increment;
  1718 +          var newHeight = this._currentHeight + increment;
  1717 +          if ((this._multiplier > 0 && this._currentHeight >= lastSelectedPane.contentHeight) ||
  1719 +          if ((this._multiplier > 0 && this._currentHeight >= lastSelectedPane.contentHeight) ||
  1718 +              (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight))
  1720 +              (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight))
  1719 +            return 0;
  1721 +            return 0;
  1720 +          
  1722 +
  1721 +          if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) ||
  1723 +          if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) ||
  1722 +              (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight))
  1724 +              (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight))
  1723 +            increment = this._animateRemainder * this._multiplier;
  1725 +            increment = this._animateRemainder * this._multiplier;
  1724 +          return increment;
  1726 +          return increment;
  1725 +        ]]>
  1727 +        ]]>
  1726 +        </getter>
  1728 +        </getter>
  1727 +      </property>
  1729 +      </property>
  1728 +      
  1730 +
  1729 +      <method name="notify">
  1731 +      <method name="notify">
  1730 +        <parameter name="aTimer"/>
  1732 +        <parameter name="aTimer"/>
  1731 +        <body>
  1733 +        <body>
  1732 +        <![CDATA[
  1734 +        <![CDATA[
  1733 +          if (!document)
  1735 +          if (!document)
  1734 +            aTimer.cancel();
  1736 +            aTimer.cancel();
  1735 +          
  1737 +
  1736 +          if (aTimer == this._animateTimer) {
  1738 +          if (aTimer == this._animateTimer) {
  1737 +            var increment = this._sizeIncrement;
  1739 +            var increment = this._sizeIncrement;
  1738 +            if (increment != 0) {
  1740 +            if (increment != 0) {
  1739 +              window.innerHeight += increment;
  1741 +              window.innerHeight += increment;
  1740 +              this._currentHeight += increment;
  1742 +              this._currentHeight += increment;
  1754 +            }
  1756 +            }
  1755 +          }
  1757 +          }
  1756 +        ]]>
  1758 +        ]]>
  1757 +        </body>
  1759 +        </body>
  1758 +      </method>
  1760 +      </method>
  1759 +      
  1761 +
  1760 +      <method name="_setUpAnimationTimer">
  1762 +      <method name="_setUpAnimationTimer">
  1761 +        <parameter name="aStartHeight"/>
  1763 +        <parameter name="aStartHeight"/>
  1762 +        <body>
  1764 +        <body>
  1763 +        <![CDATA[
  1765 +        <![CDATA[
  1764 +          if (!this._animateTimer) 
  1766 +          if (!this._animateTimer)
  1765 +            this._animateTimer = Components.classes["@mozilla.org/timer;1"]
  1767 +            this._animateTimer = Components.classes["@mozilla.org/timer;1"]
  1766 +                                           .createInstance(Components.interfaces.nsITimer);
  1768 +                                           .createInstance(Components.interfaces.nsITimer);
  1767 +          else
  1769 +          else
  1768 +            this._animateTimer.cancel();
  1770 +            this._animateTimer.cancel();
  1769 +          this._currentHeight = aStartHeight;
  1771 +          this._currentHeight = aStartHeight;
  1770 +          
  1772 +
  1771 +          this._animateTimer.initWithCallback(this, this._animateDelay, 
  1773 +          this._animateTimer.initWithCallback(this, this._animateDelay,
  1772 +                                              Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
  1774 +                                              Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
  1773 +        ]]>
  1775 +        ]]>
  1774 +        </body>
  1776 +        </body>
  1775 +      </method>
  1777 +      </method>
  1776 +      
  1778 +
  1777 +      <method name="_setUpFadeTimer">
  1779 +      <method name="_setUpFadeTimer">
  1778 +        <body>
  1780 +        <body>
  1779 +        <![CDATA[
  1781 +        <![CDATA[
  1780 +          if (!this._fadeTimer) 
  1782 +          if (!this._fadeTimer)
  1781 +            this._fadeTimer = Components.classes["@mozilla.org/timer;1"]
  1783 +            this._fadeTimer = Components.classes["@mozilla.org/timer;1"]
  1782 +                                        .createInstance(Components.interfaces.nsITimer);
  1784 +                                        .createInstance(Components.interfaces.nsITimer);
  1783 +          else
  1785 +          else
  1784 +            this._fadeTimer.cancel();
  1786 +            this._fadeTimer.cancel();
  1785 +          
  1787 +
  1786 +          this._fadeTimer.initWithCallback(this, this._fadeDelay, 
  1788 +          this._fadeTimer.initWithCallback(this, this._fadeDelay,
  1787 +                                           Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
  1789 +                                           Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
  1788 +        ]]>
  1790 +        ]]>
  1789 +        </body>
  1791 +        </body>
  1790 +      </method>
  1792 +      </method>
  1791 +      
  1793 +
  1792 +      <field name="_animateTimer">null</field>
  1794 +      <field name="_animateTimer">null</field>
  1793 +      <field name="_fadeTimer">null</field>
  1795 +      <field name="_fadeTimer">null</field>
  1794 +      <field name="_animateDelay">15</field>
  1796 +      <field name="_animateDelay">15</field>
  1795 +      <field name="_animateIncrement">40</field>
  1797 +      <field name="_animateIncrement">40</field>
  1796 +      <field name="_fadeDelay">5</field>
  1798 +      <field name="_fadeDelay">5</field>
  1802 +      <method name="addPane">
  1804 +      <method name="addPane">
  1803 +        <parameter name="aPaneElement"/>
  1805 +        <parameter name="aPaneElement"/>
  1804 +        <body>
  1806 +        <body>
  1805 +        <![CDATA[
  1807 +        <![CDATA[
  1806 +          this.appendChild(aPaneElement);
  1808 +          this.appendChild(aPaneElement);
  1807 +          
  1809 +
  1808 +          // Set up pane button
  1810 +          // Set up pane button
  1809 +          this._makePaneButton(aPaneElement);
  1811 +          this._makePaneButton(aPaneElement);
  1810 +        ]]>
  1812 +        ]]>
  1811 +        </body>
  1813 +        </body>
  1812 +      </method>
  1814 +      </method>
  1813 +      
  1815 +
  1814 +      <method name="openSubDialog">
  1816 +      <method name="openSubDialog">
  1815 +        <parameter name="aURL"/>
  1817 +        <parameter name="aURL"/>
  1816 +        <parameter name="aFeatures"/>
  1818 +        <parameter name="aFeatures"/>
  1817 +        <parameter name="aParams"/>
  1819 +        <parameter name="aParams"/>
  1818 +        <body>
  1820 +        <body>
  1819 +          return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams);
  1821 +          return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams);
  1820 +        </body>
  1822 +        </body>
  1821 +      </method>
  1823 +      </method>
  1822 +      
  1824 +
  1823 +      <method name="openWindow">
  1825 +      <method name="openWindow">
  1824 +        <parameter name="aWindowType"/>
  1826 +        <parameter name="aWindowType"/>
  1825 +        <parameter name="aURL"/>
  1827 +        <parameter name="aURL"/>
  1826 +        <parameter name="aFeatures"/>
  1828 +        <parameter name="aFeatures"/>
  1827 +        <parameter name="aParams"/>
  1829 +        <parameter name="aParams"/>
  1854 +
  1856 +
  1855 +        var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
  1857 +        var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
  1856 +                    .getService(Components.interfaces.nsIScriptSecurityManager);
  1858 +                    .getService(Components.interfaces.nsIScriptSecurityManager);
  1857 +        if (this.type == "child" && window.opener &&
  1859 +        if (this.type == "child" && window.opener &&
  1858 +            secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) {
  1860 +            secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) {
  1859 +          var psvc = Components.classes["@mozilla.org/preferences-service;1"]
  1861 +          let psvc = Components.classes["@mozilla.org/preferences-service;1"]
  1860 +                               .getService(Components.interfaces.nsIPrefBranch);
  1862 +                               .getService(Components.interfaces.nsIPrefBranch);
  1861 +          var pdocEl = window.opener.document.documentElement;
  1863 +          var pdocEl = window.opener.document.documentElement;
  1862 +          if (pdocEl.instantApply) {
  1864 +          if (pdocEl.instantApply) {
  1863 +            var panes = this.preferencePanes;
  1865 +            let panes = this.preferencePanes;
  1864 +            for (var i = 0; i < panes.length; ++i)
  1866 +            for (let i = 0; i < panes.length; ++i)
  1865 +              panes[i].writePreferences(true);
  1867 +              panes[i].writePreferences(true);
  1866 +          }
  1868 +          }
  1867 +          else {
  1869 +          else {
  1868 +            // Clone all the preferences elements from the child document and
  1870 +            // Clone all the preferences elements from the child document and
  1869 +            // insert them into the pane collection of the parent. 
  1871 +            // insert them into the pane collection of the parent.
  1870 +            var pdoc = window.opener.document;
  1872 +            var pdoc = window.opener.document;
  1871 +            if (pdoc.documentElement.localName == "prefwindow") {
  1873 +            if (pdoc.documentElement.localName == "prefwindow") {
  1872 +              var currentPane = pdoc.documentElement.currentPane;
  1874 +              var currentPane = pdoc.documentElement.currentPane;
  1873 +              var id = window.location.href + "#childprefs";
  1875 +              var id = window.location.href + "#childprefs";
  1874 +              var childPrefs = pdoc.getElementById(id);
  1876 +              var childPrefs = pdoc.getElementById(id);
  1875 +              if (!childPrefs) {
  1877 +              if (!childPrefs) {
  1876 +                var childPrefs = pdoc.createElement("preferences");
  1878 +                childPrefs = pdoc.createElement("preferences");
  1877 +                currentPane.appendChild(childPrefs);
  1879 +                currentPane.appendChild(childPrefs);
  1878 +                childPrefs.id = id;
  1880 +                childPrefs.id = id;
  1879 +              }
  1881 +              }
  1880 +              var panes = this.preferencePanes;
  1882 +              let panes = this.preferencePanes;
  1881 +              for (var i = 0; i < panes.length; ++i) {
  1883 +              for (let i = 0; i < panes.length; ++i) {
  1882 +                var preferences = panes[i].preferences;
  1884 +                var preferences = panes[i].preferences;
  1883 +                for (var j = 0; j < preferences.length; ++j) {
  1885 +                for (var j = 0; j < preferences.length; ++j) {
  1884 +                  // Try to find a preference element for the same preference.
  1886 +                  // Try to find a preference element for the same preference.
  1885 +                  var preference = null;
  1887 +                  var preference = null;
  1886 +                  var parentPreferences = pdoc.getElementsByTagName("preferences");
  1888 +                  var parentPreferences = pdoc.getElementsByTagName("preferences");
  1907 +              }
  1909 +              }
  1908 +            }
  1910 +            }
  1909 +          }
  1911 +          }
  1910 +        }
  1912 +        }
  1911 +        else {
  1913 +        else {
  1912 +          var panes = this.preferencePanes;
  1914 +          let panes = this.preferencePanes;
  1913 +          for (var i = 0; i < panes.length; ++i)
  1915 +          for (var i = 0; i < panes.length; ++i)
  1914 +            panes[i].writePreferences(false);
  1916 +            panes[i].writePreferences(false);
  1915 +
  1917 +
  1916 +          var psvc = Components.classes["@mozilla.org/preferences-service;1"]
  1918 +          let psvc = Components.classes["@mozilla.org/preferences-service;1"]
  1917 +                               .getService(Components.interfaces.nsIPrefService);
  1919 +                               .getService(Components.interfaces.nsIPrefService);
  1918 +          psvc.savePrefFile(null);
  1920 +          psvc.savePrefFile(null);
  1919 +        }
  1921 +        }
  1920 +
  1922 +
  1921 +        return true;
  1923 +        return true;
  1953 +        event.preventDefault();
  1955 +        event.preventDefault();
  1954 +      ]]>
  1956 +      ]]>
  1955 +      </handler>
  1957 +      </handler>
  1956 +    </handlers>
  1958 +    </handlers>
  1957 +  </binding>
  1959 +  </binding>
  1958 +  
  1960 +
  1959 +  <binding id="prefpane">
  1961 +  <binding id="prefpane">
  1960 +    <resources>
  1962 +    <resources>
  1961 +      <stylesheet src="chrome://global/skin/preferences.css"/>
  1963 +      <stylesheet src="chrome://global/skin/preferences.css"/>
  1962 +    </resources>
  1964 +    </resources>
  1963 +    <content>
  1965 +    <content>
  1988 +            psvc.savePrefFile(null);
  1990 +            psvc.savePrefFile(null);
  1989 +          }
  1991 +          }
  1990 +        ]]>
  1992 +        ]]>
  1991 +        </body>
  1993 +        </body>
  1992 +      </method>
  1994 +      </method>
  1993 +      
  1995 +
  1994 +      <property name="src" 
  1996 +      <property name="src"
  1995 +                onget="return this.getAttribute('src');"
  1997 +                onget="return this.getAttribute('src');"
  1996 +                onset="this.setAttribute('src', val); return val;"/>
  1998 +                onset="this.setAttribute('src', val); return val;"/>
  1997 +      <property name="selected" 
  1999 +      <property name="selected"
  1998 +                onget="return this.getAttribute('selected') == 'true';"
  2000 +                onget="return this.getAttribute('selected') == 'true';"
  1999 +                onset="this.setAttribute('selected', val); return val;"/>
  2001 +                onset="this.setAttribute('selected', val); return val;"/>
  2000 +      <property name="image" 
  2002 +      <property name="image"
  2001 +                onget="return this.getAttribute('image');"
  2003 +                onget="return this.getAttribute('image');"
  2002 +                onset="this.setAttribute('image', val); return val;"/>
  2004 +                onset="this.setAttribute('image', val); return val;"/>
  2003 +      <property name="label" 
  2005 +      <property name="label"
  2004 +                onget="return this.getAttribute('label');"
  2006 +                onget="return this.getAttribute('label');"
  2005 +                onset="this.setAttribute('label', val); return val;"/>
  2007 +                onset="this.setAttribute('label', val); return val;"/>
  2006 +      
  2008 +
  2007 +      <property name="preferenceElements"
  2009 +      <property name="preferenceElements"
  2008 +                onget="return this.getElementsByAttribute('preference', '*');"/>
  2010 +                onget="return this.getElementsByAttribute('preference', '*');"/>
  2009 +      <property name="preferences"
  2011 +      <property name="preferences"
  2010 +                onget="return this.getElementsByTagName('preference');"/>
  2012 +                onget="return this.getElementsByTagName('preference');"/>
  2011 +
  2013 +
  2025 +        ]]>
  2027 +        ]]>
  2026 +        </getter>
  2028 +        </getter>
  2027 +      </property>
  2029 +      </property>
  2028 +
  2030 +
  2029 +      <field name="_loaded">false</field>
  2031 +      <field name="_loaded">false</field>
  2030 +      <property name="loaded" 
  2032 +      <property name="loaded"
  2031 +                onget="return !this.src ? true : this._loaded;"
  2033 +                onget="return !this.src ? true : this._loaded;"
  2032 +                onset="this._loaded = val; return val;"/>
  2034 +                onset="this._loaded = val; return val;"/>
  2033 +      
  2035 +
  2034 +      <method name="preferenceForElement">
  2036 +      <method name="preferenceForElement">
  2035 +        <parameter name="aElement"/>
  2037 +        <parameter name="aElement"/>
  2036 +        <body>
  2038 +        <body>
  2037 +          return document.getElementById(aElement.getAttribute("preference"));
  2039 +          return document.getElementById(aElement.getAttribute("preference"));
  2038 +        </body>
  2040 +        </body>
  2039 +      </method>
  2041 +      </method>
  2040 +      
  2042 +
  2041 +      <method name="getPreferenceElement">
  2043 +      <method name="getPreferenceElement">
  2042 +        <parameter name="aStartElement"/>
  2044 +        <parameter name="aStartElement"/>
  2043 +        <body>
  2045 +        <body>
  2044 +        <![CDATA[
  2046 +        <![CDATA[
  2045 +          var temp = aStartElement;
  2047 +          var temp = aStartElement;
  2046 +          while (temp && temp.nodeType == Node.ELEMENT_NODE && 
  2048 +          while (temp && temp.nodeType == Node.ELEMENT_NODE &&
  2047 +                 !temp.hasAttribute("preference"))
  2049 +                 !temp.hasAttribute("preference"))
  2048 +            temp = temp.parentNode;
  2050 +            temp = temp.parentNode;
  2049 +          return temp.nodeType == Node.ELEMENT_NODE ? temp : aStartElement;
  2051 +          return temp.nodeType == Node.ELEMENT_NODE ? temp : aStartElement;
  2050 +        ]]>
  2052 +        ]]>
  2051 +        </body>
  2053 +        </body>
  2052 +      </method>
  2054 +      </method>
  2053 +      
  2055 +
  2054 +      <field name="DeferredTask" readonly="true">
  2056 +      <field name="DeferredTask" readonly="true">
  2055 +        let targetObj = {};
  2057 +        let targetObj = {};
  2056 +        Components.utils.import("resource://gre/modules/DeferredTask.jsm", targetObj);
  2058 +        Components.utils.import("resource://gre/modules/DeferredTask.jsm", targetObj);
  2057 +        targetObj.DeferredTask;
  2059 +        targetObj.DeferredTask;
  2058 +      </field>
  2060 +      </field>
  2104 +            }
  2106 +            }
  2105 +          }
  2107 +          }
  2106 +        ]]>
  2108 +        ]]>
  2107 +        </body>
  2109 +        </body>
  2108 +      </method>
  2110 +      </method>
  2109 +      
  2111 +
  2110 +      <property name="contentHeight">
  2112 +      <property name="contentHeight">
  2111 +        <getter>
  2113 +        <getter>
  2112 +          var targetHeight = parseInt(window.getComputedStyle(this._content, "").height);
  2114 +          var targetHeight = parseInt(window.getComputedStyle(this._content, "").height);
  2113 +          targetHeight += parseInt(window.getComputedStyle(this._content, "").marginTop);
  2115 +          targetHeight += parseInt(window.getComputedStyle(this._content, "").marginTop);
  2114 +          targetHeight += parseInt(window.getComputedStyle(this._content, "").marginBottom);
  2116 +          targetHeight += parseInt(window.getComputedStyle(this._content, "").marginBottom);
  2119 +        document.getAnonymousElementByAttribute(this, "class", "content-box");
  2121 +        document.getAnonymousElementByAttribute(this, "class", "content-box");
  2120 +      </field>
  2122 +      </field>
  2121 +    </implementation>
  2123 +    </implementation>
  2122 +    <handlers>
  2124 +    <handlers>
  2123 +      <handler event="command">
  2125 +      <handler event="command">
  2124 +        // This "command" event handler tracks changes made to preferences by 
  2126 +        // This "command" event handler tracks changes made to preferences by
  2125 +        // the user in this window.
  2127 +        // the user in this window.
  2126 +        if (event.sourceEvent)
  2128 +        if (event.sourceEvent)
  2127 +          event = event.sourceEvent;
  2129 +          event = event.sourceEvent;
  2128 +        this.userChangedValue(event.target);
  2130 +        this.userChangedValue(event.target);
  2129 +      </handler>
  2131 +      </handler>
  2130 +      <handler event="select">
  2132 +      <handler event="select">
  2131 +        // This "select" event handler tracks changes made to colorpicker 
  2133 +        // This "select" event handler tracks changes made to colorpicker
  2132 +        // preferences by the user in this window.
  2134 +        // preferences by the user in this window.
  2133 +        if (event.target.localName == "colorpicker") 
  2135 +        if (event.target.localName == "colorpicker")
  2134 +          this.userChangedValue(event.target);
  2136 +          this.userChangedValue(event.target);
  2135 +      </handler>
  2137 +      </handler>
  2136 +      <handler event="change">
  2138 +      <handler event="change">
  2137 +        // This "change" event handler tracks changes made to preferences by 
  2139 +        // This "change" event handler tracks changes made to preferences by
  2138 +        // the user in this window. 
  2140 +        // the user in this window.
  2139 +        this.userChangedValue(event.target);
  2141 +        this.userChangedValue(event.target);
  2140 +      </handler>
  2142 +      </handler>
  2141 +      <handler event="input">
  2143 +      <handler event="input">
  2142 +        // This "input" event handler tracks changes made to preferences by 
  2144 +        // This "input" event handler tracks changes made to preferences by
  2143 +        // the user in this window.
  2145 +        // the user in this window.
  2144 +        this.userChangedValue(event.target);
  2146 +        this.userChangedValue(event.target);
  2145 +      </handler>
  2147 +      </handler>
  2146 +      <handler event="paneload">
  2148 +      <handler event="paneload">
  2147 +      <![CDATA[
  2149 +      <![CDATA[
  2154 +          }
  2156 +          }
  2155 +          catch (e) {
  2157 +          catch (e) {
  2156 +            dump("*** No preference found for " + elements[i].getAttribute("preference") + "\n");
  2158 +            dump("*** No preference found for " + elements[i].getAttribute("preference") + "\n");
  2157 +          }
  2159 +          }
  2158 +        }
  2160 +        }
  2159 +      ]]>      
  2161 +      ]]>
  2160 +      </handler>
  2162 +      </handler>
  2161 +    </handlers>
  2163 +    </handlers>
  2162 +  </binding>
  2164 +  </binding>
  2163 +          
  2165 +
  2164 +  <binding id="panebutton" role="xul:listitem"
  2166 +  <binding id="panebutton" role="xul:listitem"
  2165 +           extends="chrome://global/content/bindings/radio.xml#radio">
  2167 +           extends="chrome://global/content/bindings/radio.xml#radio">
  2166 +    <resources>
  2168 +    <resources>
  2167 +      <stylesheet src="chrome://global/skin/preferences.css"/>
  2169 +      <stylesheet src="chrome://global/skin/preferences.css"/>
  2168 +    </resources>
  2170 +    </resources>