Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Berry <bryan@olenepal.org>2010-02-14 11:29:17 (GMT)
committer Bryan Berry <bryan@olenepal.org>2010-02-14 11:29:17 (GMT)
commitf1a6b7cbb5700287dcdc3e3cfc449401b675f7ee (patch)
treed29b07dccf83778c077a1a872a9f474af7e08a51
parentc551470a3be17ee5ea9ef1c553847dee323ffb37 (diff)
fix firefox version, again
-rwxr-xr-xtools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/27c13cf6-d561-f5a5-4a4a3ec5-2ab791a1.dmpbin75720 -> 0 bytes
-rwxr-xr-xtools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/4a23810c-bb39-feb7-3d7a3d88-72833eea.dmpbin80776 -> 0 bytes
-rwxr-xr-xtools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/541b24cb-4b3c-a613-0d9cceca-770987c7.dmpbin83488 -> 0 bytes
-rw-r--r--tools/xo_bundle/LICENSE567
-rwxr-xr-xtools/xo_bundle/application.ini14
-rwxr-xr-xtools/xo_bundle/blocklist.xml16
-rwxr-xr-xtools/xo_bundle/chrome/browser.jarbin2024404 -> 2051514 bytes
-rwxr-xr-xtools/xo_bundle/chrome/classic.jarbin605954 -> 564886 bytes
-rwxr-xr-xtools/xo_bundle/chrome/comm.jarbin40073 -> 40075 bytes
-rwxr-xr-xtools/xo_bundle/chrome/en-US.jarbin477417 -> 482945 bytes
-rwxr-xr-xtools/xo_bundle/chrome/pippki.jarbin279789 -> 279773 bytes
-rwxr-xr-xtools/xo_bundle/chrome/reporter.jarbin39459 -> 39459 bytes
-rwxr-xr-xtools/xo_bundle/chrome/rkiosk.jarbin0 -> 3835 bytes
-rwxr-xr-xtools/xo_bundle/chrome/rkiosk.manifest5
-rwxr-xr-xtools/xo_bundle/chrome/toolkit.jarbin2009877 -> 2086860 bytes
-rwxr-xr-xtools/xo_bundle/chrome/toolkit.manifest1
-rwxr-xr-xtools/xo_bundle/components/FeedConverter.js33
-rwxr-xr-xtools/xo_bundle/components/FeedProcessor.js32
-rwxr-xr-xtools/xo_bundle/components/FeedWriter.js24
-rw-r--r--tools/xo_bundle/components/GPSDGeolocationProvider.js268
-rwxr-xr-xtools/xo_bundle/components/NetworkGeolocationProvider.js209
-rwxr-xr-xtools/xo_bundle/components/WebContentConverter.js6
-rwxr-xr-xtools/xo_bundle/components/browser.xptbin361500 -> 365568 bytes
-rw-r--r--tools/xo_bundle/components/components.list66
-rwxr-xr-xtools/xo_bundle/components/compreg.dat359
-rwxr-xr-xtools/xo_bundle/components/fuelApplication.js22
-rwxr-xr-xtools/xo_bundle/components/jsconsole-clhandler.js2
-rwxr-xr-xtools/xo_bundle/components/libbrowsercomps.sobin165548 -> 157712 bytes
-rwxr-xr-xtools/xo_bundle/components/libbrowserdirprovider.sobin40880 -> 40960 bytes
-rwxr-xr-xtools/xo_bundle/components/libdbusservice.sobin28072 -> 28156 bytes
-rwxr-xr-xtools/xo_bundle/components/libimgicon.sobin42736 -> 42288 bytes
-rwxr-xr-xtools/xo_bundle/components/libmozgnome.sobin32776 -> 38652 bytes
-rwxr-xr-xtools/xo_bundle/components/libnkgnomevfs.sobin36660 -> 36744 bytes
-rwxr-xr-xtools/xo_bundle/components/nsAddonRepository.js2
-rwxr-xr-xtools/xo_bundle/components/nsBlocklistService.js342
-rwxr-xr-xtools/xo_bundle/components/nsBrowserContentHandler.js13
-rwxr-xr-xtools/xo_bundle/components/nsBrowserGlue.js146
-rwxr-xr-xtools/xo_bundle/components/nsContentDispatchChooser.js6
-rwxr-xr-xtools/xo_bundle/components/nsContentPrefService.js100
-rwxr-xr-xtools/xo_bundle/components/nsDefaultCLH.js2
-rwxr-xr-xtools/xo_bundle/components/nsExtensionManager.js1671
-rwxr-xr-xtools/xo_bundle/components/nsFilePicker.js9
-rw-r--r--tools/xo_bundle/components/nsFormAutoComplete.js478
-rwxr-xr-xtools/xo_bundle/components/nsHelperAppDlg.js104
-rwxr-xr-xtools/xo_bundle/components/nsLivemarkService.js111
-rwxr-xr-xtools/xo_bundle/components/nsLoginManager.js42
-rwxr-xr-xtools/xo_bundle/components/nsLoginManagerPrompter.js163
-rwxr-xr-xtools/xo_bundle/components/nsMicrosummaryService.js137
-rw-r--r--tools/xo_bundle/components/nsPlacesAutoComplete.js1068
-rwxr-xr-xtools/xo_bundle/components/nsPlacesDBFlush.js291
-rwxr-xr-xtools/xo_bundle/components/nsPlacesTransactionsService.js156
-rwxr-xr-xtools/xo_bundle/components/nsPrivateBrowsingService.js210
-rwxr-xr-xtools/xo_bundle/components/nsSafebrowsingApplication.js61
-rwxr-xr-xtools/xo_bundle/components/nsSearchService.js317
-rwxr-xr-xtools/xo_bundle/components/nsSearchSuggestions.js22
-rwxr-xr-xtools/xo_bundle/components/nsSessionStartup.js4
-rwxr-xr-xtools/xo_bundle/components/nsSessionStore.js502
-rwxr-xr-xtools/xo_bundle/components/nsSidebar.js2
-rwxr-xr-xtools/xo_bundle/components/nsTaggingService.js60
-rwxr-xr-xtools/xo_bundle/components/nsURLFormatter.js4
-rwxr-xr-xtools/xo_bundle/components/nsUpdateService.js1213
-rw-r--r--tools/xo_bundle/components/nsUpdateServiceStub.js44
-rw-r--r--tools/xo_bundle/components/nsUpdateTimerManager.js216
-rwxr-xr-xtools/xo_bundle/components/nsUrlClassifierLib.js26
-rwxr-xr-xtools/xo_bundle/components/nsUrlClassifierListManager.js26
-rwxr-xr-xtools/xo_bundle/components/storage-mozStorage.js47
-rwxr-xr-xtools/xo_bundle/components/xpti.dat2723
-rwxr-xr-xtools/xo_bundle/crashreporterbin45760 -> 47828 bytes
-rwxr-xr-xtools/xo_bundle/crashreporter.ini2
-rwxr-xr-xtools/xo_bundle/defaults/autoconfig/prefcalls.js12
-rwxr-xr-xtools/xo_bundle/defaults/pref/channel-prefs.js2
-rwxr-xr-xtools/xo_bundle/defaults/pref/firefox-branding.js16
-rwxr-xr-xtools/xo_bundle/defaults/pref/firefox-l10n.js4
-rwxr-xr-xtools/xo_bundle/defaults/pref/firefox.js152
-rw-r--r--tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.pngbin0 -> 1248 bytes
-rwxr-xr-xtools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf6
-rw-r--r--tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/preview.pngbin0 -> 10017 bytes
-rwxr-xr-xtools/xo_bundle/firefox3
-rwxr-xr-xtools/xo_bundle/firefox-binbin58228 -> 44680 bytes
-rwxr-xr-xtools/xo_bundle/firefox-old142
-rwxr-xr-xtools/xo_bundle/firefox~142
-rw-r--r--tools/xo_bundle/foo.txt1
-rwxr-xr-xtools/xo_bundle/greprefs/all.js140
-rwxr-xr-xtools/xo_bundle/greprefs/security-prefs.js4
-rwxr-xr-xtools/xo_bundle/libfreebl3.chkbin478 -> 478 bytes
-rwxr-xr-xtools/xo_bundle/libfreebl3.sobin317036 -> 321220 bytes
-rwxr-xr-xtools/xo_bundle/libmozjs.sobin839304 -> 1051744 bytes
-rwxr-xr-xtools/xo_bundle/libnspr4.sobin200736 -> 200812 bytes
-rwxr-xr-xtools/xo_bundle/libnss3.sobin858792 -> 863076 bytes
-rwxr-xr-xtools/xo_bundle/libnssckbi.sobin338140 -> 364764 bytes
-rw-r--r--tools/xo_bundle/libnssdbm3.chkbin0 -> 478 bytes
-rwxr-xr-xtools/xo_bundle/libnssdbm3.sobin122896 -> 122988 bytes
-rwxr-xr-xtools/xo_bundle/libnssutil3.sobin77608 -> 78880 bytes
-rwxr-xr-xtools/xo_bundle/libplc4.sobin13180 -> 13256 bytes
-rwxr-xr-xtools/xo_bundle/libplds4.sobin8748 -> 8824 bytes
-rwxr-xr-xtools/xo_bundle/libsmime3.sobin125644 -> 125724 bytes
-rwxr-xr-xtools/xo_bundle/libsoftokn3.chkbin478 -> 478 bytes
-rwxr-xr-xtools/xo_bundle/libsoftokn3.sobin190032 -> 194204 bytes
-rwxr-xr-xtools/xo_bundle/libsqlite3.sobin442840 -> 447080 bytes
-rwxr-xr-xtools/xo_bundle/libssl3.sobin160140 -> 160212 bytes
-rwxr-xr-xtools/xo_bundle/libxpcom.sobin12160 -> 12236 bytes
-rwxr-xr-xtools/xo_bundle/libxul.sobin14177440 -> 14744476 bytes
-rw-r--r--tools/xo_bundle/modules/CertUtils.jsm77
-rwxr-xr-xtools/xo_bundle/modules/DownloadUtils.jsm12
-rw-r--r--tools/xo_bundle/modules/FileUtils.jsm106
-rw-r--r--tools/xo_bundle/modules/LightweightThemeConsumer.jsm111
-rw-r--r--tools/xo_bundle/modules/LightweightThemeManager.jsm357
-rw-r--r--tools/xo_bundle/modules/NetUtil.jsm211
-rw-r--r--tools/xo_bundle/modules/NetworkPrioritizer.jsm217
-rwxr-xr-xtools/xo_bundle/modules/PlacesDBUtils.jsm111
-rwxr-xr-xtools/xo_bundle/modules/SpatialNavigation.js15
-rwxr-xr-xtools/xo_bundle/modules/WindowDraggingUtils.jsm2
-rwxr-xr-xtools/xo_bundle/modules/XPCOMUtils.jsm52
-rw-r--r--tools/xo_bundle/modules/ctypes.jsm117
-rwxr-xr-xtools/xo_bundle/modules/debug.js2
-rwxr-xr-xtools/xo_bundle/modules/distribution.js193
-rw-r--r--tools/xo_bundle/modules/openLocationLastURL.jsm95
-rwxr-xr-xtools/xo_bundle/modules/utils.js324
-rwxr-xr-xtools/xo_bundle/mozilla-xremote-clientbin10804 -> 11052 bytes
-rwxr-xr-xtools/xo_bundle/platform.ini8
-rwxr-xr-xtools/xo_bundle/plugins/libflashplayer.sobin0 -> 8115888 bytes
-rwxr-xr-xtools/xo_bundle/plugins/libnullplugin.sobin15824 -> 15716 bytes
-rwxr-xr-xtools/xo_bundle/removed-files11
-rw-r--r--tools/xo_bundle/res/broken-image.pngbin0 -> 253 bytes
-rwxr-xr-xtools/xo_bundle/res/charsetData.properties16
-rwxr-xr-xtools/xo_bundle/res/charsetalias.properties6
-rwxr-xr-xtools/xo_bundle/res/forms.css45
-rwxr-xr-xtools/xo_bundle/res/html.css16
-rwxr-xr-xtools/xo_bundle/res/langGroups.properties39
-rwxr-xr-xtools/xo_bundle/res/language.properties59
-rw-r--r--tools/xo_bundle/res/loading-image.pngbin0 -> 268 bytes
-rwxr-xr-xtools/xo_bundle/res/ua.css5
-rwxr-xr-xtools/xo_bundle/res/viewsource.css2
-rwxr-xr-xtools/xo_bundle/run-mozilla-new.sh~401
-rwxr-xr-xtools/xo_bundle/run-mozilla.sh12
-rwxr-xr-xtools/xo_bundle/searchplugins/yahoo.xml2
-rwxr-xr-xtools/xo_bundle/updaterbin70472 -> 71344 bytes
137 files changed, 10170 insertions, 5022 deletions
diff --git a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/27c13cf6-d561-f5a5-4a4a3ec5-2ab791a1.dmp b/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/27c13cf6-d561-f5a5-4a4a3ec5-2ab791a1.dmp
deleted file mode 100755
index 7d9fa4e..0000000
--- a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/27c13cf6-d561-f5a5-4a4a3ec5-2ab791a1.dmp
+++ /dev/null
Binary files differ
diff --git a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/4a23810c-bb39-feb7-3d7a3d88-72833eea.dmp b/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/4a23810c-bb39-feb7-3d7a3d88-72833eea.dmp
deleted file mode 100755
index 7c9b69d..0000000
--- a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/4a23810c-bb39-feb7-3d7a3d88-72833eea.dmp
+++ /dev/null
Binary files differ
diff --git a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/541b24cb-4b3c-a613-0d9cceca-770987c7.dmp b/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/541b24cb-4b3c-a613-0d9cceca-770987c7.dmp
deleted file mode 100755
index d09c71d..0000000
--- a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/541b24cb-4b3c-a613-0d9cceca-770987c7.dmp
+++ /dev/null
Binary files differ
diff --git a/tools/xo_bundle/LICENSE b/tools/xo_bundle/LICENSE
new file mode 100644
index 0000000..bc8f037
--- /dev/null
+++ b/tools/xo_bundle/LICENSE
@@ -0,0 +1,567 @@
+ MOZILLA PUBLIC LICENSE
+ Version 1.1
+
+ ---------------
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which controls, is
+ controlled by, or is under common control with You. For purposes of
+ this definition, "control" means (a) the power, direct or indirect,
+ to cause the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty percent
+ (50%) of the outstanding shares or beneficial ownership of such
+ entity.
+
+2. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, each Contributor
+ hereby grants You a world-wide, royalty-free, non-exclusive license
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+ If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to
+ statute, judicial order, or regulation then You must: (a) comply with
+ the terms of this License to the maximum extent possible; and (b)
+ describe the limitations and the code they affect. Such description
+ must be included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+ DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+ THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+ COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+ WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+ RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+ PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+ THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``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 ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
+
+ ----------------------------------------------------------------------
+
+ AMENDMENTS
+
+ The Netscape Public License Version 1.1 ("NPL") consists of the
+ Mozilla Public License Version 1.1 with the following Amendments,
+ including Exhibit A-Netscape Public License. Files identified with
+ "Exhibit A-Netscape Public License" are governed by the Netscape
+ Public License Version 1.1.
+
+ Additional Terms applicable to the Netscape Public License.
+ I. Effect.
+ These additional terms described in this Netscape Public
+ License -- Amendments shall apply to the Mozilla Communicator
+ client code and to all Covered Code under this License.
+
+ II. "Netscape's Branded Code" means Covered Code that Netscape
+ distributes and/or permits others to distribute under one or more
+ trademark(s) which are controlled by Netscape but which are not
+ licensed for use under this License.
+
+ III. Netscape and logo.
+ This License does not grant any rights to use the trademarks
+ "Netscape", the "Netscape N and horizon" logo or the "Netscape
+ lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
+ "Smart Browsing" even if such marks are included in the Original
+ Code or Modifications.
+
+ IV. Inability to Comply Due to Contractual Obligation.
+ Prior to licensing the Original Code under this License, Netscape
+ has licensed third party code for use in Netscape's Branded Code.
+ To the extent that Netscape is limited contractually from making
+ such third party code available under this License, Netscape may
+ choose to reintegrate such code into Covered Code without being
+ required to distribute such code in Source Code form, even if
+ such code would otherwise be considered "Modifications" under
+ this License.
+
+ V. Use of Modifications and Covered Code by Initial Developer.
+ V.1. In General.
+ The obligations of Section 3 apply to Netscape, except to
+ the extent specified in this Amendment, Section V.2 and V.3.
+
+ V.2. Other Products.
+ Netscape may include Covered Code in products other than the
+ Netscape's Branded Code which are released by Netscape
+ during the two (2) years following the release date of the
+ Original Code, without such additional products becoming
+ subject to the terms of this License, and may license such
+ additional products on different terms from those contained
+ in this License.
+
+ V.3. Alternative Licensing.
+ Netscape may license the Source Code of Netscape's Branded
+ Code, including Modifications incorporated therein, without
+ such Netscape Branded Code becoming subject to the terms of
+ this License, and may license such Netscape Branded Code on
+ different terms from those contained in this License.
+
+ VI. Litigation.
+ Notwithstanding the limitations of Section 11 above, the
+ provisions regarding litigation in Section 11(a), (b) and (c) of
+ the License shall apply to all disputes relating to this License.
+
+ EXHIBIT A-Netscape Public License.
+
+ "The contents of this file are subject to the Netscape 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/NPL/
+
+ 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 Communicator client code, released
+ March 31, 1998.
+
+ The Initial Developer of the Original Code is Netscape
+ Communications Corporation. Portions created by Netscape are
+ Copyright (C) 1998-1999 Netscape Communications Corporation. All
+ Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the
+ terms of the _____ license (the "[___] License"), in which case
+ the provisions of [______] License are applicable instead of
+ those above. If you wish to allow use of your version of this
+ file only under the terms of the [____] License and not to allow
+ others to use your version of this file under the NPL, indicate
+ your decision by deleting the provisions above and replace them
+ with the notice and other provisions required by the [___]
+ License. If you do not delete the provisions above, a recipient
+ may use your version of this file under either the NPL or the
+ [___] License."
diff --git a/tools/xo_bundle/application.ini b/tools/xo_bundle/application.ini
index 182bf1f..f9803cc 100755
--- a/tools/xo_bundle/application.ini
+++ b/tools/xo_bundle/application.ini
@@ -38,16 +38,16 @@
[App]
Vendor=Mozilla
Name=Firefox
-Version=3.5.3
-BuildID=20090824085743
-SourceRepository=http://hg.mozilla.org/releases/mozilla-1.9.1
-SourceStamp=0da982f65d37
-Copyright=Copyright (c) 1998 - 2009 mozilla.org
+Version=3.6
+BuildID=20100115133306
+SourceRepository=http://hg.mozilla.org/releases/mozilla-1.9.2
+SourceStamp=448d0d2d310c
+Copyright=Copyright (c) 1998 - 2010 mozilla.org
ID={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
[Gecko]
-MinVersion=1.9.1.3
-MaxVersion=1.9.1.3
+MinVersion=1.9.2
+MaxVersion=1.9.2
[XRE]
EnableProfileMigrator=1
diff --git a/tools/xo_bundle/blocklist.xml b/tools/xo_bundle/blocklist.xml
index 1689e6b..dadc9c2 100755
--- a/tools/xo_bundle/blocklist.xml
+++ b/tools/xo_bundle/blocklist.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist">
<emItems>
<emItem id="fdm_ffext@freedownloadmanager.org">
@@ -21,6 +21,10 @@
<emItem id="support@daemon-tools.cc">
<versionRange minVersion=" " maxVersion="1.0.0.5"/>
</emItem>
+ <emItem id="{2224e955-00e9-4613-a844-ce69fccaae91}"/>
+ <emItem id="{3f963a5b-e555-4543-90e2-c3908898db71}">
+ <versionRange minVersion=" " maxVersion="8.5"/>
+ </emItem>
<emItem id="{4B3803EA-5230-4DC3-A7FC-33638F3D3542}">
<versionRange minVersion="1.2" maxVersion="1.2">
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
@@ -28,6 +32,9 @@
</targetApplication>
</versionRange>
</emItem>
+ <emItem id="{B13721C7-F507-4982-B2E5-502A71474FED}">
+ <versionRange minVersion=" " maxVersion="3.3.0.3970" severity="1"/>
+ </emItem>
</emItems>
<pluginItems>
<pluginItem>
@@ -49,5 +56,10 @@
</targetApplication>
</versionRange>
</pluginItem>
+ <pluginItem>
+ <match name="filename" exp="NPFFAddOn.dll"/>
+ <versionRange>
+ </versionRange>
+ </pluginItem>
</pluginItems>
-</blocklist>
+</blocklist> \ No newline at end of file
diff --git a/tools/xo_bundle/chrome/browser.jar b/tools/xo_bundle/chrome/browser.jar
index caecd22..85b890e 100755
--- a/tools/xo_bundle/chrome/browser.jar
+++ b/tools/xo_bundle/chrome/browser.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/classic.jar b/tools/xo_bundle/chrome/classic.jar
index 34b4d25..71a4aef 100755
--- a/tools/xo_bundle/chrome/classic.jar
+++ b/tools/xo_bundle/chrome/classic.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/comm.jar b/tools/xo_bundle/chrome/comm.jar
index 376adc7..df9c226 100755
--- a/tools/xo_bundle/chrome/comm.jar
+++ b/tools/xo_bundle/chrome/comm.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/en-US.jar b/tools/xo_bundle/chrome/en-US.jar
index 378d6a2..e0983e0 100755
--- a/tools/xo_bundle/chrome/en-US.jar
+++ b/tools/xo_bundle/chrome/en-US.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/pippki.jar b/tools/xo_bundle/chrome/pippki.jar
index bc64444..eaee50c 100755
--- a/tools/xo_bundle/chrome/pippki.jar
+++ b/tools/xo_bundle/chrome/pippki.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/reporter.jar b/tools/xo_bundle/chrome/reporter.jar
index c7e2027..1791fb9 100755
--- a/tools/xo_bundle/chrome/reporter.jar
+++ b/tools/xo_bundle/chrome/reporter.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/rkiosk.jar b/tools/xo_bundle/chrome/rkiosk.jar
new file mode 100755
index 0000000..312d717
--- /dev/null
+++ b/tools/xo_bundle/chrome/rkiosk.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/rkiosk.manifest b/tools/xo_bundle/chrome/rkiosk.manifest
new file mode 100755
index 0000000..3104999
--- /dev/null
+++ b/tools/xo_bundle/chrome/rkiosk.manifest
@@ -0,0 +1,5 @@
+
+overlay chrome://browser/content/browser.xul chrome://rkiosk/content/rkioskbrowser.xul
+overlay chrome://mozapps/content/xpinstall/xpinstallConfirm.xul chrome://rkiosk/content/rkioskxpinstallConfirm.xul
+overlay chrome://mozapps/content/downloads/unknownContentType.xul chrome://rkiosk/content/rkioskunknownContentType.xul
+content rkiosk jar:chrome/rkiosk.jar!/content/rkiosk/
diff --git a/tools/xo_bundle/chrome/toolkit.jar b/tools/xo_bundle/chrome/toolkit.jar
index 466b6b8..cc3e371 100755
--- a/tools/xo_bundle/chrome/toolkit.jar
+++ b/tools/xo_bundle/chrome/toolkit.jar
Binary files differ
diff --git a/tools/xo_bundle/chrome/toolkit.manifest b/tools/xo_bundle/chrome/toolkit.manifest
index 0839061..5054ab9 100755
--- a/tools/xo_bundle/chrome/toolkit.manifest
+++ b/tools/xo_bundle/chrome/toolkit.manifest
@@ -1,3 +1,4 @@
+resource gre-resources resource://gre/res/
content global-region jar:toolkit.jar!/content/global-region/ xpcnativewrappers=yes
content global jar:toolkit.jar!/content/global/ xpcnativewrappers=yes contentaccessible=yes
content mozapps jar:toolkit.jar!/content/mozapps/ xpcnativewrappers=yes
diff --git a/tools/xo_bundle/components/FeedConverter.js b/tools/xo_bundle/components/FeedConverter.js
index aeb603d..3ed95c1 100755
--- a/tools/xo_bundle/components/FeedConverter.js
+++ b/tools/xo_bundle/components/FeedConverter.js
@@ -1,4 +1,4 @@
-//@line 39 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/FeedConverter.js"
+//@line 39 "/builds/slave/linux_build/build/browser/components/feeds/src/FeedConverter.js"
const Cc = Components.classes;
const Ci = Components.interfaces;
@@ -124,17 +124,7 @@ FeedConverter.prototype = {
* Records if the feed was sniffed
*/
_sniffed: false,
-
- /**
- * See nsIStreamConverter.idl
- */
- canConvert: function FC_canConvert(sourceType, destinationType) {
- // We only support one conversion.
- return destinationType == TYPE_ANY && ((sourceType == TYPE_MAYBE_FEED) ||
- (sourceType == TYPE_MAYBE_VIDEO) ||
- (sourceType == TYPE_MAYBE_AUDIO));
- },
-
+
/**
* See nsIStreamConverter.idl
*/
@@ -246,18 +236,13 @@ FeedConverter.prototype = {
getService(Ci.nsIIOService);
var chromeChannel;
- // show the feed page if it wasn't sniffed and we have a document,
- // or we have a document, title, and link or id
- if (result.doc && (!this._sniffed ||
- (result.doc.title && (result.doc.link || result.doc.id)))) {
+ // If there was no automatic handler, or this was a podcast,
+ // photostream or some other kind of application, show the preview page
+ // if the parser returned a document.
+ if (result.doc) {
- // If there was no automatic handler, or this was a podcast,
- // photostream or some other kind of application, we must always
- // show the preview page.
-
// Store the result in the result service so that the display
// page can access it.
-
feedService.addFeedResult(result);
// Now load the actual XUL document.
@@ -325,7 +310,7 @@ FeedConverter.prototype = {
/**
* See nsIRequestObserver.idl
*/
- onStopRequest: function FC_onStopReqeust(request, context, status) {
+ onStopRequest: function FC_onStopRequest(request, context, status) {
if (this._processor)
this._processor.onStopRequest(request, context, status);
},
@@ -662,7 +647,7 @@ function NSGetModule(cm, file) {
return Module;
}
-//@line 44 "/builds/moz2_slave/linux_build/build/toolkit/content/debug.js"
+//@line 44 "/builds/slave/linux_build/build/toolkit/content/debug.js"
var EXPORTED_SYMBOLS = ["NS_ASSERT"];
@@ -744,7 +729,7 @@ function NS_ASSERT(condition, message) {
getService(Components.interfaces.nsIPromptService);
ps.alert(source, "Assertion Failed", assertionText + stackText);
}
-//@line 37 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/GenericFactory.js"
+//@line 37 "/builds/slave/linux_build/build/browser/components/feeds/src/GenericFactory.js"
/**
* An object implementing nsIFactory that can construct other objects upon
diff --git a/tools/xo_bundle/components/FeedProcessor.js b/tools/xo_bundle/components/FeedProcessor.js
index 64298ee..9c30ab9 100755
--- a/tools/xo_bundle/components/FeedProcessor.js
+++ b/tools/xo_bundle/components/FeedProcessor.js
@@ -803,25 +803,25 @@ function LC(element) {
// create a generator element
function atomGenerator(s, generator) {
generator.QueryInterface(Ci.nsIFeedGenerator);
- generator.agent = trimString(s);
+ generator.agent = s.trim();
return generator;
}
// post-process atom:logo to create an RSS2-like structure
function atomLogo(s, logo) {
- logo.setPropertyAsAString("url", trimString(s));
+ logo.setPropertyAsAString("url", s.trim());
}
// post-process an RSS category, map it to the Atom fields.
function rssCatTerm(s, cat) {
// add slash handling?
- cat.setPropertyAsAString("term", trimString(s));
+ cat.setPropertyAsAString("term", s.trim());
return cat;
}
// post-process a GUID
function rssGuid(s, guid) {
- guid.setPropertyAsAString("guid", trimString(s));
+ guid.setPropertyAsAString("guid", s.trim());
return guid;
}
@@ -841,13 +841,13 @@ function rssGuid(s, guid) {
function rssAuthor(s,author) {
author.QueryInterface(Ci.nsIFeedPerson);
// check for RSS2 string format
- var chars = trimString(s);
+ var chars = s.trim();
var matches = chars.match(/(.*)\((.*)\)/);
var emailCheck =
/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (matches) {
- var match1 = trimString(matches[1]);
- var match2 = trimString(matches[2]);
+ var match1 = matches[1].trim();
+ var match2 = matches[2].trim();
if (match2.indexOf("mailto:") == 0)
match2 = match2.substring(7);
if (emailCheck.test(match1)) {
@@ -896,16 +896,6 @@ function isValidRFC822Date(aDateStr) {
return regex.test(aDateStr);
}
-/**
- * Removes leading and trailing whitespace from a string.
- * @param s The string to trim.
- *
- * @returns A new string with whitespace stripped.
- */
-function trimString(s) {
- return(s.replace(/^\s+/, "").replace(/\s+$/, ""));
-}
-
// Regular expression matching RFC822 dates
const RFC822_RE = "^((Mon|Tue|Wed|Thu|Fri|Sat|Sun)([a-z]+)?,? *)?\\d\\d?"
+ " +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)([a-z]+)?"
@@ -922,7 +912,7 @@ const RFC822_RE = "^((Mon|Tue|Wed|Thu|Fri|Sat|Sun)([a-z]+)?,? *)?\\d\\d?"
* @returns A Date.toString XXX--fixme
*/
function dateParse(dateString) {
- var date = trimString(dateString);
+ var date = dateString.trim();
if (date.search(/^\d\d\d\d/) != -1) //Could be a ISO8601/W3C date
return W3CToIETFDate(dateString);
@@ -1067,7 +1057,7 @@ XHTMLHandler.prototype = {
// When we peek too far, go back to the main processor
if (this._depth < 0) {
- this._processor.returnFromXHTMLHandler(trimString(this._buf),
+ this._processor.returnFromXHTMLHandler(this._buf.trim(),
uri, localName, qName);
return;
}
@@ -1134,7 +1124,7 @@ ExtensionHandler.prototype = {
endElement: function EH_endElement(uri, localName, qName) {
--this._depth;
if (this._depth == 0) {
- var text = this._hasChildElements ? null : trimString(this._buf);
+ var text = this._hasChildElements ? null : this._buf.trim();
this._processor.returnFromExtHandler(this._uri, this._localName,
text, this._attrs);
}
@@ -1779,7 +1769,7 @@ FeedProcessor.prototype = {
// Only for RSS2esque formats
_findRSSVersion: function FP__findRSSVersion(attributes) {
- var versionAttr = trimString(attributes.getValueFromName("", "version"));
+ var versionAttr = attributes.getValueFromName("", "version").trim();
var versions = { "0.91":"rss091",
"0.92":"rss092",
"0.93":"rss093",
diff --git a/tools/xo_bundle/components/FeedWriter.js b/tools/xo_bundle/components/FeedWriter.js
index ae10bef..e2101bb 100755
--- a/tools/xo_bundle/components/FeedWriter.js
+++ b/tools/xo_bundle/components/FeedWriter.js
@@ -1,4 +1,4 @@
-//@line 42 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
+//@line 42 "/builds/slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
const Cc = Components.classes;
const Ci = Components.interfaces;
@@ -641,7 +641,7 @@ FeedWriter.prototype = {
* @returns The display name of the application represented by the file.
*/
_getFileDisplayName: function FW__getFileDisplayName(file) {
-//@line 702 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
+//@line 702 "/builds/slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
var ios =
Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
@@ -699,9 +699,9 @@ FeedWriter.prototype = {
// XXXben - we need to compare this with the running instance executable
// just don't know how to do that via script...
// XXXmano TBD: can probably add this to nsIShellService
-//@line 765 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
+//@line 765 "/builds/slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
if (fp.file.leafName != "firefox-bin") {
-//@line 768 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
+//@line 768 "/builds/slave/linux_build/build/browser/components/feeds/src/FeedWriter.js"
this._initMenuItemWithFile(this._contentSandbox.selectedAppMenuItem,
this._selectedApp);
@@ -782,8 +782,6 @@ FeedWriter.prototype = {
// nsIDomEventListener
handleEvent: function(event) {
- // see comments in init()
- event = new XPCNativeWrapper(event);
if (event.target.ownerDocument != this._document) {
LOG("FeedWriter.handleEvent: Someone passed the feed writer as a listener to the events of another document!");
return;
@@ -1089,10 +1087,7 @@ FeedWriter.prototype = {
// nsIFeedWriter
init: function FW_init(aWindow) {
- // Explicitly wrap |window| in an XPCNativeWrapper to make sure
- // it's a real native object! This will throw an exception if we
- // get a non-native object.
- var window = new XPCNativeWrapper(aWindow);
+ var window = aWindow;
this._feedURI = this._getOriginalURI(window);
if (!this._feedURI)
return;
@@ -1203,7 +1198,7 @@ FeedWriter.prototype = {
var selectedItem = this._getSelectedItemFromMenulist(handlersMenuList);
// Show the file picker before subscribing if the
- // choose application menuitem was choosen using the keyboard
+ // choose application menuitem was chosen using the keyboard
if (selectedItem.id == "chooseApplicationMenuItem") {
if (!this._chooseClientApp())
return;
@@ -1269,9 +1264,6 @@ FeedWriter.prototype = {
// nsIObserver
observe: function FW_observe(subject, topic, data) {
- // see init()
- subject = new XPCNativeWrapper(subject);
-
if (!this._window) {
// this._window is null unless this.init was called with a trusted
// window object.
@@ -1338,9 +1330,6 @@ FeedWriter.prototype = {
// nsINavHistoryService
onPageChanged: function FW_onPageChanged(aURI, aWhat, aValue) {
- // see init()
- aURI = new XPCNativeWrapper(aURI);
-
if (aWhat == Ci.nsINavHistoryObserver.ATTRIBUTE_FAVICON) {
// Go through the readers menu and look for the corresponding
// reader menu-item for the page if any.
@@ -1360,6 +1349,7 @@ FeedWriter.prototype = {
onEndUpdateBatch: function() { },
onVisit: function() { },
onTitleChanged: function() { },
+ onBeforeDeleteURI: function() { },
onDeleteURI: function() { },
onClearHistory: function() { },
onPageExpired: function() { },
diff --git a/tools/xo_bundle/components/GPSDGeolocationProvider.js b/tools/xo_bundle/components/GPSDGeolocationProvider.js
new file mode 100644
index 0000000..4f63d84
--- /dev/null
+++ b/tools/xo_bundle/components/GPSDGeolocationProvider.js
@@ -0,0 +1,268 @@
+/* ***** 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 Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Martin McNickle <mmcnickle@gmail.com>
+ *
+ * Based on static_geolocation_provider.js by:
+ * Doug Turner <dougt@meer.net>
+ *
+ *
+ * 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 ***** */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+
+var gLoggingEnabled = false;
+
+function LOG(aMsg) {
+ if (gLoggingEnabled)
+ {
+ aMsg = ("*** GPSD GEO: " + aMsg);
+ Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(aMsg);
+ dump(aMsg);
+ }
+}
+
+function GeoPositionCoordsObject(latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed) {
+
+ this.latitude = latitude;
+ this.longitude = longitude;
+ this.altitude = altitude;
+ this.accuracy = accuracy;
+ this.altitudeAccuracy = altitudeAccuracy;
+ this.heading = heading;
+ this.speed = speed;
+
+};
+
+GeoPositionCoordsObject.prototype = {
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGeoPositionCoords, Ci.nsIClassInfo]),
+
+ // Class Info is required to be able to pass objects back into the DOM.
+ getInterfaces: function(countRef) {
+ var interfaces = [Ci.nsIDOMGeoPositionCoords, Ci.nsIClassInfo, Ci.nsISupports];
+ countRef.value = interfaces.length;
+ return interfaces;
+ },
+
+ getHelperForLanguage: function(language) null,
+ contractID: null,
+ classDescription: "Geoposition Coordinate Object",
+ classID: null,
+ implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
+ flags: Ci.nsIClassInfo.DOM_OBJECT,
+
+ latitude: null,
+ longitude: null,
+ altitude: null,
+ accuracy: null,
+ altitudeAccuracy: null,
+ heading: null,
+ speed: null,
+
+};
+
+function GeoPositionObject(latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed, timestamp) {
+ this.coords = new GeoPositionCoordsObject(latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed);
+ this.timestamp = timestamp;
+};
+
+GeoPositionObject.prototype = {
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGeoPosition, Ci.nsIClassInfo]),
+
+ // Class Info is required to be able to pass objects back into the DOM.
+ getInterfaces: function(countRef) {
+ var interfaces = [Ci.nsIDOMGeoPosition, Ci.nsIClassInfo, Ci.nsISupports];
+ countRef.value = interfaces.length;
+ return interfaces;
+ },
+
+ getHelperForLanguage: function(language) null,
+ contractID: null,
+ classDescription: "Geoposition Object",
+ classID: null,
+ implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
+ flags: Ci.nsIClassInfo.DOM_OBJECT,
+
+ coords: null,
+ timestamp: null,
+
+};
+
+function GPSDProvider() {
+ this.prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).QueryInterface(Ci.nsIPrefService);
+
+ try {
+ gLoggingEnabled = this.prefService.getBoolPref("geo.gpsd.logging.enabled");
+ } catch (e) {}
+};
+
+GPSDProvider.prototype = {
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationProvider]),
+
+ classDescription: "Returns a geolocation from a GPSD source",
+ classID: Components.ID("{0A3BE523-0F2A-32CC-CCD8-1E5986D5A79D}"),
+ contractID: "@mozilla.org/geolocation/gpsd/provider;1",
+ _xpcom_categories: [{
+ category: "geolocation-provider",
+ }],
+
+ prefService: null,
+
+ transport: null,
+ outputStream: null,
+ inputStream: null,
+
+ startup: function() {
+
+ LOG("startup called\n");
+ var socketTransportService = Cc["@mozilla.org/network/socket-transport-service;1"].getService(Ci.nsISocketTransportService);
+
+ var hostIPAddr = "127.0.0.1";
+ var hostPort = "2947";
+
+ try {
+ hostIPAddr = this.prefService.getCharPref("geo.gpsd.host.ipaddr");
+ } catch (e) {}
+
+ try {
+ hostPort = this.prefService.getCharPref("geo.gpsd.host.port");
+ } catch (e) {}
+
+ LOG("Host info: " + hostIPAddr + ":" + hostPort + "\n");
+
+ this.transport = socketTransportService.createTransport(null, 0, hostIPAddr, hostPort, null);
+
+ // Alright to open streams here as they are non-blocking by default
+ this.outputStream = this.transport.openOutputStream(0,0,0);
+ this.inputStream = this.transport.openInputStream(0,0,0);
+
+ },
+
+ shutdown: function() {
+ LOG("shutdown called\n");
+ this.outputStream.close();
+ this.inputStream.close();
+ this.transport.close(Components.results.NS_OK);
+ },
+
+ watch: function(c) {
+ LOG("watch called\n");
+
+ // Turn GPSD buffer on, results in smoother data points which I think we want.
+ // Required due to the way that different data arrives in different NMEA sentences.
+ var bufferOption = "J=1\n";
+ this.outputStream.write(bufferOption, bufferOption.length);
+
+ // Go into "watcher" mode
+ var mode = "w\n";
+ this.outputStream.write(mode, mode.length);
+
+ var dataListener = {
+ onStartRequest: function(request, context) {},
+ onStopRequest: function(request, context, status) {},
+ onDataAvailable: function(request, context, inputStream, offset, count) {
+
+ var sInputStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
+ sInputStream.init(inputStream);
+
+ var s = sInputStream.read(count);
+
+ var response = s.split('=');
+
+ var header = response[0];
+ var info = response[1];
+
+ // is this location information?
+ if (header != 'GPSD,O') {
+ // don't do anything
+ return;
+ }
+
+ // is there a fix?
+ if (info == '?') {
+ // don't do anything
+ return;
+ }
+
+ // get the info from the string
+ var fields = info.split(' ');
+
+ // we'll only use RMC data as it seems to make sense
+ if (fields[0] != 'RMC') {
+ return;
+ }
+
+ LOG("Got info: " + info);
+
+ for (var i = 0; i < fields.length; i++) {
+ if (fields[i] == '?') {
+ fields[i] = null;
+ }
+ }
+
+ var timestamp = fields[1]; // UTC
+ var timeError = fields[2]; // seconds
+ var latitude = fields[3]; // degrees
+ var longitude = fields[4]; // degrees
+ var altitude = fields[5]; // meters
+ var horizontalError = fields[6]; // meters
+ var verticalError = fields[7]; // meters
+ var course = fields[8]; // degrees;
+ var speed = fields[9]; // meters/sec maybe knots depending on GPSD version TODO: figure this out
+
+ var geoPos = new GeoPositionObject(latitude, longitude, altitude, horizontalError, verticalError, course, speed, timestamp);
+
+ c.update(geoPos);
+
+ }
+
+ };
+
+ var pump = Cc["@mozilla.org/network/input-stream-pump;1"].createInstance(Ci.nsIInputStreamPump);
+ pump.init(this.inputStream, -1, -1, 0, 0, false);
+ pump.asyncRead(dataListener, null);
+
+ },
+
+};
+
+var components = [GPSDProvider];
+
+function NSGetModule(compMgr, fileSpec) {
+ return XPCOMUtils.generateModule(components);
+}
diff --git a/tools/xo_bundle/components/NetworkGeolocationProvider.js b/tools/xo_bundle/components/NetworkGeolocationProvider.js
index c56b44d..dfbae0f 100755
--- a/tools/xo_bundle/components/NetworkGeolocationProvider.js
+++ b/tools/xo_bundle/components/NetworkGeolocationProvider.js
@@ -3,49 +3,62 @@ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
const Ci = Components.interfaces;
const Cc = Components.classes;
+var gLoggingEnabled = false;
+var gTestingEnabled = false;
+
function nowInSeconds()
{
return Date.now() / 1000;
}
function LOG(aMsg) {
- //aMsg = ("*** WIFI GEO: " + aMsg);
- //Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(aMsg);
+ if (gLoggingEnabled)
+ {
+ aMsg = ("*** WIFI GEO: " + aMsg);
+ Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(aMsg);
+ dump(aMsg);
+ }
}
-function getAccessTokenForURL(url)
-{
- // check to see if we have an access token:
- var accessToken = "";
-
- try {
- var prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
-
- var accessTokenPrefName = "geo.wifi.access_token." + url;
- accessToken = prefService.getCharPref(accessTokenPrefName);
-
- // check to see if it has expired
- var accessTokenDate = prefService.getIntPref(accessTokenPrefName + ".time");
-
- var accessTokenInterval = 1209600; /* seconds in 2 weeks */
- try {
- accessTokenInterval = prefService.getIntPref("geo.wifi.access_token.recycle_interval");
- } catch (e) {}
-
- if (nowInSeconds() - accessTokenDate > accessTokenInterval)
- accessToken = "";
- }
- catch (e) {
- accessToken = "";
- LOG("Error: "+ e);
- }
- return accessToken;
+function WifiGeoAddressObject(streetNumber, street, premises, city, county, region, country, countryCode, postalCode) {
+
+ this.streetNumber = streetNumber;
+ this.street = street;
+ this.premises = premises;
+ this.city = city;
+ this.county = county;
+ this.region = region;
+ this.country = country;
+ this.countryCode = countryCode;
+ this.postalCode = postalCode;
}
-function WifiGeoCoordsObject(lat, lon, acc) {
+WifiGeoAddressObject.prototype = {
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGeoPositionAddress,
+ Ci.nsIDOMGeoPositionAddress_MOZILLA_1_9_2_BRANCH,
+ Ci.nsIClassInfo]),
+
+ getInterfaces: function(countRef) {
+ var interfaces = [Ci.nsIDOMGeoPositionAddress, Ci.nsIClassInfo, Ci.nsISupports];
+ countRef.value = interfaces.length;
+ return interfaces;
+ },
+
+ getHelperForLanguage: function(language) null,
+ contractID: "",
+ classDescription: "wifi geo position address object",
+ classID: null,
+ implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
+ flags: Ci.nsIClassInfo.DOM_OBJECT,
+};
+
+function WifiGeoCoordsObject(lat, lon, acc, alt, altacc) {
this.latitude = lat;
this.longitude = lon;
this.accuracy = acc;
+ this.altitude = alt;
+ this.altitudeAccuracy = altacc;
};
WifiGeoCoordsObject.prototype = {
@@ -68,15 +81,33 @@ WifiGeoCoordsObject.prototype = {
latitude: 0,
longitude: 0,
accuracy: 0,
-
altitude: 0,
altitudeAccuracy: 0,
- heading: 0,
- speed: 0,
+
};
-function WifiGeoPositionObject(lat, lon, acc) {
- this.coords = new WifiGeoCoordsObject(lat, lon, acc);
+function WifiGeoPositionObject(location, address) {
+
+ this.coords = new WifiGeoCoordsObject(location.latitude,
+ location.longitude,
+ location.accuracy || 12450, // .5 * circumference of earth.
+ location.altitude || 0,
+ location.altitude_accuracy || 0);
+
+ if (address) {
+ this.address = new WifiGeoAddressObject(address.street_number || null,
+ address.street || null,
+ address.premises || null,
+ address.city || null,
+ address.county || null,
+ address.region || null,
+ address.country || null,
+ address.country_code || null,
+ address.postal_code || null);
+ }
+ else
+ this.address = null;
+
this.timestamp = Date.now();
};
@@ -102,51 +133,50 @@ WifiGeoPositionObject.prototype = {
timestamp: 0,
};
-function WifiGeoPositionProvider() {};
+function WifiGeoPositionProvider() {
+ this.prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).QueryInterface(Ci.nsIPrefService);
+ try {
+ gLoggingEnabled = this.prefService.getBoolPref("geo.wifi.logging.enabled");
+ } catch (e) {}
+
+ try {
+ gTestingEnabled = this.prefService.getBoolPref("geo.wifi.testing");
+ } catch (e) {}
+
+};
+
WifiGeoPositionProvider.prototype = {
classDescription: "A component that returns a geolocation based on WIFI",
classID: Components.ID("{77DA64D3-7458-4920-9491-86CC9914F904}"),
contractID: "@mozilla.org/geolocation/provider;1",
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationProvider, Ci.nsIWifiListener, Ci.nsITimerCallback]),
-
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationProvider,
+ Ci.nsIWifiListener,
+ Ci.nsITimerCallback]),
+
+ prefService: null,
+
provider_url: null,
wifi_service: null,
timer: null,
hasSeenWiFi: false,
- observe: function (aSubject, aTopic, aData) {
- if (aTopic == "private-browsing") {
- if (aData == "enter" || aData == "exit") {
- let psvc = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
- try {
- let branch = psvc.getBranch("geo.wifi.access_token.");
- branch.deleteBranch("");
- } catch (e) {}
- }
- }
- },
-
startup: function() {
LOG("startup called");
- var prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
- this.provider_url = prefService.getCharPref("geo.wifi.uri");
+ this.provider_url = this.prefService.getCharPref("geo.wifi.uri");
LOG("provider url = " + this.provider_url);
// if we don't see anything in 5 seconds, kick of one IP geo lookup.
+ // if we are testing, just hammer this callback so that we are more or less
+ // always sending data. It doesn't matter if we have an access point or not.
this.hasSeenWiFi = false;
this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
- this.timer.initWithCallback(this, 5000, this.timer.TYPE_ONE_SHOT);
-
- let os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
- os.addObserver(this, "private-browsing", false);
+ if (gTestingEnabled == false)
+ this.timer.initWithCallback(this, 5000, this.timer.TYPE_ONE_SHOT);
+ else
+ this.timer.initWithCallback(this, 200, this.timer.TYPE_REPEATING_SLACK);
},
- isReady: function() {
- LOG("isReady called");
- return true
- },
-
watch: function(c) {
LOG("watch called");
if (!this.wifi_service) {
@@ -174,9 +204,33 @@ WifiGeoPositionProvider.prototype = {
let prefBranch = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
if (prefBranch.getIntPref("network.cookie.lifetimePolicy") != 0)
prefBranch.deleteBranch("geo.wifi.access_token.");
+ },
- let os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
- os.removeObserver(this, "private-browsing");
+ getAccessTokenForURL: function(url)
+ {
+ // check to see if we have an access token:
+ var accessToken = "";
+
+ try {
+ var accessTokenPrefName = "geo.wifi.access_token." + url;
+ accessToken = this.prefService.getCharPref(accessTokenPrefName);
+
+ // check to see if it has expired
+ var accessTokenDate = this.prefService.getIntPref(accessTokenPrefName + ".time");
+
+ var accessTokenInterval = 1209600; /* seconds in 2 weeks */
+ try {
+ accessTokenInterval = this.prefService.getIntPref("geo.wifi.access_token.recycle_interval");
+ } catch (e) {}
+
+ if (nowInSeconds() - accessTokenDate > accessTokenInterval)
+ accessToken = "";
+ }
+ catch (e) {
+ accessToken = "";
+ LOG("Error: "+ e);
+ }
+ return accessToken;
},
onChange: function(accessPoints) {
@@ -184,8 +238,6 @@ WifiGeoPositionProvider.prototype = {
LOG("onChange called");
this.hasSeenWiFi = true;
- var prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
-
// send our request to a wifi geolocation network provider:
var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
@@ -229,30 +281,39 @@ WifiGeoPositionProvider.prototype = {
}
}
- var newLocation = new WifiGeoPositionObject(response.location.latitude,
- response.location.longitude,
- response.location.accuracy);
+ var address = null;
+ try {
+ address = response.location.address;
+ } catch (e) {
+ LOG("No address in response");
+ }
+
+ LOG("sending update to geolocation.");
+
+ var newLocation = new WifiGeoPositionObject(response.location, address);
var update = Cc["@mozilla.org/geolocation/service;1"].getService(Ci.nsIGeolocationUpdate);
update.update(newLocation);
};
- var accessToken = getAccessTokenForURL(this.provider_url);
+ var accessToken = this.getAccessTokenForURL(this.provider_url);
var request = {
version: "1.1.0",
-// request_address: true,
+ request_address: true,
};
if (accessToken != "")
request.access_token = accessToken;
if (accessPoints != null) {
- request.wifi_towers = accessPoints.map(function (ap) ({
- mac_address: ap.mac,
+ function filterBlankSSIDs(ap) ap.ssid != ""
+ function deconstruct(ap) ({
+ mac_address: ap.mac,
ssid: ap.ssid,
- signal_strength: ap.signal,
- }));
+ signal_strength: ap.signal
+ })
+ request.wifi_towers = accessPoints.filter(filterBlankSSIDs).map(deconstruct);
}
var jsonString = JSON.stringify(request);
diff --git a/tools/xo_bundle/components/WebContentConverter.js b/tools/xo_bundle/components/WebContentConverter.js
index 42f47e9..1b0e862 100755
--- a/tools/xo_bundle/components/WebContentConverter.js
+++ b/tools/xo_bundle/components/WebContentConverter.js
@@ -1,4 +1,4 @@
-//@line 39 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/WebContentConverter.js"
+//@line 39 "/builds/slave/linux_build/build/browser/components/feeds/src/WebContentConverter.js"
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
@@ -903,7 +903,7 @@ function NSGetModule(cm, file) {
return XPCOMUtils.generateModule([WebContentConverterRegistrar]);
}
-//@line 44 "/builds/moz2_slave/linux_build/build/toolkit/content/debug.js"
+//@line 44 "/builds/slave/linux_build/build/toolkit/content/debug.js"
var EXPORTED_SYMBOLS = ["NS_ASSERT"];
@@ -985,5 +985,5 @@ function NS_ASSERT(condition, message) {
getService(Components.interfaces.nsIPromptService);
ps.alert(source, "Assertion Failed", assertionText + stackText);
}
-//@line 944 "/builds/moz2_slave/linux_build/build/browser/components/feeds/src/WebContentConverter.js"
+//@line 944 "/builds/slave/linux_build/build/browser/components/feeds/src/WebContentConverter.js"
diff --git a/tools/xo_bundle/components/browser.xpt b/tools/xo_bundle/components/browser.xpt
index f9e5b57..ff34c94 100755
--- a/tools/xo_bundle/components/browser.xpt
+++ b/tools/xo_bundle/components/browser.xpt
Binary files differ
diff --git a/tools/xo_bundle/components/components.list b/tools/xo_bundle/components/components.list
new file mode 100644
index 0000000..350e974
--- /dev/null
+++ b/tools/xo_bundle/components/components.list
@@ -0,0 +1,66 @@
+nsProxyAutoConfig.js
+nsHandlerService.js
+nsWebHandlerApp.js
+NetworkGeolocationProvider.js
+GPSDGeolocationProvider.js
+nsBadCertHandler.js
+txEXSLTRegExFunctions.js
+tp-cmdline.js
+nsHelperAppDlg.js
+nsProgressDialog.js
+nsURLFormatter.js
+nsContentPrefService.js
+nsPlacesDBFlush.js
+nsPlacesAutoComplete.js
+nsLivemarkService.js
+nsTaggingService.js
+nsFilePicker.js
+jsconsole-clhandler.js
+nsLoginManager.js
+nsLoginManagerPrompter.js
+nsLoginInfo.js
+storage-Legacy.js
+storage-mozStorage.js
+FeedProcessor.js
+nsFormAutoComplete.js
+nsSearchService.js
+nsSearchSuggestions.js
+nsDownloadManagerUI.js
+nsUrlClassifierLib.js
+nsUrlClassifierListManager.js
+nsTryToClose.js
+nsDefaultCLH.js
+nsExtensionManager.js
+nsBlocklistService.js
+nsAddonRepository.js
+nsUpdateService.js
+nsUpdateTimerManager.js
+nsUpdateServiceStub.js
+pluginGlue.js
+nsContentDispatchChooser.js
+libmozgnome.so
+libdbusservice.so
+libtestdynamic.so
+libMyService.so
+libxpcomsample.so
+nsSample.js
+httpd.js
+libimgicon.so
+reftest-cmdline.js
+libnkgnomevfs.so
+libbrowserdirprovider.so
+nsMicrosummaryService.js
+nsSessionStore.js
+nsSessionStartup.js
+nsSetDefaultBrowser.js
+nsSidebar.js
+FeedConverter.js
+FeedWriter.js
+WebContentConverter.js
+nsPlacesTransactionsService.js
+nsPrivateBrowsingService.js
+nsSafebrowsingApplication.js
+libbrowsercomps.so
+nsBrowserContentHandler.js
+nsBrowserGlue.js
+fuelApplication.js
diff --git a/tools/xo_bundle/components/compreg.dat b/tools/xo_bundle/components/compreg.dat
index de5d6f9..04fd223 100755
--- a/tools/xo_bundle/components/compreg.dat
+++ b/tools/xo_bundle/components/compreg.dat
@@ -4,85 +4,83 @@ Generated File. Do not edit.
Version,0,5
[COMPONENTS]
-rel:libbrowserdirprovider.so,1253014814000
-rel:libimgicon.so,1253014814000
-rel:FeedProcessor.js,1253014816000
-rel:nsSessionStore.js,1253014816000
-rel:WebContentConverter.js,1253014814000
-rel:libnkgnomevfs.so,1253014815000
-rel:libdbusservice.so,1253014816000
-rel:nsProxyAutoConfig.js,1253014815000
-rel:nsSearchService.js,1253014816000
-rel:aboutSessionRestore.js,1253014815000
-rel:nsSetDefaultBrowser.js,1253014816000
-rel:nsHandlerService.js,1253014815000
-rel:libbrowsercomps.so,1253014815000
-rel:nsBlocklistService.js,1253014815000
-rel:nsContentPrefService.js,1253014815000
-rel:nsAddonRepository.js,1253014815000
-rel:nsBadCertHandler.js,1253014814000
-rel:nsPlacesDBFlush.js,1253014816000
-rel:nsUrlClassifierLib.js,1253014815000
-rel:nsURLFormatter.js,1253014816000
-rel:txEXSLTRegExFunctions.js,1253014816000
-rel:fuelApplication.js,1253014816000
-rel:aboutRobots.js,1253014814000
-rel:nsLivemarkService.js,1253014816000
-rel:nsSessionStartup.js,1253014814000
-rel:nsHelperAppDlg.js,1253014814000
-rel:nsDefaultCLH.js,1253014814000
-rel:FeedConverter.js,1253014815000
-rel:nsContentDispatchChooser.js,1253014816000
-rel:nsUrlClassifierListManager.js,1253014815000
-rel:nsExtensionManager.js,1253014815000
-rel:storage-Legacy.js,1253014814000
-rel:nsPlacesTransactionsService.js,1253014815000
-rel:pluginGlue.js,1253014816000
-rel:FeedWriter.js,1253014815000
-rel:nsTaggingService.js,1253014816000
-rel:nsSafebrowsingApplication.js,1253014815000
-rel:NetworkGeolocationProvider.js,1253014814000
-rel:aboutCertError.js,1253014815000
-rel:nsTryToClose.js,1253014814000
-rel:nsDownloadManagerUI.js,1253014814000
-rel:nsFilePicker.js,1253014815000
-rel:nsLoginManagerPrompter.js,1253014816000
-rel:nsPrivateBrowsingService.js,1253014816000
-rel:nsLoginInfo.js,1253014816000
-rel:libmozgnome.so,1253014815000
-rel:aboutPrivateBrowsing.js,1253014814000
-rel:storage-mozStorage.js,1253014815000
-rel:nsBrowserContentHandler.js,1253014815000
-rel:nsMicrosummaryService.js,1253014815000
-rel:nsBrowserGlue.js,1253014816000
-rel:jsconsole-clhandler.js,1253014814000
-rel:nsWebHandlerApp.js,1253014816000
-rel:aboutRights.js,1253014816000
-rel:nsSidebar.js,1253014815000
-rel:nsLoginManager.js,1253014814000
-rel:nsSearchSuggestions.js,1253014816000
-rel:nsUpdateService.js,1253014816000
+rel:nsFormAutoComplete.js,1263595301000
+rel:nsSidebar.js,1263595301000
+rel:storage-mozStorage.js,1263595301000
+rel:nsDefaultCLH.js,1263595301000
+rel:nsSessionStore.js,1263595301000
+rel:txEXSLTRegExFunctions.js,1263595301000
+rel:libbrowserdirprovider.so,1263595306000
+rel:nsContentDispatchChooser.js,1263595301000
+rel:FeedWriter.js,1263595300000
+rel:nsPrivateBrowsingService.js,1263595300000
+rel:nsBrowserGlue.js,1263595300000
+rel:FeedProcessor.js,1263595300000
+rel:nsSetDefaultBrowser.js,1263595300000
+rel:nsLoginInfo.js,1263595300000
+rel:FeedConverter.js,1263595300000
+rel:nsHandlerService.js,1263595301000
+rel:nsDownloadManagerUI.js,1263595301000
+rel:nsHelperAppDlg.js,1263595301000
+rel:nsUrlClassifierListManager.js,1263595302000
+rel:nsSessionStartup.js,1263595301000
+rel:WebContentConverter.js,1263595300000
+rel:libnkgnomevfs.so,1263595306000
+rel:nsPlacesDBFlush.js,1263595301000
+rel:nsUpdateServiceStub.js,1263595301000
+rel:libmozgnome.so,1263595306000
+rel:storage-Legacy.js,1263595300000
+rel:nsSafebrowsingApplication.js,1263595302000
+rel:nsUpdateTimerManager.js,1263595301000
+rel:nsLivemarkService.js,1263595301000
+rel:nsLoginManager.js,1263595300000
+rel:nsPlacesTransactionsService.js,1263595300000
+rel:nsProxyAutoConfig.js,1263595301000
+rel:nsBadCertHandler.js,1263595301000
+rel:nsFilePicker.js,1263595301000
+rel:nsTryToClose.js,1263595300000
+rel:libdbusservice.so,1263595306000
+rel:fuelApplication.js,1263595300000
+rel:nsWebHandlerApp.js,1263595301000
+rel:nsExtensionManager.js,1263595301000
+rel:nsBlocklistService.js,1263595301000
+rel:nsUpdateService.js,1263595301000
+rel:pluginGlue.js,1263595301000
+rel:nsSearchService.js,1263595300000
+rel:nsTaggingService.js,1263595301000
+rel:nsMicrosummaryService.js,1263595300000
+rel:GPSDGeolocationProvider.js,1263595301000
+rel:libbrowsercomps.so,1263595306000
+rel:NetworkGeolocationProvider.js,1263595301000
+rel:nsURLFormatter.js,1263595301000
+rel:nsUrlClassifierLib.js,1263595302000
+rel:jsconsole-clhandler.js,1263595301000
+rel:nsLoginManagerPrompter.js,1263595300000
+rel:nsAddonRepository.js,1263595300000
+rel:libimgicon.so,1263595306000
+rel:nsSearchSuggestions.js,1263595300000
+rel:nsContentPrefService.js,1263595301000
+rel:nsBrowserContentHandler.js,1263595300000
+rel:nsPlacesAutoComplete.js,1263595301000
[CLASSIDS]
{bfc310d2-38a0-11d3-8cd3-0060b0fc14a3},,application/x-mozilla-static,,nsLayoutModule
{a7f800e0-4306-11d4-98d0-001083010e9b},@mozilla.org/uriloader/external-helper-app-service;1,application/x-mozilla-static,Netscape External Helper App Service,docshell_provider
+{a277189c-1dd1-11b2-a8c9-e4e8bfb1338e},,application/x-mozilla-static,,NSS
{75656ad9-bd13-4c5d-939a-ec6351eea0cc},,application/x-mozilla-static,,nsComposerModule
{ba6151ad-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{8df290ae-dcaa-4c11-98a5-2429a4dc97bb},,text/javascript,,rel:nsContentPrefService.js
{495eca42-0a5c-11d4-a135-005004832142},,application/x-mozilla-static,,nsUConvModule
{0cd233e0-7a86-11d3-915c-006008a6edf6},,application/x-mozilla-static,,nsI18nModule
{73bb7c12-dbab-4ae2-aecf-a0331dec916f},,application/x-mozilla-static,,nsUCvMathModule
{cb6593e0-f9b2-11d2-bdd6-000064657374},@mozilla.org/js/xpc/XPConnect;1,application/x-mozilla-static,,xpconnect
{e768ebef-70f9-4fe3-8835-4f4f3fd996e2},,application/x-mozilla-static,,nsUCvMathModule
-{229fa115-9412-4d32-baf3-2fc407f76fb1},,text/javascript,,rel:FeedConverter.js
+{5d0ce354-df01-421a-83fb-7ead0990c24e},,text/javascript,,rel:nsBrowserContentHandler.js
{4bfaa9f0-1dd2-11b2-afae-a82cbaa0b606},,application/x-mozilla-static,,PKI
{f1299dc2-1dd1-11b2-a347-ee6b7660e048},,application/x-mozilla-static,,JavaScript_Debugger
-{77da64d3-7458-4920-9491-86cc9914f904},,text/javascript,,rel:NetworkGeolocationProvider.js
-{0de2fbfa-6b7f-11d7-bbba-0003938a9d96},,application/x-mozilla-static,,nsLayoutModule
+{c1751cfc-e8f1-4ade-b0bb-f74edfb8ef6a},,text/javascript,,rel:nsPlacesDBFlush.js
{5eb7c3c1-ec1f-4007-87cc-eefb37d68ce6},,application/x-mozilla-static,,nsToolkitCompsModule
{6394eeae-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{d4f2b600-b5c1-11d6-b483-cc97c63e567c},,application/x-mozilla-static,,nsLayoutModule
-{27f0682c-ff64-4dd2-ae7a-668e59f2fd38},,application/x-mozilla-static,,nsImageLib2Module
{748a1132-671a-409a-8d1d-f1cdf6b3a6b4},,application/x-mozilla-static,,nsI18nModule
{fcacef24-2b40-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUniversalCharDetModule
{a496d0a2-dff7-4e23-bd65-1ca742fa178a},,application/x-mozilla-static,,NSS
@@ -94,9 +92,9 @@ rel:nsUpdateService.js,1253014816000
{ba6151ba-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{f7fa4581-238e-11d5-a73c-ab64fb68f2bc},,application/x-mozilla-static,,embedcomponents
{8b1ae382-51a9-4972-b930-56977a57919d},,text/javascript,,rel:nsWebHandlerApp.js
+{e43b0010-04ba-4da6-b523-1f92580bc150},,text/javascript,,rel:nsUpdateServiceStub.js
{10f2f5f0-f103-4901-980f-ba11bd70d60d},,application/x-mozilla-static,,nsToolkitCompsModule
{9416bfb4-1f93-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{e18da21c-a4b8-4be5-98aa-942e1e19f35c},,text/javascript,,rel:aboutRobots.js
{be9a53ae-c7e9-11d3-8cda-0060b0fc14a3},@mozilla.org/network/file-input-stream;1,application/x-mozilla-static,nsFileInputStream,necko
{a0f827e1-8ab6-11d5-a14b-005004832142},,application/x-mozilla-static,,nsUConvModule
{a6cf9124-15b3-11d2-932e-00805f8add32},,application/x-mozilla-static,,nsLayoutModule
@@ -119,14 +117,13 @@ rel:nsUpdateService.js,1253014816000
{7c657d14-ec5e-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eea6-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{ba61519b-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{5fcaa2c1-7ca4-4f73-a357-93e79d709376},,application/x-mozilla-static,,nsLayoutModule
{831f8f13-7aa8-485f-b02e-77c881cc5773},,application/x-mozilla-static,,necko
{660d8ca6-f763-11d2-8aad-00600811a836},,application/x-mozilla-static,,nsUConvModule
{7294fe9c-14d8-11d5-9882-00c04fa02f40},,application/x-mozilla-static,,docshell_provider
+{eab9012e-5f74-4cbc-b2b5-a590235513cc},,text/javascript,,rel:nsBrowserGlue.js
{ba6151a3-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{eaca2576-0d4a-11d3-9d7e-0060088f9ff7},,application/x-mozilla-static,,nsLayoutModule
{b88a4712-eb52-4c10-9b85-bf5894b510f0},,application/x-mozilla-static,,nsLayoutModule
-{6a4d4c1e-a74a-4320-8124-16233a0183d6},,application/x-mozilla-static,,nsSoftwareUpdate
{ba6151b2-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{0c351177-0159-4500-86b0-a219dfde4258},,application/x-mozilla-static,,nsLayoutModule
{495eca47-0a5c-11d4-a135-005004832142},,application/x-mozilla-static,,nsUConvModule
@@ -176,28 +173,28 @@ rel:nsUpdateService.js,1253014816000
{22117140-9c6e-11d3-aaf1-00805f8a4905},,text/javascript,,rel:nsSidebar.js
{9de95a0c-39a4-4d64-9a53-17940dd7cabb},,application/x-mozilla-static,,nsPlacesModule
{66856477-6596-40eb-bb87-59ca2dabb6f7},,application/x-mozilla-static,,nsLayoutModule
+{dbded6ec-edbf-4054-a834-287b82c260f9},,text/javascript,,rel:nsBadCertHandler.js
{892ffeb0-3f80-11d3-a16c-0050041caf44},,application/x-mozilla-static,,necko
{929d9320-251e-11d4-8a7c-006008c844c3},,application/x-mozilla-static,,NSS
{1f4dbcf7-245c-4c8c-943d-8a1da0495e8a},,application/x-mozilla-static,,necko
-{eab9012e-5f74-4cbc-b2b5-a590235513cc},,text/javascript,,rel:nsBrowserGlue.js
+{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980},,application/x-mozilla-native,,rel:libbrowsercomps.so
{6394eeab-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{ab1da296-6125-40ba-96d0-47a8282ae3db},,application/x-mozilla-static,,nsParserModule
-{4ca3c946-5408-49f0-9eca-3a97d5c67750},,application/x-mozilla-native,,rel:libbrowsercomps.so
+{d0272978-beab-4adc-a3d4-04b76acfa4e7},,text/javascript,,rel:nsPlacesAutoComplete.js
{f30bc0a2-958b-4287-bf62-ce38ba0c811e},,application/x-mozilla-static,,docshell_provider
{66634f68-be19-42d0-a4ca-d1c21fa059b8},,application/x-mozilla-static,,nsUConvModule
{2d524fd0-ae74-11d3-abf7-0004aceefa51},,application/x-mozilla-static,,nsUConvModule
{ff8780a5-bbb1-4bc5-8ee7-057e7bc5c925},,application/x-mozilla-static,,nsUConvModule
{2002f784-3960-11d3-b3c3-00805f8a6670},,application/x-mozilla-static,,nsChardetModule
{2d96b3d0-c051-11d1-a827-0040959a28c9},,application/x-mozilla-static,,nsWidgetGtk2Module
-{4a68cee9-6f07-4950-b441-a1ce6a082e2f},,application/x-mozilla-static,,nsCJVMManagerModule
+{67ba681d-5485-4fff-952c-2ee337ffdcd6},,application/x-mozilla-static,,NSS
{26acb1f0-28fc-43bc-867a-a46aabc85dd4},,text/javascript,,rel:FeedProcessor.js
{ff8fe7ec-2f74-4408-b742-6b7a546029a8},,application/x-mozilla-static,,necko
{62db0002-dbb6-43f4-8fb7-9d2538bc5747},,application/x-mozilla-static,,nsComposerModule
{5b256c10-22d8-4109-af92-1253035e9fcb},,application/x-mozilla-static,,NSS
{b57f97c1-0d70-11d3-8aae-00600811a836},,application/x-mozilla-static,,nsUConvModule
-{db340cc2-7f50-4ea3-8427-f529daf6dc87},,application/x-mozilla-static,,satchel
+{4e4aae11-8901-46cc-8217-dad7c5415873},,application/x-mozilla-static,,embedcomponents
{7b8556a9-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
-{78d2286f-de9d-47ac-9c26-e8675aedf3be},,text/javascript,,rel:aboutCertError.js
{439400d3-6f23-43db-8b06-8aafe1869bd8},,application/x-mozilla-static,,necko
{a578e0a4-f76b-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{9416bfb1-1f93-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -208,7 +205,7 @@ rel:nsUpdateService.js,1253014816000
{948a0023-e3a7-11d2-96cf-0060b0fb9956},,application/x-mozilla-static,,nsWidgetGtk2Module
{8dbe7246-1dd2-11b2-9b8f-b9a849e4403a},,application/x-mozilla-static,,necko
{8b5314ba-db01-11d2-96ce-0060b0fb9956},,application/x-mozilla-static,,nsWidgetGtk2Module
-{50e95301-17a8-11d4-9f7e-dd530d5f057c},,application/x-mozilla-static,,nsComposerModule
+{cf7fd51f-aba2-44c1-9ff0-11f7508efcd4},,application/x-mozilla-static,,nsLayoutModule
{7d7008a0-c49a-11d3-9b22-0080c7cb1080},,application/x-mozilla-static,,necko
{77cfaaf1-1cf4-11d3-8aaf-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eeb8-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -216,7 +213,6 @@ rel:nsUpdateService.js,1253014816000
{cb60980e-18a5-4a77-9110-8146614ca7f0},,application/x-mozilla-static,,nsFileViewModule
{ba6151a2-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{379c2771-ec77-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
-{8a115faa-7dcb-4e8f-979b-5f53472f51cf},,text/javascript,,rel:nsExtensionManager.js
{49b38f14-6193-11d3-b3c5-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{12bb8f1c-2389-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUniversalCharDetModule
{e6fd9940-899d-11d2-8eae-00805f29f370},,application/x-mozilla-static,,nsLayoutModule
@@ -226,7 +222,7 @@ rel:nsUpdateService.js,1253014816000
{3b581fd4-3497-426c-8f61-3658b971cb80},,application/x-mozilla-static,,nsLayoutModule
{36a1d3b3-d886-4317-96ff-87b0005cfef7},,application/x-mozilla-static,,NSS
{bf88b48c-fd8e-40b4-ba36-c7c3ad6d8ac9},,application/x-mozilla-static,,embedcomponents
-{aa699204-1dd1-11b2-84a9-a280c268e4fb},,application/x-mozilla-static,,nsGfxModule
+{6a4d4c1e-a74a-4320-8124-16233a0183d6},,application/x-mozilla-static,,nsSoftwareUpdate
{920307b0-c6e8-11d2-8aa8-00600811a836},,application/x-mozilla-static,,nsUConvModule
{7c657d11-ec5e-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eea3-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -238,8 +234,9 @@ rel:nsUpdateService.js,1253014816000
{895db6c7-dbdf-40ea-9f64-b175033243dc},,application/x-mozilla-static,,satchel
{e12752f0-ee9a-11d1-a82a-0040959a28c9},,application/x-mozilla-static,,nsGfxModule
{47049e42-1d87-482a-984d-56ae185e367a},,application/x-mozilla-static,,nsChromeModule
-{c1751cfc-e8f1-4ade-b0bb-f74edfb8ef6a},,text/javascript,,rel:nsPlacesDBFlush.js
+{8df290ae-dcaa-4c11-98a5-2429a4dc97bb},,text/javascript,,rel:nsContentPrefService.js
{ba6151af-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
+{376ff2c1-9bf6-418a-b143-3340c00112f7},,application/x-mozilla-static,,nsImageLib2Module
{495eca44-0a5c-11d4-a135-005004832142},,application/x-mozilla-static,,nsUConvModule
{972d8d8f-f0da-11d4-9885-00c04fa0cf4b},,application/x-mozilla-static,,nsLayoutModule
{56388dad-287b-4240-a785-85c394012503},,application/x-mozilla-static,,necko
@@ -250,6 +247,7 @@ rel:nsUpdateService.js,1253014816000
{898cdc9b-e43f-422f-9cc4-2f6291b415a3},,text/javascript,,rel:nsUpdateService.js
{a35d1cd4-c505-4d2d-a0f9-aef00b7ce5a5},,application/x-mozilla-static,,nsLayoutModule
{0032d852-1dd2-11b2-95f7-e0a1910ed2da},,application/x-mozilla-static,,nsRDFModule
+{0a3be523-0f2a-32cc-ccd8-1e5986d5a79d},,text/javascript,,rel:GPSDGeolocationProvider.js
{87ed1160-e2f2-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
{6394eeb0-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{7b8556a1-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
@@ -260,6 +258,7 @@ rel:nsUpdateService.js,1253014816000
{e332db00-e076-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
{3decd6c8-30ef-11d3-8cd0-0060b0fc14a3},,application/x-mozilla-static,,necko
{e8b8bdb7-c96c-4d82-9c6f-2b3c585ec7ea},,application/x-mozilla-static,,nsPlacesModule
+{f1eac762-87e9-11d3-af80-00a024ffc08c},,application/x-mozilla-static,,docshell_provider
{ba6151bc-ec62-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{e6a3f533-4ffa-4615-8eb4-d4e72d883fa7},,text/javascript,,rel:nsContentPrefService.js
{2e9b69dd-9087-438c-8b5d-f77b553abefb},,application/x-mozilla-static,,docshell_provider
@@ -282,6 +281,7 @@ rel:nsUpdateService.js,1253014816000
{7b8556ae-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{379c2776-ec77-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{ea617873-3b73-4efd-a2c4-fc39bfab809d},,application/x-mozilla-static,,necko
+{db340cc2-7f50-4ea3-8427-f529daf6dc87},,application/x-mozilla-static,,satchel
{f6d5ebbd-34f4-487d-9d10-3d34123e3eb9},,application/x-mozilla-static,,tkAutoCompleteModule
{6987230e-0098-4e78-bc5f-1493ee7519fa},,application/x-mozilla-static,,nsWidgetGtk2Module
{f01cb3e7-4ace-414e-a2b7-eaba03e9c86c},,application/x-mozilla-static,,nsUCvMathModule
@@ -309,7 +309,6 @@ rel:nsUpdateService.js,1253014816000
{2002f781-3960-11d3-b3c3-00805f8a6670},,application/x-mozilla-static,,nsChardetModule
{1f34bc80-1bc7-11d6-a384-d705dd0746fc},,application/x-mozilla-static,,nsLayoutModule
{ba61519a-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{35b2656c-4102-4bc1-876a-fd6cb830787b},,application/x-mozilla-static,,nsLayoutModule
{8b042e22-6f87-11d3-b3c8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{4dc30689-929d-425e-a709-082c6294e542},,application/x-mozilla-static,,nsLayoutModule
{ba6151b4-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -340,6 +339,7 @@ rel:nsUpdateService.js,1253014816000
{2d524fdd-ae74-11d3-abf7-0004aceefa51},,application/x-mozilla-static,,nsUConvModule
{aaab6710-0f2c-11d5-a53b-0010a401eb10},,application/x-mozilla-static,,necko
{e9b301c0-e0e4-11d3-a1a8-0050041caf44},,application/x-mozilla-static,,necko
+{23e8fd98-a625-4b08-be1a-f7cc18a5b106},,application/x-mozilla-static,,nsPluginModule
{77cfaaf2-1cf4-11d3-8aaf-00600811a836},,application/x-mozilla-static,,nsUConvModule
{d9b1f97e-cfa0-80b6-fb92-9972e48e3dcc},,application/x-mozilla-static,,nsUConvModule
{929814d6-1dd2-11b2-8e08-82fa0a339b00},,application/x-mozilla-static,,xpconnect
@@ -348,10 +348,9 @@ rel:nsUpdateService.js,1253014816000
{ea06d4e5-2b3d-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUniversalCharDetModule
{2f277c00-0eaf-4ddb-b936-41326ba48aae},,application/x-mozilla-static,,necko
{1423e739-782c-4081-b5d8-fe6fba68c0ef},,application/x-mozilla-static,,necko
-{ecea1b28-ae54-4047-8bbe-c624235106b4},,application/x-mozilla-static,,nsLayoutModule
{0ae53c0f-8ea2-4916-bedc-717443c3e185},,application/x-mozilla-static,,NSS
{0ddf4df8-4dbb-4133-8b79-9afb966514f5},,application/x-mozilla-static,,nsLayoutModule
-{dbfd145d-3298-4f3c-902f-2c5e1a1494ce},,application/x-mozilla-static,,nsImageLib2Module
+{0de2fbfa-6b7f-11d7-bbba-0003938a9d96},,application/x-mozilla-static,,nsLayoutModule
{ba6151ac-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{cb3ede1a-0fa5-4e27-aafe-0f7801e5a1f1},,application/x-mozilla-static,,nsImageLib2Module
{c94f4a30-64d7-11d4-9960-00b0d02354a0},,application/x-mozilla-static,,NSS
@@ -377,7 +376,6 @@ rel:nsUpdateService.js,1253014816000
{ff8c4d10-3194-11d3-9885-006008962422},@mozilla.org/js/xpc/ContextStack;1,application/x-mozilla-static,,xpconnect
{d2800356-c2d7-4e05-a884-79fe566af1cf},,application/x-mozilla-static,,nsUConvModule
{9868b4ce-da08-11d3-8cda-0060b0fc14a3},,application/x-mozilla-static,,necko
-{69bb8313-2d4f-45ec-97e0-d39da58ecce9},,text/javascript,,rel:nsExtensionManager.js
{ba6151b9-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{d9b1f97f-cfa0-80b6-fb92-9972e48e3dcc},,application/x-mozilla-static,,nsUConvModule
{bc54f001-6eb0-4e32-9f49-7e064d8e70ef},,application/x-mozilla-static,,nsAuthModule
@@ -386,6 +384,7 @@ rel:nsUpdateService.js,1253014816000
{62b778a6-bce3-456b-8c31-2865fbb68c91},@mozilla.org/network/idn-service;1,application/x-mozilla-static,nsIDNService,necko
{9416bfb3-1f93-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{6030f7ef-32ed-46a7-9a63-6a5d3f90445f},,application/x-mozilla-static,,nsLayoutModule
+{e7c2aaf5-c11a-4954-9dbf-e28edec1fd91},,application/x-mozilla-static,,nsLayoutModule
{6803cacc-1e3b-11d5-a145-005004832142},,application/x-mozilla-static,,nsUConvModule
{9f6d5d40-90e7-11d3-af80-00a024ffc08c},,application/x-mozilla-static,,docshell_provider
{8b5314bc-db01-11d2-96ce-0060b0fb9956},,application/x-mozilla-static,,nsWidgetGtk2Module
@@ -399,8 +398,8 @@ rel:nsUpdateService.js,1253014816000
{45c23a20-d71c-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{a6cf9112-15b3-11d2-932e-00805f8add32},,application/x-mozilla-static,,nsParserModule
{f916ebfb-78ef-464b-94d0-a6f2ca3200ae},,application/x-mozilla-static,,nsWidgetGtk2Module
-{cc75499a-1dd1-11b2-8a82-ca410ac907b8},,application/x-mozilla-static,,BOOT
{c6e8c44d-9f39-4af7-bcc0-76e38a8310f5},,text/javascript,,rel:nsBrowserGlue.js
+{0e4e7d00-f71a-439f-9178-1a71ff11b55f},,application/x-mozilla-static,,nsLayoutModule
{7b8556b2-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{7c657d13-ec5e-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eea5-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -414,6 +413,7 @@ rel:nsUpdateService.js,1253014816000
{ec693a6f-0832-49dd-877c-89f6552df5de},,application/x-mozilla-static,,NSS
{dccbe7e4-7750-466b-a557-5ea36c8ff24e},,application/x-mozilla-static,,necko
{1f59b001-02c9-11d5-ae76-cc92f7db9e03},,application/x-mozilla-static,,embedcomponents
+{18a03189-067b-4978-b4f1-bafe35292ed6},,text/javascript,,rel:txEXSLTRegExFunctions.js
{ba6151b1-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{47433d1d-d9a7-4954-994f-f7a05cf87c2e},,application/x-mozilla-static,,nsUConvModule
{cb9e0de8-3598-4ed7-857b-827f011ad5d8},,text/javascript,,rel:nsLoginManager.js
@@ -442,7 +442,6 @@ rel:nsUpdateService.js,1253014816000
{12bb8f16-2389-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsChardetModule
{ed394ba0-5472-11d3-bbc8-0000861d1237},,application/x-mozilla-static,,necko
{e638d761-8687-11d2-b530-000000000000},,application/x-mozilla-static,,nsRDFModule
-{54ae32f8-1dd2-11b2-a209-df7c505370f8},,text/javascript,,rel:nsFilePicker.js
{a41661d5-1417-11d5-9882-00c04fa02f40},,application/x-mozilla-static,,docshell_provider
{9e9b565a-8e52-4c1a-8805-b2b91655f874},,application/x-mozilla-static,,nsI18nModule
{057b04d0-0ccf-11d2-beba-00805f8a66dc},,application/x-mozilla-static,,docshell_provider
@@ -468,7 +467,7 @@ rel:nsUpdateService.js,1253014816000
{d6008c40-4dad-11d2-b328-00805f8a3859},,application/x-mozilla-static,,nsLayoutModule
{3a8a3a50-512c-11d4-9a54-000064657374},,application/x-mozilla-static,,nsLayoutModule
{4f91ef2e-57ba-472e-ab7a-b4999e42d6c0},,text/javascript,,rel:FeedConverter.js
-{7ef2f07f-6e34-410b-8336-88acd1cd16b7},,application/x-mozilla-static,,nsLayoutModule
+{54ae32f8-1dd2-11b2-a209-df7c505370f8},,text/javascript,,rel:nsFilePicker.js
{9f6a0d2e-1dd1-11b2-a5b8-951f13c846f7},,application/x-mozilla-static,,nsImageLib2Module
{94f1de09-d0e5-4ca8-94c2-98b049316b7f},,application/x-mozilla-static,,nsSystemPrefModule
{a4557478-ae16-11d5-ba4b-00108303b117},,application/x-mozilla-static,,NSS
@@ -477,14 +476,13 @@ rel:nsUpdateService.js,1253014816000
{fb8cbf4e-4701-4ba1-b1d6-5388e041fb67},,application/x-mozilla-static,,necko
{feca3c34-205e-4ae5-bd1c-03c686ff012b},,application/x-mozilla-static,,nsLayoutModule
{7c657d18-ec5e-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
-{6394eeaa-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
+{f66bc334-1dd1-11b2-bab2-90e04fe15c19},,application/x-mozilla-static,,Browser_Embedding_Module
{a772eee4-0464-405d-a329-a29dfda3791a},,application/x-mozilla-static,,docshell_provider
-{549abb24-7c9d-4aba-915e-7ce0b716b32f},,application/x-mozilla-static,,nsSystemPrefModule
{3a449110-66fd-11d4-9528-0020183bf181},,application/x-mozilla-static,,Browser_Embedding_Module
{6fb0c970-e1b1-11db-8314-0800200c9a66},,application/x-mozilla-native,,rel:libbrowsercomps.so
{b5e65b52-1dd1-11b2-ae8f-f0928ed88482},@mozilla.org/js/xpc/RuntimeService;1,application/x-mozilla-static,,xpconnect
{38d1592e-b81e-432b-86f8-471878bbfe07},,application/x-mozilla-static,,nsImageLib2Module
-{a277189c-1dd1-11b2-a8c9-e4e8bfb1338e},,application/x-mozilla-static,,NSS
+{01e1c3ff-094a-d048-44b4-62d29c7b4f39},,application/x-mozilla-static,,nsLayoutModule
{0fa3158c-d5a7-43de-9181-a285e74cf1d4},,application/x-mozilla-static,,nsUnixProxyModule
{2002f783-3960-11d3-b3c3-00805f8a6670},,application/x-mozilla-static,,nsChardetModule
{6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344},,text/javascript,,rel:nsDefaultCLH.js
@@ -494,24 +492,23 @@ rel:nsUpdateService.js,1253014816000
{ba6151b6-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{cf0f71fd-fafd-4e2b-9fdc-134d972e16e2},,application/x-mozilla-static,,necko
{5fb907e0-1dd2-11b2-a7c0-f14c416a62a1},,application/x-mozilla-static,,NSS
-{f66bc334-1dd1-11b2-bab2-90e04fe15c19},,application/x-mozilla-static,,Browser_Embedding_Module
+{0c797702-1c60-4051-9dd7-4d7405605642},,application/x-mozilla-static,,jsctypes
{13e50d8d-9cee-4ad1-a3a2-4a442fdf7dfa},,application/x-mozilla-static,,nsComposerModule
{a1fde867-e802-11d4-9885-00c04fa0cf4b},,application/x-mozilla-static,,nsLayoutModule
{a578e0a3-f76b-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{f96f5ec9-755b-447e-b1f3-717d1a84bb41},,application/x-mozilla-static,,nsLayoutModule
-{adea1880-1a8e-11d2-a82e-0040959a28c9},,application/x-mozilla-static,,nsPluginModule
+{84e11f80-ca55-11dd-ad8b-0800200c9a66},,application/x-mozilla-native,,rel:libmozgnome.so
{776588a6-86d5-47e2-b6b3-992810078202},,application/x-mozilla-static,,nsUConvModule
{f6913e2e-1dd1-11b2-84be-f455dee342af},,application/x-mozilla-static,,necko
{a6cf9120-15b3-11d2-932e-00805f8add32},,application/x-mozilla-static,,nsI18nModule
+{06aa7c21-fe05-4cf2-b1c4-0c7126a4f713},,application/x-mozilla-static,,nsLayoutModule
{ba61519d-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{d8e716f9-c96e-4e84-ab12-980f5567e2a4},,application/x-mozilla-static,,nsPluginModule
{660d8ca4-f763-11d2-8aad-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eeb7-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{67ba681d-5485-4fff-952c-2ee337ffdcd6},,application/x-mozilla-static,,NSS
+{69bb8313-2d4f-45ec-97e0-d39da58ecce9},,text/javascript,,rel:nsExtensionManager.js
{7b8556a8-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{ba6151a1-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{830b5f80-e2f2-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
-{d92a18c8-234d-49e4-9936-3b7e020c29a2},,text/javascript,,rel:aboutPrivateBrowsing.js
{2d524fdc-ae74-11d3-abf7-0004aceefa51},,application/x-mozilla-static,,nsUConvModule
{cc10c750-9ec3-11d2-b3ae-00805f8a6670},,application/x-mozilla-static,,nsI18nModule
{12bb8f1b-2389-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUniversalCharDetModule
@@ -520,7 +517,7 @@ rel:nsUpdateService.js,1253014816000
{eae599aa-ecef-49c6-a8af-6ddcc6feb484},,application/x-mozilla-static,,NSS
{fcca6f83-9f7d-44e4-a74b-b59433e6c8c3},,application/x-mozilla-static,,nsLayoutModule
{218f2ac0-0a48-11d3-b3ba-00805f8a6670},,application/x-mozilla-static,,nsChardetModule
-{6049b261-c1e6-11d1-a827-0040959a28c9},,application/x-mozilla-static,,nsGfxModule
+{51fa28c7-74c0-4b85-9c46-d03faa7b696b},,application/x-mozilla-static,,necko
{663ca4a8-d219-4000-925d-d8f66406b626},,application/x-mozilla-static,,nsAccessibilityModule
{6394eea2-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{bfd05264-834c-11d2-8eac-00805f29f370},,application/x-mozilla-static,,nsRDFModule
@@ -529,7 +526,6 @@ rel:nsUpdateService.js,1253014816000
{1f1ce501-663a-11d3-b7a0-be426e4e69bc},,application/x-mozilla-static,,appshell
{3f429a14-dffe-417d-8cb8-fdf09bacd09e},,application/x-mozilla-static,,NSS
{a2059c0e-5a58-4c55-ab7c-26f0557546ef},,application/x-mozilla-static,,satchel
-{5d0ce354-df01-421a-83fb-7ead0990c24e},,text/javascript,,rel:nsBrowserContentHandler.js
{a61e6398-2057-40fd-9c81-873b908d24e7},,application/x-mozilla-static,,nsWidgetGtk2Module
{8d995d4f-adcc-4159-b7f1-e94af72eeb88},,application/x-mozilla-static,,BOOT
{2ee3039b-2de4-43d9-93b0-649beacff39a},,application/x-mozilla-static,,tkAutoCompleteModule
@@ -552,7 +548,7 @@ rel:nsUpdateService.js,1253014816000
{5534ddc0-dd96-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{84b0f182-c6c7-11d2-b3b0-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{6394eeaf-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{460a9792-b154-4f26-a922-0f653e2c8f91},,text/javascript,,rel:nsMicrosummaryService.js
+{27aba825-35b5-4018-9fdd-f99250a0e722},,text/javascript,,rel:nsUpdateService.js
{a2027ec6-ba0d-4c72-805d-148233f5f33c},,application/x-mozilla-static,,necko
{ba615199-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{495eca43-0a5c-11d4-a135-005004832142},,application/x-mozilla-static,,nsUConvModule
@@ -564,7 +560,7 @@ rel:nsUpdateService.js,1253014816000
{7bb40992-77eb-43db-9a4e-39d3bcc383ae},,application/x-mozilla-static,,nsParserModule
{8a0dce80-e2f2-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
{a4048e94-1dd1-11b2-a676-8a06c086cc7d},,application/x-mozilla-static,,nsRDFModule
-{ce768990-5a4e-11d2-8164-006008119d7a},,application/x-mozilla-static,,nsPluginModule
+{549abb24-7c9d-4aba-915e-7ce0b716b32f},,application/x-mozilla-static,,nsSystemPrefModule
{815e42e0-72cc-480f-934b-148e33c228a6},,application/x-mozilla-static,,nsAuthModule
{ba6151bb-ec62-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{95f46161-d177-11d2-bf86-00105a1b0627},,application/x-mozilla-static,,nsLayoutModule
@@ -605,7 +601,7 @@ rel:nsUpdateService.js,1253014816000
{fc2389b8-c650-4093-9e42-b05e5f0685b7},,application/x-mozilla-static,,nsWidgetGtk2Module
{58a1c31c-1dd2-11b2-a3f6-d36949d48268},,application/x-mozilla-static,,necko
{c7e410d4-85f2-11d3-9f63-006008a6efe9},,application/x-mozilla-static,,nsJarModule
-{18a03189-067b-4978-b4f1-bafe35292ed6},,text/javascript,,rel:txEXSLTRegExFunctions.js
+{4ca3c946-5408-49f0-9eca-3a97d5c67750},,application/x-mozilla-native,,rel:libbrowsercomps.so
{7b8556b1-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{7ee2a4c0-4b93-17d3-ba18-0060b0f199a2},@mozilla.org/scriptsecuritymanager;1,application/x-mozilla-static,scriptsecuritymanager,nsSecurityManagerModule
{ba6151b3-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -623,7 +619,6 @@ rel:nsUpdateService.js,1253014816000
{518e071f-1dd2-11b2-937e-c45f14def778},,application/x-mozilla-static,,PKI
{f24a14f0-4fa1-11d3-9894-006008962422},,application/x-mozilla-static,,xpconnect
{e35d5067-95bc-4029-8432-e8f1e431148d},,text/javascript,,rel:nsContentDispatchChooser.js
-{82776710-5690-11d3-be36-00104bde6048},,application/x-mozilla-static,,application
{660d8ca1-f763-11d2-8aad-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eeb4-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{14c0e880-623e-11d3-a178-0050041caf44},,application/x-mozilla-static,,necko
@@ -634,14 +629,15 @@ rel:nsUpdateService.js,1253014816000
{47cd0651-b1be-4a0f-b5c4-10e5a573ef71},,text/javascript,,rel:nsBrowserContentHandler.js
{e91f9440-e076-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
{06beec76-a183-4d9f-85dd-085f26da565a},,application/x-mozilla-static,,nsWidgetGtk2Module
-{12ff56ec-58be-402c-b057-01f961de969b},,application/x-mozilla-native,,rel:libbrowsercomps.so
-{6394eeba-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
+{8a115faa-7dcb-4e8f-979b-5f53472f51cf},,text/javascript,,rel:nsExtensionManager.js
+{fd9a9e8a-a77b-496a-b7bb-263df9715149},,application/x-mozilla-static,,nsImageLib2Module
+{460a9792-b154-4f26-a922-0f653e2c8f91},,text/javascript,,rel:nsMicrosummaryService.js
{e7f70966-9a37-48d7-8aeb-35998f31090e},,application/x-mozilla-static,,nsToolkitCompsModule
{a0ccaaf8-09da-44d8-b250-9ac3e93c8117},,application/x-mozilla-static,,nsToolkitCompsModule
{21dd6a03-413c-11d3-b3c3-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{dbded6ec-edbf-4054-a834-287b82c260f9},,text/javascript,,rel:nsBadCertHandler.js
+{ecba5203-77da-465a-865e-78b7af10d8f7},,application/x-mozilla-static,,nsWidgetGtk2Module
{5551a1e0-5a66-11d3-806a-00600811a9c3},,application/x-mozilla-static,,application
-{27aba825-35b5-4018-9fdd-f99250a0e722},,text/javascript,,rel:nsUpdateService.js
+{50e95301-17a8-11d4-9f7e-dd530d5f057c},,application/x-mozilla-static,,nsComposerModule
{6c3c274b-4cbf-4bb5-a635-05ad2cbb6535},,application/x-mozilla-static,,docshell_provider
{25029490-f132-11d2-9588-00805f369f95},,application/x-mozilla-static,,necko
{30dcd313-73e1-447d-8339-37744952154e},,application/x-mozilla-static,,nsUConvModule
@@ -650,7 +646,7 @@ rel:nsUpdateService.js,1253014816000
{ac2bb8fe-eeeb-4572-b40f-be03932b56e0},,application/x-mozilla-static,,nsImageLib2Module
{4ea60761-31d6-491d-9e34-4b53a26c416c},,application/x-mozilla-static,,NSS
{aa40253b-4c42-4056-8132-37bcd07862fd},,application/x-mozilla-static,,nsLayoutModule
-{4e4aae11-8901-46cc-8217-dad7c5415873},,application/x-mozilla-static,,embedcomponents
+{baa34652-f1f1-4185-b224-244ee82a413a},,application/x-mozilla-static,,nsLayoutModule
{fbc81170-1f69-11d3-9344-00104ba0fd40},@mozilla.org/network/protocol;1?name=file,application/x-mozilla-static,nsFileProtocolHandler,necko
{a0d6ad32-1dd1-11b2-aa55-a40187b54036},,application/x-mozilla-static,,necko
{984e3259-9266-49cf-b605-60b022a00756},,application/x-mozilla-static,,nsPlacesModule
@@ -659,6 +655,7 @@ rel:nsUpdateService.js,1253014816000
{0a5cd734-eb65-4d14-88a0-9f0bb2aba206},,application/x-mozilla-static,,nsRDFModule
{749e62f4-60ae-4569-a8a2-de78b649660e},,text/javascript,,rel:nsLoginManagerPrompter.js
{9a28ffa7-e6ef-4b52-a127-6ad951de8e9b},,application/x-mozilla-native,,rel:libbrowsercomps.so
+{77da64d3-7458-4920-9491-86cc9914f904},,text/javascript,,rel:NetworkGeolocationProvider.js
{2d96b3df-c051-11d1-a827-0040959a28c9},,application/x-mozilla-static,,nsWidgetGtk2Module
{a6cf9115-15b3-11d2-932e-00805f8add32},,application/x-mozilla-static,,nsGfxModule
{5c337258-a580-472e-8615-f277ddc5bb06},,application/x-mozilla-static,,nsWidgetGtk2Module
@@ -693,9 +690,8 @@ rel:nsUpdateService.js,1253014816000
{a33982d3-1adf-4162-9941-f734bc45e4ed},,application/x-mozilla-static,,nsComposerModule
{7b8556aa-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{bd6390c8-fbea-11d4-98f6-001083010e9b},,application/x-mozilla-static,,docshell_provider
-{a6cf9059-15b3-11d2-932e-00805f8add32},,application/x-mozilla-static,,docshell_provider
{c375fa80-150f-11d6-a618-0010a401eb10},,application/x-mozilla-static,,necko
-{51fa28c7-74c0-4b85-9c46-d03faa7b696b},,application/x-mozilla-static,,necko
+{660d8ca3-f763-11d2-8aad-00600811a836},,application/x-mozilla-static,,nsUConvModule
{d750a964-2d14-484c-b3aa-8ed7823b5c7b},,application/x-mozilla-static,,nsLayoutModule
{f57899d0-4e2c-4ac6-9e29-50c736103b0c},,text/javascript,,rel:nsSetDefaultBrowser.js
{786e0a0e-e035-4600-8ee0-365a63a80b80},,application/x-mozilla-static,,nsToolkitCompsModule
@@ -725,7 +721,7 @@ rel:nsUpdateService.js,1253014816000
{7e6e57c0-e2f2-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
{ea06d4e3-2b3d-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUniversalCharDetModule
{5871a422-1dd2-11b2-ab3f-e2e56be5da9c},,application/x-mozilla-static,,nsImageLib2Module
-{0e4e7d00-f71a-439f-9178-1a71ff11b55f},,application/x-mozilla-static,,nsLayoutModule
+{15629ada-a41c-4a09-961f-6553cd60b1a2},,application/x-mozilla-static,,necko
{e197cc01-cfe1-11d4-8eb0-87ae406dfd3f},,application/x-mozilla-static,,nsLayoutModule
{2ea2e7d0-4095-11d3-9144-006008a6edf6},,application/x-mozilla-static,,nsI18nModule
{dd156d62-d26f-4441-9cdb-e8f09107c273},,application/x-mozilla-static,,nsSecurityManagerModule
@@ -734,12 +730,11 @@ rel:nsUpdateService.js,1253014816000
{96ec4163-efc8-407a-8735-007fb26be4e8},,application/x-mozilla-static,,nsAuthModule
{e38e53b9-5bb0-456a-b553-579370cb1567},,application/x-mozilla-static,,xpconnect
{a6cf90e3-15b3-11d2-932e-00805f8add32},,application/x-mozilla-static,,nsLayoutModule
-{89e9da80-4c03-46a0-a357-cf77bbef98b9},,text/javascript,,rel:aboutRights.js
{d164e770-4157-11d4-9a42-000064657374},,application/x-mozilla-static,,nsLayoutModule
{2d524fd6-ae74-11d3-abf7-0004aceefa51},,application/x-mozilla-static,,nsUConvModule
{78481e4a-50e4-4489-b68a-ef82670ed63f},,application/x-mozilla-native,,rel:libbrowsercomps.so
{301dea42-6850-4cda-8945-81f7dbc2186b},,application/x-mozilla-static,,necko
-{b322a5c0-a419-484e-96ba-d7182163899f},,text/javascript,,rel:nsUpdateService.js
+{b322a5c0-a419-484e-96ba-d7182163899f},,text/javascript,,rel:nsUpdateTimerManager.js
{9c47c121-1c6e-4d8f-b904-3ac968116e88},,application/x-mozilla-static,,docshell_provider
{8b449142-1eab-4bfa-9830-fab6ebb09774},,application/x-mozilla-static,,nsLayoutModule
{6bd13476-1dd2-11b2-bbef-f0ccb5fa64b6},@mozilla.org/moz/jsloader;1,application/x-mozilla-static,JS component loader,xpconnect
@@ -759,7 +754,7 @@ rel:nsUpdateService.js,1253014816000
{cf3a0e06-1dd1-11b2-a904-ac1d6da77a02},,application/x-mozilla-static,,necko
{e09e4ca6-276b-4bb4-8b71-0635a3a2a007},,text/javascript,,rel:storage-Legacy.js
{56c778e4-1bee-45f3-a689-886692a97fe7},,application/x-mozilla-static,,mozSpellCheckerModule
-{fd9a9e8a-a77b-496a-b7bb-263df9715149},,application/x-mozilla-static,,nsImageLib2Module
+{ec06f3fc-70db-4ecd-94e0-a6e91ca44d8a},,application/x-mozilla-static,,docshell_provider
{7bd05c78-6a26-11d7-b16f-0003938a9d96},,application/x-mozilla-static,,nsLayoutModule
{6394eebe-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{7b8556af-ec79-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
@@ -776,6 +771,7 @@ rel:nsUpdateService.js,1253014816000
{aa13e4a0-a5ac-11d2-9119-006008a6edf6},,application/x-mozilla-static,,nsI18nModule
{7c657d17-ec5e-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{6394eea9-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
+{229fa115-9412-4d32-baf3-2fc407f76fb1},,text/javascript,,rel:FeedConverter.js
{66354bc9-7ed1-4692-ae1d-8da97d6b205e},,text/javascript,,rel:nsBlocklistService.js
{171e72db-0f8a-412a-8461-e4c927a3a2ac},,application/x-mozilla-static,,nsComposerModule
{ef565d0a-ab9a-4a13-9160-0644cdfd859a},,application/x-mozilla-static,,nsCookieModule
@@ -783,8 +779,8 @@ rel:nsUpdateService.js,1253014816000
{5e8d4751-1852-434b-a992-2c6d2a25fa46},,application/x-mozilla-static,,nsPlacesModule
{ecd55a01-2780-11d5-a73c-ca641a6813bc},,application/x-mozilla-static,,embedcomponents
{2002f782-3960-11d3-b3c3-00805f8a6670},,application/x-mozilla-static,,nsChardetModule
+{c11c21b2-71c9-4f87-a0f8-5e13f50495fd},,text/javascript,,rel:nsFormAutoComplete.js
{8227f019-afc7-461e-b030-9f185d7a0e29},,application/x-mozilla-static,,mozSpellCheckerModule
-{7c65e6f0-7605-11dd-ad8b-0800200c9a66},,text/javascript,,rel:aboutSessionRestore.js
{1d40026b-4c44-4f6f-b158-26bb5e9c65e9},,application/x-mozilla-static,,nsLayoutModule
{e28ab250-d66d-11d2-8aac-00600811a836},,application/x-mozilla-static,,nsUConvModule
{ba6151b5-1dfa-11d3-b3bf-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
@@ -799,8 +795,7 @@ rel:nsUpdateService.js,1253014816000
{6803cac8-1e3b-11d5-a145-005004832142},,application/x-mozilla-static,,nsUConvModule
{758e4f20-e2f2-11d3-b32f-004005a7a7e4},,application/x-mozilla-static,,nsUCvMathModule
{6394eea1-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
-{ec06f3fc-70db-4ecd-94e0-a6e91ca44d8a},,application/x-mozilla-static,,docshell_provider
-{660d8ca3-f763-11d2-8aad-00600811a836},,application/x-mozilla-static,,nsUConvModule
+{6049b261-c1e6-11d1-a827-0040959a28c9},,application/x-mozilla-static,,nsGfxModule
{6394eeb6-fc3d-11d2-b3b8-00805f8a6670},,application/x-mozilla-static,,nsUConvModule
{bd57cee8-1dd1-11b2-9fe7-95cf4709aea3},,application/x-mozilla-static,,nsWidgetGtk2Module
{9c0ff6f4-deda-40e5-806c-b6cc449c21ce},,application/x-mozilla-static,,nsUConvModule
@@ -810,10 +805,10 @@ rel:nsUpdateService.js,1253014816000
{430d416c-a722-4ad1-be98-d9a445f85e3f},,application/x-mozilla-static,,ZipWriterModule
{245abae2-b947-4ded-a46d-9829d3cca462},,application/x-mozilla-static,,nsJarModule
{cb9abbae-66b6-4609-8594-5c4ff300888e},,application/x-mozilla-static,,necko
-{38e7ef10-58df-11d2-8164-006008119d7a},,application/x-mozilla-static,,nsCJVMManagerModule
+{82776710-5690-11d3-be36-00104bde6048},,application/x-mozilla-static,,application
{2c3837af-8b85-4a68-b0d8-0aed88985b32},,application/x-mozilla-static,,NSS
{23bcc750-dc20-460b-b2d4-74d8f58d3615},,application/x-mozilla-static,,CommandLineModule
-{6049b260-c1e6-11d1-a827-0040959a28c9},,application/x-mozilla-static,,nsGfxModule
+{cc75499a-1dd1-11b2-8a82-ca410ac907b8},,application/x-mozilla-static,,BOOT
{dbfcbe4a-10f7-4d6f-a481-68e6d6b71d21},,application/x-mozilla-static,,NSS
{c744ca3d-840b-460a-8d70-7ce63c51c958},,application/x-mozilla-static,,nsWindowDataSourceModule
{be65e2b7-fe46-4e0f-88e0-4b385db4d68a},,application/x-mozilla-static,,NSS
@@ -831,7 +826,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/network/effective-tld-service;1,{cb9abbae-66b6-4609-8594-5c4ff300888e}
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-greek,{7b8556b1-ec79-11d2-8aac-00600811a836}
@mozilla.org/extensions/addon-repository;1,{8eaaf524-7d6d-4f7d-ae8b-9277b324008d}
-@mozilla.org/oji/jvm-mgr;1,{38e7ef10-58df-11d2-8164-006008119d7a}
@mozilla.org/inspector/dom-utils;1,{40b22006-5dd5-42f2-bfe7-7dbf0757ab8b}
@mozilla.org/xtf/xml-contentbuilder;1,{e09af32d-2a54-4d76-9ef0-3070e83f8be7}
@mozilla.org/intl/unicharcategory;1,{748a1132-671a-409a-8d1d-f1cdf6b3a6b4}
@@ -844,14 +838,13 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/network/protocol/about;1?what=config,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/network/sync-stream-listener;1,{439400d3-6f23-43db-8b06-8aafe1869bd8}
@mozilla.org/intl/unicode/decoder;1?charset=x-viet-tcvn5712,{6394eead-fc3d-11d2-b3b8-00805f8a6670}
-@mozilla.org/download-manager-ui;1,{7dfdf0d1-aff6-4a34-bad1-d0fe74601642}
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-arabic,{6803cac7-1e3b-11d5-a145-005004832142}
@mozilla.org/url-classifier/streamupdater;1,{c2be6dc0-ef1e-4abd-86a2-4f864ddc57f6}
@mozilla.org/xmlextras/domparser;1,{3a8a3a50-512c-11d4-9a54-000064657374}
-@mozilla.org/oji/jvm-config-mgr;1,{4a68cee9-6f07-4950-b441-a1ce6a082e2f}
@mozilla.org/streamconv;1?from=x-compress&to=uncompressed,{66230b2b-17fa-4bd3-abf4-07986151022d}
@mozilla.org/network/protocol-proxy-service;1,{e9b301c0-e0e4-11d3-a1a8-0050041caf44}
@mozilla.org/storage/service;1,{bbbb1d61-438f-4436-92ed-8308e5830fb0}
+@mozilla.org/image/decoder;2?type=image/icon,{ffc08380-256c-11d5-9905-001083010e9b}
@mozilla.org/widget/clipboardhelper;1,{77221d5a-1dd2-11b2-8c69-c710f15d2ed5}
@mozilla.org/network/server-socket;1,{2ec62893-3b35-48fa-ab1d-5e68a9f45f08}
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-14,{6394eeb1-fc3d-11d2-b3b8-00805f8a6670}
@@ -871,6 +864,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/image/decoder;2?type=image/jpg,{5871a422-1dd2-11b2-ab3f-e2e56be5da9c}
@mozilla.org/security/crlmanager;1,{5b256c10-22d8-4109-af92-1253035e9fcb}
@mozilla.org/layout/contentserializer;1?mimetype=image/svg+xml,{4aef38b7-6364-4e23-a5e7-12f837fbbd9c}
+@mozilla.org/login-manager/storage/mozStorage;1,{8c2023b9-175c-477e-9761-44ae7b549756}
@mozilla.org/network/mime-input-stream;1,{58a1c31c-1dd2-11b2-a3f6-d36949d48268}
@mozilla.org/intl/unicode/decoder;1?charset=UTF-8,{5534ddc0-dd96-11d2-8aac-00600811a836}
@mozilla.org/dom/storage;1,{8b449142-1eab-4bfa-9830-fab6ebb09774}
@@ -897,6 +891,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/layout/documentEncoder;1?type=application/xml,{e7ba1480-1dea-11d3-830f-00104bed045e}
@mozilla.org/image/decoder;2?type=image/gif,{797bec5a-1dd2-11b2-a7f8-ca397e0179c4}
@mozilla.org/intl/texttosuburi;1,{8b042e22-6f87-11d3-b3c8-00805f8a6670}
+@mozilla.org/network/http-activity-distributor;1,{15629ada-a41c-4a09-961f-6553cd60b1a2}
@mozilla.org/network/protocol/about;1?what=buildconfig,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/widget/htmlformatconverter;1,{948a0023-e3a7-11d2-96cf-0060b0fb9956}
@mozilla.org/intl/unicode/encoder;1?charset=Shift_JIS,{e28ab250-d66d-11d2-8aac-00600811a836}
@@ -904,6 +899,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/streamconv;1?from=application/http-index-format&to=text/html,{cf0f71fd-fafd-4e2b-9fdc-134d972e16e2}
@mozilla.org/network/stream-transport-service;1,{0885d4f8-f7b8-4cda-902e-94ba38bc256e}
@mozilla.org/js/xpc/RuntimeService;1,{b5e65b52-1dd1-11b2-ae8f-f0928ed88482}
+@mozilla.org/updates/update-service-stub;1,{e43b0010-04ba-4da6-b523-1f92580bc150}
@mozilla.org/network/binary-detector;1,{a2027ec6-ba0d-4c72-805d-148233f5f33c}
@mozilla.org/intl/charsetalias;1,{98d41c21-ccf3-11d2-b3b1-00805f8a6670}
@mozilla.org/browser/favicon-service;1,{984e3259-9266-49cf-b605-60b022a00756}
@@ -925,6 +921,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/unicode/encoder;1?charset=x-mathematica3,{830b5f80-e2f2-11d3-b32f-004005a7a7e4}
@mozilla.org/intl/unicode/decoder;1?charset=Big5-HKSCS,{ba6151bb-ec62-11d2-8aac-00600811a836}
@mozilla.org/security/psmdownload;1,{c94f4a30-64d7-11d4-9960-00b0d02354a0}
+@mozilla.org/image/container;2,{376ff2c1-9bf6-418a-b143-3340c00112f7}
@mozilla.org/embedcomp/find;1,{57cf9383-3405-11d5-be5b-aa20fa2cf37c}
@mozilla.org/autocomplete/controller;1,{f6d5ebbd-34f4-487d-9d10-3d34123e3eb9}
@mozilla.org/network/unichar-stream-loader;1,{9445791f-fa4c-4669-b174-df5032bb67b3}
@@ -952,18 +949,18 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/editor/txtsrvfilter;1,{171e72db-0f8a-412a-8461-e4c927a3a2ac}
@mozilla.org/nsDOMCryptoDialogs;1,{518e071f-1dd2-11b2-937e-c45f14def778}
@mozilla.org/intl/unicode/decoder;1?charset=armscii-8,{6394eeac-fc3d-11d2-b3b8-00805f8a6670}
-@mozilla.org/image/decoder;2?type=image/icon,{ffc08380-256c-11d5-9905-001083010e9b}
+@mozilla.org/jsctypes;1,{0c797702-1c60-4051-9dd7-4d7405605642}
@mozilla.org/intl/unicode/encoder;1?charset=windows-874,{6394eeb4-fc3d-11d2-b3b8-00805f8a6670}
@mozilla.org/network/protocol;1?name=resource,{e64f152a-9f07-11d3-8cda-0060b0fc14a3}
@mozilla.org/updates/update-manager;1,{093c2356-4843-4c65-8709-d7dbcbbe7dfb}
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-3,{660d8ca5-f763-11d2-8aad-00600811a836}
+@mozilla.org/accelerometer;1,{ecba5203-77da-465a-865e-78b7af10d8f7}
@mozilla.org/network/url-parser;1?auth=yes,{275d800e-3f60-4896-adb7-d7f390ce0e42}
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-8-I,{495eca48-0a5c-11d4-a135-005004832142}
@mozilla.org/embedcomp/cookieprompt-service;1,{ce002b28-92b7-4701-8621-cc925866fb87}
@mozilla.org/intl/unicode/encoder;1?charset=x-zapf-dingbats,{21dd6a03-413c-11d3-b3c3-00805f8a6670}
@mozilla.org/network/idn-service;1,{62b778a6-bce3-456b-8c31-2865fbb68c91}
-@mozilla.org/intl/unicode/decoder;1?charset=x-mac-ukrainian,{6394eeaa-fc3d-11d2-b3b8-00805f8a6670}
-@mozilla.org/gfx/image/frame;2,{aa699204-1dd1-11b2-84a9-a280c268e4fb}
+@mozilla.org/updates/update-checker;1,{898cdc9b-e43f-422f-9cc4-2f6291b415a3}
@mozilla.org/network/input-stream-channel;1,{6ddb050c-0d04-11d4-986e-00c04fa0cf4a}
@mozilla.org/microsummary/service;1,{460a9792-b154-4f26-a922-0f653e2c8f91}
@mozilla.org/toolkit/app-startup;1,{7dd4d320-c84b-4624-8d45-7bb9b2356977}
@@ -1032,7 +1029,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-ce,{7b8556b0-ec79-11d2-8aac-00600811a836}
@mozilla.org/permissionmanager;1,{4f6b5e00-0c36-11d5-a535-0010a401eb10}
@mozilla.org/toolkit/crash-reporter;1,{95d89e3e-a169-41a3-8e56-719978e15b12}
-@mozilla.org/DOM/Level2/CSS/computedStyleDeclaration;1,{ecea1b28-ae54-4047-8bbe-c624235106b4}
@mozilla.org/safebrowsing/application;1,{c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5}
@mozilla.org/network/application-cache-namespace;1,{b00ed78a-04e2-4f74-8e1c-d1af79dfd12f}
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-8,{660d8ca9-f763-11d2-8aad-00600811a836}
@@ -1040,6 +1036,8 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/accessibleRetrieval;1,{663ca4a8-d219-4000-925d-d8f66406b626}
@mozilla.org/intl/stringcharsetdetect;1?type=cjk_parallel_state_machine,{fcacef22-2b40-11d3-b3bf-00805f8a6670}
@mozilla.org/js/jsd/debugger-service;1,{f1299dc2-1dd1-11b2-a347-ee6b7660e048}
+@mozilla.org/docshell;1,{f1eac762-87e9-11d3-af80-00a024ffc08c}
+@mozilla.org/appshell/trytoclose;1,{b69155f4-a8bf-453d-8653-91d1456e1d3d}
@mozilla.org/image/encoder;2?type=image/png,{38d1592e-b81e-432b-86f8-471878bbfe07}
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-cyrillic,{6394eeb9-fc3d-11d2-b3b8-00805f8a6670}
@mozilla.org/gfx/devicecontextspec;1,{d3f69889-e13a-4321-980c-a39332e21f34}
@@ -1075,7 +1073,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/layout/xul-boxobject-container;1,{dca9d7c3-7b6a-4490-ad6d-2699a8d683cd}
@mozilla.org/streamconv;1?from=multipart/mixed&to=*/*,{7584ce90-5b25-11d3-a175-0050041caf44}
@mozilla.org/network/auth-module;1?name=kerb-gss,{dc8e21a0-03e4-11da-8cd6-0800200c9a66}
-@mozilla.org/layout/contentserializer;1?mimetype=application/xhtml+xml,{4aef38b7-6364-4e23-a5e7-12f837fbbd9c}
+@mozilla.org/layout/contentserializer;1?mimetype=application/xhtml+xml,{e7c2aaf5-c11a-4954-9dbf-e28edec1fd91}
@mozilla.org/appshell/appShellService;1,{0099907d-123c-4853-a46a-43098b5fb68c}
@mozilla.org/network/protocol/about;1?what=mozilla,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/js/jsd/app-start-observer;2,{2fd6b7f6-eb8c-4f32-ad26-113f2c02d0fe}
@@ -1084,12 +1082,13 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/browser/search-service;1,{7319788a-fe93-4db3-9f39-818cf08f4256}
@mozilla.org/intl/unicode/decoder;1?charset=gb18030,{a59da935-4091-11d5-a145-005004832142}
@mozilla.org/browser/feeds/sniffer;1,{06893e69-71d8-4b23-81eb-80314daf3e66}
-@mozilla.org/image/decoder;2?type=image/xbm,{dbfd145d-3298-4f3c-902f-2c5e1a1494ce}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-greek,{7b8556a3-ec79-11d2-8aac-00600811a836}
+@mozilla.org/system-alerts-service;1,{84e11f80-ca55-11dd-ad8b-0800200c9a66}
@mozilla.org/network/protocol/about;1?what=logo,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/intl/unicode/encoder;1?charset=T.61-8bit,{ba6151af-1dfa-11d3-b3bf-00805f8a6670}
+@mozilla.org/login-manager/loginInfo;1,{0f2f347c-1e4f-40cc-8efd-792dea70a85e}
@mozilla.org/intl/unicode/decoder;1?charset=T.61-8bit,{ba6151b4-1dfa-11d3-b3bf-00805f8a6670}
-@mozilla.org/plugin/manager;1,{ce768990-5a4e-11d2-8164-006008119d7a}
+@mozilla.org/embedcomp/appstartup-notifier;1,{1f59b001-02c9-11d5-ae76-cc92f7db9e03}
@mozilla.org/intl/unicode/encoder;1?charset=IBM855,{2d524fd8-ae74-11d3-abf7-0004aceefa51}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-ce,{7b8556a2-ec79-11d2-8aac-00600811a836}
@mozilla.org/rdf/datasource;1?name=composite-datasource,{e638d761-8687-11d2-b530-000000000000}
@@ -1104,8 +1103,8 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/layout/contentserializer;1?mimetype=text/plain,{6030f7ef-32ed-46a7-9a63-6a5d3f90445f}
@mozilla.org/inspector/dom-view;1,{fb5c1775-1bbd-4b9c-abb0-ae7acd29e87e}
@mozilla.org/embeddor.implemented/web-content-handler-registrar;1,{792a7e82-06a0-437c-af63-b2d12e808acc}
-@mozilla.org/network/protocol/about;1?what=blocked,{c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5}
@mozilla.org/offlinecacheupdate;1,{e56f5e01-c7cc-4675-a9d7-b8f1e4127295}
+@mozilla.org/geolocation;1,{01e1c3ff-094a-d048-44b4-62d29c7b4f39}
@mozilla.org/embedcomp/controller-command-table;1,{670ee5da-6ad5-11d7-9950-000393636592}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-roman,{7b8556a1-ec79-11d2-8aac-00600811a836}
@mozilla.org/image/request;1,{20557898-1dd2-11b2-8f65-9c462ee2bc95}
@@ -1141,7 +1140,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/content/style-sheet-service;1,{fcca6f83-9f7d-44e4-a74b-b59433e6c8c3}
@mozilla.org/uriloader/content-handler;1?type=image/png,{5d0ce354-df01-421a-83fb-7ead0990c24e}
@mozilla.org/chrome/chrome-registry;1,{47049e42-1d87-482a-984d-56ae185e367a}
-@mozilla.org/appshell/trytoclose;1,{b69155f4-a8bf-453d-8653-91d1456e1d3d}
+@mozilla.org/network/protocol;1?name=feed,{4f91ef2e-57ba-472e-ab7a-b4999e42d6c0}
@mozilla.org/image/decoder;2?type=image/x-png,{36fa00c2-1dd2-11b2-be07-d16eeb4c50ed}
@mozilla.org/cookieService;1,{c375fa80-150f-11d6-a618-0010a401eb10}
@mozilla.org/principal;1,{36102b6b-7b62-451a-a1c8-a0d456c92dc5}
@@ -1182,7 +1181,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/transformiix-nodeset;1,{5d5d92cd-6bf8-11d9-bf4a-000a95dc234c}
@mozilla.org/uriloader/content-handler;1?type=image/svg+xml,{5d0ce354-df01-421a-83fb-7ead0990c24e}
@mozilla.org/updates/update-prompt;1,{27aba825-35b5-4018-9fdd-f99250a0e722}
-@mozilla.org/uriloader/content-handler;1?type=image/x-xbitmap,{5d0ce354-df01-421a-83fb-7ead0990c24e}
@mozilla.org/intl/unicode/decoder;1?charset=UTF-32BE,{ba6151b3-1dfa-11d3-b3bf-00805f8a6670}
@mozilla.org/intl/nslocaleservice;1,{c8e518c1-47ae-11d3-91cd-00105aa3f7dc}
@mozilla.org/rdf/content-sink;1,{0958b101-9ada-11d2-8ebc-00805f29f370}
@@ -1202,7 +1200,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/browser/httpindex-service;1,{2587e382-1324-11d4-a652-eadbb2be3484}
@mozilla.org/gfx/fontmetrics;1,{6049b263-c1e6-11d1-a827-0040959a28c9}
@mozilla.org/intl/stringcharsetdetect;1?type=ukprob,{2002f784-3960-11d3-b3c3-00805f8a6670}
-@mozilla.org/focus-event-suppressor-service;1,{35b2656c-4102-4bc1-876a-fd6cb830787b}
+@mozilla.org/network/protocol/about;1?what=blocked,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/widget/native-key-bindings;1?type=editor,{f916ebfb-78ef-464b-94d0-a6f2ca3200ae}
@mozilla.org/js/xpc/ContextStackIterator;1,{05bae29d-8aef-486d-84aa-53f48f146811}
@mozilla.org/browser/session-history-entry;1,{bfd1a791-ad9f-11d3-bdc7-0050040a9b44}
@@ -1254,15 +1252,13 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/pref-relativefile;1,{2f977d4f-5485-11d4-87e2-0010a4e75ef2}
@mozilla.org/gfx/printsession;1,{2f977d53-5485-11d4-87e2-0010a4e75ef2}
@mozilla.org/mime;1,{a7f800e0-4306-11d4-98d0-001083010e9b}
-@mozilla.org/image/decoder;2?type=image/x-xbitmap,{dbfd145d-3298-4f3c-902f-2c5e1a1494ce}
+@mozilla.org/browser/global-history;2,{88cecbb7-6c63-4b3b-8cd4-84f3b8228c69}
@mozilla.org/intl/unicode/encoder;1?charset=windows-1258,{6394eeb3-fc3d-11d2-b3b8-00805f8a6670}
-@mozilla.org/webshell;1,{a6cf9059-15b3-11d2-932e-00805f8add32}
@mozilla.org/intl/charsetdetectionadaptor;1,{12bb8f17-2389-11d3-b3bf-00805f8a6670}
@mozilla.org/intl/unicode/encoder;1?charset=VISCII,{6394eebf-fc3d-11d2-b3b8-00805f8a6670}
@mozilla.org/profile/migrator;1?app=browser&type=phoenix,{78481e4a-50e4-4489-b68a-ef82670ed63f}
@mozilla.org/intl/unicode/encoder;1?charset=Big5-HKSCS,{ba6151bc-ec62-11d2-8aac-00600811a836}
@mozilla.org/streamconv;1?from=deflate&to=uncompressed,{66230b2b-17fa-4bd3-abf4-07986151022d}
-@mozilla.org/oji/jvm-auth-tools;1,{d8e716f9-c96e-4e84-ab12-980f5567e2a4}
@mozilla.org/layout/htmlsanitizer;1,{feca3c34-205e-4ae5-bd1c-03c686ff012b}
@mozilla.org/cookiemanager;1,{aaab6710-0f2c-11d5-a53b-0010a401eb10}
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-2,{7b8556a6-ec79-11d2-8aac-00600811a836}
@@ -1275,7 +1271,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/wbrk;1,{2bf64765-997f-450d-af96-3028d1a902b0}
@mozilla.org/charset-converter-manager;1,{3c1c0163-9bd0-11d3-9d09-0050040007b2}
@mozilla.org/security/streamcipher;1,{dbfcbe4a-10f7-4d6f-a481-68e6d6b71d21}
-@mozilla.org/login-manager/loginInfo;1,{0f2f347c-1e4f-40cc-8efd-792dea70a85e}
+@mozilla.org/eventlistenerservice;1,{baa34652-f1f1-4185-b224-244ee82a413a}
@mozilla.org:/content/content-area-dragdrop;1,{1f34bc80-1bc7-11d6-a384-d705dd0746fc}
@mozilla.org/layout/documentEncoder;1?type=text/html,{e7ba1480-1dea-11d3-830f-00104bed045e}
@mozilla.org/rdf/rdf-service;1,{bfd05264-834c-11d2-8eac-00805f29f370}
@@ -1291,7 +1287,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/embedcomp/base-command-controller;1,{bf88b48c-fd8e-40b4-ba36-c7c3ad6d8ac9}
@mozilla.org/intl/unicode/decoder;1?charset=IBM864i,{2d524fdc-ae74-11d3-abf7-0004aceefa51}
@mozilla.org/wifi/monitor;1,{3ff8fb9f-ee63-48df-89f0-dace0242fd82}
-@mozilla.org/plugin/host;1,{adea1880-1a8e-11d2-a82e-0040959a28c9}
+@mozilla.org/plugin/host;1,{23e8fd98-a625-4b08-be1a-f7cc18a5b106}
@mozilla.org/embedcomp/command-params;1,{f7fa4581-238e-11d5-a73c-ab64fb68f2bc}
@mozilla.org/uriloader/content-handler;1?type=text/xml,{5d0ce354-df01-421a-83fb-7ead0990c24e}
@mozilla.org/intl/unicode/encoder;1?charset=IBM857,{2d524fd9-ae74-11d3-abf7-0004aceefa51}
@@ -1309,7 +1305,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/filepicker;1,{bd57cee8-1dd1-11b2-9fe7-95cf4709aea3}
@mozilla.org/accessibilityService;1,{de401c37-9a7f-4278-a6f8-3de2833989ef}
@mozilla.org/xml/xpointer;1?scheme=xpath1,{0c351177-0159-4500-86b0-a219dfde4258}
-@mozilla.org/network/protocol/about;1?what=sessionrestore,{7c65e6f0-7605-11dd-ad8b-0800200c9a66}
+@mozilla.org/network/protocol/about;1?what=sessionrestore,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-gurmukhi,{6803cace-1e3b-11d5-a145-005004832142}
@mozilla.org/intl/unicode/encoder;1?charset=windows-1250,{7b8556aa-ec79-11d2-8aac-00600811a836}
@mozilla.org/intl/unicode/decoder;1?charset=ISO-8859-16,{a0f827e1-8ab6-11d5-a14b-005004832142}
@@ -1325,10 +1321,11 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/content/namespacemanager;1,{d9783472-8fe9-11d2-9d3c-0060088f9ff7}
@mozilla.org/rdf/datasource;1?name=xml-datasource,{7baf62e0-8e61-11d2-8eb1-00805f29f370}
@mozilla.org/uriloader/content-handler;1?type=image/jpeg,{5d0ce354-df01-421a-83fb-7ead0990c24e}
+@mozilla.org/embedding/browser/nsWebBrowser;1,{f1eac761-87e9-11d3-af80-00a024ffc08c}
@mozilla.org/network/proxy-auto-config;1,{63ac8c66-1dd2-11b2-b070-84d00d3eaece}
@mozilla.org/system-preferences;1,{549abb24-7c9d-4aba-915e-7ce0b716b32f}
@mozilla.org/systemprincipal;1,{4a6212db-accb-11d3-b765-0060b0b6cecb}
-@mozilla.org/intl/unicode/encoder;1?charset=x-mac-ukrainian,{6394eeba-fc3d-11d2-b3b8-00805f8a6670}
+@mozilla.org/network/protocol/about;1?what=neterror,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/login-manager/storage/legacy;1,{e09e4ca6-276b-4bb4-8b71-0635a3a2a007}
@mozilla.org/streamconv;1?from=uncompressed&to=x-gzip,{461cd5dd-73c6-47a4-8cc3-603b37d84a61}
@mozilla.org/network/incremental-download;1,{a62af1ba-79b3-4896-8aaf-b148bfce4280}
@@ -1340,7 +1337,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/no-data-protocol-content-policy;1,{ac9e3e82-bfbd-4f26-941e-f58c8ee178c1}
@mozilla.org/libjar/zip-reader;1,{7526a738-9632-11d3-8cd9-0060b0fc14a3}
@mozilla.org/document-charset-info;1,{d25e0511-2bae-11d4-9d10-0050040007b2}
-@mozilla.org/network/protocol/about;1?what=privatebrowsing,{d92a18c8-234d-49e4-9936-3b7e020c29a2}
+@mozilla.org/network/protocol/about;1?what=privatebrowsing,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/download-manager;1,{edb0490e-1dd1-11b2-83b8-dbf8d85906a6}
@mozilla.org/xre/runtime;1,{95d89e3e-a169-41a3-8e56-719978e15b12}
@mozilla.org/readconfig;1,{ba5bc4c6-1dd1-11b2-bb89-b844c6ec0339}
@@ -1353,7 +1350,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/widget/image-to-gdk-pixbuf;1,{fc2389b8-c650-4093-9e42-b05e5f0685b7}
@mozilla.org/txttohtmlconv;1,{77c0e42a-1dd2-11b2-8ebf-edc6606f2f4b}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-devanagari,{6803cac4-1e3b-11d5-a145-005004832142}
-@mozilla.org/embedding/browser/nsWebBrowser;1,{f1eac761-87e9-11d3-af80-00a024ffc08c}
+@mozilla.org/network/protocol/about;1?what=memory,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/network/protocol;1?name=https,{dccbe7e4-7750-466b-a557-5ea36c8ff24e}
@mozilla.org/intl/unicode/decoder;1?charset=Shift_JIS,{0e6892c1-a9ad-11d2-b3ae-00805f8a6670}
@mozilla.org/network/http-authenticator;1?scheme=negotiate,{75c80fd0-accb-432c-af59-ec60668c3990}
@@ -1363,7 +1360,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/rdf/resource-factory;1,{0f78da56-8321-11d2-8eac-00805f29f370}
@mozilla.org/intl/unicode/encoder;1?charset=UTF-32BE,{ba6151ae-1dfa-11d3-b3bf-00805f8a6670}
@mozilla.org/rdf/datasource;1?name=charset-menu,{42c52b81-a200-11d3-9d0b-0050040007b2}
-@mozilla.org/embedcomp/appstartup-notifier;1,{1f59b001-02c9-11d5-ae76-cc92f7db9e03}
@mozilla.org/intl/metacharset;1,{218f2ac0-0a48-11d3-b3ba-00805f8a6670}
@mozilla.org/feed;1,{5d0cfa97-69dd-4e5e-ac84-f253162e8f9a}
@mozilla.org/content/pre-content-iterator;1,{80d7e247-d4b8-45d7-bb59-6f1dd56f384c}
@@ -1380,7 +1376,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/dirIndex;1,{f6913e2e-1dd1-11b2-84be-f455dee342af}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-croatian,{6394eea7-fc3d-11d2-b3b8-00805f8a6670}
@mozilla.org/appshell/window-mediator;1,{0659cb83-faad-11d2-8e19-b206620a657c}
-@mozilla.org/network/protocol/about;1?what=rights,{89e9da80-4c03-46a0-a357-cf77bbef98b9}
+@mozilla.org/network/protocol/about;1?what=rights,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/network/simple-uri;1,{e0da1d70-2f7b-11d3-8cd0-0060b0fc14a3}
@mozilla.org/intl/unicode/decoder;1?charset=x-mac-gujarati,{6803caca-1e3b-11d5-a145-005004832142}
@mozilla.org/intl/unicode/decoder;1?charset=GEOSTD8,{6394eeaf-fc3d-11d2-b3b8-00805f8a6670}
@@ -1389,8 +1385,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/content/range;1,{56ad2981-8a87-11d2-918c-0080c8e44db5}
@mozilla.org/network/default-auth-prompt;1,{ca200860-4696-40d7-88fa-4490d423a8ef}
@mozilla.org/places/sync;1,{c1751cfc-e8f1-4ade-b0bb-f74edfb8ef6a}
-@mozilla.org/gfx/image;1,{6049b260-c1e6-11d1-a827-0040959a28c9}
-@mozilla.org/network/protocol/about;1?what=robots,{e18da21c-a4b8-4be5-98aa-942e1e19f35c}
+@mozilla.org/network/protocol/about;1?what=robots,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/embedcomp/window-watcher;1,{a21bfa01-f349-4394-a84c-8de5cf0737d0}
@mozilla.org/network/protocol/about;1?what=licence,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/browser/default-browser-clh;1,{f57899d0-4e2c-4ac6-9e29-50c736103b0c}
@@ -1436,6 +1431,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/security/pkcs11;1,{74b7a390-3b41-11d4-8a80-006008c844c3}
@mozilla.org/layout/xmlfragmentsink;2,{4dc30689-929d-425e-a709-082c6294e542}
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-croatian,{6394eeb7-fc3d-11d2-b3b8-00805f8a6670}
+@mozilla.org/network/protocol/about;1?what=support,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/content-pref/service;1,{e6a3f533-4ffa-4615-8eb4-d4e72d883fa7}
@mozilla.org/url-classifier/dbservice;1,{5eb7c3c1-ec1f-4007-87cc-eefb37d68ce6}
@mozilla.org/intl/unicode/decoder;1?charset=IBM862,{2d524fd4-ae74-11d3-abf7-0004aceefa51}
@@ -1449,6 +1445,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/url-classifier/jslib;1,{26a4a019-2827-4a89-a85c-5931a678823a}
@mozilla.org/saxparser/attributes;1,{7bb40992-77eb-43db-9a4e-39d3bcc383ae}
@mozilla.org/intl/unicode/encoder;1?charset=KOI8-U,{6394eeb6-fc3d-11d2-b3b8-00805f8a6670}
+@mozilla.org/focus-manager;1,{cf7fd51f-aba2-44c1-9ff0-11f7508efcd4}
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-gurmukhi,{6803cacf-1e3b-11d5-a145-005004832142}
@mozilla.org/intl/unicode/decoder;1?charset=windows-936,{9416bfc0-1f93-11d3-b3bf-00805f8a6670}
@mozilla.org/transfer;1,{e3fa9d0a-1dd1-11b2-bdef-8c720b597445}
@@ -1468,7 +1465,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/unicode/encoder;1?charset=x-t1-cmsy,{e768ebef-70f9-4fe3-8835-4f4f3fd996e2}
@mozilla.org/intl/unicode/decoder;1?charset=TIS-620,{66634f68-be19-42d0-a4ca-d1c21fa059b8}
@mozilla.org/network/protocol;1?name=default,{bd6390c8-fbea-11d4-98f6-001083010e9b}
-@mozilla.org/image/container;1,{27f0682c-ff64-4dd2-ae7a-668e59f2fd38}
@mozilla.org/toolkit/default-clh;1,{6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344}
@mozilla.org/intl/unicode/encoder;1?charset=x-mac-icelandic,{6394eebb-fc3d-11d2-b3b8-00805f8a6670}
@mozilla.org/intl/unicode/encoder;1?charset=ISO-2022-JP,{4f76e100-d71c-11d2-8aac-00600811a836}
@@ -1497,7 +1493,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/gfx/screenmanager;1,{c401eb80-f9ea-11d3-bb6f-e732b73ebe7c}
@mozilla.org/rdf/container;1,{d4214e93-fb94-11d2-bdd8-00104bde6048}
@mozilla.org/moz/jsloader;1,{6bd13476-1dd2-11b2-bbef-f0ccb5fa64b6}
-@mozilla.org/network/protocol/about;1?what=feeds,{12ff56ec-58be-402c-b057-01f961de969b}
+@mozilla.org/network/protocol/about;1?what=feeds,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/rdf/xml-serializer;1,{0032d852-1dd2-11b2-95f7-e0a1910ed2da}
@mozilla.org/network/dns-service;1,{b0ff4572-dae4-4bef-a092-83c1b88f6be9}
@mozilla.org/intl/unicode/encoder;1?charset=windows-1256,{ba6151a4-1dfa-11d3-b3bf-00805f8a6670}
@@ -1521,13 +1517,13 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/collation;1,{aa13e4a0-a5ac-11d2-9119-006008a6edf6}
@mozilla.org/widget/transferable;1,{8b5314bc-db01-11d2-96ce-0060b0fb9956}
@mozilla.org/intl/unicode/encoder;1?charset=UTF-16BE,{ba6151ad-1dfa-11d3-b3bf-00805f8a6670}
-@mozilla.org/login-manager/storage/mozStorage;1,{8c2023b9-175c-477e-9761-44ae7b549756}
-@mozilla.org/image/decoder;2?type=image/x-xbm,{dbfd145d-3298-4f3c-902f-2c5e1a1494ce}
+@mozilla.org/updates/update-service;1,{b3c290a6-3943-4b89-8bbe-c01eb7b3b311}
@mozilla.org/network/auth-module;1?name=sys-ntlm,{bc54f001-6eb0-4e32-9f49-7e064d8e70ef}
@mozilla.org/intl/unicode/encoder;1?charset=hkscs-1,{a59da931-4091-11d5-a145-005004832142}
@mozilla.org/intl/unicode/encoder;1?charset=x-t1-cmex,{f01cb3e7-4ace-414e-a2b7-eaba03e9c86c}
+@mozilla.org/satchel/form-autocomplete;1,{c11c21b2-71c9-4f87-a0f8-5e13f50495fd}
@mozilla.org/intl/unicode/decoder;1?charset=IBM852,{2d524fd1-ae74-11d3-abf7-0004aceefa51}
-@mozilla.org/network/protocol;1?name=feed,{4f91ef2e-57ba-472e-ab7a-b4999e42d6c0}
+@mozilla.org/download-manager-ui;1,{7dfdf0d1-aff6-4a34-bad1-d0fe74601642}
@mozilla.org/layout/contentserializer;1?mimetype=application/vnd.mozilla.xul+xml,{4aef38b7-6364-4e23-a5e7-12f837fbbd9c}
@mozilla.org/intl/unicode/encoder;1?charset=x-gbk,{ba61519b-1dfa-11d3-b3bf-00805f8a6670}
@mozilla.org/intl/unicode/decoder;1?charset=IBM855,{2d524fd2-ae74-11d3-abf7-0004aceefa51}
@@ -1546,8 +1542,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/streamconv;1?from=multipart/x-mixed-replace&to=*/*,{7584ce90-5b25-11d3-a175-0050041caf44}
@mozilla.org/streamconv;1?from=text/ftp-dir&to=application/http-index-format,{14c0e880-623e-11d3-a178-0050041caf44}
@mozilla.org/intl/unicode/encoder;1?charset=x-mathematica5,{8a0dce80-e2f2-11d3-b32f-004005a7a7e4}
-@mozilla.org/network/protocol/about;1?what=neterror,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
-@mozilla.org/updates/update-checker;1,{898cdc9b-e43f-422f-9cc4-2f6291b415a3}
@mozilla.org/intl/unicode/encoder;1?charset=IBM864i,{2d524fdd-ae74-11d3-abf7-0004aceefa51}
@mozilla.org/xul/xul-prototype-cache;1,{3a0a0fc1-8349-11d3-be47-00104bde6048}
@mozilla.org/intl/unicode/encoder;1?charset=UTF-16,{49b38f12-6193-11d3-b3c5-00805f8a6670}
@@ -1558,18 +1552,17 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/network/auth-module;1?name=negotiate-gss,{96ec4163-efc8-407a-8735-007fb26be4e8}
@mozilla.org/embedding/browser/content-policy;1,{f66bc334-1dd1-11b2-bab2-90e04fe15c19}
@mozilla.org/browser/tagging-service;1,{bbc23860-2553-479d-8b78-94d9038334f7}
-@mozilla.org/network/protocol/about;1?what=certerror,{78d2286f-de9d-47ac-9c26-e8675aedf3be}
+@mozilla.org/network/protocol/about;1?what=certerror,{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}
@mozilla.org/js/xpc/ContextStack;1,{ff8c4d10-3194-11d3-9885-006008962422}
@mozilla.org/intl/unicode/encoder;1?charset=jis_0201,{ba615191-1dfa-11d3-b3bf-00805f8a6670}
@mozilla.org/intl/unicode/decoder;1?charset=windows-1254,{7c657d17-ec5e-11d2-8aac-00600811a836}
@mozilla.org/streamconv;1?from=uncompressed&to=rawdeflate,{461cd5dd-73c6-47a4-8cc3-603b37d84a61}
@mozilla.org/xre/app-info;1,{95d89e3e-a169-41a3-8e56-719978e15b12}
@mozilla.org/xptinfo/loader;1&type=zip,{0320e073-79c7-4dae-8055-81bed8b8db96}
-@mozilla.org/browser/global-history;2,{88cecbb7-6c63-4b3b-8cd4-84f3b8228c69}
+@mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.audio.feed&to=*/*,{229fa115-9412-4d32-baf3-2fc407f76fb1}
@mozilla.org/intl/unicode/encoder;1?charset=KOI8-R,{6394eeb5-fc3d-11d2-b3b8-00805f8a6670}
@mozilla.org/network/protocol/about;1?what=license,{f0acde16-1dd1-11b2-9e35-f5786fff5a66}
@mozilla.org/intl/utf8converterservice;1,{2b026890-5a2e-4981-ada2-a600358947b4}
-@mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.audio.feed&to=*/*,{229fa115-9412-4d32-baf3-2fc407f76fb1}
@mozilla.org/transactionmanager;1,{9c8f9601-801a-11d2-98ba-00805f297d89}
@mozilla.org/nss_errors_service;1,{a277189c-1dd1-11b2-a8c9-e4e8bfb1338e}
@mozilla.org/saxparser/xmlreader;1,{ab1da296-6125-40ba-96d0-47a8282ae3db}
@@ -1579,6 +1572,7 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/network/authprompt-adapter-factory;1,{a21bfa01-f349-4394-a84c-8de5cf0737d0}
@mozilla.org/layout/plaintextsink;1,{6030f7ef-32ed-46a7-9a63-6a5d3f90445f}
@mozilla.org/gfx/region;1,{da5b130a-1dd1-11b2-ad47-f455b1814a78}
+@mozilla.org/geolocation/gpsd/provider;1,{0a3be523-0f2a-32cc-ccd8-1e5986d5a79d}
@mozilla.org/network/http-authenticator;1?scheme=digest,{17491ba4-1dd2-11b2-aae3-de6b92dab620}
@mozilla.org/network/cache-service;1,{6c84aec9-29a5-4264-8fbc-bee8f922ea67}
@mozilla.org/security/entropy;1,{34587f4a-be18-43c0-9112-b782b08c0add}
@@ -1598,7 +1592,6 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-11,{9c0ff6f4-deda-40e5-806c-b6cc449c21ce}
@mozilla.org/intl/stringcharsetdetect;1?type=universal_charset_detector,{6ee5301a-3981-49bd-85f8-1a2cc228cf3e}
@mozilla.org/feed-unescapehtml;1,{10f2f5f0-f103-4901-980f-ba11bd70d60d}
-@mozilla.org/updates/update-service;1,{b3c290a6-3943-4b89-8bbe-c01eb7b3b311}
@mozilla.org/dom/xpath-evaluator;1,{d0a75e02-b5e7-11d5-a7f2-df109fb8a1fc}
@mozilla.org/layout/contentserializer;1?mimetype=text/xml,{4aef38b7-6364-4e23-a5e7-12f837fbbd9c}
@mozilla.org/intl/unicode/decoder;1?charset=IBM857,{2d524fd3-ae74-11d3-abf7-0004aceefa51}
@@ -1606,9 +1599,10 @@ rel:nsUpdateService.js,1253014816000
@mozilla.org/intl/unicode/encoder;1?charset=ISO-8859-6-I,{495eca46-0a5c-11d4-a135-005004832142}
@mozilla.org/intl/charsetdetect;1?type=universal_charset_detector,{374e0cde-f605-4259-8c92-e639c6c2eeef}
@mozilla.org/dirIndexParser;1,{a0d6ad32-1dd1-11b2-aa55-a40187b54036}
-@mozilla.org/autocomplete/search;1?name=history,{88cecbb7-6c63-4b3b-8cd4-84f3b8228c69}
+@mozilla.org/autocomplete/search;1?name=history,{d0272978-beab-4adc-a3d4-04b76acfa4e7}
@mozilla.org/network/downloader;1,{510a86bb-6019-4ed1-bb4f-965cffd23ece}
@mozilla.org/intl/unicode/decoder;1?charset=EUC-KR,{379c2775-ec77-11d2-8aac-00600811a836}
+@mozilla.org/files/filereader;1,{06aa7c21-fe05-4cf2-b1c4-0c7126a4f713}
@mozilla.org/PopupWindowManager;1,{822bcd11-6432-48be-9e9d-36f7804b7747}
@mozilla.org/security/recentbadcerts;1,{e7caf8c0-3570-47fe-aa1b-da47539b5d07}
@mozilla.org/dom/json;1,{93ad72a6-02cd-4716-9626-d47d5ec275ec}
@@ -1645,14 +1639,13 @@ Charset Encoders,TIS-620,
Charset Encoders,ISO-IR-111,
Charset Encoders,EUC-JP,
Charset Encoders,windows-1251,
-Charset Encoders,x-mac-ukrainian,
+Charset Encoders,HZ-GB-2312,
Charset Encoders,x-t1-cmex,
Charset Encoders,x-mac-roman,
Charset Encoders,ISO-8859-7,
Charset Encoders,x-mac-hebrew,
Charset Encoders,ISO-8859-15,
Charset Encoders,Adobe-Symbol-Encoding,
-Charset Encoders,gb18030,
Charset Encoders,IBM857,
Charset Encoders,x-ttf-cmsy,
Charset Encoders,x-mathematica5,
@@ -1664,7 +1657,7 @@ Charset Encoders,ISO-8859-10,
Charset Encoders,GB2312,
Charset Encoders,UTF-8,
Charset Encoders,x-viet-tcvn5712,
-Charset Encoders,HZ-GB-2312,
+Charset Encoders,gb18030,
Charset Encoders,ISO-8859-2,
Charset Encoders,windows-1257,
Charset Encoders,x-mathematica1,
@@ -1746,12 +1739,10 @@ Charset Encoders,x-mac-cyrillic,
net-content-sniffers,Feed Sniffer,@mozilla.org/browser/feeds/sniffer;1
net-content-sniffers,Binary Detector,@mozilla.org/network/binary-detector;1
JavaScript global static nameset,PrivilegeManager,@mozilla.org/security/script/nameset;1
-parser-service-category,Meta Charset Service,@mozilla.org/intl/metacharset;1
JavaScript global constructor,BrowserFeedWriter,@mozilla.org/browser/feeds/result-writer;1
JavaScript global constructor,Image,@mozilla.org/content/element/html;1?name=img
JavaScript global constructor,Audio,@mozilla.org/content/element/html;1?name=audio
JavaScript global constructor,Option,@mozilla.org/content/element/html;1?name=option
-agent-style-sheets,pluginfinder xbl binding,chrome://mozapps/content/plugins/missingPluginBinding.css
xpcom-directory-providers,spellcheck-directory-provider,@mozilla.org/spellcheck/dir-provider;1
xpcom-directory-providers,browser-directory-provider,@mozilla.org/browser/directory-provider;1
external-uricontentlisteners,application/x-x509-user-cert,@mozilla.org/uriloader/psm-external-content-listener;1
@@ -1764,6 +1755,7 @@ external-uricontentlisteners,application/x-x509-server-cert,@mozilla.org/uriload
uconv-charset-titles,chrome://global/locale/charsetTitles.properties,
uconv-charset-data,resource://gre/res/charsetData.properties,
command-line-handler,x-default,@mozilla.org/browser/final-clh;1
+command-line-handler,m-privatebrowsing,@mozilla.org/privatebrowsing;1
command-line-handler,b-jsconsole,@mozilla.org/toolkit/console-clh;1
command-line-handler,m-setdefaultbrowser,@mozilla.org/browser/default-browser-clh;1
command-line-handler,m-browser,@mozilla.org/browser/clh;1
@@ -1801,9 +1793,13 @@ JavaScript global property,InstallTrigger,@mozilla.org/xpinstall/installtrigger;
JavaScript global property,external,@mozilla.org/sidebar;1
JavaScript global property,sidebar,@mozilla.org/sidebar;1
command-line-validator,b-browser,@mozilla.org/browser/clh;1
+parser-service-category,Meta Charset Service,@mozilla.org/intl/metacharset;1
+profile-after-change,Timer Manager,@mozilla.org/updates/timer-manager;1
+profile-after-change,Extension Manager,@mozilla.org/extensions/manager;1
+profile-after-change,Update Service Stub,@mozilla.org/updates/update-service-stub;1
Gecko-Content-Viewers,application/xml,@mozilla.org/content/document-loader-factory;1
+Gecko-Content-Viewers,application/x-javascript,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,application/javascript,@mozilla.org/content/document-loader-factory;1
-Gecko-Content-Viewers,text/rdf,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,text/plain,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,image/jpg,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,image/gif,@mozilla.org/content/document-loader-factory;1
@@ -1816,9 +1812,7 @@ Gecko-Content-Viewers,application/ecmascript,@mozilla.org/content/document-loade
Gecko-Content-Viewers,mozilla.application/cached-xul,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,image/x-png,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,application/http-index-format,@mozilla.org/xpfe/http-index-format-factory-constructor
-Gecko-Content-Viewers,image/x-xbitmap,@mozilla.org/content/document-loader-factory;1
-Gecko-Content-Viewers,application/x-javascript,@mozilla.org/content/document-loader-factory;1
-Gecko-Content-Viewers,image/x-xbm,@mozilla.org/content/document-loader-factory;1
+Gecko-Content-Viewers,text/rdf,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,image/png,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,text/css,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,text/html,@mozilla.org/content/document-loader-factory;1
@@ -1830,10 +1824,30 @@ Gecko-Content-Viewers,application/xhtml+xml,@mozilla.org/content/document-loader
Gecko-Content-Viewers,application/vnd.mozilla.xul+xml,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,text/xml,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,image/vnd.microsoft.icon,@mozilla.org/content/document-loader-factory;1
-Gecko-Content-Viewers,image/xbm,@mozilla.org/content/document-loader-factory;1
Gecko-Content-Viewers,image/x-ms-bmp,@mozilla.org/content/document-loader-factory;1
-profile-after-change,Extension Manager,@mozilla.org/extensions/manager;1
-profile-after-change,Blocklist Service,@mozilla.org/extensions/blocklist;1
+agent-style-sheets,pluginfinder xbl binding,chrome://mozapps/content/plugins/missingPluginBinding.css
+geolocation-provider,Returns a geolocation from a GPSD source,@mozilla.org/geolocation/gpsd/provider;1
+JavaScript global constructor prototype alias,Image,HTMLImageElement
+JavaScript global constructor prototype alias,Audio,HTMLAudioElement
+JavaScript global constructor prototype alias,Option,HTMLOptionElement
+module-loader,text/javascript,@mozilla.org/moz/jsloader;1
+app-startup,PrivateBrowsing Service,service,@mozilla.org/privatebrowsing;1
+app-startup,tryToClose Service,service,@mozilla.org/appshell/trytoclose;1
+app-startup,Web Content Handler Registrar,service,@mozilla.org/embeddor.implemented/web-content-handler-registrar;1
+app-startup,Application,service,@mozilla.org/fuel/application;1
+app-startup,Window Data Source,service,@mozilla.org/rdf/datasource;1?name=window-mediator
+app-startup,Firefox Browser Glue Service,service,@mozilla.org/browser/browserglue;1
+app-startup,Browser Session Startup Service,service,@mozilla.org/browser/sessionstartup;1
+app-startup,SystemPref Module,@mozilla.org/system-preferences;1
+app-startup,Script Security Manager,service,@mozilla.org/scriptsecuritymanager;1
+bookmark-observers,Used to synchronize the temporary and permanent tables of Places,@mozilla.org/places/sync;1
+JavaScript global privileged property,Application,@mozilla.org/fuel/application;1
+update-timer,Extension Manager,@mozilla.org/extensions/manager;1,getService,addon-background-update-timer,extensions.update.interval,86400
+update-timer,Microsummary Service,@mozilla.org/microsummary/service;1,getService,microsummary-generator-update-timer,browser.microsummary.generatorUpdateInterval,604800
+update-timer,Update Service,@mozilla.org/updates/update-service;1,getService,background-update-timer,app.update.interval,86400
+update-timer,Blocklist Service,@mozilla.org/extensions/blocklist;1,getService,blocklist-background-update-timer,extensions.blocklist.interval,86400
+XSLT extension functions,http://exslt.org/regular-expressions,@mozilla.org/exslt/regexp;1
+history-observers,Used to synchronize the temporary and permanent tables of Places,@mozilla.org/places/sync;1
Charset Decoders,UTF-16,
Charset Decoders,ISO-8859-8-E,
Charset Decoders,ISO-8859-4,
@@ -1844,7 +1858,6 @@ Charset Decoders,ISO-IR-111,
Charset Decoders,windows-1252,
Charset Decoders,windows-1251,
Charset Decoders,UTF-16BE,
-Charset Decoders,x-mac-ukrainian,
Charset Decoders,IBM852,
Charset Decoders,x-mac-roman,
Charset Decoders,ISO-8859-7,
@@ -1923,21 +1936,3 @@ Charset Decoders,windows-936,
Charset Decoders,windows-1254,
Charset Decoders,IBM855,
Charset Decoders,x-viet-vps,
-JavaScript global constructor prototype alias,Image,HTMLImageElement
-JavaScript global constructor prototype alias,Audio,HTMLAudioElement
-JavaScript global constructor prototype alias,Option,HTMLOptionElement
-module-loader,text/javascript,@mozilla.org/moz/jsloader;1
-app-startup,tryToClose Service,service,@mozilla.org/appshell/trytoclose;1
-app-startup,Update Service,service,@mozilla.org/updates/update-service;1
-app-startup,Firefox Browser Glue Service,service,@mozilla.org/browser/browserglue;1
-app-startup,Web Content Handler Registrar,service,@mozilla.org/embeddor.implemented/web-content-handler-registrar;1
-app-startup,PrivateBrowsing Service,service,@mozilla.org/privatebrowsing;1
-app-startup,Window Data Source,service,@mozilla.org/rdf/datasource;1?name=window-mediator
-app-startup,Application,service,@mozilla.org/fuel/application;1
-app-startup,Browser Session Startup Service,service,@mozilla.org/browser/sessionstartup;1
-app-startup,SystemPref Module,@mozilla.org/system-preferences;1
-app-startup,Script Security Manager,service,@mozilla.org/scriptsecuritymanager;1
-bookmark-observers,Used to synchronize the temporary and permanent tables of Places,@mozilla.org/places/sync;1
-JavaScript global privileged property,Application,@mozilla.org/fuel/application;1
-XSLT extension functions,http://exslt.org/regular-expressions,@mozilla.org/exslt/regexp;1
-history-observers,Used to synchronize the temporary and permanent tables of Places,@mozilla.org/places/sync;1
diff --git a/tools/xo_bundle/components/fuelApplication.js b/tools/xo_bundle/components/fuelApplication.js
index 1584b6e..efd5b9d 100755
--- a/tools/xo_bundle/components/fuelApplication.js
+++ b/tools/xo_bundle/components/fuelApplication.js
@@ -144,24 +144,19 @@ Window.prototype = {
_event : function win_event(aEvent) {
this._events.dispatch(aEvent.type, new BrowserTab(this, aEvent.originalTarget.linkedBrowser));
},
-
get tabs() {
var tabs = [];
var browsers = this._tabbrowser.browsers;
-
for (var i=0; i<browsers.length; i++)
tabs.push(new BrowserTab(this, browsers[i]));
return tabs;
},
-
get activeTab() {
return new BrowserTab(this, this._tabbrowser.selectedBrowser);
},
-
open : function win_open(aURI) {
return new BrowserTab(this, this._tabbrowser.addTab(aURI.spec).linkedBrowser);
},
-
_shutdown : function win_shutdown() {
for (var type in this._cleanup)
this._tabbrowser.removeEventListener(type, this._cleanup[type], true);
@@ -175,7 +170,6 @@ Window.prototype = {
QueryInterface : XPCOMUtils.generateQI([Ci.fuelIWindow])
};
-
//=================================================
// BrowserTab implementation
function BrowserTab(aFUELWindow, aBrowser) {
@@ -232,17 +226,15 @@ BrowserTab.prototype = {
*/
_event : function bt_event(aEvent) {
if (aEvent.type == "load") {
- if (!(aEvent.originalTarget instanceof Ci.nsIDOMHTMLDocument))
+ if (!(aEvent.originalTarget instanceof Ci.nsIDOMDocument))
return;
if (aEvent.originalTarget.defaultView instanceof Ci.nsIDOMWindowInternal &&
aEvent.originalTarget.defaultView.frameElement)
return;
}
-
this._events.dispatch(aEvent.type, this);
},
-
/*
* Helper used to determine the index offset of the browsertab
*/
@@ -416,6 +408,9 @@ Bookmark.prototype = {
// bookmark object doesn't exist at this point
},
+ onBeforeItemRemoved : function bm_obir(aId) {
+ },
+
onItemRemoved : function bm_oir(aId, aFolder, aIndex) {
if (this._id == aId)
this._events.dispatch("remove", aId);
@@ -552,7 +547,7 @@ BookmarkFolder.prototype = {
},
remove : function bmf_remove() {
- Utilities.bookmarks.removeFolder(this._id);
+ Utilities.bookmarks.removeItem(this._id);
},
// observer
@@ -572,6 +567,9 @@ BookmarkFolder.prototype = {
this._events.dispatch("addchild", aId);
},
+ onBeforeItemRemoved : function bmf_oir(aId) {
+ },
+
onItemRemoved : function bmf_oir(aId, aFolder, aIndex) {
// handle root folder events
if (!this._parent || this._id == aId)
@@ -866,7 +864,7 @@ Events.prototype = {
this._listeners = this._listeners.filter(hasFilter);
function hasFilter(element) {
- return element.event != aEvent && element.listener != aListener;
+ return (element.event != aEvent) || (element.listener != aListener);
}
},
@@ -1434,7 +1432,7 @@ extApplication.prototype = {
os.notifyObservers(cancelQuit, "quit-application-requested", null);
if (cancelQuit.data)
return false; // somebody canceled our quit request
-
+
let appStartup = Components.classes['@mozilla.org/toolkit/app-startup;1']
.getService(Components.interfaces.nsIAppStartup);
appStartup.quit(aFlags);
diff --git a/tools/xo_bundle/components/jsconsole-clhandler.js b/tools/xo_bundle/components/jsconsole-clhandler.js
index e0dffe8..d9dca88 100755
--- a/tools/xo_bundle/components/jsconsole-clhandler.js
+++ b/tools/xo_bundle/components/jsconsole-clhandler.js
@@ -1,4 +1,4 @@
-//@line 41 "/builds/moz2_slave/linux_build/build/toolkit/components/console/jsconsole-clhandler.js"
+//@line 41 "/builds/slave/linux_build/build/toolkit/components/console/jsconsole-clhandler.js"
const Cc = Components.classes;
const Ci = Components.interfaces;
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
diff --git a/tools/xo_bundle/components/libbrowsercomps.so b/tools/xo_bundle/components/libbrowsercomps.so
index 0dbc493..573b16e 100755
--- a/tools/xo_bundle/components/libbrowsercomps.so
+++ b/tools/xo_bundle/components/libbrowsercomps.so
Binary files differ
diff --git a/tools/xo_bundle/components/libbrowserdirprovider.so b/tools/xo_bundle/components/libbrowserdirprovider.so
index b17f6b9..e4a2926 100755
--- a/tools/xo_bundle/components/libbrowserdirprovider.so
+++ b/tools/xo_bundle/components/libbrowserdirprovider.so
Binary files differ
diff --git a/tools/xo_bundle/components/libdbusservice.so b/tools/xo_bundle/components/libdbusservice.so
index ac88c21..0a3466e 100755
--- a/tools/xo_bundle/components/libdbusservice.so
+++ b/tools/xo_bundle/components/libdbusservice.so
Binary files differ
diff --git a/tools/xo_bundle/components/libimgicon.so b/tools/xo_bundle/components/libimgicon.so
index 84f9cf7..8997df9 100755
--- a/tools/xo_bundle/components/libimgicon.so
+++ b/tools/xo_bundle/components/libimgicon.so
Binary files differ
diff --git a/tools/xo_bundle/components/libmozgnome.so b/tools/xo_bundle/components/libmozgnome.so
index 33a99e8..9019e3e 100755
--- a/tools/xo_bundle/components/libmozgnome.so
+++ b/tools/xo_bundle/components/libmozgnome.so
Binary files differ
diff --git a/tools/xo_bundle/components/libnkgnomevfs.so b/tools/xo_bundle/components/libnkgnomevfs.so
index 53928bd..fe975b6 100755
--- a/tools/xo_bundle/components/libnkgnomevfs.so
+++ b/tools/xo_bundle/components/libnkgnomevfs.so
Binary files differ
diff --git a/tools/xo_bundle/components/nsAddonRepository.js b/tools/xo_bundle/components/nsAddonRepository.js
index 93f9a17..c74accb 100755
--- a/tools/xo_bundle/components/nsAddonRepository.js
+++ b/tools/xo_bundle/components/nsAddonRepository.js
@@ -1,6 +1,6 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
-//@line 38 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsAddonRepository.js"
+//@line 38 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsAddonRepository.js"
*/
const Cc = Components.classes;
diff --git a/tools/xo_bundle/components/nsBlocklistService.js b/tools/xo_bundle/components/nsBlocklistService.js
index 327221f..d95b5b3 100755
--- a/tools/xo_bundle/components/nsBlocklistService.js
+++ b/tools/xo_bundle/components/nsBlocklistService.js
@@ -1,6 +1,6 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
-//@line 41 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
+//@line 41 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
*/
const Cc = Components.classes;
@@ -8,6 +8,7 @@ const Ci = Components.interfaces;
const Cr = Components.results;
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/FileUtils.jsm");
const TOOLKIT_ID = "toolkit@mozilla.org"
const KEY_PROFILEDIR = "ProfD";
@@ -17,6 +18,7 @@ const PREF_BLOCKLIST_URL = "extensions.blocklist.url";
const PREF_BLOCKLIST_ENABLED = "extensions.blocklist.enabled";
const PREF_BLOCKLIST_INTERVAL = "extensions.blocklist.interval";
const PREF_BLOCKLIST_LEVEL = "extensions.blocklist.level";
+const PREF_PLUGINS_NOTIFYUSER = "plugins.update.notifyUser";
const PREF_GENERAL_USERAGENT_LOCALE = "general.useragent.locale";
const PREF_PARTNER_BRANCH = "app.partner.";
const PREF_APP_DISTRIBUTION = "distribution.id";
@@ -30,108 +32,77 @@ const URI_BLOCKLIST_DIALOG = "chrome://mozapps/content/extensions/blo
const DEFAULT_SEVERITY = 3;
const DEFAULT_LEVEL = 2;
const MAX_BLOCK_LEVEL = 3;
+const SEVERITY_OUTDATED = 0;
-const MODE_RDONLY = 0x01;
-const MODE_WRONLY = 0x02;
-const MODE_CREATE = 0x08;
-const MODE_APPEND = 0x10;
-const MODE_TRUNCATE = 0x20;
-
-const PERMS_FILE = 0644;
-const PERMS_DIRECTORY = 0755;
-
-var gApp = null;
-var gPref = null;
-var gOS = null;
-var gConsole = null;
-var gVersionChecker = null;
var gLoggingEnabled = null;
-var gABI = null;
-var gOSVersion = null;
var gBlocklistEnabled = true;
var gBlocklistLevel = DEFAULT_LEVEL;
-// shared code for suppressing bad cert dialogs
-//@line 41 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/shared/src/badCertHandler.js"
+XPCOMUtils.defineLazyServiceGetter(this, "gConsole",
+ "@mozilla.org/consoleservice;1",
+ "nsIConsoleService");
-/**
- * Only allow built-in certs for HTTPS connections. See bug 340198.
- */
-function checkCert(channel) {
- if (!channel.originalURI.schemeIs("https")) // bypass
- return;
+XPCOMUtils.defineLazyServiceGetter(this, "gVersionChecker",
+ "@mozilla.org/xpcom/version-comparator;1",
+ "nsIVersionComparator");
- const Ci = Components.interfaces;
- var cert =
- channel.securityInfo.QueryInterface(Ci.nsISSLStatusProvider).
- SSLStatus.QueryInterface(Ci.nsISSLStatus).serverCert;
+XPCOMUtils.defineLazyGetter(this, "gPref", function bls_gPref() {
+ return Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).
+ QueryInterface(Ci.nsIPrefBranch2);
+});
- var issuer = cert.issuer;
- while (issuer && !cert.equals(issuer)) {
- cert = issuer;
- issuer = cert.issuer;
- }
-
- var errorstring = "cert issuer is not built-in";
- if (!issuer)
- throw errorstring;
+XPCOMUtils.defineLazyGetter(this, "gApp", function bls_gApp() {
+ return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).
+ QueryInterface(Ci.nsIXULRuntime);
+});
- issuer = issuer.QueryInterface(Ci.nsIX509Cert3);
- var tokenNames = issuer.getAllTokenNames({});
+XPCOMUtils.defineLazyGetter(this, "gABI", function bls_gABI() {
+ let abi = null;
+ try {
+ abi = gApp.XPCOMABI;
+ }
+ catch (e) {
+ LOG("BlockList Global gABI: XPCOM ABI unknown.");
+ }
+//@line 113 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
+ return abi;
+});
+
+XPCOMUtils.defineLazyGetter(this, "gOSVersion", function bls_gOSVersion() {
+ let osVersion;
+ let sysInfo = Cc["@mozilla.org/system-info;1"].
+ getService(Ci.nsIPropertyBag2);
+ try {
+ osVersion = sysInfo.getProperty("name") + " " + sysInfo.getProperty("version");
+ }
+ catch (e) {
+ LOG("BlockList Global gOSVersion: OS Version unknown.");
+ }
- if (!tokenNames.some(isBuiltinToken))
- throw errorstring;
-}
+ if (osVersion) {
+ try {
+ osVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
+ }
+ catch (e) {
+ // Not all platforms have a secondary widget library, so an error is nothing to worry about.
+ }
+ osVersion = encodeURIComponent(osVersion);
+ }
+ return osVersion;
+});
-function isBuiltinToken(tokenName) {
- return tokenName == "Builtin Object Token";
+// shared code for suppressing bad cert dialogs
+XPCOMUtils.defineLazyGetter(this, "gCertUtils", function bls_gCertUtils() {
+ let temp = { };
+ Components.utils.import("resource://gre/modules/CertUtils.jsm", temp);
+ return temp;
+});
+
+function getObserverService() {
+ return Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
}
/**
- * This class implements nsIBadCertListener. Its job is to prevent "bad cert"
- * security dialogs from being shown to the user. It is better to simply fail
- * if the certificate is bad. See bug 304286.
- */
-function BadCertHandler() {
-}
-BadCertHandler.prototype = {
-
- // nsIChannelEventSink
- onChannelRedirect: function(oldChannel, newChannel, flags) {
- // make sure the certificate of the old channel checks out before we follow
- // a redirect from it. See bug 340198.
- checkCert(oldChannel);
- },
-
- // Suppress any certificate errors
- notifyCertProblem: function(socketInfo, status, targetSite) {
- return true;
- },
-
- // Suppress any ssl errors
- notifySSLError: function(socketInfo, error, targetSite) {
- return true;
- },
-
- // nsIInterfaceRequestor
- getInterface: function(iid) {
- return this.QueryInterface(iid);
- },
-
- // nsISupports
- QueryInterface: function(iid) {
- if (!iid.equals(Components.interfaces.nsIChannelEventSink) &&
- !iid.equals(Components.interfaces.nsIBadCertListener2) &&
- !iid.equals(Components.interfaces.nsISSLErrorListener) &&
- !iid.equals(Components.interfaces.nsIInterfaceRequestor) &&
- !iid.equals(Components.interfaces.nsISupports))
- throw Components.results.NS_ERROR_NO_INTERFACE;
- return this;
- }
-};
-//@line 93 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
-
-/**
* Logs a string to the error console.
* @param string
* The string to write to the error console..
@@ -139,8 +110,7 @@ BadCertHandler.prototype = {
function LOG(string) {
if (gLoggingEnabled) {
dump("*** " + string + "\n");
- if (gConsole)
- gConsole.logStringMessage(string);
+ gConsole.logStringMessage(string);
}
}
@@ -166,63 +136,6 @@ function getPref(func, preference, defaultValue) {
}
/**
- * Gets the file at the specified hierarchy under a Directory Service key.
- * @param key
- * The Directory Service Key to start from
- * @param pathArray
- * An array of path components to locate beneath the directory
- * specified by |key|. The last item in this array must be the
- * leaf name of a file.
- * @return nsIFile object for the file specified. The file is NOT created
- * if it does not exist, however all required directories along
- * the way are.
- */
-function getFile(key, pathArray) {
- var fileLocator = Cc["@mozilla.org/file/directory_service;1"].
- getService(Ci.nsIProperties);
- var file = fileLocator.get(key, Ci.nsILocalFile);
- for (var i = 0; i < pathArray.length - 1; ++i) {
- file.append(pathArray[i]);
- if (!file.exists())
- file.create(Ci.nsILocalFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
- }
- file.followLinks = false;
- file.append(pathArray[pathArray.length - 1]);
- return file;
-}
-
-/**
- * Opens a safe file output stream for writing.
- * @param file
- * The file to write to.
- * @param modeFlags
- * (optional) File open flags. Can be undefined.
- * @returns nsIFileOutputStream to write to.
- */
-function openSafeFileOutputStream(file, modeFlags) {
- var fos = Cc["@mozilla.org/network/safe-file-output-stream;1"].
- createInstance(Ci.nsIFileOutputStream);
- if (modeFlags === undefined)
- modeFlags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
- if (!file.exists())
- file.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- fos.init(file, modeFlags, PERMS_FILE, 0);
- return fos;
-}
-
-/**
- * Closes a safe file output stream.
- * @param stream
- * The stream to close.
- */
-function closeSafeFileOutputStream(stream) {
- if (stream instanceof Ci.nsISafeOutputStream)
- stream.finish();
- else
- stream.close();
-}
-
-/**
* Constructs a URI to a spec.
* @param spec
* The spec to construct a URI to
@@ -347,50 +260,13 @@ function getDistributionPrefValue(aPrefName) {
*/
function Blocklist() {
- gApp = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
- gApp.QueryInterface(Ci.nsIXULRuntime);
- gPref = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefService).
- QueryInterface(Ci.nsIPrefBranch2);
- gVersionChecker = Cc["@mozilla.org/xpcom/version-comparator;1"].
- getService(Ci.nsIVersionComparator);
- gConsole = Cc["@mozilla.org/consoleservice;1"].
- getService(Ci.nsIConsoleService);
-
- gOS = Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
- gOS.addObserver(this, "xpcom-shutdown", false);
-
- // Not all builds have a known ABI
- try {
- gABI = gApp.XPCOMABI;
- }
- catch (e) {
- LOG("Blocklist: XPCOM ABI unknown.");
- gABI = UNKNOWN_XPCOM_ABI;
- }
-
- var osVersion;
- var sysInfo = Components.classes["@mozilla.org/system-info;1"]
- .getService(Components.interfaces.nsIPropertyBag2);
- try {
- osVersion = sysInfo.getProperty("name") + " " + sysInfo.getProperty("version");
- }
- catch (e) {
- LOG("Blocklist: OS Version unknown.");
- }
-
- if (osVersion) {
- try {
- osVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
- }
- catch (e) {
- // Not all platforms have a secondary widget library, so an error is nothing to worry about.
- }
- gOSVersion = encodeURIComponent(osVersion);
- }
-
-//@line 362 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
+ let os = getObserverService();
+ os.addObserver(this, "xpcom-shutdown", false);
+ gLoggingEnabled = getPref("getBoolPref", PREF_EM_LOGGING_ENABLED, false);
+ gBlocklistEnabled = getPref("getBoolPref", PREF_BLOCKLIST_ENABLED, true);
+ gBlocklistLevel = Math.min(getPref("getIntPref", PREF_BLOCKLIST_LEVEL, DEFAULT_LEVEL),
+ MAX_BLOCK_LEVEL);
+ gPref.addObserver("extensions.blocklist.", this, false);
}
Blocklist.prototype = {
@@ -412,27 +288,12 @@ Blocklist.prototype = {
_addonEntries: null,
_pluginEntries: null,
- observe: function (aSubject, aTopic, aData) {
+ observe: function(aSubject, aTopic, aData) {
switch (aTopic) {
- case "profile-after-change":
- gLoggingEnabled = getPref("getBoolPref", PREF_EM_LOGGING_ENABLED, false);
- gBlocklistEnabled = getPref("getBoolPref", PREF_BLOCKLIST_ENABLED, true);
- gBlocklistLevel = Math.min(getPref("getIntPref", PREF_BLOCKLIST_LEVEL, DEFAULT_LEVEL),
- MAX_BLOCK_LEVEL);
- gPref.addObserver("extensions.blocklist.", this, false);
- var tm = Cc["@mozilla.org/updates/timer-manager;1"].
- getService(Ci.nsIUpdateTimerManager);
- var interval = getPref("getIntPref", PREF_BLOCKLIST_INTERVAL, 86400);
- tm.registerTimer("blocklist-background-update-timer", this, interval);
- break;
case "xpcom-shutdown":
- gOS.removeObserver(this, "xpcom-shutdown");
- gOS = null;
+ let os = getObserverService();
+ os.removeObserver(this, "xpcom-shutdown");
gPref.removeObserver("extensions.blocklist.", this);
- gPref = null;
- gConsole = null;
- gVersionChecker = null;
- gApp = null;
break;
case "nsPref:changed":
switch (aData) {
@@ -547,7 +408,7 @@ Blocklist.prototype = {
var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
createInstance(Ci.nsIXMLHttpRequest);
request.open("GET", uri.spec, true);
- request.channel.notificationCallbacks = new BadCertHandler();
+ request.channel.notificationCallbacks = new gCertUtils.BadCertHandler();
request.overrideMimeType("text/xml");
request.setRequestHeader("Cache-Control", "no-cache");
request.QueryInterface(Components.interfaces.nsIJSXMLHttpRequest);
@@ -566,7 +427,7 @@ Blocklist.prototype = {
onXMLLoad: function(aEvent) {
var request = aEvent.target;
try {
- checkCert(request.channel);
+ gCertUtils.checkCert(request.channel);
}
catch (e) {
LOG("Blocklist::onXMLLoad: " + e);
@@ -578,18 +439,19 @@ Blocklist.prototype = {
LOG("Blocklist::onXMLLoad: there was an error during load");
return;
}
- var blocklistFile = getFile(KEY_PROFILEDIR, [FILE_BLOCKLIST]);
+ var blocklistFile = FileUtils.getFile(KEY_PROFILEDIR, [FILE_BLOCKLIST]);
if (blocklistFile.exists())
blocklistFile.remove(false);
- var fos = openSafeFileOutputStream(blocklistFile);
+ var fos = FileUtils.openSafeFileOutputStream(blocklistFile);
fos.write(request.responseText, request.responseText.length);
- closeSafeFileOutputStream(fos);
+ FileUtils.closeSafeFileOutputStream(fos);
var oldAddonEntries = this._addonEntries;
var oldPluginEntries = this._pluginEntries;
this._addonEntries = { };
this._pluginEntries = { };
- this._loadBlocklistFromFile(getFile(KEY_PROFILEDIR, [FILE_BLOCKLIST]));
+ this._loadBlocklistFromFile(FileUtils.getFile(KEY_PROFILEDIR,
+ [FILE_BLOCKLIST]));
this._blocklistUpdated(oldAddonEntries, oldPluginEntries);
},
@@ -619,12 +481,12 @@ Blocklist.prototype = {
_loadBlocklist: function() {
this._addonEntries = { };
this._pluginEntries = { };
- var profFile = getFile(KEY_PROFILEDIR, [FILE_BLOCKLIST]);
+ var profFile = FileUtils.getFile(KEY_PROFILEDIR, [FILE_BLOCKLIST]);
if (profFile.exists()) {
this._loadBlocklistFromFile(profFile);
return;
}
- var appFile = getFile(KEY_APPDIR, [FILE_BLOCKLIST]);
+ var appFile = FileUtils.getFile(KEY_APPDIR, [FILE_BLOCKLIST]);
if (appFile.exists()) {
this._loadBlocklistFromFile(appFile);
return;
@@ -633,7 +495,7 @@ Blocklist.prototype = {
},
/**
-//@line 653 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
+//@line 592 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsBlocklistService.js"
*/
_loadBlocklistFromFile: function(file) {
@@ -649,7 +511,7 @@ Blocklist.prototype = {
var fileStream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
- fileStream.init(file, MODE_RDONLY, PERMS_FILE, 0);
+ fileStream.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
try {
var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
createInstance(Ci.nsIDOMParser);
@@ -799,10 +661,13 @@ Blocklist.prototype = {
for (var i = 0; i < blockEntry.versions.length; i++) {
if (blockEntry.versions[i].includesItem(plugin.version, appVersion,
- toolkitVersion))
- return blockEntry.versions[i].severity >= gBlocklistLevel ?
- Ci.nsIBlocklistService.STATE_BLOCKED :
- Ci.nsIBlocklistService.STATE_SOFTBLOCKED;
+ toolkitVersion)) {
+ if (blockEntry.versions[i].severity >= gBlocklistLevel)
+ return Ci.nsIBlocklistService.STATE_BLOCKED;
+ if (blockEntry.versions[i].severity == SEVERITY_OUTDATED)
+ return Ci.nsIBlocklistService.STATE_OUTDATED;
+ return Ci.nsIBlocklistService.STATE_SOFTBLOCKED;
+ }
}
}
@@ -854,14 +719,19 @@ Blocklist.prototype = {
plugins[i].disabled = true;
}
else if (!plugins[i].disabled && state != Ci.nsIBlocklistService.STATE_NOT_BLOCKED) {
- addonList.push({
- name: plugins[i].name,
- version: plugins[i].version,
- icon: "chrome://mozapps/skin/plugins/pluginGeneric.png",
- disable: false,
- blocked: state == Ci.nsIBlocklistService.STATE_BLOCKED,
- item: plugins[i]
- });
+ if (state == Ci.nsIBlocklistService.STATE_OUTDATED) {
+ gPref.setBoolPref(PREF_PLUGINS_NOTIFYUSER, true);
+ }
+ else {
+ addonList.push({
+ name: plugins[i].name,
+ version: plugins[i].version,
+ icon: "chrome://mozapps/skin/plugins/pluginGeneric.png",
+ disable: false,
+ blocked: state == Ci.nsIBlocklistService.STATE_BLOCKED,
+ item: plugins[i]
+ });
+ }
}
plugins[i].blocklisted = state == Ci.nsIBlocklistService.STATE_BLOCKED;
}
@@ -890,7 +760,8 @@ Blocklist.prototype = {
else if (addonList[i].item instanceof Ci.nsIPluginTag)
addonList[i].item.disabled = true;
else
- LOG("Unknown add-on type: " + addonList[i].item);
+ LOG("Blocklist::_blocklistUpdated: Unknown add-on type: " +
+ addonList[i].item);
}
if (args.restart)
@@ -903,7 +774,10 @@ Blocklist.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
Ci.nsIBlocklistService,
Ci.nsITimerCallback]),
- _xpcom_categories: [{ category: "profile-after-change" }]
+ _xpcom_categories: [{ category: "update-timer",
+ value: "@mozilla.org/extensions/blocklist;1," +
+ "getService,blocklist-background-update-timer," +
+ PREF_BLOCKLIST_INTERVAL + ",86400" }]
};
/**
diff --git a/tools/xo_bundle/components/nsBrowserContentHandler.js b/tools/xo_bundle/components/nsBrowserContentHandler.js
index fd5ccb2..ec9b51a 100755
--- a/tools/xo_bundle/components/nsBrowserContentHandler.js
+++ b/tools/xo_bundle/components/nsBrowserContentHandler.js
@@ -1,4 +1,4 @@
-//@line 37 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
+//@line 37 "/builds/slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
const nsISupports = Components.interfaces.nsISupports;
@@ -455,7 +455,7 @@ var nsBrowserContentHandler = {
cmdLine.preventDefault = true;
}
-//@line 506 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
+//@line 506 "/builds/slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
},
helpInfo : " -browser Open a browser window.\n",
@@ -664,13 +664,13 @@ var nsDefaultCommandLineHandler = {
// running and have already been handled. This is compared against uri's
// opened using DDE on Win32 so we only open one of the requests.
_handledURIs: [ ],
-//@line 717 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
+//@line 717 "/builds/slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
/* nsICommandLineHandler */
handle : function dch_handle(cmdLine) {
var urilist = [];
-//@line 743 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
+//@line 743 "/builds/slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
try {
var ar;
@@ -825,9 +825,9 @@ var Module = {
registerType("text/html");
registerType("application/vnd.mozilla.xul+xml");
-//@line 898 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
+//@line 898 "/builds/slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
registerType("image/svg+xml");
-//@line 900 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
+//@line 900 "/builds/slave/linux_build/build/browser/components/nsBrowserContentHandler.js"
registerType("text/rdf");
registerType("text/xml");
registerType("application/xhtml+xml");
@@ -840,7 +840,6 @@ var Module = {
registerType("image/bmp");
registerType("image/x-icon");
registerType("image/vnd.microsoft.icon");
- registerType("image/x-xbitmap");
registerType("application/http-index-format");
var catMan = Components.classes["@mozilla.org/categorymanager;1"]
diff --git a/tools/xo_bundle/components/nsBrowserGlue.js b/tools/xo_bundle/components/nsBrowserGlue.js
index d938b13..e3b9a22 100755
--- a/tools/xo_bundle/components/nsBrowserGlue.js
+++ b/tools/xo_bundle/components/nsBrowserGlue.js
@@ -1,4 +1,4 @@
-//@line 42 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserGlue.js"
+//@line 43 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
const Ci = Components.interfaces;
const Cc = Components.classes;
@@ -11,6 +11,8 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource:///modules/distribution.js");
const PREF_EM_NEW_ADDONS_LIST = "extensions.newAddons";
+const PREF_PLUGINS_NOTIFYUSER = "plugins.update.notifyUser";
+const PREF_PLUGINS_UPDATEURL = "plugins.update.url";
// Check to see if bookmarks need backing up once per
// day on 1 hour idle.
@@ -59,9 +61,16 @@ function BrowserGlue() {
getService(Ci.nsIObserverService);
});
+ this.__defineGetter__("_distributionCustomizer", function() {
+ delete this._distributionCustomizer;
+ return this._distributionCustomizer = new DistributionCustomizer()
+ });
+
this._init();
}
+//@line 118 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
+
BrowserGlue.prototype = {
_saveSession: false,
@@ -111,6 +120,17 @@ BrowserGlue.prototype = {
// and history synchronization could fail.
this._onProfileShutdown();
break;
+//@line 169 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
+ case "browser-lastwindow-close-requested":
+ // The application is not actually quitting, but the last full browser
+ // window is about to be closed.
+ this._onQuitRequest(subject, "lastwindow");
+ break;
+ case "browser-lastwindow-close-granted":
+ if (this._saveSession)
+ this._setPrefToSaveSession();
+ break;
+//@line 179 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
case "session-save":
this._setPrefToSaveSession();
subject.QueryInterface(Ci.nsISupportsPRBool);
@@ -121,6 +141,10 @@ BrowserGlue.prototype = {
this._observerService.removeObserver(this, "places-init-complete");
// no longer needed, since history was initialized completely.
this._observerService.removeObserver(this, "places-database-locked");
+
+ // Now apply distribution customized bookmarks.
+ // This should always run after Places initialization.
+ this._distributionCustomizer.applyBookmarks();
break;
case "places-database-locked":
this._isPlacesDatabaseLocked = true;
@@ -134,6 +158,12 @@ BrowserGlue.prototype = {
this._archiveBookmarks();
}
break;
+ case "distribution-customization-complete":
+ this._observerService
+ .removeObserver(this, "distribution-customization-complete");
+ // Customization has finished, we don't need the customizer anymore.
+ delete this._distributionCustomizer;
+ break;
}
},
@@ -149,9 +179,14 @@ BrowserGlue.prototype = {
osvr.addObserver(this, "browser:purge-session-history", false);
osvr.addObserver(this, "quit-application-requested", false);
osvr.addObserver(this, "quit-application-granted", false);
+//@line 228 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
+ osvr.addObserver(this, "browser-lastwindow-close-requested", false);
+ osvr.addObserver(this, "browser-lastwindow-close-granted", false);
+//@line 231 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
osvr.addObserver(this, "session-save", false);
osvr.addObserver(this, "places-init-complete", false);
osvr.addObserver(this, "places-database-locked", false);
+ osvr.addObserver(this, "distribution-customization-complete", false);
},
// cleanup (called on application shutdown)
@@ -165,6 +200,10 @@ BrowserGlue.prototype = {
osvr.removeObserver(this, "sessionstore-windows-restored");
osvr.removeObserver(this, "browser:purge-session-history");
osvr.removeObserver(this, "quit-application-requested");
+//@line 249 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
+ osvr.removeObserver(this, "browser-lastwindow-close-requested");
+ osvr.removeObserver(this, "browser-lastwindow-close-granted");
+//@line 252 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
osvr.removeObserver(this, "quit-application-granted");
osvr.removeObserver(this, "session-save");
},
@@ -173,8 +212,7 @@ BrowserGlue.prototype = {
{
// apply distribution customizations (prefs)
// other customizations are applied in _onProfileStartup()
- var distro = new DistributionCustomizer();
- distro.applyPrefDefaults();
+ this._distributionCustomizer.applyPrefDefaults();
},
// profile startup handler (contains profile initialization routines)
@@ -193,8 +231,7 @@ BrowserGlue.prototype = {
// apply distribution customizations
// prefs are applied in _onAppDefaults()
- var distro = new DistributionCustomizer();
- distro.applyCustomizations();
+ this._distributionCustomizer.applyCustomizations();
// handle any UI migration
this._migrateUI();
@@ -205,6 +242,7 @@ BrowserGlue.prototype = {
// profile shutdown handler (contains profile cleanup routines)
_onProfileShutdown: function()
{
+//@line 302 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
this._shutdownPlaces();
this._idleService.removeIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME);
this.Sanitizer.onShutdown();
@@ -245,6 +283,11 @@ BrowserGlue.prototype = {
if (this._isPlacesDatabaseLocked) {
this._showPlacesLockedNotificationBox();
}
+
+ // If there are plugins installed that are outdated, and the user hasn't
+ // been warned about them yet, open the plugins update page.
+ if (this._prefs.getBoolPref(PREF_PLUGINS_NOTIFYUSER))
+ this._showPluginUpdatePage();
},
_onQuitRequest: function(aCancelQuit, aQuitType)
@@ -298,7 +341,6 @@ BrowserGlue.prototype = {
if (!showPrompt || inPrivateBrowsing)
return false;
- var buttonChoice = 0;
var quitBundle = this._bundleService.createBundle("chrome://browser/locale/quitDialog.properties");
var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties");
@@ -337,9 +379,11 @@ BrowserGlue.prototype = {
button2Title = quitBundle.GetStringFromName("quitTitle");
}
- buttonChoice = promptService.confirmEx(null, quitDialogTitle, message,
- flags, button0Title, button1Title, button2Title,
- neverAskText, neverAsk);
+ var mostRecentBrowserWindow = wm.getMostRecentWindow("navigator:browser");
+ var buttonChoice =
+ promptService.confirmEx(mostRecentBrowserWindow, quitDialogTitle, message,
+ flags, button0Title, button1Title, button2Title,
+ neverAskText, neverAsk);
switch (buttonChoice) {
case 2: // Quit
@@ -383,7 +427,7 @@ BrowserGlue.prototype = {
return !this._prefs.getBoolPref("browser.EULA.override");
} catch (e) { }
-//@line 430 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserGlue.js"
+//@line 490 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
// Look to see if the user has seen the current version or not.
var currentVersion = this._prefs.getIntPref("browser.rights.version");
@@ -408,7 +452,7 @@ BrowserGlue.prototype = {
var notifyBox = browser.getNotificationBox();
var brandBundle = this._bundleService.createBundle("chrome://branding/locale/brand.properties");
- var rightsBundle = this._bundleService.createBundle("chrome://browser/locale/aboutRights.properties");
+ var rightsBundle = this._bundleService.createBundle("chrome://global/locale/aboutRights.properties");
var buttonLabel = rightsBundle.GetStringFromName("buttonLabel");
var buttonAccessKey = rightsBundle.GetStringFromName("buttonAccessKey");
@@ -433,6 +477,18 @@ BrowserGlue.prototype = {
var box = notifyBox.appendNotification(notifyRightsText, "about-rights", null, notifyBox.PRIORITY_INFO_LOW, buttons);
box.persistence = 3; // arbitrary number, just so bar sticks around for a bit
},
+
+ _showPluginUpdatePage : function () {
+ this._prefs.setBoolPref(PREF_PLUGINS_NOTIFYUSER, false);
+
+ var formatter = Cc["@mozilla.org/toolkit/URLFormatterService;1"].
+ getService(Ci.nsIURLFormatter);
+ var updateUrl = formatter.formatURLPref(PREF_PLUGINS_UPDATEURL);
+
+ var win = this.getMostRecentBrowserWindow();
+ var browser = win.gBrowser;
+ browser.selectedTab = browser.addTab(updateUrl);
+ },
// returns the (cached) Sanitizer constructor
get Sanitizer()
@@ -772,7 +828,13 @@ BrowserGlue.prototype = {
},
ensurePlacesDefaultQueriesInitialized: function() {
- const SMART_BOOKMARKS_VERSION = 1;
+ // This is actual version of the smart bookmarks, must be increased every
+ // time smart bookmarks change.
+ // When adding a new smart bookmark below, its newInVersion property must
+ // be set to the version it has been added in, we will compare its value
+ // to users' smartBookmarksVersion and add new smart bookmarks without
+ // recreating old deleted ones.
+ const SMART_BOOKMARKS_VERSION = 2;
const SMART_BOOKMARKS_ANNO = "Places/SmartBookmark";
const SMART_BOOKMARKS_PREF = "browser.places.smartBookmarksVersion";
@@ -784,7 +846,7 @@ BrowserGlue.prototype = {
var smartBookmarksCurrentVersion = 0;
try {
smartBookmarksCurrentVersion = this._prefs.getIntPref(SMART_BOOKMARKS_PREF);
- } catch(ex) {}
+ } catch(ex) { /* no version set, new profile */ }
// bail out if we don't have to create or update Smart Bookmarks
if (smartBookmarksCurrentVersion == -1 ||
@@ -816,13 +878,14 @@ BrowserGlue.prototype = {
var smart = {queryId: "MostVisited", // don't change this
itemId: null,
title: placesBundle.GetStringFromName("mostVisitedTitle"),
- uri: this._uri("place:queryType=" +
- Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY +
+ uri: this._uri("place:redirectsMode=" +
+ Ci.nsINavHistoryQueryOptions.REDIRECTS_MODE_TARGET +
"&sort=" +
Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_DESCENDING +
"&maxResults=" + MAX_RESULTS),
parent: bmsvc.toolbarFolder,
- position: bookmarksToolbarIndex++};
+ position: bookmarksToolbarIndex++,
+ newInVersion: 1 };
smartBookmarks.push(smart);
// RECENTLY BOOKMARKED
@@ -840,7 +903,8 @@ BrowserGlue.prototype = {
"&maxResults=" + MAX_RESULTS +
"&excludeQueries=1"),
parent: bmsvc.bookmarksMenuFolder,
- position: bookmarksMenuIndex++};
+ position: bookmarksMenuIndex++,
+ newInVersion: 1 };
smartBookmarks.push(smart);
// RECENT TAGS
@@ -854,15 +918,19 @@ BrowserGlue.prototype = {
Ci.nsINavHistoryQueryOptions.SORT_BY_LASTMODIFIED_DESCENDING +
"&maxResults=" + MAX_RESULTS),
parent: bmsvc.bookmarksMenuFolder,
- position: bookmarksMenuIndex++};
+ position: bookmarksMenuIndex++,
+ newInVersion: 1 };
smartBookmarks.push(smart);
var smartBookmarkItemIds = annosvc.getItemsWithAnnotation(SMART_BOOKMARKS_ANNO, {});
- // set current itemId, parent and position if Smart Bookmark exists
+ // Set current itemId, parent and position if Smart Bookmark exists,
+ // we will use these informations to create the new version at the same
+ // position.
for each(var itemId in smartBookmarkItemIds) {
var queryId = annosvc.getItemAnnotation(itemId, SMART_BOOKMARKS_ANNO);
for (var i = 0; i < smartBookmarks.length; i++){
if (smartBookmarks[i].queryId == queryId) {
+ smartBookmarks[i].found = true;
smartBookmarks[i].itemId = itemId;
smartBookmarks[i].parent = bmsvc.getFolderIdForItem(itemId);
smartBookmarks[i].position = bmsvc.getItemIndex(itemId);
@@ -880,6 +948,14 @@ BrowserGlue.prototype = {
// create smart bookmarks
for each(var smartBookmark in smartBookmarks) {
+ // We update or create only changed or new smart bookmarks.
+ // Also we respect user choices, so we won't try to create a smart
+ // bookmark if it has been removed.
+ if (smartBookmarksCurrentVersion > 0 &&
+ smartBookmark.newInVersion <= smartBookmarksCurrentVersion &&
+ !smartBookmark.found)
+ continue;
+
smartBookmark.itemId = bmsvc.insertBookmark(smartBookmark.parent,
smartBookmark.uri,
smartBookmark.position,
@@ -891,7 +967,8 @@ BrowserGlue.prototype = {
// If we are creating all Smart Bookmarks from ground up, add a
// separator below them in the bookmarks menu.
- if (smartBookmarkItemIds.length == 0)
+ if (smartBookmarksCurrentVersion == 0 &&
+ smartBookmarkItemIds.length == 0)
bmsvc.insertSeparator(bmsvc.bookmarksMenuFolder, bookmarksMenuIndex);
}
};
@@ -908,7 +985,7 @@ BrowserGlue.prototype = {
}
},
-//@line 957 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserGlue.js"
+//@line 1050 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
// this returns the most recent non-popup browser window
getMostRecentBrowserWindow : function ()
@@ -916,7 +993,7 @@ BrowserGlue.prototype = {
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
getService(Components.interfaces.nsIWindowMediator);
-//@line 965 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserGlue.js"
+//@line 1058 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
var win = wm.getMostRecentWindow("navigator:browser", true);
// if we're lucky, this isn't a popup, and we can just return this
@@ -930,7 +1007,7 @@ BrowserGlue.prototype = {
win = nextWin;
}
}
-//@line 991 "/builds/moz2_slave/linux_build/build/browser/components/nsBrowserGlue.js"
+//@line 1084 "/builds/slave/linux_build/build/browser/components/nsBrowserGlue.js"
return win;
},
@@ -1012,8 +1089,9 @@ GeolocationPrompt.prototype = {
var buttons = [{
label: browserBundle.GetStringFromName("geolocation.shareLocation"),
accessKey: browserBundle.GetStringFromName("geolocation.shareLocation.accesskey"),
- callback: function(notification) {
- if (notification.getElementsByClassName("rememberChoice")[0].checked)
+ callback: function(notification) {
+ var elements = notification.getElementsByClassName("rememberChoice");
+ if (elements.length && elements[0].checked)
setPagePermission(request.requestingURI, true);
request.allow();
},
@@ -1022,7 +1100,8 @@ GeolocationPrompt.prototype = {
label: browserBundle.GetStringFromName("geolocation.dontShareLocation"),
accessKey: browserBundle.GetStringFromName("geolocation.dontShareLocation.accesskey"),
callback: function(notification) {
- if (notification.getElementsByClassName("rememberChoice")[0].checked)
+ var elements = notification.getElementsByClassName("rememberChoice");
+ if (elements.length && elements[0].checked)
setPagePermission(request.requestingURI, false);
request.cancel();
},
@@ -1043,10 +1122,17 @@ GeolocationPrompt.prototype = {
// bar.
function geolocation_hacks_to_notification () {
- var checkbox = newBar.ownerDocument.createElementNS(XULNS, "checkbox");
- checkbox.className = "rememberChoice";
- checkbox.setAttribute("label", browserBundle.GetStringFromName("geolocation.remember"));
- newBar.appendChild(checkbox);
+ // Never show a remember checkbox inside the private browsing mode
+ var inPrivateBrowsing = Cc["@mozilla.org/privatebrowsing;1"].
+ getService(Ci.nsIPrivateBrowsingService).
+ privateBrowsingEnabled;
+ if (!inPrivateBrowsing) {
+ var checkbox = newBar.ownerDocument.createElementNS(XULNS, "checkbox");
+ checkbox.className = "rememberChoice";
+ checkbox.setAttribute("label", browserBundle.GetStringFromName("geolocation.remember"));
+ checkbox.setAttribute("accesskey", browserBundle.GetStringFromName("geolocation.remember.accesskey"));
+ newBar.appendChild(checkbox);
+ }
var link = newBar.ownerDocument.createElementNS(XULNS, "label");
link.className = "text-link";
diff --git a/tools/xo_bundle/components/nsContentDispatchChooser.js b/tools/xo_bundle/components/nsContentDispatchChooser.js
index e01c247..da9e3ae 100755
--- a/tools/xo_bundle/components/nsContentDispatchChooser.js
+++ b/tools/xo_bundle/components/nsContentDispatchChooser.js
@@ -91,9 +91,11 @@ nsContentDispatchChooser.prototype =
[xai.name], 1)];
var params = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
+ let SupportsString = Components.Constructor(
+ "@mozilla.org/supports-string;1",
+ "nsISupportsString");
for each (let text in arr) {
- let string = Cc["@mozilla.org/supports-string;1"].
- createInstance(Ci.nsISupportsString);
+ let string = new SupportsString;
string.data = text;
params.appendElement(string, false);
}
diff --git a/tools/xo_bundle/components/nsContentPrefService.js b/tools/xo_bundle/components/nsContentPrefService.js
index 1a584bc..29bba07 100755
--- a/tools/xo_bundle/components/nsContentPrefService.js
+++ b/tools/xo_bundle/components/nsContentPrefService.js
@@ -215,14 +215,7 @@ ContentPrefService.prototype = {
if (groupID)
this._deleteGroupIfUnused(groupID);
- for each (var observer in this._getObservers(aName)) {
- try {
- observer.onContentPrefRemoved(group, aName);
- }
- catch(ex) {
- Cu.reportError(ex);
- }
- }
+ this._notifyPrefRemoved(group, aName);
},
removeGroupedPrefs: function ContentPrefService_removeGroupedPrefs() {
@@ -238,6 +231,45 @@ ContentPrefService.prototype = {
}
},
+ removePrefsByName: function ContentPrefService_removePrefsByName(aName) {
+ var settingID = this._selectSettingID(aName);
+ if (!settingID) {
+ return;
+ }
+
+ var selectGroupsStmt = this._dbCreateStatement(
+ "SELECT groups.name AS groupName " +
+ "FROM prefs " +
+ "JOIN groups ON prefs.groupID = groups.id " +
+ "WHERE prefs.settingID = :setting "
+ );
+
+ try {
+ selectGroupsStmt.params.setting = settingID;
+
+ var groups = [];
+ while (selectGroupsStmt.step()) {
+ groups.push(selectGroupsStmt.row["groupName"]);
+ }
+ }
+ finally {
+ selectGroupsStmt.reset();
+ }
+
+ if (this.hasPref(null, aName)) {
+ groups.push(null);
+ }
+
+ this._dbConnection.executeSimpleSQL("DELETE FROM prefs WHERE settingID = " + settingID);
+ this._dbConnection.executeSimpleSQL("DELETE FROM settings WHERE id = " + settingID);
+
+ for (var i = 0; i < groups.length; i++) {
+ this._notifyPrefRemoved(groups[i], aName);
+ if (groups[i])
+ this._deleteGroupIfUnused(groups[i]);
+ }
+ },
+
getPrefs: function ContentPrefService_getPrefs(aURI) {
if (aURI) {
var group = this.grouper.group(aURI);
@@ -247,6 +279,10 @@ ContentPrefService.prototype = {
return this._selectGlobalPrefs();
},
+ getPrefsByName: function ContentPrefService_getPrefsByName(aName) {
+ return this._selectPrefsByName(aName);
+ },
+
// A hash of arrays of observers, indexed by setting name.
_observers: {},
@@ -297,6 +333,17 @@ ContentPrefService.prototype = {
return observers;
},
+
+ _notifyPrefRemoved: function ContentPrefService__notifyPrefRemoved(aGroup, aName) {
+ for each (var observer in this._getObservers(aName)) {
+ try {
+ observer.onContentPrefRemoved(aGroup, aName);
+ }
+ catch(ex) {
+ Cu.reportError(ex);
+ }
+ }
+ },
_grouper: null,
get grouper ContentPrefService_get_grouper() {
@@ -658,6 +705,43 @@ ContentPrefService.prototype = {
return prefs;
},
+ __stmtSelectPrefsByName: null,
+ get _stmtSelectPrefsByName ContentPrefService_get__stmtSelectPrefsByName() {
+ if (!this.__stmtSelectPrefsByName)
+ this.__stmtSelectPrefsByName = this._dbCreateStatement(
+ "SELECT groups.name AS groupName, prefs.value AS value " +
+ "FROM prefs " +
+ "JOIN groups ON prefs.groupID = groups.id " +
+ "JOIN settings ON prefs.settingID = settings.id " +
+ "WHERE settings.name = :setting "
+ );
+
+ return this.__stmtSelectPrefsByName;
+ },
+
+ _selectPrefsByName: function ContentPrefService__selectPrefsByName(aName) {
+ var prefs = Cc["@mozilla.org/hash-property-bag;1"].
+ createInstance(Ci.nsIWritablePropertyBag);
+
+ try {
+ this._stmtSelectPrefsByName.params.setting = aName;
+
+ while (this._stmtSelectPrefsByName.step())
+ prefs.setProperty(this._stmtSelectPrefsByName.row["groupName"],
+ this._stmtSelectPrefsByName.row["value"]);
+ }
+ finally {
+ this._stmtSelectPrefsByName.reset();
+ }
+
+ var global = this._selectGlobalPref(aName);
+ if (typeof global != "undefined") {
+ prefs.setProperty(null, global);
+ }
+
+ return prefs;
+ },
+
//**************************************************************************//
// Database Creation & Access
diff --git a/tools/xo_bundle/components/nsDefaultCLH.js b/tools/xo_bundle/components/nsDefaultCLH.js
index 315c064..c108523 100755
--- a/tools/xo_bundle/components/nsDefaultCLH.js
+++ b/tools/xo_bundle/components/nsDefaultCLH.js
@@ -1,4 +1,4 @@
-//@line 38 "/builds/moz2_slave/linux_build/build/toolkit/components/nsDefaultCLH.js"
+//@line 38 "/builds/slave/linux_build/build/toolkit/components/nsDefaultCLH.js"
const nsISupports = Components.interfaces.nsISupports;
diff --git a/tools/xo_bundle/components/nsExtensionManager.js b/tools/xo_bundle/components/nsExtensionManager.js
index 637504a..b2f4eec 100755
--- a/tools/xo_bundle/components/nsExtensionManager.js
+++ b/tools/xo_bundle/components/nsExtensionManager.js
@@ -1,6 +1,6 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
-//@line 44 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 44 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
*/
//
@@ -13,6 +13,7 @@ const Ci = Components.interfaces;
const Cr = Components.results;
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm");
const PREF_EM_CHECK_COMPATIBILITY = "extensions.checkCompatibility";
const PREF_EM_CHECK_UPDATE_SECURITY = "extensions.checkUpdateSecurity";
@@ -21,6 +22,8 @@ const PREF_EM_ENABLED_ITEMS = "extensions.enabledItems";
const PREF_UPDATE_COUNT = "extensions.update.count";
const PREF_UPDATE_DEFAULT_URL = "extensions.update.url";
const PREF_EM_NEW_ADDONS_LIST = "extensions.newAddons";
+const PREF_EM_DISABLED_ADDONS_LIST = "extensions.disabledAddons";
+const PREF_EM_SHOW_MISMATCH_UI = "extensions.showMismatchUI";
const PREF_EM_IGNOREMTIMECHANGES = "extensions.ignoreMTimeChanges";
const PREF_EM_DISABLEDOBSOLETE = "extensions.disabledObsolete";
const PREF_EM_EXTENSION_FORMAT = "extensions.%UUID%.";
@@ -30,6 +33,7 @@ const PREF_EM_ITEM_UPDATE_URL = "extensions.%UUID%.update.url";
const PREF_EM_DSS_ENABLED = "extensions.dss.enabled";
const PREF_DSS_SWITCHPENDING = "extensions.dss.switchPending";
const PREF_DSS_SKIN_TO_SELECT = "extensions.lastSelectedSkin";
+const PREF_LWTHEME_TO_SELECT = "extensions.lwThemeToSelect";
const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin";
const PREF_EM_LOGGING_ENABLED = "extensions.logging.enabled";
const PREF_EM_UPDATE_INTERVAL = "extensions.update.interval";
@@ -46,12 +50,10 @@ const FILE_EXTENSIONS_STARTUP_CACHE = "extensions.cache";
const FILE_EXTENSIONS_LOG = "extensions.log";
const FILE_AUTOREG = ".autoreg";
const FILE_INSTALL_MANIFEST = "install.rdf";
-const FILE_CONTENTS_MANIFEST = "contents.rdf";
const FILE_CHROME_MANIFEST = "chrome.manifest";
const UNKNOWN_XPCOM_ABI = "unknownABI";
-const FILE_DEFAULT_THEME_JAR = "classic.jar";
const TOOLKIT_ID = "toolkit@mozilla.org"
const KEY_PROFILEDIR = "ProfD";
@@ -84,7 +86,6 @@ const CATEGORY_INSTALL_LOCATIONS = "extension-install-locations";
const CATEGORY_UPDATE_PARAMS = "extension-update-params";
const PREFIX_NS_EM = "http://www.mozilla.org/2004/em-rdf#";
-const PREFIX_NS_CHROME = "http://www.mozilla.org/rdf/chrome#";
const PREFIX_ITEM_URI = "urn:mozilla:item:";
const PREFIX_EXTENSION = "urn:mozilla:extension:";
const PREFIX_THEME = "urn:mozilla:theme:";
@@ -102,6 +103,20 @@ const URI_DOWNLOADS_PROPERTIES = "chrome://mozapps/locale/downloads/downl
const URI_EXTENSION_UPDATE_DIALOG = "chrome://mozapps/content/extensions/update.xul";
const URI_EXTENSION_LIST_DIALOG = "chrome://mozapps/content/extensions/list.xul";
+/**
+ * Constants that internal code can use to indicate the reason for an add-on
+ * update check. external code uses other constants in nsIExtensionManager.idl.
+ */
+const MAX_PUBLIC_UPDATE_WHEN = 15;
+const UPDATE_WHEN_PERIODIC_UPDATE = 16;
+const UPDATE_WHEN_ADDON_INSTALLED = 17;
+
+/**
+ * Bitmask of the different types of update check.
+ */
+const UPDATE_TYPE_COMPATIBILITY = 32;
+const UPDATE_TYPE_NEWVERSION = 64;
+
const INSTALLERROR_SUCCESS = 0;
const INSTALLERROR_INVALID_VERSION = -1;
const INSTALLERROR_INVALID_GUID = -2;
@@ -129,6 +144,7 @@ var gApp = null;
var gPref = null;
var gRDF = null;
var gOS = null;
+var gCheckCompatibilityPref;
var gEmSingleton = null;
var gBlocklist = null;
var gXPCOMABI = null;
@@ -145,91 +161,25 @@ var gFirstRun = false;
var gAllowFlush = true;
var gDSNeedsFlush = false;
var gManifestNeedsFlush = false;
+var gDefaultTheme = "classic/1.0";
+
+const URI_EXTENSION_MANAGER = "chrome://mozapps/content/extensions/extensions.xul";
+const FEATURES_EXTENSION_MANAGER = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
+const FEATURES_EXTENSION_UPDATES = "chrome,centerscreen,extra-chrome,dialog,resizable,modal";
/**
* Valid GUIDs fit this pattern.
*/
var gIDTest = /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)$/i;
-// shared code for suppressing bad cert dialogs
-//@line 41 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/shared/src/badCertHandler.js"
-
-/**
- * Only allow built-in certs for HTTPS connections. See bug 340198.
- */
-function checkCert(channel) {
- if (!channel.originalURI.schemeIs("https")) // bypass
- return;
-
- const Ci = Components.interfaces;
- var cert =
- channel.securityInfo.QueryInterface(Ci.nsISSLStatusProvider).
- SSLStatus.QueryInterface(Ci.nsISSLStatus).serverCert;
-
- var issuer = cert.issuer;
- while (issuer && !cert.equals(issuer)) {
- cert = issuer;
- issuer = cert.issuer;
- }
-
- var errorstring = "cert issuer is not built-in";
- if (!issuer)
- throw errorstring;
-
- issuer = issuer.QueryInterface(Ci.nsIX509Cert3);
- var tokenNames = issuer.getAllTokenNames({});
-
- if (!tokenNames.some(isBuiltinToken))
- throw errorstring;
-}
-
-function isBuiltinToken(tokenName) {
- return tokenName == "Builtin Object Token";
-}
-
-/**
- * This class implements nsIBadCertListener. Its job is to prevent "bad cert"
- * security dialogs from being shown to the user. It is better to simply fail
- * if the certificate is bad. See bug 304286.
- */
-function BadCertHandler() {
-}
-BadCertHandler.prototype = {
-
- // nsIChannelEventSink
- onChannelRedirect: function(oldChannel, newChannel, flags) {
- // make sure the certificate of the old channel checks out before we follow
- // a redirect from it. See bug 340198.
- checkCert(oldChannel);
- },
-
- // Suppress any certificate errors
- notifyCertProblem: function(socketInfo, status, targetSite) {
- return true;
- },
-
- // Suppress any ssl errors
- notifySSLError: function(socketInfo, error, targetSite) {
- return true;
- },
-
- // nsIInterfaceRequestor
- getInterface: function(iid) {
- return this.QueryInterface(iid);
- },
+var gBranchVersion = /^([^\.]+\.[^a-z\.]+[a-z]?).*/gi;
- // nsISupports
- QueryInterface: function(iid) {
- if (!iid.equals(Components.interfaces.nsIChannelEventSink) &&
- !iid.equals(Components.interfaces.nsIBadCertListener2) &&
- !iid.equals(Components.interfaces.nsISSLErrorListener) &&
- !iid.equals(Components.interfaces.nsIInterfaceRequestor) &&
- !iid.equals(Components.interfaces.nsISupports))
- throw Components.results.NS_ERROR_NO_INTERFACE;
- return this;
- }
-};
-//@line 196 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+// shared code for suppressing bad cert dialogs
+XPCOMUtils.defineLazyGetter(this, "gCertUtils", function() {
+ let temp = { };
+ Components.utils.import("resource://gre/modules/CertUtils.jsm", temp);
+ return temp;
+});
/**
* Creates a Version Checker object.
@@ -278,10 +228,6 @@ function EM_NS(property) {
return PREFIX_NS_EM + property;
}
-function CHROME_NS(property) {
- return PREFIX_NS_CHROME + property;
-}
-
function EM_R(property) {
return gRDF.GetResource(EM_NS(property));
}
@@ -566,25 +512,52 @@ function removeDirRecursive(dir) {
}
/**
- * Logs a string to the error console.
+ * Logs a string to the error console and the text console if logging is
+ * enabled.
* @param string
- * The string to write to the error console.
+ * The log message.
*/
function LOG(string) {
if (gLoggingEnabled) {
- dump("*** " + string + "\n");
+ dump("*** EM_LOG *** " + string + "\n");
if (gConsole)
gConsole.logStringMessage(string);
}
}
/**
- * Logs a string to the error console and to a permanent log file.
+ * Logs a warning to the error console and if logging is enabled to the text
+ * console.
* @param string
- * The string to write out.
+ * The warning message.
+ */
+function WARN(string) {
+ if (gLoggingEnabled)
+ dump("*** EM_WARN *** " + string + "\n");
+ if (gConsole) {
+ var message = Cc["@mozilla.org/scripterror;1"].
+ createInstance(Ci.nsIScriptError);
+ message.init(string, null, null, 0, 0, Ci.nsIScriptError.warningFlag,
+ "component javascript");
+ gConsole.logMessage(message);
+ }
+}
+
+/**
+ * Logs an error to the error console and to a permanent log file.
+ * @param string
+ * The error message.
*/
function ERROR(string) {
- LOG(string);
+ if (gLoggingEnabled)
+ dump("*** EM_ERROR *** " + string + "\n");
+ if (gConsole) {
+ var message = Cc["@mozilla.org/scripterror;1"].
+ createInstance(Ci.nsIScriptError);
+ message.init(string, null, null, 0, 0, Ci.nsIScriptError.errorFlag,
+ "component javascript");
+ gConsole.logMessage(message);
+ }
try {
var tstamp = new Date();
var logfile = getFile(KEY_PROFILEDIR, [FILE_EXTENSIONS_LOG]);
@@ -859,6 +832,35 @@ function getZipReaderForFile(zipFile) {
}
/**
+ * Verifies that a zip file's contents are all signed by the same principal.
+ * Directory entries and anything in the META-INF directory are not checked.
+ * @param zip
+ * A nsIZipReader to check
+ * @param principal
+ * The nsIPrincipal to compare against
+ * @return true if all the contents were signed by the principal, false
+ * otherwise.
+ */
+function verifyZipSigning(zip, principal) {
+ var count = 0;
+ var entries = zip.findEntries(null);
+ while (entries.hasMore()) {
+ var entry = entries.getNext();
+ // Nothing in META-INF is in the manifest.
+ if (entry.substr(0, 9) == "META-INF/")
+ continue;
+ // Directory entries aren't in the manifest.
+ if (entry.substr(-1) == "/")
+ continue;
+ count++;
+ var entryPrincipal = zip.getCertificatePrincipal(entry);
+ if (!entryPrincipal || !principal.equals(entryPrincipal))
+ return false;
+ }
+ return zip.manifestEntriesCount == count;
+}
+
+/**
* Extract a RDF file from a ZIP archive to a random location in the system
* temp directory.
* @param zipFile
@@ -1291,7 +1293,7 @@ DirectoryInstallLocation.prototype = {
* See nsIExtensionManager.idl
*/
getItemFile: function DirInstallLocation_getItemFile(id, filePath) {
- var itemLocation = this.getItemLocation(id).clone();
+ var itemLocation = this.getItemLocation(id);
var parts = filePath.split("/");
for (var i = 0; i < parts.length; ++i)
itemLocation.append(parts[i]);
@@ -1397,380 +1399,11 @@ DirectoryInstallLocation.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIInstallLocation])
};
-//@line 1509 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 1592 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
/**
- * An object which handles the installation of an Extension.
- * @constructor
- */
-function Installer(ds, id, installLocation, type) {
- this._ds = ds;
- this._id = id;
- this._type = type;
- this._installLocation = installLocation;
-}
-Installer.prototype = {
- // Item metadata
- _id: null,
- _ds: null,
- _installLocation: null,
- _metadataDS: null,
-
- /**
- * Gets the Install Manifest datasource we are installing from.
- */
- get metadataDS() {
- if (!this._metadataDS) {
- var metadataFile = this._installLocation
- .getItemFile(this._id, FILE_INSTALL_MANIFEST);
- if (!metadataFile.exists())
- return null;
- this._metadataDS = getInstallManifest(metadataFile);
- if (!this._metadataDS) {
- LOG("Installer::install: metadata datasource for extension " +
- this._id + " at " + metadataFile.path + " could not be loaded. " +
- " Installation will not proceed.");
- }
- }
- return this._metadataDS;
- },
-
- /**
- * Installs the Extension
- * @param file
- * A XPI/JAR file to install from. If this is null or does not exist,
- * the item is assumed to be an expanded directory, located at the GUID
- * key in the supplied Install Location.
- */
- installFromFile: function Installer_installFromFile(file) {
- // Move files from the staging dir into the extension's final home.
- if (file && file.exists()) {
- this._installExtensionFiles(file);
- }
-
- if (!this.metadataDS)
- return;
-
- // Upgrade old-style contents.rdf Chrome Manifests if necessary.
- if (this._type == Ci.nsIUpdateItem.TYPE_THEME)
- this.upgradeThemeChrome();
- else
- this.upgradeExtensionChrome();
-
- // Add metadata for the extension to the global extension metadata set
- this._ds.addItemMetadata(this._id, this.metadataDS, this._installLocation);
- },
-
- /**
- * Safely extract the Extension's files into the target folder.
- * @param file
- * The XPI/JAR file to install from.
- */
- _installExtensionFiles: function Installer__installExtensionFiles(file) {
- /**
- * Callback for |safeInstallOperation| that performs file level installation
- * steps for an Extension.
- * @param extensionID
- * The GUID of the Extension being installed.
- * @param installLocation
- * The Install Location where the Extension is being installed.
- * @param xpiFile
- * The source XPI file that contains the Extension.
- */
- function extractExtensionFiles(extensionID, installLocation, xpiFile) {
- // Create a logger to log install operations for uninstall. This must be
- // created in the |safeInstallOperation| callback, since it creates a file
- // in the target directory. If we do this outside of the callback, we may
- // be clobbering a file we should not be.
- var zipReader = getZipReaderForFile(xpiFile);
-
- // create directories first
- var entries = zipReader.findEntries("*/");
- while (entries.hasMore()) {
- var entryName = entries.getNext();
- var target = installLocation.getItemFile(extensionID, entryName);
- if (!target.exists()) {
- try {
- target.create(Ci.nsILocalFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
- }
- catch (e) {
- ERROR("extractExtensionsFiles: failed to create target directory for extraction " +
- " file = " + target.path + ", exception = " + e + "\n");
- }
- }
- }
-
- entries = zipReader.findEntries(null);
- while (entries.hasMore()) {
- var entryName = entries.getNext();
- target = installLocation.getItemFile(extensionID, entryName);
- if (target.exists())
- continue;
-
- try {
- target.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- }
- catch (e) {
- ERROR("extractExtensionsFiles: failed to create target file for extraction " +
- " file = " + target.path + ", exception = " + e + "\n");
- }
- zipReader.extract(entryName, target);
- }
- zipReader.close();
- }
-
- /**
- * Callback for |safeInstallOperation| that performs file level installation
- * steps for a Theme.
- * @param id
- * The GUID of the Theme being installed.
- * @param installLocation
- * The Install Location where the Theme is being installed.
- * @param jarFile
- * The source JAR file that contains the Theme.
- */
- function extractThemeFiles(id, installLocation, jarFile) {
- var themeDirectory = installLocation.getItemLocation(id);
- var zipReader = getZipReaderForFile(jarFile);
-
- // The only critical file is the install.rdf and we would not have
- // gotten this far without one.
- var rootFiles = [FILE_INSTALL_MANIFEST, FILE_CHROME_MANIFEST,
- "preview.png", "icon.png"];
- for (var i = 0; i < rootFiles.length; ++i) {
- try {
- var target = installLocation.getItemFile(id, rootFiles[i]);
- zipReader.extract(rootFiles[i], target);
- }
- catch (e) {
- }
- }
-
- var manifestFile = installLocation.getItemFile(id, FILE_CHROME_MANIFEST);
- // new theme structure requires a chrome.manifest file
- if (manifestFile.exists()) {
- var entries = zipReader.findEntries(DIR_CHROME + "/*");
- while (entries.hasMore()) {
- var entryName = entries.getNext();
- if (entryName.charAt(entryName.length - 1) == "/")
- continue;
- target = installLocation.getItemFile(id, entryName);
- try {
- target.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- }
- catch (e) {
- ERROR("extractThemeFiles: failed to create target file for extraction " +
- " file = " + target.path + ", exception = " + e + "\n");
- }
- zipReader.extract(entryName, target);
- }
- zipReader.close();
- }
- else { // old theme structure requires only an install.rdf
- try {
- var contentsManifestFile = installLocation.getItemFile(id, FILE_CONTENTS_MANIFEST);
- contentsManifestFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- zipReader.extract(FILE_CONTENTS_MANIFEST, contentsManifestFile);
- }
- catch (e) {
- zipReader.close();
- ERROR("extractThemeFiles: failed to extract contents.rdf: " + target.path);
- throw e; // let the safe-op clean up
- }
- zipReader.close();
- var chromeDir = installLocation.getItemFile(id, DIR_CHROME);
- try {
- jarFile.copyTo(chromeDir, jarFile.leafName);
- }
- catch (e) {
- ERROR("extractThemeFiles: failed to copy theme JAR file to: " + chromeDir.path);
- throw e; // let the safe-op clean up
- }
-
- if (!installer.metadataDS && installer._type == Ci.nsIUpdateItem.TYPE_THEME) {
- var themeName = extensionStrings.GetStringFromName("incompatibleThemeName");
- if (contentsManifestFile && contentsManifestFile.exists()) {
- var contentsManifest = gRDF.GetDataSourceBlocking(getURLSpecFromFile(contentsManifestFile));
- try {
- var ctr = getContainer(contentsManifest,
- gRDF.GetResource("urn:mozilla:skin:root"));
- var elts = ctr.GetElements();
- var nameArc = gRDF.GetResource(CHROME_NS("displayName"));
- while (elts.hasMoreElements()) {
- var elt = elts.getNext().QueryInterface(Ci.nsIRDFResource);
- themeName = stringData(contentsManifest.GetTarget(elt, nameArc, true));
- if (themeName)
- break;
- }
- }
- catch (e) {
- themeName = extensionStrings.GetStringFromName("incompatibleThemeName");
- }
- }
- showIncompatibleError({ name: themeName, version: "",
- type: Ci.nsIUpdateItem.TYPE_THEME });
- LOG("Theme JAR file: " + jarFile.leafName + " contains an Old-Style " +
- "Theme that is not compatible with this version of the software.");
- throw new Error("Old Theme"); // let the safe-op clean up
- }
- }
- }
-
- var installer = this;
- var callback = extractExtensionFiles;
- if (this._type == Ci.nsIUpdateItem.TYPE_THEME)
- callback = extractThemeFiles;
- safeInstallOperation(this._id, this._installLocation,
- { callback: callback, data: file });
- },
-
- /**
- * Upgrade contents.rdf Chrome Manifests used by this Theme to the new
- * chrome.manifest format if necessary.
- */
- upgradeThemeChrome: function Installer_upgradeThemeChrome() {
- // Use the Chrome Registry API to install the theme there
- var cr = Cc["@mozilla.org/chrome/chrome-registry;1"].
- getService(Ci.nsIToolkitChromeRegistry);
- var manifestFile = this._installLocation.getItemFile(this._id, FILE_CHROME_MANIFEST);
- if (manifestFile.exists() ||
- this._id == stripPrefix(RDFURI_DEFAULT_THEME, PREFIX_ITEM_URI))
- return;
-
- try {
- // creates a chrome manifest for themes
- var manifestURI = getURIFromFile(manifestFile);
- var chromeDir = this._installLocation.getItemFile(this._id, DIR_CHROME);
- // We're relying on the fact that there is only one JAR file
- // in the "chrome" directory. This is a hack, but it works.
- var entries = chromeDir.directoryEntries.QueryInterface(Ci.nsIDirectoryEnumerator);
- var jarFile = entries.nextFile;
- if (jarFile) {
- var jarFileURI = getURIFromFile(jarFile);
- var contentsURI = newURI("jar:" + jarFileURI.spec + "!/");
- var contentsFile = this._installLocation.getItemFile(this._id, FILE_CONTENTS_MANIFEST);
- var contentsFileURI = getURIFromFile(contentsFile.parent);
-
- cr.processContentsManifest(contentsFileURI, manifestURI, contentsURI, false, true);
- }
- entries.close();
- contentsFile.remove(false);
- }
- catch (e) {
- // Failed to register chrome, for any number of reasons - non-existent
- // contents.rdf file at the location specified, malformed contents.rdf,
- // etc. Set the pending op to be OP_NEEDS_UNINSTALL so that the
- // extension is uninstalled properly during the subsequent uninstall
- // pass in |ExtensionManager::_finishOperations|
- ERROR("upgradeThemeChrome: failed for theme " + this._id + " - why " +
- "not convert to the new chrome.manifest format while you're at it? " +
- "Failure exception: " + e);
- showMessage("malformedRegistrationTitle", [], "malformedRegistrationMessage",
- [BundleManager.appName]);
-
- var stageFile = this._installLocation.getStageFile(this._id);
- if (stageFile)
- this._installLocation.removeFile(stageFile);
-
- StartupCache.put(this._installLocation, this._id, OP_NEEDS_UNINSTALL, true);
- StartupCache.write();
- }
- },
-
- /**
- * Upgrade contents.rdf Chrome Manifests used by this Extension to the new
- * chrome.manifest format if necessary.
- */
- upgradeExtensionChrome: function Installer_upgradeExtensionChrome() {
- // If the extension is aware of the new flat chrome manifests and has
- // included one, just use it instead of generating one from the
- // install.rdf/contents.rdf data.
- var manifestFile = this._installLocation.getItemFile(this._id, FILE_CHROME_MANIFEST);
- if (manifestFile.exists())
- return;
-
- try {
- // Enumerate the metadata datasource files collection and register chrome
- // for each file, calling _registerChrome for each.
- var chromeDir = this._installLocation.getItemFile(this._id, DIR_CHROME);
-
- if (!manifestFile.parent.exists())
- return;
-
- // Even if an extension doesn't have any chrome, we generate an empty
- // manifest file so that we don't try to upgrade from the "old-style"
- // chrome manifests at every startup.
- manifestFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
-
- var manifestURI = getURIFromFile(manifestFile);
- var files = this.metadataDS.GetTargets(gInstallManifestRoot, EM_R("file"), true);
- while (files.hasMoreElements()) {
- var file = files.getNext().QueryInterface(Ci.nsIRDFResource);
- var chromeFile = chromeDir.clone();
- var fileName = file.Value.substr("urn:mozilla:extension:file:".length, file.Value.length);
- chromeFile.append(fileName);
-
- var fileURLSpec = getURLSpecFromFile(chromeFile);
- if (!chromeFile.isDirectory()) {
- var zipReader = getZipReaderForFile(chromeFile);
- fileURLSpec = "jar:" + fileURLSpec + "!/";
- var contentsFile = this._installLocation.getItemFile(this._id, FILE_CONTENTS_MANIFEST);
- contentsFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- }
-
- var providers = [EM_R("package"), EM_R("skin"), EM_R("locale")];
- for (var i = 0; i < providers.length; ++i) {
- var items = this.metadataDS.GetTargets(file, providers[i], true);
- while (items.hasMoreElements()) {
- var item = items.getNext().QueryInterface(Ci.nsIRDFLiteral);
- var fileURI = newURI(fileURLSpec + item.Value);
- // Extract the contents.rdf files instead of opening them inside of
- // the jar. This prevents the jar from being cached by the zip
- // reader which will keep the jar in use and prevent deletion.
- if (zipReader) {
- zipReader.extract(item.Value + FILE_CONTENTS_MANIFEST, contentsFile);
- var contentsFileURI = getURIFromFile(contentsFile.parent);
- }
- else
- contentsFileURI = fileURI;
-
- var cr = Cc["@mozilla.org/chrome/chrome-registry;1"].
- getService(Ci.nsIToolkitChromeRegistry);
- cr.processContentsManifest(contentsFileURI, manifestURI, fileURI, true, false);
- }
- }
- if (zipReader) {
- zipReader.close();
- zipReader = null;
- contentsFile.remove(false);
- }
- }
- }
- catch (e) {
- // Failed to register chrome, for any number of reasons - non-existent
- // contents.rdf file at the location specified, malformed contents.rdf,
- // etc. Set the pending op to be OP_NEEDS_UNINSTALL so that the
- // extension is uninstalled properly during the subsequent uninstall
- // pass in |ExtensionManager::_finishOperations|
- ERROR("upgradeExtensionChrome: failed for extension " + this._id + " - why " +
- "not convert to the new chrome.manifest format while you're at it? " +
- "Failure exception: " + e);
- showMessage("malformedRegistrationTitle", [], "malformedRegistrationMessage",
- [BundleManager.appName]);
-
- var stageFile = this._installLocation.getStageFile(this._id);
- if (stageFile)
- this._installLocation.removeFile(stageFile);
-
- StartupCache.put(this._installLocation, this._id, OP_NEEDS_UNINSTALL, true);
- StartupCache.write();
- }
- }
-};
-
-/**
- * Safely attempt to perform a caller-defined install operation for a given
- * item ID. Using aggressive success-safety checks, this function will attempt
+ * Safely attempt to install or uninstall a given item ID in an install
+ * location. Using aggressive success-safety checks, this function will attempt
* to move an existing location for an item aside and then allow installation
* into the appropriate folder. If any operation fails the installation will
* abort and roll back from the moved-aside old version.
@@ -1778,16 +1411,10 @@ Installer.prototype = {
* The GUID of the item to perform the operation on.
* @param installLocation
* The Install Location where the item is installed.
- * @param installCallback
- * A caller supplied JS object with the following properties:
- * "data" A data parameter to be passed to the callback.
- * "callback" A function to perform the install operation. This
- * function is passed three parameters:
- * 1. The GUID of the item being operated on.
- * 2. The Install Location where the item is installed.
- * 3. The "data" parameter on the installCallback object.
+ * @param file
+ * An xpi file to install to the location or null to just uninstall
*/
-function safeInstallOperation(itemID, installLocation, installCallback) {
+function safeInstallOperation(itemID, installLocation, file) {
var movedFiles = [];
/**
@@ -1949,28 +1576,61 @@ function safeInstallOperation(itemID, installLocation, installCallback) {
}
}
- // Now tell the client to do their stuff.
- try {
- installCallback.callback(itemID, installLocation, installCallback.data);
- }
- catch (e) {
- // This means the install operation failed. Remove everything and roll back.
- ERROR("safeInstallOperation: install operation (caller-supplied callback) failed, " +
- "rolling back file moves and aborting installation.");
+ if (file) {
+ // Extract the xpi's files into the new directory
try {
- // Us-generated. Safe.
- removeDirRecursive(itemLocation);
+ var zipReader = getZipReaderForFile(file);
+
+ // create directories first
+ var entries = zipReader.findEntries("*/");
+ while (entries.hasMore()) {
+ var entryName = entries.getNext();
+ var target = installLocation.getItemFile(itemID, entryName);
+ if (!target.exists()) {
+ try {
+ target.create(Ci.nsILocalFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
+ }
+ catch (e) {
+ ERROR("extractFiles: failed to create target directory for extraction " +
+ "file = " + target.path + ", exception = " + e + "\n");
+ }
+ }
+ }
+
+ entries = zipReader.findEntries(null);
+ while (entries.hasMore()) {
+ var entryName = entries.getNext();
+ target = installLocation.getItemFile(itemID, entryName);
+ if (target.exists())
+ continue;
+
+ zipReader.extract(entryName, target);
+ target.permissions = PERMS_FILE;
+ }
}
catch (e) {
- ERROR("safeInstallOperation: failed to remove the folder we failed to install " +
- "an item into: " + itemLocation.path + " -- There is not much to suggest " +
- "here... maybe restart and try again?");
+ // This means the install operation failed. Remove everything and roll back.
+ ERROR("safeInstallOperation: file extraction failed, " +
+ "rolling back file moves and aborting installation.");
+ try {
+ // Us-generated. Safe.
+ removeDirRecursive(itemLocation);
+ }
+ catch (e) {
+ ERROR("safeInstallOperation: failed to remove the folder we failed to install " +
+ "an item into: " + itemLocation.path + " -- There is not much to suggest " +
+ "here... maybe restart and try again?");
+ cleanUpTrash(itemLocationTrash);
+ throw e;
+ }
+ rollbackMove();
cleanUpTrash(itemLocationTrash);
throw e;
}
- rollbackMove();
- cleanUpTrash(itemLocationTrash);
- throw e;
+ finally {
+ if (zipReader)
+ zipReader.close();
+ }
}
// Now, and only now - after everything else has succeeded (against all odds!)
@@ -2314,11 +1974,18 @@ function ExtensionManager() {
gXPCOMABI = UNKNOWN_XPCOM_ABI;
}
gPref = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefBranch2);
+ getService(Ci.nsIPrefBranch2).
+ QueryInterface(Ci.nsIPrefService);
+ var defaults = gPref.getDefaultBranch("");
+ try {
+ gDefaultTheme = defaults.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN);
+ } catch(e) {}
gOS = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
gOS.addObserver(this, "xpcom-shutdown", false);
+ gOS.addObserver(this, "lightweight-theme-preview-requested", false);
+ gOS.addObserver(this, "lightweight-theme-change-requested", false);
gConsole = Cc["@mozilla.org/consoleservice;1"].
getService(Ci.nsIConsoleService);
@@ -2386,7 +2053,7 @@ function ExtensionManager() {
InstallLocations.put(systemLocation);
}
-//@line 2512 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 2260 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
// Register Additional Install Locations
var categoryManager = Cc["@mozilla.org/categorymanager;1"].
@@ -2415,13 +2082,66 @@ ExtensionManager.prototype = {
case "offline-requested":
this._confirmCancelDownloadsOnOffline(subject);
break;
+ case "lightweight-theme-preview-requested":
+ if (gPref.prefHasUserValue(PREF_GENERAL_SKINS_SELECTEDSKIN)) {
+ let cancel = subject.QueryInterface(Ci.nsISupportsPRBool);
+ cancel.data = true;
+ }
+ break;
+ case "lightweight-theme-change-requested":
+ let theme = JSON.parse(data);
+ if (!theme)
+ return;
+
+ if (gPref.prefHasUserValue(PREF_GENERAL_SKINS_SELECTEDSKIN)) {
+ if (getPref("getBoolPref", PREF_EM_DSS_ENABLED, false)) {
+ gPref.clearUserPref(PREF_GENERAL_SKINS_SELECTEDSKIN);
+ return;
+ }
+
+ let cancel = subject.QueryInterface(Ci.nsISupportsPRBool);
+ cancel.data = true;
+ gPref.setBoolPref(PREF_DSS_SWITCHPENDING, true);
+ gPref.setCharPref(PREF_DSS_SKIN_TO_SELECT, gDefaultTheme);
+ gPref.setCharPref(PREF_LWTHEME_TO_SELECT, theme.id);
+
+ // Open the UI so the user can see that a restart is necessary
+ var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
+ getService(Ci.nsIWindowMediator);
+ var win = wm.getMostRecentWindow("Extension:Manager");
+
+ if (win) {
+ win.showView("themes");
+ return;
+ }
+
+ var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
+ getService(Ci.nsIWindowWatcher);
+ var param = Cc["@mozilla.org/supports-array;1"].
+ createInstance(Ci.nsISupportsArray);
+ var arg = Cc["@mozilla.org/supports-string;1"].
+ createInstance(Ci.nsISupportsString);
+ arg.data = "themes";
+ param.AppendElement(arg);
+ ww.openWindow(null, URI_EXTENSION_MANAGER, null, FEATURES_EXTENSION_MANAGER, param);
+ return;
+ }
+ else {
+ // Cancel any pending theme change and allow the lightweight theme
+ // change to go ahead
+ if (gPref.prefHasUserValue(PREF_DSS_SWITCHPENDING))
+ gPref.clearUserPref(PREF_DSS_SWITCHPENDING);
+ if (gPref.prefHasUserValue(PREF_DSS_SKIN_TO_SELECT))
+ gPref.clearUserPref(PREF_DSS_SKIN_TO_SELECT);
+ }
+ break;
case "xpcom-shutdown":
this._shutdown();
break;
case "nsPref:changed":
if (data == PREF_EM_LOGGING_ENABLED)
this._loggingToggled();
- else if (data == PREF_EM_CHECK_COMPATIBILITY ||
+ else if (data == gCheckCompatibilityPref ||
data == PREF_EM_CHECK_UPDATE_SECURITY)
this._updateAppDisabledState();
else if ((data == PREF_MATCH_OS_LOCALE) || (data == PREF_SELECTED_LOCALE))
@@ -2460,7 +2180,7 @@ ExtensionManager.prototype = {
* we must app-enable or app-disable the item based on the new settings.
*/
_updateAppDisabledState: function EM__updateAppDisabledState() {
- gCheckCompatibility = getPref("getBoolPref", PREF_EM_CHECK_COMPATIBILITY, true);
+ gCheckCompatibility = getPref("getBoolPref", gCheckCompatibilityPref, true);
gCheckUpdateSecurity = getPref("getBoolPref", PREF_EM_CHECK_UPDATE_SECURITY, true);
var ds = this.datasource;
@@ -2492,27 +2212,48 @@ ExtensionManager.prototype = {
gPref.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN, toSelect);
gPref.clearUserPref(PREF_DSS_SWITCHPENDING);
gPref.clearUserPref(PREF_DSS_SKIN_TO_SELECT);
+
+ // If we've changed to a non-default theme make sure there is no
+ // lightweight theme selected
+ if (toSelect != gDefaultTheme) {
+ if (gPref.prefHasUserValue(PREF_LWTHEME_TO_SELECT))
+ gPref.clearUserPref(PREF_LWTHEME_TO_SELECT);
+ LightweightThemeManager.currentTheme = null;
+ }
+ }
+
+ if (gPref.prefHasUserValue(PREF_LWTHEME_TO_SELECT)) {
+ var id = gPref.getCharPref(PREF_LWTHEME_TO_SELECT);
+ if (id)
+ LightweightThemeManager.currentTheme = LightweightThemeManager.getUsedTheme(id);
+ else
+ LightweightThemeManager.currentTheme = null;
+ gPref.clearUserPref(PREF_LWTHEME_TO_SELECT);
}
}
catch (e) {
}
+ var version = gApp.version.replace(gBranchVersion, "$1");
+ gCheckCompatibilityPref = PREF_EM_CHECK_COMPATIBILITY + "." + version;
+
+ gLoggingEnabled = getPref("getBoolPref", PREF_EM_LOGGING_ENABLED, false);
+ gCheckCompatibility = getPref("getBoolPref", gCheckCompatibilityPref, true);
+ gCheckUpdateSecurity = getPref("getBoolPref", PREF_EM_CHECK_UPDATE_SECURITY, true);
+
if ("nsICrashReporter" in Ci && gApp instanceof Ci.nsICrashReporter) {
- // Annotate the crash report with the list of add-ons
+ // Annotate the crash report with relevant add-on information.
+ try {
+ gApp.annotateCrashReport("Add-ons", gPref.getCharPref(PREF_EM_ENABLED_ITEMS));
+ } catch (e) { }
try {
- try {
- gApp.annotateCrashReport("Add-ons", gPref.getCharPref(PREF_EM_ENABLED_ITEMS));
- } catch (e) { }
gApp.annotateCrashReport("Theme", gPref.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN));
- }
- catch (ex) {
- // This will fail in unnofficial builds, ignorable error
- }
+ } catch (e) { }
+ try {
+ gApp.annotateCrashReport("EMCheckCompatibility", gCheckCompatibility);
+ } catch (e) { }
}
- gLoggingEnabled = getPref("getBoolPref", PREF_EM_LOGGING_ENABLED, false);
- gCheckCompatibility = getPref("getBoolPref", PREF_EM_CHECK_COMPATIBILITY, true);
- gCheckUpdateSecurity = getPref("getBoolPref", PREF_EM_CHECK_UPDATE_SECURITY, true);
gPref.addObserver("extensions.", this, false);
gPref.addObserver(PREF_MATCH_OS_LOCALE, this, false);
gPref.addObserver(PREF_SELECTED_LOCALE, this, false);
@@ -2526,9 +2267,6 @@ ExtensionManager.prototype = {
if (!getPref("getBoolPref", PREF_UPDATE_NOTIFYUSER, false))
return;
- const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
- const EMFEATURES = "chrome,centerscreen,extra-chrome,dialog,resizable,modal";
-
var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
getService(Ci.nsIWindowWatcher);
var param = Cc["@mozilla.org/supports-array;1"].
@@ -2537,7 +2275,7 @@ ExtensionManager.prototype = {
createInstance(Ci.nsISupportsString);
arg.data = "updates-only";
param.AppendElement(arg);
- ww.openWindow(null, EMURL, null, EMFEATURES, param);
+ ww.openWindow(null, URI_EXTENSION_MANAGER, null, FEATURES_EXTENSION_UPDATES, param);
},
/**
@@ -2564,6 +2302,8 @@ ExtensionManager.prototype = {
}
gOS.removeObserver(this, "xpcom-shutdown");
+ gOS.removeObserver(this, "lightweight-theme-preview-requested");
+ gOS.removeObserver(this, "lightweight-theme-change-requested");
// Release strongly held services.
gOS = null;
@@ -2624,7 +2364,7 @@ ExtensionManager.prototype = {
/**
* See nsIExtensionManager.idl
*/
- start: function EM_start(commandLine) {
+ start: function EM_start() {
var isDirty, forceAutoReg;
// Check for missing manifests - e.g. missing extensions.ini, missing
@@ -2675,24 +2415,10 @@ ExtensionManager.prototype = {
ERROR("Error flushing caches: " + e);
}
- if (!needsRestart)
- this._startTimers();
-
return needsRestart;
},
/**
- * Begins all background update check timers
- */
- _startTimers: function EM__startTimers() {
- // Register a background update check timer
- var tm = Cc["@mozilla.org/updates/timer-manager;1"].
- getService(Ci.nsIUpdateTimerManager);
- var interval = getPref("getIntPref", PREF_EM_UPDATE_INTERVAL, 86400);
- tm.registerTimer("addon-background-update-timer", this, interval);
- },
-
- /**
* Notified when a timer fires
* @param timer
* The timer that fired
@@ -2707,55 +2433,9 @@ ExtensionManager.prototype = {
updater.checkForUpdates(items, items.length,
Ci.nsIExtensionManager.UPDATE_CHECK_NEWVERSION,
new BackgroundUpdateCheckListener(this.datasource),
- null, null);
- },
-
- /**
- * See nsIExtensionManager.idl
- */
- handleCommandLineArgs: function EM_handleCommandLineArgs(commandLine) {
- try {
- var globalExtension = commandLine.handleFlagWithParam("install-global-extension", false);
- if (globalExtension) {
- var file = commandLine.resolveFile(globalExtension);
- this._installGlobalItem(file);
- }
- var globalTheme = commandLine.handleFlagWithParam("install-global-theme", false);
- if (globalTheme) {
- file = commandLine.resolveFile(globalTheme);
- this._installGlobalItem(file);
- }
- }
- catch (e) {
- ERROR("ExtensionManager:handleCommandLineArgs - failure, catching exception - lineno: " +
- e.lineNumber + " - file: " + e.fileName + " - " + e);
- }
- commandLine.preventDefault = true;
- },
+ UPDATE_WHEN_PERIODIC_UPDATE);
- /**
- * Installs an XPI/JAR file into the KEY_APP_GLOBAL install location.
- * @param file
- * The XPI/JAR file to extract
- */
- _installGlobalItem: function EM__installGlobalItem(file) {
- if (!file || !file.exists())
- throw new Error("Unable to find the file specified on the command line!");
-//@line 2872 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
- var installManifestFile = extractRDFFileToTempDir(file, FILE_INSTALL_MANIFEST, true);
- if (!installManifestFile.exists())
- throw new Error("The package is missing an install manifest!");
- var installManifest = getInstallManifest(installManifestFile);
- installManifestFile.remove(false);
- var installData = this._getInstallData(installManifest);
- var installer = new Installer(installManifest, installData.id,
- InstallLocations.get(KEY_APP_GLOBAL),
- installData.type);
- installer._installExtensionFiles(file);
- if (installData.type == Ci.nsIUpdateItem.TYPE_THEME)
- installer.upgradeThemeChrome();
- else
- installer.upgradeExtensionChrome();
+ LightweightThemeManager.updateCurrentTheme();
},
/**
@@ -3032,19 +2712,32 @@ ExtensionManager.prototype = {
// walk these lists multiple times on every startup.
var item = this._getItemForDroppedFile(entry, location);
if (item) {
- droppedInFiles.push({ file: entry, location: location });
var prettyName = "";
try {
var zipReader = getZipReaderForFile(entry);
- var principal = { };
- var certPrincipal = zipReader.getCertificatePrincipal(null, principal);
- // XXXbz This string could be empty. This needs better
- // UI to present principal.value.certificate's subject.
- prettyName = principal.value.prettyName;
+ zipReader.QueryInterface(Ci.nsIJAR);
+ var principal = zipReader.getCertificatePrincipal(null);
+ if (principal && principal.hasCertificate) {
+ if (verifyZipSigning(zipReader, principal)) {
+ x509 = principal.certificate;
+ if (x509 instanceof Ci.nsIX509Cert && x509.commonName.length > 0)
+ prettyName = x509.commonName;
+ else
+ prettyName = principal.prettyName;
+ }
+ else {
+ // The xpi isn't correctly signed, don't offer to install.
+ LOG("Ignoring " + entry.path + " as it is not correctly signed.");
+ zipReader.close();
+ entry.remove(true);
+ continue;
+ }
+ }
}
catch (e) { }
if (zipReader)
zipReader.close();
+ droppedInFiles.push({ file: entry, location: location });
xpinstallStrings = xpinstallStrings.concat([item.name,
getURLSpecFromFile(entry),
item.iconURL,
@@ -3178,107 +2871,6 @@ ExtensionManager.prototype = {
return isDirty;
},
- /**
- * Upgrades contents.rdf files to chrome.manifest files for any existing
- * Extensions and Themes.
- * @returns true if actions were performed that require a restart, false
- * otherwise.
- */
- _upgradeChrome: function EM__upgradeChrome() {
- if (inSafeMode())
- return false;
-
- var checkForNewChrome = false;
- var ds = this.datasource;
- // If we have extensions that were installed before the new flat chrome
- // manifests, and are still valid, we need to manually create the flat
- // manifest files.
- var extensions = this._getActiveItems(Ci.nsIUpdateItem.TYPE_EXTENSION +
- Ci.nsIUpdateItem.TYPE_LOCALE);
- for (var i = 0; i < extensions.length; ++i) {
- var e = extensions[i];
- var itemLocation = e.location.getItemLocation(e.id);
- var manifest = itemLocation.clone();
- manifest.append(FILE_CHROME_MANIFEST);
- if (!manifest.exists()) {
- var installRDF = itemLocation.clone();
- installRDF.append(FILE_INSTALL_MANIFEST);
- var installLocation = this.getInstallLocation(e.id);
- if (installLocation && installRDF.exists()) {
- var itemLocation = installLocation.getItemLocation(e.id);
- if (itemLocation.exists() && itemLocation.isDirectory()) {
- var installer = new Installer(ds, e.id, installLocation,
- Ci.nsIUpdateItem.TYPE_EXTENSION);
- installer.upgradeExtensionChrome();
- }
- }
- else {
- ds.removeItemMetadata(e.id);
- ds.removeItemFromContainer(e.id);
- }
-
- checkForNewChrome = true;
- }
- }
-
- var themes = this._getActiveItems(Ci.nsIUpdateItem.TYPE_THEME);
- // If we have themes that were installed before the new flat chrome
- // manifests, and are still valid, we need to manually create the flat
- // manifest files.
- for (i = 0; i < themes.length; ++i) {
- var item = themes[i];
- var itemLocation = item.location.getItemLocation(item.id);
- var manifest = itemLocation.clone();
- manifest.append(FILE_CHROME_MANIFEST);
- if (manifest.exists() ||
- item.id == stripPrefix(RDFURI_DEFAULT_THEME, PREFIX_ITEM_URI))
- continue;
-
- var entries;
- try {
- var manifestURI = getURIFromFile(manifest);
- var chromeDir = itemLocation.clone();
- chromeDir.append(DIR_CHROME);
-
- if (!chromeDir.exists() || !chromeDir.isDirectory()) {
- ds.removeItemMetadata(item.id);
- ds.removeItemFromContainer(item.id);
- continue;
- }
-
- // We're relying on the fact that there is only one JAR file
- // in the "chrome" directory. This is a hack, but it works.
- entries = chromeDir.directoryEntries.QueryInterface(Ci.nsIDirectoryEnumerator);
- var jarFile = entries.nextFile;
- if (jarFile) {
- var jarFileURI = getURIFromFile(jarFile);
- var contentsURI = newURI("jar:" + jarFileURI.spec + "!/");
-
- // Use the Chrome Registry API to install the theme there
- var cr = Cc["@mozilla.org/chrome/chrome-registry;1"].
- getService(Ci.nsIToolkitChromeRegistry);
- cr.processContentsManifest(contentsURI, manifestURI, contentsURI, false, true);
- }
- entries.close();
- }
- catch (e) {
- ERROR("_upgradeChrome: failed to upgrade contents manifest for " +
- "theme: " + item.id + ", exception: " + e + "... The theme will be " +
- "disabled.");
- this._appDisableItem(item.id);
- }
- finally {
- try {
- entries.close();
- }
- catch (e) {
- }
- }
- checkForNewChrome = true;
- }
- return checkForNewChrome;
- },
-
_checkForUncoveredItem: function EM__checkForUncoveredItem(id) {
var ds = this.datasource;
var oldLocation = this.getInstallLocation(id);
@@ -3443,14 +3035,6 @@ ExtensionManager.prototype = {
}
while (PendingOperations.size > 0);
- // Upgrade contents.rdf files to the new chrome.manifest format for
- // existing Extensions and Themes
- if (this._upgradeChrome()) {
- var cr = Cc["@mozilla.org/chrome/chrome-registry;1"].
- getService(Ci.nsIChromeRegistry);
- cr.checkForNewChrome();
- }
-
// If no additional restart is required, it implies that there are
// no new components that need registering so we can inform the app
// not to do any extra startup checking next time round.
@@ -3492,11 +3076,6 @@ ExtensionManager.prototype = {
// Block attempts to flush for the entire startup
gAllowFlush = false;
- // Version mismatch, we have to load the extensions datasource and do
- // version checking. Time hit here doesn't matter since this doesn't happen
- // all that often.
- this._upgradeFromV10();
-
// Make the extensions datasource consistent if it isn't already.
var isDirty;
[isDirty,] = this._ensureDatasetIntegrity();
@@ -3537,6 +3116,7 @@ ExtensionManager.prototype = {
ds.endUpdateBatch();
var badItems = [];
+ var disabledAddons = [];
var allAppManaged = true;
elements = ctr.GetElements();
while (elements.hasMoreElements()) {
@@ -3590,6 +3170,7 @@ ExtensionManager.prototype = {
}
else if (!ds.getItemProperty(id, "appDisabled")) {
properties.appDisabled = EM_L("true");
+ disabledAddons.push(id);
}
ds.setItemProperties(id, properties);
@@ -3627,10 +3208,21 @@ ExtensionManager.prototype = {
// Update the manifests to reflect the items that were disabled / enabled.
this._updateManifests(true);
- // Always check for compatibility updates when upgrading if we have add-ons
- // that aren't managed by the application.
- if (!allAppManaged)
- this._showMismatchWindow(inactiveItemIDs);
+ // Determine if we should check for compatibility updates when upgrading if
+ // we have add-ons that aren't managed by the application.
+ if (!allAppManaged && !gFirstRun && disabledAddons.length > 0) {
+ // Should we show a UI or just pass the list via a pref?
+ if (getPref("getBoolPref", PREF_EM_SHOW_MISMATCH_UI, true)) {
+ this._showMismatchWindow(inactiveItemIDs);
+ }
+ else {
+ // Remember the list of add-ons that were disabled this time around
+ gPref.setCharPref(PREF_EM_DISABLED_ADDONS_LIST, disabledAddons.join(","));
+ }
+ } else if (gPref.prefHasUserValue(PREF_EM_DISABLED_ADDONS_LIST)) {
+ // Clear the disabled addons list if necessary
+ gPref.clearUserPref(PREF_EM_DISABLED_ADDONS_LIST);
+ }
// Finish any pending upgrades from the compatibility update to avoid an
// additional restart.
@@ -3687,190 +3279,6 @@ ExtensionManager.prototype = {
}
},
- /*
- * Catch all for facilitating a version 1.0 profile upgrade.
- * 1) removes the abandoned default theme directory from the profile.
- * 2) prepares themes installed with version 1.0 for installation.
- * 3) initiates an install to populate the new extensions datasource.
- * 4) migrates the disabled attribute from the old datasource.
- * 5) migrates the app compatibility info from the old datasource.
- */
- _upgradeFromV10: function EM__upgradeFromV10() {
- var extensionsDS = getFile(KEY_PROFILEDIR, [FILE_EXTENSIONS]);
- var dsExists = extensionsDS.exists();
- // Toolkiit 1.7 profiles (Firefox 1.0, Thunderbird 1.0, etc.) have a default
- // theme directory in the profile's extensions directory that will be
- // disabled due to having a maxVersion that is incompatible with the
- // toolkit 1.8 release of the app.
- var profileDefaultTheme = getDirNoCreate(KEY_PROFILEDS, [DIR_EXTENSIONS,
- stripPrefix(RDFURI_DEFAULT_THEME, PREFIX_ITEM_URI)]);
- if (profileDefaultTheme && profileDefaultTheme.exists()) {
- removeDirRecursive(profileDefaultTheme);
- // Sunbird 0.3a1 didn't move the default theme into the app's extensions
- // directory and we can't install it while uninstalling the one in the
- // profile directory. If we have a toolkit 1.8 extensions datasource and
- // a profile default theme deleting the toolkit 1.8 extensions datasource
- // will fix this problem when the datasource is re-created.
- if (dsExists)
- extensionsDS.remove(false);
- }
-
- // return early if the toolkit 1.7 extensions datasource file doesn't exist.
- var oldExtensionsFile = getFile(KEY_PROFILEDIR, [DIR_EXTENSIONS, "Extensions.rdf"]);
- if (!oldExtensionsFile.exists())
- return;
-
- // Sunbird 0.2 used a different GUID for the default theme
- profileDefaultTheme = getDirNoCreate(KEY_PROFILEDS, [DIR_EXTENSIONS,
- "{8af2d0a7-e394-4de2-ae55-2dae532a7a9b}"]);
- if (profileDefaultTheme && profileDefaultTheme.exists())
- removeDirRecursive(profileDefaultTheme);
-
- // Firefox 0.9 profiles may have DOMi 1.0 with just an install.rdf
- var profileDOMi = getDirNoCreate(KEY_PROFILEDS, [DIR_EXTENSIONS,
- "{641d8d09-7dda-4850-8228-ac0ab65e2ac9}"]);
- if (profileDOMi && profileDOMi.exists())
- removeDirRecursive(profileDOMi);
-
- // return early to avoid migrating data twice if we already have a
- // toolkit 1.8 extension datasource.
- if (dsExists)
- return;
-
- // Prepare themes for installation
- // Only enumerate directories in the app-profile and app-global locations.
- var locations = [KEY_APP_PROFILE, KEY_APP_GLOBAL];
- for (var i = 0; i < locations.length; ++i) {
- var location = InstallLocations.get(locations[i]);
- if (!location.canAccess)
- continue;
-
- var entries = location.itemLocations;
- var entry;
- while ((entry = entries.nextFile)) {
- var installRDF = entry.clone();
- installRDF.append(FILE_INSTALL_MANIFEST);
-
- var chromeDir = entry.clone();
- chromeDir.append(DIR_CHROME);
-
- // It must be a directory without an install.rdf and it must contain
- // a chrome directory
- if (!entry.isDirectory() || installRDF.exists() || !chromeDir.exists())
- continue;
-
- var chromeEntries = chromeDir.directoryEntries.QueryInterface(Ci.nsIDirectoryEnumerator);
- if (!chromeEntries.hasMoreElements())
- continue;
-
- // We're relying on the fact that there is only one JAR file
- // in the "chrome" directory. This is a hack, but it works.
- var jarFile = chromeEntries.nextFile;
- if (jarFile.isDirectory())
- continue;
- var id = location.getIDForLocation(entry);
-
- try {
- var zipReader = getZipReaderForFile(jarFile);
- zipReader.extract(FILE_INSTALL_MANIFEST, installRDF);
-
- var contentsManifestFile = location.getItemFile(id, FILE_CONTENTS_MANIFEST);
- zipReader.extract(FILE_CONTENTS_MANIFEST, contentsManifestFile);
-
- var rootFiles = ["preview.png", "icon.png"];
- for (var i = 0; i < rootFiles.length; ++i) {
- try {
- var target = location.getItemFile(id, rootFiles[i]);
- zipReader.extract(rootFiles[i], target);
- }
- catch (e) {
- }
- }
- zipReader.close();
- }
- catch (e) {
- ERROR("ExtensionManager:_upgradeFromV10 - failed to extract theme files\r\n" +
- "Exception: " + e);
- }
- }
- }
-
- // When upgrading from a version 1.0 profile we need to populate the
- // extensions datasource with all items before checking for incompatible
- // items since the datasource hasn't been created yet.
- var itemsToCheck = [];
- if (this._checkForFileChanges()) {
- // Create a list of all items that are to be installed so we can migrate
- // these items's settings to the new datasource.
- var items = PendingOperations.getOperations(OP_NEEDS_INSTALL);
- for (i = items.length - 1; i >= 0; --i) {
- if (items[i].locationKey == KEY_APP_PROFILE ||
- items[i].locationKey == KEY_APP_GLOBAL)
- itemsToCheck.push(items[i].id);
- }
- this._finishOperations();
- }
-
- // If there are no items to migrate settings for return early.
- if (itemsToCheck.length == 0)
- return;
-
- var fileURL = getURLSpecFromFile(oldExtensionsFile);
- var oldExtensionsDS = gRDF.GetDataSourceBlocking(fileURL);
- var versionChecker = getVersionChecker();
- var ds = this.datasource;
- var currAppVersion = gApp.version;
- var currAppID = gApp.ID;
- for (var i = 0; i < itemsToCheck.length; ++i) {
- var item = ds.getItemForID(itemsToCheck[i]);
- var oldPrefix = (item.type == Ci.nsIUpdateItem.TYPE_EXTENSION) ? PREFIX_EXTENSION : PREFIX_THEME;
- var oldRes = gRDF.GetResource(oldPrefix + item.id);
- // Disable the item if it was disabled in the version 1.0 extensions
- // datasource.
- if (oldExtensionsDS.GetTarget(oldRes, EM_R("disabled"), true))
- ds.setItemProperty(item.id, EM_R("userDisabled"), EM_L("true"));
-
- // app enable all items. If it is incompatible it will be app disabled
- // later on.
- ds.setItemProperty(item.id, EM_R("appDisabled"), null);
-
- // if the item is already compatible don't attempt to migrate the
- // item's compatibility info
- var newRes = getResourceForID(itemsToCheck[i]);
- if (ds.isCompatible(ds, newRes))
- continue;
-
- var updatedMinVersion = null;
- var updatedMaxVersion = null;
- var targetApps = oldExtensionsDS.GetTargets(oldRes, EM_R("targetApplication"), true);
- while (targetApps.hasMoreElements()) {
- var targetApp = targetApps.getNext();
- if (targetApp instanceof Ci.nsIRDFResource) {
- try {
- var foundAppID = stringData(oldExtensionsDS.GetTarget(targetApp, EM_R("id"), true));
- // Different target application? (Note: v1.0 didn't support toolkit app ID)
- if (foundAppID != currAppID)
- continue;
-
- updatedMinVersion = stringData(oldExtensionsDS.GetTarget(targetApp, EM_R("minVersion"), true));
- updatedMaxVersion = stringData(oldExtensionsDS.GetTarget(targetApp, EM_R("maxVersion"), true));
-
- // Only set the target app info if the extension's target app info
- // in the version 1.0 extensions datasource makes it compatible
- if (versionChecker.compare(currAppVersion, updatedMinVersion) >= 0 &&
- versionChecker.compare(currAppVersion, updatedMaxVersion) <= 0)
- ds.setTargetApplicationInfo(item.id, foundAppID, updatedMinVersion,
- updatedMaxVersion, null);
-
- break;
- }
- catch (e) {
- }
- }
- }
- }
- },
-
/**
* Write the Extensions List and the Startup Cache
* @param needsRestart
@@ -4138,10 +3546,9 @@ ExtensionManager.prototype = {
installData.error = INSTALLERROR_INSECURE_UPDATE;
return installData;
}
-
- // Check that the target application range allows compatibility with the app
- if (gCheckCompatibility &&
- !this.datasource.isCompatible(installManifest, gInstallManifestRoot, undefined)) {
+
+ // Check that the item is compatible with the application.
+ if (!this.datasource.isCompatible(installManifest, gInstallManifestRoot, false)) {
installData.error = INSTALLERROR_INCOMPATIBLE_VERSION;
return installData;
}
@@ -4174,10 +3581,8 @@ ExtensionManager.prototype = {
// If there are no compatibility checks running and no downloads in
// progress then the install operations are complete.
- if (this._compatibilityCheckCount == 0 && this._transactions.length == 0) {
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallsCompleted();
- }
+ if (this._compatibilityCheckCount == 0 && this._transactions.length == 0)
+ this._callInstallListeners("onInstallsCompleted");
},
/**
@@ -4385,10 +3790,12 @@ ExtensionManager.prototype = {
this._xpi = xpiFile;
this._installManifest = installManifest;
- for (var i = 0; i < em._installListeners.length; ++i)
- em._installListeners[i].onCompatibilityCheckStarted(item);
+ em._callInstallListeners("onCompatibilityCheckStarted", item);
em._compatibilityCheckCount++;
- em.update([item], 1, Ci.nsIExtensionManager.UPDATE_CHECK_COMPATIBILITY, this);
+ var updater = new ExtensionItemUpdater(em);
+ updater.checkForUpdates([item], 1,
+ Ci.nsIExtensionManager.UPDATE_CHECK_COMPATIBILITY,
+ this, UPDATE_WHEN_ADDON_INSTALLED);
},
/**
@@ -4428,8 +3835,7 @@ ExtensionManager.prototype = {
em.datasource.removeDownload(this._xpi.path);
LOG("Version Check Phone Home Completed");
- for (var i = 0; i < em._installListeners.length; ++i)
- em._installListeners[i].onCompatibilityCheckEnded(addon, status);
+ em._callInstallListeners("onCompatibilityCheckEnded", addon, status);
// Only compatibility updates (e.g. STATUS_VERSIONINFO) are currently
// supported
@@ -4474,9 +3880,8 @@ ExtensionManager.prototype = {
BundleManager.appName + " " + gApp.version + ", Toolkit " +
gApp.platformVersion + ". Remote compatibility check did not " +
"resolve this.");
-
- for (var i = 0; i < em._installListeners.length; ++i)
- em._installListeners[i].onInstallEnded(addon, INSTALLERROR_INCOMPATIBLE_VERSION);
+
+ em._callInstallListeners("onInstallEnded", addon, INSTALLERROR_INCOMPATIBLE_VERSION);
// We are responsible for cleaning up this file!
InstallLocations.get(aInstallLocationKey).removeFile(this._xpi);
@@ -4485,10 +3890,8 @@ ExtensionManager.prototype = {
em._compatibilityCheckCount--;
// If there are no more compatibility checks running and no downloads in
// progress then the install operations are complete.
- if (em._compatibilityCheckCount == 0 && em._transactions.length == 0) {
- for (var i = 0; i < em._installListeners.length; ++i)
- em._installListeners[i].onInstallsCompleted();
- }
+ if (em._compatibilityCheckCount == 0 && em._transactions.length == 0)
+ em._callInstallListeners("onInstallsCompleted");
},
QueryInterface: XPCOMUtils.generateQI([Ci.nsIAddonUpdateCheckListener])
@@ -4504,9 +3907,8 @@ ExtensionManager.prototype = {
var addon = makeItem(getURIFromFile(aXPIFile).spec, "",
aInstallLocationKey, "", "", "",
getURIFromFile(aXPIFile).spec,
- "", "", "", "", 0, gApp.id);
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallStarted(addon);
+ "", "", "", "", 0, gApp.ID);
+ this._callInstallListeners("onInstallStarted", addon);
shouldPhoneHomeIfNecessary = true;
var installManifest = null;
@@ -4520,8 +3922,7 @@ ExtensionManager.prototype = {
if (!installManifest) {
LOG("The Install Manifest supplied by this item is not well-formed. " +
"Installation will not proceed.");
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallEnded(addon, INSTALLERROR_INVALID_MANIFEST);
+ this._callInstallListeners("onInstallEnded", addon, INSTALLERROR_INVALID_MANIFEST);
return INSTALLERROR_INVALID_MANIFEST;
}
}
@@ -4589,8 +3990,7 @@ ExtensionManager.prototype = {
// this function, BEFORE staging takes place... technically speaking
// a location could become readonly during the phone home process,
// but that's an edge case I don't care about.
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallEnded(addon, INSTALLERROR_RESTRICTED);
+ this._callInstallListeners("onInstallEnded", addon, INSTALLERROR_RESTRICTED);
return INSTALLERROR_RESTRICTED;
}
@@ -4686,9 +4086,7 @@ ExtensionManager.prototype = {
stageXPIForOtherApps(aXPIFile, installData);
// The install of this item is complete, notify observers
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallEnded(addon, installData.error);
-
+ this._callInstallListeners("onInstallEnded", addon, installData.error);
return installData.error;
},
@@ -4835,10 +4233,23 @@ ExtensionManager.prototype = {
if (!file && "stageFile" in installLocation)
file = installLocation.getStageFile(id);
- // If |file| is null or does not exist, the installer assumes the item is
- // a dropped-in directory.
- var installer = new Installer(this.datasource, id, installLocation, type);
- installer.installFromFile(file);
+ // If there is a staged file then we must extract it to the correct place,
+ // otherwise we are dealing with a dropped-in directory.
+ if (file && file.exists())
+ safeInstallOperation(id, installLocation, file);
+
+ var metadataFile = installLocation.getItemFile(id, FILE_INSTALL_MANIFEST);
+ if (metadataFile && metadataFile.exists()) {
+ var metadataDS = getInstallManifest(metadataFile);
+ if (metadataDS) {
+ // Add metadata for the item to the extensions datasource
+ this.datasource.addItemMetadata(id, metadataDS, installLocation);
+ }
+ }
+ else {
+ LOG("_finalizeInstall: install manifest for extension " + id + " at " +
+ metadataFile.path + " could not be loaded. Add-on is not usable.");
+ }
// If the file was staged, we must clean it up ourselves, otherwise the
// EM caller is responsible for doing so (e.g. XPInstall)
@@ -4869,7 +4280,7 @@ ExtensionManager.prototype = {
var installRDF = extractRDFFileToTempDir(stagedFile, FILE_INSTALL_MANIFEST, true);
else
installRDF = installLocation.getItemFile(id, FILE_INSTALL_MANIFEST);
- if (installRDF.exists()) {
+ if (installRDF && installRDF.exists()) {
var installManifest = getInstallManifest(installRDF);
if (installManifest) {
var type = getAddonTypeFromInstallManifest(installManifest);
@@ -4904,10 +4315,9 @@ ExtensionManager.prototype = {
var installLocation = this.getInstallLocation(id);
if (!installLocation.itemIsManagedIndependently(id)) {
try {
- // Having a callback that does nothing just causes the directory to be
+ // Passing null for the file to install will just cause the directory
// removed.
- safeInstallOperation(id, installLocation,
- { data: null, callback: function() { } });
+ safeInstallOperation(id, installLocation, null);
}
catch (e) {
ERROR("_finalizeUninstall: failed to remove directory for item: " + id +
@@ -4916,7 +4326,7 @@ ExtensionManager.prototype = {
// If there is no manifest then either the rollback failed, or there was
// no manifest in the first place. Either way this item is now invalid
// and we shouldn't try to re-install it.
- if (manifest.exists()) {
+ if (manifest && manifest.exists()) {
// Removal of the files failed, reset the uninstalled flag and rewrite
// the install manifests so this item's components are registered.
// Clear the op flag from the Startup Cache
@@ -4978,7 +4388,7 @@ ExtensionManager.prototype = {
}
else {
if (opType == OP_NEEDS_UPGRADE)
- ds.setItemProperty(id, "newVersion", null);
+ ds.setItemProperty(id, EM_R("newVersion"), null);
this._setOp(id, OP_NEEDS_UNINSTALL);
var type = ds.getItemProperty(id, "type");
var restartRequired = this.installRequiresRestart(id, type);
@@ -5332,10 +4742,9 @@ ExtensionManager.prototype = {
*/
_isUsableItem: function EM__isUsableItem(id) {
var ds = this.datasource;
- /* If we're not compatibility checking or if the item is compatible
- * and if it isn't blocklisted and has all dependencies satisfied then
- * proceed to the security check */
- if ((!gCheckCompatibility || ds.getItemProperty(id, "compatible") == "true") &&
+ /* If the item is compatible and if it isn't blocklisted and has all
+ * dependencies satisfied then proceed to the security check */
+ if (ds.isCompatible(ds, getResourceForID(id), false) &&
ds.getItemProperty(id, "blocklisted") == "false" &&
ds.getItemProperty(id, "satisfiesDependencies") == "true") {
@@ -5383,7 +4792,13 @@ ExtensionManager.prototype = {
* See nsIExtensionManager.idl
*/
update: function EM_update(items, itemCount, updateCheckType, listener,
- appVersion, platformVersion) {
+ updateType, appVersion, platformVersion) {
+
+ // Callers through the API are only allowed to use update types declared
+ // in nsIExtensionManager.idl
+ if (updateType > MAX_PUBLIC_UPDATE_WHEN)
+ throw Cr.NS_ERROR_ILLEGAL_VALUE;
+
for (i = 0; i < itemCount; ++i) {
var currItem = items[i];
if (!currItem)
@@ -5395,7 +4810,7 @@ ExtensionManager.prototype = {
var updater = new ExtensionItemUpdater(this);
updater.checkForUpdates(items, items.length, updateCheckType, listener,
- appVersion, platformVersion);
+ updateType, appVersion, platformVersion);
},
/**
@@ -5498,44 +4913,18 @@ ExtensionManager.prototype = {
},
/* See nsIExtensionManager.idl */
- getIncompatibleItemList: function EM_getIncompatibleItemList(id, appVersion,
+ getIncompatibleItemList: function EM_getIncompatibleItemList(appVersion,
platformVersion,
type,
includeDisabled,
countRef) {
- var items = this.datasource.getIncompatibleItemList(id, appVersion ? appVersion : undefined,
+ var items = this.datasource.getIncompatibleItemList(appVersion ? appVersion : undefined,
platformVersion ? platformVersion : undefined,
type, includeDisabled);
countRef.value = items.length;
return items;
},
- /**
- * Move an Item to the index of another item in its container.
- * @param movingID
- * The ID of the item to be moved.
- * @param destinationID
- * The ID of an item to move another item to.
- */
- moveToIndexOf: function EM_moveToIndexOf(movingID, destinationID) {
- this.datasource.moveToIndexOf(movingID, destinationID);
- },
-
- /**
- * Sorts addons of the specified type by the specified property starting from
- * the top of their container. If the addons are already sorted then no action
- * is performed.
- * @param type
- * The nsIUpdateItem type of the items to sort.
- * @param propertyName
- * The RDF property name used for sorting.
- * @param isAscending
- * true to sort ascending and false to sort descending
- */
- sortTypeByProperty: function EM_sortTypeByProperty(type, propertyName, isAscending) {
- this.datasource.sortTypeByProperty(type, propertyName, isAscending);
- },
-
/////////////////////////////////////////////////////////////////////////////
// Downloads
_transactions: [],
@@ -5560,13 +4949,13 @@ ExtensionManager.prototype = {
// count to 0 to prevent this dialog from being displayed again.
this._downloadCount = 0;
var result;
-//@line 5691 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 5156 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
result = this._confirmCancelDownloads(this._downloadCount,
"quitCancelDownloadsAlertTitle",
"quitCancelDownloadsAlertMsgMultiple",
"quitCancelDownloadsAlertMsg",
"dontQuitButtonWin");
-//@line 5703 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 5168 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
if (subject instanceof Ci.nsISupportsPRBool)
subject.data = result;
}
@@ -5671,12 +5060,17 @@ ExtensionManager.prototype = {
// being updated during an install.
if (!manager) {
var id = currItem.id
- ds.setItemProperties(id, {
+ var props = {
availableUpdateURL: null,
availableUpdateHash: null,
availableUpdateVersion: null,
availableUpdateInfo: null
- });
+ };
+ var updateVersion = ds.getItemProperty(id, "availableUpdateVersion");
+ var updateURL = ds.getItemProperty(id, "availableUpdateURL");
+ if (updateVersion && (updateURL == currItem.xpiURL))
+ props.newVersion = EM_L(updateVersion);
+ ds.setItemProperties(id, props);
ds.updateProperty(id, "availableUpdateURL");
ds.updateProperty(id, "updateable");
}
@@ -5725,12 +5119,10 @@ ExtensionManager.prototype = {
switch (state) {
case nsIXPIProgressDialog.DOWNLOAD_START:
ds.updateDownloadState(id, "downloading");
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onDownloadStarted(addon);
+ this._callInstallListeners("onDownloadStarted", addon);
break;
case nsIXPIProgressDialog.DOWNLOAD_DONE:
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onDownloadEnded(addon);
+ this._callInstallListeners("onDownloadEnded", addon);
break;
case nsIXPIProgressDialog.INSTALL_START:
ds.updateDownloadState(id, "finishing");
@@ -5747,10 +5139,8 @@ ExtensionManager.prototype = {
}
transaction.removeDownload(addon.xpiURL);
// A successful install will be passing notifications via installItemFromFile
- if (value != 0) {
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallEnded(addon, value);
- }
+ if (value != 0)
+ this._callInstallListeners("onInstallEnded", addon, value);
break;
case nsIXPIProgressDialog.DIALOG_CLOSE:
for (var i = 0; i < this._transactions.length; ++i) {
@@ -5763,10 +5153,8 @@ ExtensionManager.prototype = {
// If there are no compatibility checks running then the install
// operations are complete.
- if (this._compatibilityCheckCount == 0) {
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onInstallsCompleted();
- }
+ if (this._compatibilityCheckCount == 0)
+ this._callInstallListeners("onInstallsCompleted");
}
break;
}
@@ -5778,8 +5166,7 @@ ExtensionManager.prototype = {
},
onProgress: function EM_onProgress(addon, value, maxValue) {
- for (var i = 0; i < this._installListeners.length; ++i)
- this._installListeners[i].onDownloadProgress(addon, value, maxValue);
+ this._callInstallListeners("onDownloadProgress", addon, value, maxValue);
var id = addon.id != addon.xpiURL ? PREFIX_ITEM_URI + addon.id : addon.xpiURL;
var progress = Math.round((value / maxValue) * 100);
@@ -5797,7 +5184,25 @@ ExtensionManager.prototype = {
},
removeInstallListenerAt: function EM_removeInstallListenerAt(index) {
- this._installListeners.splice(index, 1);
+ if (index < 0 || index >= this._installListeners.length)
+ throw Cr.NS_ERROR_INVALID_ARGUMENT;
+
+ this._installListeners[index] = null;
+ while (this._installListeners[this._installListeners.length - 1] === null)
+ this._installListeners.splice(this._installListeners.length - 1, 1);
+ },
+
+ _callInstallListeners: function EM__callInstallListeners(method) {
+ for (var i = 0; i < this._installListeners.length; ++i) {
+ try {
+ if (this._installListeners[i])
+ this._installListeners[i][method].apply(this._installListeners[i],
+ Array.slice(arguments, 1));
+ }
+ catch (e) {
+ LOG("Failure in install listener's " + method + ": " + e);
+ }
+ }
},
/**
@@ -5844,7 +5249,11 @@ ExtensionManager.prototype = {
classDescription: "Extension Manager",
contractID: "@mozilla.org/extensions/manager;1",
classID: Components.ID("{8A115FAA-7DCB-4e8f-979B-5F53472F51CF}"),
- _xpcom_categories: [{ category: "profile-after-change" }],
+ _xpcom_categories: [{ category: "profile-after-change" },
+ { category: "update-timer",
+ value: "@mozilla.org/extensions/manager;1," +
+ "getService,addon-background-update-timer," +
+ PREF_EM_UPDATE_INTERVAL + ",86400" }],
_xpcom_factory: {
createInstance: function(outer, iid) {
if (outer != null)
@@ -5975,9 +5384,6 @@ BackgroundUpdateCheckListener.prototype = {
gPref.setBoolPref(PREF_UPDATE_NOTIFYUSER, false);
}
else {
- const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
- const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
-
var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
getService(Ci.nsIWindowWatcher);
var param = Cc["@mozilla.org/supports-array;1"].
@@ -5986,7 +5392,7 @@ BackgroundUpdateCheckListener.prototype = {
createInstance(Ci.nsISupportsString);
arg.data = "updates";
param.AppendElement(arg);
- ww.openWindow(null, EMURL, null, EMFEATURES, param);
+ ww.openWindow(null, URI_EXTENSION_MANAGER, null, FEATURES_EXTENSION_MANAGER, param);
}
},
@@ -6087,16 +5493,18 @@ ExtensionItemUpdater.prototype = {
_emDS : null,
_em : null,
_updateCheckType : 0,
+ _updateType : 0,
_items : [],
_listener : null,
/* ExtensionItemUpdater
-//@line 6253 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 5736 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
*/
checkForUpdates: function ExtensionItemUpdater_checkForUpdates(aItems,
aItemCount,
aUpdateCheckType,
aListener,
+ aUpdateType,
aAppVersion,
aPlatformVersion) {
if (aUpdateCheckType == Ci.nsIExtensionManager.UPDATE_NOTIFY_NEWVERSION) {
@@ -6117,6 +5525,14 @@ ExtensionItemUpdater.prototype = {
this._items = aItems;
this._responseCount = aItemCount;
+ this._updateType = aUpdateType;
+ // All update check types look for compatibility currently
+ this._updateType |= UPDATE_TYPE_COMPATIBILITY;
+ // Only two types also look for new versions
+ if (aUpdateCheckType == Ci.nsIExtensionManager.UPDATE_NOTIFY_NEWVERSION ||
+ aUpdateCheckType == Ci.nsIExtensionManager.UPDATE_CHECK_NEWVERSION)
+ this._updateType |= UPDATE_TYPE_NEWVERSION;
+
// This is the number of extensions/themes/etc that we found updates for.
this._updateCount = 0;
@@ -6241,6 +5657,10 @@ ExtensionItemUpdater.prototype = {
* appropriate values.
* @param aItem
* The nsIUpdateItem representing the item
+ * @param aAppVersion
+ * The application version to check for updates for
+ * @param aUpdateType
+ * The type of the update (see nsIExtensionManager)
* @param aURI
* The uri to escape
* @param aDS
@@ -6248,7 +5668,7 @@ ExtensionItemUpdater.prototype = {
*
* @returns the appropriately escaped uri.
*/
-function escapeAddonURI(aItem, aAppVersion, aURI, aDS)
+function escapeAddonURI(aItem, aAppVersion, aUpdateType, aURI, aDS)
{
var itemStatus = "userEnabled";
if (aDS.getItemProperty(aItem.id, "userDisabled") == "true" ||
@@ -6278,6 +5698,8 @@ function escapeAddonURI(aItem, aAppVersion, aURI, aDS)
aURI = aURI.replace(/%APP_ABI%/g, gXPCOMABI);
aURI = aURI.replace(/%APP_LOCALE%/g, gLocale);
aURI = aURI.replace(/%CURRENT_APP_VERSION%/g, gApp.version);
+ if (aUpdateType)
+ aURI = aURI.replace(/%UPDATE_TYPE%/g, aUpdateType);
// Replace custom parameters (names of custom parameters must have at
// least 3 characters to prevent lookups for something like %D0%C8)
@@ -6373,15 +5795,16 @@ RDFItemUpdater.prototype = {
if (!dsURI)
dsURI = gPref.getCharPref(PREF_UPDATE_DEFAULT_URL);
- dsURI = escapeAddonURI(aItem, this._updater._appVersion, dsURI, emDS);
+ dsURI = escapeAddonURI(aItem, this._updater._appVersion,
+ this._updater._updateType, dsURI, emDS);
// Verify that the URI provided is valid
try {
var uri = newURI(dsURI);
}
catch (e) {
- LOG("RDFItemUpdater:checkForUpdates: There was an error loading the \r\n" +
- " update datasource for: " + dsURI + ", item = " + aItem.id + ", error: " + e);
+ WARN("RDFItemUpdater:checkForUpdates: There was an error loading the \r\n" +
+ " update datasource for: " + dsURI + ", item = " + aItem.id + ", error: " + e);
this._updater.checkForDone(aItem,
Ci.nsIAddonUpdateCheckListener.STATUS_FAILURE);
return;
@@ -6393,7 +5816,7 @@ RDFItemUpdater.prototype = {
var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
createInstance(Ci.nsIXMLHttpRequest);
request.open("GET", uri.spec, true);
- request.channel.notificationCallbacks = new BadCertHandler();
+ request.channel.notificationCallbacks = new gCertUtils.BadCertHandler();
request.overrideMimeType("text/xml");
request.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
@@ -6406,7 +5829,7 @@ RDFItemUpdater.prototype = {
onXMLLoad: function RDFItemUpdater_onXMLLoad(aEvent, aItem) {
var request = aEvent.target;
try {
- checkCert(request.channel);
+ gCertUtils.checkCert(request.channel);
}
catch (e) {
// This may be overly restrictive in two cases: corporate installations
@@ -6466,15 +5889,15 @@ RDFItemUpdater.prototype = {
if (status == 0)
statusText = "nsIXMLHttpRequest channel unavailable";
- LOG("RDFItemUpdater:onError: There was an error loading the \r\n" +
- "the update datasource for item " + aItem.id + ", error: " + statusText);
+ WARN("RDFItemUpdater:onError: There was an error loading the \r\n" +
+ "the update datasource for item " + aItem.id + ", error: " + statusText);
this._updater.checkForDone(aItem,
Ci.nsIAddonUpdateCheckListener.STATUS_FAILURE);
},
onDatasourceLoaded: function RDFItemUpdater_onDatasourceLoaded(aDatasource, aLocalItem) {
/*
-//@line 6676 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
+//@line 6175 "/builds/slave/linux_build/build/toolkit/mozapps/extensions/src/nsExtensionManager.js.in"
*/
if (!aDatasource.GetAllResources().hasMoreElements()) {
LOG("RDFItemUpdater:onDatasourceLoaded: Datasource empty.\r\n" +
@@ -6502,29 +5925,29 @@ RDFItemUpdater.prototype = {
getService(Ci.nsIDataSignatureVerifier);
try {
if (!verifier.verifyData(updateString, signature, aLocalItem.updateKey)) {
- LOG("RDFItemUpdater:onDatasourceLoaded: Update manifest for " +
- aLocalItem.id + " failed signature check.");
+ WARN("RDFItemUpdater:onDatasourceLoaded: Update manifest for " +
+ aLocalItem.id + " failed signature check.");
this._updater.checkForDone(aLocalItem, Ci.nsIAddonUpdateCheckListener.STATUS_FAILURE);
return;
}
}
catch (e) {
- LOG("RDFItemUpdater:onDatasourceLoaded: Failed to verify signature for " +
- aLocalItem.id + ". This indicates a malformed update key or signature.");
+ WARN("RDFItemUpdater:onDatasourceLoaded: Failed to verify signature for " +
+ aLocalItem.id + ". This indicates a malformed update key or signature.");
this._updater.checkForDone(aLocalItem, Ci.nsIAddonUpdateCheckListener.STATUS_FAILURE);
return;
}
}
catch (e) {
- LOG("RDFItemUpdater:onDatasourceLoaded: Failed to generate signature " +
- "string for " + aLocalItem.id + ". Serializer threw " + e);
+ WARN("RDFItemUpdater:onDatasourceLoaded: Failed to generate signature " +
+ "string for " + aLocalItem.id + ". Serializer threw " + e);
this._updater.checkForDone(aLocalItem, Ci.nsIAddonUpdateCheckListener.STATUS_FAILURE);
return;
}
}
else {
- LOG("RDFItemUpdater:onDatasourceLoaded: Update manifest for " +
- aLocalItem.id + " did not contain a signature.");
+ WARN("RDFItemUpdater:onDatasourceLoaded: Update manifest for " +
+ aLocalItem.id + " did not contain a signature.");
this._updater.checkForDone(aLocalItem, Ci.nsIAddonUpdateCheckListener.STATUS_FAILURE);
return;
}
@@ -6633,15 +6056,15 @@ RDFItemUpdater.prototype = {
updates = updates.QueryInterface(Ci.nsIRDFResource);
}
catch (e) {
- LOG("RDFItemUpdater:_parseV20UpdateInfo: No updates were found for:\r\n" +
- aLocalItem.id + "\r\n" +
- "If you are an Extension developer and were expecting there to be\r\n" +
- "updates, this could mean any number of things, since the RDF system\r\n" +
- "doesn't give up much in the way of information when the load fails.\r\n" +
- "\r\nTry checking that: \r\n" +
- " 1. Your RDF File is correct - e.g. check that there is a top level\r\n" +
- " RDF Resource with a URI urn:mozilla:extension:{GUID}, and that\r\n" +
- " the <em:updates> listed all have matching GUIDs.");
+ WARN("RDFItemUpdater:_parseV20UpdateInfo: No updates were found for:\r\n" +
+ aLocalItem.id + "\r\n" +
+ "If you are an Extension developer and were expecting there to be\r\n" +
+ "updates, this could mean any number of things, since the RDF system\r\n" +
+ "doesn't give up much in the way of information when the load fails.\r\n" +
+ "\r\nTry checking that: \r\n" +
+ " 1. Your RDF File is correct - e.g. check that there is a top level\r\n" +
+ " RDF Resource with a URI urn:mozilla:extension:{GUID}, and that\r\n" +
+ " the <em:updates> listed all have matching GUIDs.");
return null;
}
@@ -6732,9 +6155,9 @@ RDFItemUpdater.prototype = {
* the sha hashing algorithms as secure. */
if (gCheckUpdateSecurity && updateLink.substring(0, 6) != "https:" &&
(!updateHash || updateHash.substring(0, 3) != "sha")) {
- LOG("RDFItemUpdater:_parseV20Update: Update for " + aLocalItem.id +
- " at " + updateLink + " ignored because it is insecure. updateLink " +
- " must be a https url or an updateHash must be specified.");
+ WARN("RDFItemUpdater:_parseV20Update: Update for " + aLocalItem.id +
+ " at " + updateLink + " ignored because it is insecure. updateLink " +
+ " must be a https url or an updateHash must be specified.");
continue;
}
}
@@ -7015,6 +6438,10 @@ ExtensionsDataSource.prototype = {
* datasource or an Install Manifest.
* @param source
* The RDF Resource of the item to inspect for compatibility.
+ * @param alwaysCheckVersion
+ * Set to true to only obey the compatibility information in the
+ * datasource. When false the compatibility range may be ignored
+ * if compatibility checking is disabled.
* @param appVersion
* The version of the application we are checking for compatibility
* against. If this parameter is undefined, the version of the running
@@ -7024,11 +6451,17 @@ ExtensionsDataSource.prototype = {
* @returns true if the item is compatible with this version of the
* application, false, otherwise.
*/
- isCompatible: function EMDS_isCompatible(datasource, source, appVersion, platformVersion) {
+ isCompatible: function EMDS_isCompatible(datasource, source, alwaysCheckVersion,
+ appVersion, platformVersion) {
// The Default Theme is always compatible.
if (source.EqualsNode(this._defaultTheme))
return true;
+ // Items pending install have no target application info in the datasource
+ if (datasource === this &&
+ this._getItemProperty(source, "opType") == OP_NEEDS_INSTALL)
+ return true;
+
var appID = gApp.ID;
if (appVersion === undefined)
appVersion = gApp.version;
@@ -7047,12 +6480,16 @@ ExtensionsDataSource.prototype = {
var minVersion = stringData(datasource.GetTarget(targetApp, minVersionRes, true));
var maxVersion = stringData(datasource.GetTarget(targetApp, maxVersionRes, true));
if (id == appID) {
+ if (!alwaysCheckVersion && !gCheckCompatibility)
+ return true;
rv = (versionChecker.compare(appVersion, minVersion) >= 0) &&
(versionChecker.compare(appVersion, maxVersion) <= 0);
return rv; // App takes precedence over toolkit.
}
if (id == TOOLKIT_ID) {
+ if (!alwaysCheckVersion && !gCheckCompatibility)
+ return true;
rv = (versionChecker.compare(platformVersion, minVersion) >= 0) &&
(versionChecker.compare(platformVersion, maxVersion) <= 0);
// Keep looping, in case the app id is later.
@@ -7063,8 +6500,6 @@ ExtensionsDataSource.prototype = {
/**
* Gets a list of items that are incompatible with a specific application version.
- * @param appID
- * The ID of the application - XXXben unused?
* @param appVersion
* The Version of the application to check for incompatibility against.
* @param platformVersion
@@ -7076,8 +6511,7 @@ ExtensionsDataSource.prototype = {
* @returns An array of nsIUpdateItems that are incompatible with the application
* ID/Version supplied.
*/
- getIncompatibleItemList: function EMDS_getIncompatibleItemList(appID,
- appVersion,
+ getIncompatibleItemList: function EMDS_getIncompatibleItemList(appVersion,
platformVersion,
desiredType,
includeDisabled) {
@@ -7105,7 +6539,7 @@ ExtensionsDataSource.prototype = {
continue;
if (type != -1 && (type & desiredType) &&
- !this.isCompatible(this, item, appVersion, platformVersion))
+ !this.isCompatible(this, item, true, appVersion, platformVersion))
items.push(this.getItemForID(id));
}
return items;
@@ -7645,9 +7079,9 @@ ExtensionsDataSource.prototype = {
"aboutURL", "iconURL", "internalName", "updateKey"];
// Items installed into restricted Install Locations can also be locked
- // (can't be removed or disabled), and hidden (not shown in the UI)
+ // (can't be removed or disabled)
if (installLocation.restricted)
- singleProps = singleProps.concat(["locked", "hidden"]);
+ singleProps = singleProps.concat(["locked"]);
if (installLocation.name == KEY_APP_GLOBAL)
singleProps = singleProps.concat(["appManaged"]);
for (var i = 0; i < singleProps.length; ++i) {
@@ -7792,86 +7226,6 @@ ExtensionsDataSource.prototype = {
},
/**
- * Move an Item to the index of another item in its container.
- * @param movingID
- * The ID of the item to be moved.
- * @param destinationID
- * The ID of an item to move another item to.
- */
- moveToIndexOf: function EMDS_moveToIndexOf(movingID, destinationID) {
- var extensions = gRDF.GetResource(RDFURI_ITEM_ROOT);
- var ctr = getContainer(this._inner, extensions);
- var item = gRDF.GetResource(movingID);
- var index = ctr.IndexOf(gRDF.GetResource(destinationID));
- if (index == -1)
- index = 1; // move to the beginning if destinationID is not found
- this._inner.beginUpdateBatch();
- ctr.RemoveElement(item, true);
- ctr.InsertElementAt(item, index, true);
- this._inner.endUpdateBatch();
- this.Flush();
- },
-
- /**
- * Sorts addons of the specified type by the specified property starting from
- * the top of their container. If the addons are already sorted then no action
- * is performed.
- * @param type
- * The nsIUpdateItem type of the items to sort.
- * @param propertyName
- * The RDF property name used for sorting.
- * @param isAscending
- * true to sort ascending and false to sort descending
- */
- sortTypeByProperty: function EMDS_sortTypeByProperty(type, propertyName, isAscending) {
- var items = [];
- var ctr = getContainer(this._inner, this._itemRoot);
- var elements = ctr.GetElements();
- // Base 0 ordinal for checking against the existing order after sorting
- var ordinal = 0;
- while (elements.hasMoreElements()) {
- var item = elements.getNext().QueryInterface(Ci.nsIRDFResource);
- var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
- var itemType = this.getItemProperty(id, "type");
- if (itemType & type) {
- items.push({ item : item,
- ordinal: ordinal,
- sortkey: this.getItemProperty(id, propertyName) });
- ordinal++;
- }
- }
-
- var direction = isAscending ? 1 : -1;
- // Locale sensitive sort
- function compare(a, b) {
- return String.localeCompare(a.sortkey, b.sortkey) * direction;
- }
- items.sort(compare);
-
- // Check if there are any changes in the order of the items
- var isDirty = false;
- for (var i = 0; i < items.length; i++) {
- if (items[i].ordinal != i) {
- isDirty = true;
- break;
- }
- }
-
- // If there are no changes then early return to avoid the perf impact
- if (!isDirty)
- return;
-
- // Reorder the items by moving them to the top of the container
- this.beginUpdateBatch();
- for (i = 0; i < items.length; i++) {
- ctr.RemoveElement(items[i].item, true);
- ctr.InsertElementAt(items[i].item, i + 1, true);
- }
- this.endUpdateBatch();
- this.Flush();
- },
-
- /**
* Determines if an Item is an active download
* @param id
* The ID of the item. This will be a uri scheme without the
@@ -8144,32 +7498,24 @@ ExtensionsDataSource.prototype = {
},
/**
- * Gets an URL to a theme's image file
+ * Gets an URL to an item's image file
* @param item
* The RDF Resource representing the item
* @param fileName
* The file to locate a URL for
- * @param fallbackURL
- * If the location fails, supply this URL instead
* @returns An RDF Resource to the URL discovered, or the fallback
* if the discovery failed.
*/
- _getThemeImageURL: function EMDS__getThemeImageURL(item, fileName, fallbackURL) {
+ _getImageURL: function EMDS__getImageURL(item, fileName) {
var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
var installLocation = this._em.getInstallLocation(id);
if (!installLocation)
- return fallbackURL;
+ return null;
var file = installLocation.getItemFile(id, fileName)
- if (file.exists())
+ if (file && file.exists())
return gRDF.GetResource(getURLSpecFromFile(file));
- if (id == stripPrefix(RDFURI_DEFAULT_THEME, PREFIX_ITEM_URI)) {
- var jarFile = getFile(KEY_APPDIR, [DIR_CHROME, FILE_DEFAULT_THEME_JAR]);
- var url = "jar:" + getURLSpecFromFile(jarFile) + "!/" + fileName;
- return gRDF.GetResource(url);
- }
-
- return fallbackURL ? gRDF.GetResource(fallbackURL) : null;
+ return null;
},
/**
@@ -8177,30 +7523,39 @@ ExtensionsDataSource.prototype = {
*/
_rdfGet_iconURL: function EMDS__rdfGet_iconURL(item, property) {
var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
+
+ var installLocation = this._em.getInstallLocation(id);
+ if (!this.isDownloadItem(id) && !installLocation)
+ return null;
+
+ // Try to pick an icon from the item's install folder
+ iconURL = this._getImageURL(item, "icon.png");
+ if (iconURL)
+ return iconURL;
+
var type = this.getItemProperty(id, "type");
- if (type & Ci.nsIUpdateItem.TYPE_THEME)
- return this._getThemeImageURL(item, "icon.png", URI_GENERIC_ICON_THEME);
-
- if (inSafeMode())
- return gRDF.GetResource(URI_GENERIC_ICON_XPINSTALL);
-
- var hasIconURL = this._inner.hasArcOut(item, property);
- // If the addon doesn't have an IconURL property or it is disabled use the
- // generic icon URL instead.
- if (!hasIconURL || this.getItemProperty(id, "isDisabled") == "true")
- return gRDF.GetResource(URI_GENERIC_ICON_XPINSTALL);
- var iconURL = stringData(this._inner.GetTarget(item, property, true));
- try {
- var uri = newURI(iconURL);
- var scheme = uri.scheme;
- // Only allow chrome URIs or when installing http(s) URIs.
- if (scheme == "chrome" || (scheme == "http" || scheme == "https") &&
- this._inner.hasArcOut(item, EM_R("downloadURL")))
- return null;
- }
- catch (e) {
+ if (type == Ci.nsIUpdateItem.TYPE_THEME)
+ return gRDF.GetResource(URI_GENERIC_ICON_THEME);
+
+ // Only look for an iconURL if the item is not disabled and safe mode isn't
+ // active
+ if (!inSafeMode() && this.getItemProperty(id, "isDisabled") != "true") {
+ var iconURL = stringData(this._inner.GetTarget(item, property, true));
+ if (iconURL) {
+ try {
+ var uri = newURI(iconURL);
+ var scheme = uri.scheme;
+ // Only allow chrome URIs normally. When an item is being installed
+ // allow http(s) URIs.
+ if (scheme == "chrome" || (scheme == "http" || scheme == "https") &&
+ this._inner.hasArcOut(item, EM_R("downloadURL")))
+ return null;
+ }
+ catch (e) {
+ }
+ }
}
- // Use a generic icon URL for addons that have an invalid iconURL.
+
return gRDF.GetResource(URI_GENERIC_ICON_XPINSTALL);
},
@@ -8209,18 +7564,33 @@ ExtensionsDataSource.prototype = {
*/
_rdfGet_previewImage: function EMDS__rdfGet_previewImage(item, property) {
var type = this.getItemProperty(stripPrefix(item.Value, PREFIX_ITEM_URI), "type");
- if (type != -1 && type & Ci.nsIUpdateItem.TYPE_THEME)
- return this._getThemeImageURL(item, "preview.png", null);
+ if (type == Ci.nsIUpdateItem.TYPE_THEME)
+ return this._getImageURL(item, "preview.png");
return null;
},
/**
* If we're in safe mode, the item is disabled by the user or app, or the
- * item is to be upgraded force the generic about dialog for the item.
+ * item is to not an extension then don't offer an options url.
+ */
+ _rdfGet_optionsURL: function EMDS__rdfGet_optionsURL(item, property) {
+ var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
+ if (inSafeMode() || this.getItemProperty(id, "isDisabled") == "true" ||
+ this.getItemProperty(id, "type") != Ci.nsIUpdateItem.TYPE_EXTENSION)
+ return EM_L("");
+
+ return null;
+ },
+
+ /**
+ * If we're in safe mode, the item is disabled by the user or app, the item
+ * is not an extension, or the item is to be upgraded force the generic about
+ * dialog for the item.
*/
_rdfGet_aboutURL: function EMDS__rdfGet_aboutURL(item, property) {
var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
if (inSafeMode() || this.getItemProperty(id, "isDisabled") == "true" ||
+ this.getItemProperty(id, "type") != Ci.nsIUpdateItem.TYPE_EXTENSION ||
this.getItemProperty(id, "opType") == OP_NEEDS_UPGRADE)
return EM_L("");
@@ -8240,23 +7610,8 @@ ExtensionsDataSource.prototype = {
* Get the em:compatible property (whether or not this item is compatible)
*/
_rdfGet_compatible: function EMDS__rdfGet_compatible(item, property) {
- var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
- var targetAppInfo = this.getTargetApplicationInfo(id, this);
- if (!targetAppInfo) {
- // When installing a new addon targetAppInfo does not exist yet
- if (this.getItemProperty(id, "opType") == OP_NEEDS_INSTALL)
- return EM_L("true");
- return EM_L("false");
- }
-
- getVersionChecker();
- var appVersion = targetAppInfo.appID == TOOLKIT_ID ? gApp.platformVersion : gApp.version;
- if (gVersionChecker.compare(targetAppInfo.maxVersion, appVersion) < 0 ||
- gVersionChecker.compare(appVersion, targetAppInfo.minVersion) < 0) {
- // OK, this item is incompatible.
- return EM_L("false");
- }
- return EM_L("true");
+ var compatible = this.isCompatible(this, item, true);
+ return compatible ? EM_L("true") : EM_L("false");
},
/**
@@ -8338,18 +7693,6 @@ ExtensionsDataSource.prototype = {
},
/**
- * Get the em:hidden property. This prevents extensions from hiding
- * extensions installed into locations other than restricted locations.
- */
- _rdfGet_hidden: function EMDS__rdfGet_hidden(item, property) {
- var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
- var installLocation = InstallLocations.get(this.getInstallLocationKey(id));
- if (!installLocation || !installLocation.restricted)
- return EM_L("false");
- return null;
- },
-
- /**
* Get the em:locked property. This prevents extensions from locking
* extensions installed into locations other than restricted locations.
*/
@@ -8450,7 +7793,7 @@ ExtensionsDataSource.prototype = {
var id = stripPrefix(item.Value, PREFIX_ITEM_URI);
var uri = stringData(this._inner.GetTarget(item, EM_R("availableUpdateInfo"), true));
if (uri) {
- uri = escapeAddonURI(this.getItemForID(id), null, uri, this);
+ uri = escapeAddonURI(this.getItemForID(id), null, null, uri, this);
return EM_L(uri);
}
return null;
diff --git a/tools/xo_bundle/components/nsFilePicker.js b/tools/xo_bundle/components/nsFilePicker.js
index 0f08fb8..83be84c 100755
--- a/tools/xo_bundle/components/nsFilePicker.js
+++ b/tools/xo_bundle/components/nsFilePicker.js
@@ -165,7 +165,7 @@ nsFilePicker.prototype = {
}
if (filterMask & nsIFilePicker.filterImages) {
this.appendFilter(bundle.GetStringFromName("imageTitle"),
- bundle.GetStringFromName("imageFilter"));
+ "*.jpg; *.jpeg; *.gif; *.png; *.bmp; *.ico"); // XXX 528755
}
if (filterMask & nsIFilePicker.filterXML) {
this.appendFilter(bundle.GetStringFromName("xmlTitle"),
@@ -197,8 +197,7 @@ nsFilePicker.prototype = {
iid.equals(nsISupports))
return this;
- Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
- return null;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
},
show: function() {
@@ -278,9 +277,9 @@ function (compMgr, fileSpec, location, type)
compMgr.registerFactoryLocation(FILEPICKER_CID,
"FilePicker JS Component",
-//@line 284 "/builds/moz2_slave/linux_build/build/toolkit/components/filepicker/src/nsFilePicker.js.in"
+//@line 283 "/builds/slave/linux_build/build/toolkit/components/filepicker/src/nsFilePicker.js.in"
"",
-//@line 286 "/builds/moz2_slave/linux_build/build/toolkit/components/filepicker/src/nsFilePicker.js.in"
+//@line 285 "/builds/slave/linux_build/build/toolkit/components/filepicker/src/nsFilePicker.js.in"
fileSpec,
location,
type);
diff --git a/tools/xo_bundle/components/nsFormAutoComplete.js b/tools/xo_bundle/components/nsFormAutoComplete.js
new file mode 100644
index 0000000..b54e33d
--- /dev/null
+++ b/tools/xo_bundle/components/nsFormAutoComplete.js
@@ -0,0 +1,478 @@
+/* ***** 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.org code.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Justin Dolske <dolske@mozilla.com> (original author)
+ *
+ * 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 ***** */
+
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+function FormAutoComplete() {
+ this.init();
+}
+
+FormAutoComplete.prototype = {
+ classDescription: "FormAutoComplete",
+ contractID: "@mozilla.org/satchel/form-autocomplete;1",
+ classID: Components.ID("{c11c21b2-71c9-4f87-a0f8-5e13f50495fd}"),
+ QueryInterface : XPCOMUtils.generateQI([Ci.nsIFormAutoComplete, Ci.nsISupportsWeakReference]),
+
+ __logService : null, // Console logging service, used for debugging.
+ get _logService() {
+ if (!this.__logService)
+ this.__logService = Cc["@mozilla.org/consoleservice;1"].
+ getService(Ci.nsIConsoleService);
+ return this.__logService;
+ },
+
+ __formHistory : null,
+ get _formHistory() {
+ if (!this.__formHistory)
+ this.__formHistory = Cc["@mozilla.org/satchel/form-history;1"].
+ getService(Ci.nsIFormHistory2);
+ return this.__formHistory;
+ },
+
+ __observerService : null, // Observer Service, for notifications
+ get _observerService() {
+ if (!this.__observerService)
+ this.__observerService = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ return this.__observerService;
+ },
+
+ _prefBranch : null,
+ _debug : false, // mirrors browser.formfill.debug
+ _enabled : true, // mirrors browser.formfill.enable preference
+ _agedWeight : 2,
+ _bucketSize : 1,
+ _maxTimeGroupings : 25,
+ _timeGroupingSize : 7 * 24 * 60 * 60 * 1000 * 1000,
+ _expireDays : null,
+ _boundaryWeight : 25,
+ _prefixWeight : 5,
+
+ init : function() {
+ // Preferences. Add observer so we get notified of changes.
+ this._prefBranch = Cc["@mozilla.org/preferences-service;1"].
+ getService(Ci.nsIPrefService).getBranch("browser.formfill.");
+ this._prefBranch.QueryInterface(Ci.nsIPrefBranch2);
+ this._prefBranch.addObserver("", this.observer, false);
+ this.observer._self = this;
+
+ this._debug = this._prefBranch.getBoolPref("debug");
+ this._enabled = this._prefBranch.getBoolPref("enable");
+ this._agedWeight = this._prefBranch.getIntPref("agedWeight");
+ this._bucketSize = this._prefBranch.getIntPref("bucketSize");
+ this._maxTimeGroupings = this._prefBranch.getIntPref("maxTimeGroupings");
+ this._timeGroupingSize = this._prefBranch.getIntPref("timeGroupingSize") * 1000 * 1000;
+ this._expireDays = this._getFormExpiryDays();
+
+ this._dbStmts = [];
+
+ this._observerService.addObserver(this.observer, "xpcom-shutdown", false);
+ },
+
+ observer : {
+ _self : null,
+
+ QueryInterface : XPCOMUtils.generateQI([Ci.nsIObserver,
+ Ci.nsISupportsWeakReference]),
+
+ observe : function (subject, topic, data) {
+ let self = this._self;
+ if (topic == "nsPref:changed") {
+ let prefName = data;
+ self.log("got change to " + prefName + " preference");
+
+ switch (prefName) {
+ case "agedWeight":
+ self._agedWeight = self._prefBranch.getIntPref(prefName);
+ break;
+ case "debug":
+ self._debug = self._prefBranch.getBoolPref(prefName);
+ break;
+ case "enable":
+ self._enabled = self._prefBranch.getBoolPref(prefName);
+ break;
+ case "maxTimeGroupings":
+ self._maxTimeGroupings = self._prefBranch.getIntPref(prefName);
+ break;
+ case "timeGroupingSize":
+ self._timeGroupingSize = self._prefBranch.getIntPref(prefName) * 1000 * 1000;
+ break;
+ case "bucketSize":
+ self._bucketSize = self._prefBranch.getIntPref(prefName);
+ break;
+ case "boundaryWeight":
+ self._boundaryWeight = self._prefBranch.getIntPref(prefName);
+ break;
+ case "prefixWeight":
+ self._prefixWeight = self._prefBranch.getIntPref(prefName);
+ break;
+ default:
+ self.log("Oops! Pref not handled, change ignored.");
+ }
+ } else if (topic == "xpcom-shutdown") {
+ self._dbStmts = null;
+ }
+ }
+ },
+
+
+ /*
+ * log
+ *
+ * Internal function for logging debug messages to the Error Console
+ * window
+ */
+ log : function (message) {
+ if (!this._debug)
+ return;
+ dump("FormAutoComplete: " + message + "\n");
+ this._logService.logStringMessage("FormAutoComplete: " + message);
+ },
+
+
+ /*
+ * autoCompleteSearch
+ *
+ * aInputName -- |name| attribute from the form input being autocompleted.
+ * aUntrimmedSearchString -- current value of the input
+ * aField -- nsIDOMHTMLInputElement being autocompleted (may be null if from chrome)
+ * aPreviousResult -- previous search result, if any.
+ *
+ * Returns: an nsIAutoCompleteResult
+ */
+ autoCompleteSearch : function (aInputName, aUntrimmedSearchString, aField, aPreviousResult) {
+ function sortBytotalScore (a, b) {
+ let x = a.totalScore;
+ let y = b.totalScore;
+ return ((x > y) ? -1 : ((x < y) ? 1 : 0));
+ }
+
+ if (!this._enabled)
+ return null;
+
+ this.log("AutoCompleteSearch invoked. Search is: " + aUntrimmedSearchString);
+ let searchString = aUntrimmedSearchString.trim().toLowerCase();
+ let result = null;
+
+ // reuse previous results if:
+ // a) length greater than one character (others searches are special cases) AND
+ // b) the the new results will be a subset of the previous results
+ if (aPreviousResult && aPreviousResult.searchString.trim().length > 1 &&
+ searchString.indexOf(aPreviousResult.searchString.trim().toLowerCase()) >= 0) {
+ this.log("Using previous autocomplete result");
+ result = aPreviousResult;
+ result.wrappedJSObject.searchString = aUntrimmedSearchString;
+
+ let searchTokens = searchString.split(/\s+/);
+ // We have a list of results for a shorter search string, so just
+ // filter them further based on the new search string and add to a new array.
+ let entries = result.wrappedJSObject.entries;
+ let filteredEntries = [];
+ for (let i = 0; i < entries.length; i++) {
+ let entry = entries[i];
+ // Remove results that do not contain the token
+ // XXX bug 394604 -- .toLowerCase can be wrong for some intl chars
+ if(searchTokens.some(function (tok) entry.textLowerCase.indexOf(tok) < 0))
+ continue;
+ this._calculateScore(entry, searchString, searchTokens);
+ this.log("Reusing autocomplete entry '" + entry.text +
+ "' (" + entry.frecency +" / " + entry.totalScore + ")");
+ filteredEntries.push(entry);
+ }
+ filteredEntries.sort(sortBytotalScore);
+ result.wrappedJSObject.entries = filteredEntries;
+ } else {
+ this.log("Creating new autocomplete search result.");
+ let entries = this.getAutoCompleteValues(aInputName, searchString);
+ result = new FormAutoCompleteResult(this._formHistory, entries, aInputName, aUntrimmedSearchString);
+ if (aField && aField.maxLength > -1) {
+ let original = result.wrappedJSObject.entries;
+ let filtered = original.filter(function (el) el.text.length <= this.maxLength, aField);
+ result.wrappedJSObject.entries = filtered;
+ }
+ }
+
+ return result;
+ },
+
+ getAutoCompleteValues : function (fieldName, searchString) {
+ let values = [];
+ let searchTokens;
+
+ let params = {
+ agedWeight: this._agedWeight,
+ bucketSize: this._bucketSize,
+ expiryDate: 1000 * (Date.now() - this._expireDays * 24 * 60 * 60 * 1000),
+ fieldname: fieldName,
+ maxTimeGroupings: this._maxTimeGroupings,
+ now: Date.now() * 1000, // convert from ms to microseconds
+ timeGroupingSize: this._timeGroupingSize
+ }
+
+ // only do substring matching when more than one character is typed
+ let where = ""
+ let boundaryCalc = "";
+ if (searchString.length > 1) {
+ searchTokens = searchString.split(/\s+/);
+
+ // build up the word boundary and prefix match bonus calculation
+ boundaryCalc = "MAX(1, :prefixWeight * (value LIKE :valuePrefix ESCAPE '/') + (";
+ // for each word, calculate word boundary weights for the SELECT clause and
+ // add word to the WHERE clause of the query
+ let tokenCalc = [];
+ for (let i = 0; i < searchTokens.length; i++) {
+ tokenCalc.push("(value LIKE :tokenBegin" + i + " ESCAPE '/') + " +
+ "(value LIKE :tokenBoundary" + i + " ESCAPE '/')");
+ where += "AND (value LIKE :tokenContains" + i + " ESCAPE '/') ";
+ }
+ // add more weight if we have a traditional prefix match and
+ // multiply boundary bonuses by boundary weight
+ boundaryCalc += tokenCalc.join(" + ") + ") * :boundaryWeight)";
+ params.prefixWeight = this._prefixWeight;
+ params.boundaryWeight = this._boundaryWeight;
+ } else if (searchString.length == 1) {
+ where = "AND (value LIKE :valuePrefix ESCAPE '/') ";
+ boundaryCalc = "1";
+ } else {
+ where = "";
+ boundaryCalc = "1";
+ }
+ /* Three factors in the frecency calculation for an entry (in order of use in calculation):
+ * 1) average number of times used - items used more are ranked higher
+ * 2) how recently it was last used - items used recently are ranked higher
+ * 3) additional weight for aged entries surviving expiry - these entries are relevant
+ * since they have been used multiple times over a large time span so rank them higher
+ * The score is then divided by the bucket size and we round the result so that entries
+ * with a very similar frecency are bucketed together with an alphabetical sort. This is
+ * to reduce the amount of moving around by entries while typing.
+ */
+
+ let query = "SELECT value, " +
+ "ROUND( " +
+ "timesUsed / MAX(1.0, (lastUsed - firstUsed) / :timeGroupingSize) * " +
+ "MAX(1.0, :maxTimeGroupings - (:now - lastUsed) / :timeGroupingSize) * "+
+ "MAX(1.0, :agedWeight * (firstUsed < :expiryDate)) / " +
+ ":bucketSize "+
+ ", 3) AS frecency, " +
+ boundaryCalc + " AS boundaryBonuses " +
+ "FROM moz_formhistory " +
+ "WHERE fieldname=:fieldname " + where +
+ "ORDER BY ROUND(frecency * boundaryBonuses) DESC, UPPER(value) ASC";
+
+ let stmt;
+ try {
+ stmt = this._dbCreateStatement(query, params);
+
+ // Chicken and egg problem: Need the statement to escape the params we
+ // pass to the function that gives us the statement. So, fix it up now.
+ if (searchString.length >= 1)
+ stmt.params.valuePrefix = stmt.escapeStringForLIKE(searchString, "/") + "%";
+ if (searchString.length > 1) {
+ for (let i = 0; i < searchTokens.length; i++) {
+ let escapedToken = stmt.escapeStringForLIKE(searchTokens[i], "/");
+ stmt.params["tokenBegin" + i] = escapedToken + "%";
+ stmt.params["tokenBoundary" + i] = "% " + escapedToken + "%";
+ stmt.params["tokenContains" + i] = "%" + escapedToken + "%";
+ }
+ } else {
+ // no addional params need to be substituted into the query when the
+ // length is zero or one
+ }
+
+ while (stmt.step()) {
+ let entry = {
+ text: stmt.row.value,
+ textLowerCase: stmt.row.value.toLowerCase(),
+ frecency: stmt.row.frecency,
+ totalScore: Math.round(stmt.row.frecency * stmt.row.boundaryBonuses)
+ }
+ values.push(entry);
+ }
+
+ } catch (e) {
+ this.log("getValues failed: " + e.name + " : " + e.message);
+ throw "DB failed getting form autocomplete values";
+ } finally {
+ stmt.reset();
+ }
+
+ return values;
+ },
+
+
+ _dbStmts : null,
+
+ _dbCreateStatement : function (query, params) {
+ let stmt = this._dbStmts[query];
+ // Memoize the statements
+ if (!stmt) {
+ this.log("Creating new statement for query: " + query);
+ stmt = this._formHistory.DBConnection.createStatement(query);
+ this._dbStmts[query] = stmt;
+ }
+ // Replace parameters, must be done 1 at a time
+ if (params) {
+ let stmtparams = stmt.params;
+ for (let i in params)
+ stmtparams[i] = params[i];
+ }
+ return stmt;
+ },
+
+ _getFormExpiryDays : function () {
+ let prefsBranch = Cc["@mozilla.org/preferences-service;1"].
+ getService(Ci.nsIPrefBranch);
+ if (prefsBranch.prefHasUserValue("browser.formfill.expire_days"))
+ return prefsBranch.getIntPref("browser.formfill.expire_days");
+ else
+ return prefsBranch.getIntPref("browser.history_expire_days");
+ },
+
+ /*
+ * _calculateScore
+ *
+ * entry -- an nsIAutoCompleteResult entry
+ * aSearchString -- current value of the input (lowercase)
+ * searchTokens -- array of tokens of the search string
+ *
+ * Returns: an int
+ */
+ _calculateScore : function (entry, aSearchString, searchTokens) {
+ let boundaryCalc = 0;
+ // for each word, calculate word boundary weights
+ for each (let token in searchTokens) {
+ boundaryCalc += (entry.textLowerCase.indexOf(token) == 0);
+ boundaryCalc += (entry.textLowerCase.indexOf(" " + token) >= 0);
+ }
+ boundaryCalc = boundaryCalc * this._boundaryWeight;
+ // now add more weight if we have a traditional prefix match and
+ // multiply boundary bonuses by boundary weight
+ boundaryCalc += this._prefixWeight *
+ (entry.textLowerCase.
+ indexOf(aSearchString) == 0);
+ entry.totalScore = Math.round(entry.frecency * Math.max(1, boundaryCalc));
+ }
+
+}; // end of FormAutoComplete implementation
+
+
+
+
+// nsIAutoCompleteResult implementation
+function FormAutoCompleteResult (formHistory, entries, fieldName, searchString) {
+ this.formHistory = formHistory;
+ this.entries = entries;
+ this.fieldName = fieldName;
+ this.searchString = searchString;
+}
+
+FormAutoCompleteResult.prototype = {
+ QueryInterface : XPCOMUtils.generateQI([Ci.nsIAutoCompleteResult,
+ Ci.nsISupportsWeakReference]),
+
+ // private
+ formHistory : null,
+ entries : null,
+ fieldName : null,
+
+ _checkIndexBounds : function (index) {
+ if (index < 0 || index >= this.entries.length)
+ throw Components.Exception("Index out of range.", Cr.NS_ERROR_ILLEGAL_VALUE);
+ },
+
+ // Allow autoCompleteSearch to get at the JS object so it can
+ // modify some readonly properties for internal use.
+ get wrappedJSObject() {
+ return this;
+ },
+
+ // Interfaces from idl...
+ searchString : null,
+ errorDescription : "",
+ get defaultIndex() {
+ if (entries.length == 0)
+ return -1;
+ else
+ return 0;
+ },
+ get searchResult() {
+ if (this.entries.length == 0)
+ return Ci.nsIAutoCompleteResult.RESULT_NOMATCH;
+ return Ci.nsIAutoCompleteResult.RESULT_SUCCESS;
+ },
+ get matchCount() {
+ return this.entries.length;
+ },
+
+ getValueAt : function (index) {
+ this._checkIndexBounds(index);
+ return this.entries[index].text;
+ },
+
+ getCommentAt : function (index) {
+ this._checkIndexBounds(index);
+ return "";
+ },
+
+ getStyleAt : function (index) {
+ this._checkIndexBounds(index);
+ return "";
+ },
+
+ getImageAt : function (index) {
+ this._checkIndexBounds(index);
+ return "";
+ },
+
+ removeValueAt : function (index, removeFromDB) {
+ this._checkIndexBounds(index);
+
+ let [removedEntry] = this.entries.splice(index, 1);
+
+ if (removeFromDB)
+ this.formHistory.removeEntry(this.fieldName, removedEntry.text);
+ }
+};
+
+let component = [FormAutoComplete];
+function NSGetModule (compMgr, fileSpec) {
+ return XPCOMUtils.generateModule(component);
+}
diff --git a/tools/xo_bundle/components/nsHelperAppDlg.js b/tools/xo_bundle/components/nsHelperAppDlg.js
index 5f7845c..1e649b4 100755
--- a/tools/xo_bundle/components/nsHelperAppDlg.js
+++ b/tools/xo_bundle/components/nsHelperAppDlg.js
@@ -1,7 +1,26 @@
/*
-//@line 45 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 45 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
*/
+///////////////////////////////////////////////////////////////////////////////
+//// Helper Functions
+
+/**
+ * Determines if a given directory is able to be used to download to.
+ *
+ * @param aDirectory
+ * The directory to check.
+ * @returns true if we can use the directory, false otherwise.
+ */
+function isUsableDirectory(aDirectory)
+{
+ return aDirectory.exists() && aDirectory.isDirectory() &&
+ aDirectory.isWritable();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// nsUnkownContentTypeDialog
+
/* This file implements the nsIHelperAppLauncherDialog interface.
*
* The implementation consists of a JavaScript "class" named nsUnknownContentTypeDialog,
@@ -110,6 +129,9 @@ nsUnknownContentTypeDialog.prototype = {
let prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
+ let bundle = Components.classes["@mozilla.org/intl/stringbundle;1"].
+ getService(Components.interfaces.nsIStringBundleService).
+ createBundle("chrome://mozapps/locale/downloads/unknownContentType.properties");
if (!aForcePrompt) {
// Check to see if the user wishes to auto save to the default download
@@ -124,7 +146,23 @@ nsUnknownContentTypeDialog.prototype = {
let dnldMgr = Components.classes["@mozilla.org/download-manager;1"]
.getService(Components.interfaces.nsIDownloadManager);
let defaultFolder = dnldMgr.userDownloadsDirectory;
- result = this.validateLeafName(defaultFolder, aDefaultFile, aSuggestedFileExtension);
+
+ try {
+ result = this.validateLeafName(defaultFolder, aDefaultFile, aSuggestedFileExtension);
+ }
+ catch (ex) {
+ if (ex.result == Components.results.NS_ERROR_FILE_ACCESS_DENIED) {
+ let prompter = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
+ getService(Components.interfaces.nsIPromptService);
+
+ // Display error alert (using text supplied by back-end)
+ prompter.alert(this.dialog,
+ bundle.GetStringFromName("badPermissions.title"),
+ bundle.GetStringFromName("badPermissions"));
+
+ return;
+ }
+ }
// Check to make sure we have a valid directory, otherwise, prompt
if (result)
@@ -135,10 +173,6 @@ nsUnknownContentTypeDialog.prototype = {
// Use file picker to show dialog.
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
-
- var bundle = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService);
- bundle = bundle.createBundle("chrome://mozapps/locale/downloads/unknownContentType.properties");
-
var windowTitle = bundle.GetStringFromName("saveDialogTitle");
var parent = aContext.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowInternal);
picker.init(parent, windowTitle, nsIFilePicker.modeSave);
@@ -172,10 +206,14 @@ nsUnknownContentTypeDialog.prototype = {
catch (e) {
}
- // Default to lastDir if it's valid, use the user's default
- // downloads directory otherwise.
+ // Default to lastDir if it is valid, otherwise use the user's default
+ // downloads directory. userDownloadsDirectory should always return a
+ // valid directory, so we can safely default to it.
var dnldMgr = Components.classes["@mozilla.org/download-manager;1"]
.getService(Components.interfaces.nsIDownloadManager);
+ picker.displayDirectory = dnldMgr.userDownloadsDirectory;
+
+ // The last directory preference may not exist, which will throw.
try {
var lastDir;
if (inPrivateBrowsing && gDownloadLastDir.file)
@@ -183,12 +221,10 @@ nsUnknownContentTypeDialog.prototype = {
else
lastDir = prefs.getComplexValue("browser.download.lastDir",
Components.interfaces.nsILocalFile);
- if (lastDir.exists())
+ if (isUsableDirectory(lastDir))
picker.displayDirectory = lastDir;
- else
- picker.displayDirectory = dnldMgr.userDownloadsDirectory;
- } catch (ex) {
- picker.displayDirectory = dnldMgr.userDownloadsDirectory;
+ }
+ catch (ex) {
}
if (picker.show() == nsIFilePicker.returnCancel) {
@@ -241,7 +277,7 @@ nsUnknownContentTypeDialog.prototype = {
*/
validateLeafName: function (aLocalFile, aLeafName, aFileExt)
{
- if (!aLocalFile || !aLocalFile.exists())
+ if (!(aLocalFile && isUsableDirectory(aLocalFile)))
return null;
// Remove any leading periods, since we don't want to save hidden files
@@ -254,7 +290,7 @@ nsUnknownContentTypeDialog.prototype = {
this.makeFileUnique(aLocalFile);
-//@line 318 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 354 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
return aLocalFile;
},
@@ -293,6 +329,10 @@ nsUnknownContentTypeDialog.prototype = {
}
catch (e) {
dump("*** exception in validateLeafName: " + e + "\n");
+
+ if (e.result == Components.results.NS_ERROR_FILE_ACCESS_DENIED)
+ throw e;
+
if (aLocalFile.leafName == "" || aLocalFile.isDirectory()) {
aLocalFile.append("unnamed");
if (aLocalFile.exists())
@@ -427,7 +467,7 @@ nsUnknownContentTypeDialog.prototype = {
// want users to be able to autodownload .exe files.
var rememberChoice = this.dialogElement("rememberChoice");
-//@line 509 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 549 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
if (shouldntRememberChoice) {
rememberChoice.checked = false;
rememberChoice.disabled = true;
@@ -567,12 +607,12 @@ nsUnknownContentTypeDialog.prototype = {
// Returns true if opening the default application makes sense.
openWithDefaultOK: function() {
// The checking is different on Windows...
-//@line 659 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 699 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
// On other platforms, default is Ok if there is a default app.
// Note that nsIMIMEInfo providers need to ensure that this holds true
// on each platform.
return this.mLauncher.MIMEInfo.hasDefaultHandler;
-//@line 664 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 704 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
},
// Set "default" application description field.
@@ -593,9 +633,9 @@ nsUnknownContentTypeDialog.prototype = {
// getPath:
getPath: function (aFile) {
-//@line 687 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 727 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
return aFile.path;
-//@line 689 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 729 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
},
// initAppAndSaveToDiskValues:
@@ -637,9 +677,9 @@ nsUnknownContentTypeDialog.prototype = {
otherHandler.setAttribute("path",
this.getPath(this.chosenApp.executable));
-//@line 734 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 774 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
otherHandler.label = this.chosenApp.executable.leafName;
-//@line 736 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 776 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
otherHandler.hidden = false;
}
@@ -795,7 +835,7 @@ nsUnknownContentTypeDialog.prototype = {
!helperApp.executable.exists()) {
// Show alert and try again.
var bundle = this.dialogElement("strings");
- var msg = bundle.getFormattedString("badApp", [this.dialogElement("otherHandler").path]);
+ var msg = bundle.getFormattedString("badApp", [this.dialogElement("otherHandler").getAttribute("path")]);
var svc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
svc.alert(this.mDialog, bundle.getString("badApp.title"), msg);
@@ -827,7 +867,7 @@ nsUnknownContentTypeDialog.prototype = {
// for the file to be saved to to pass to |saveToDisk| - otherwise
// we must ask the user to pick a save name.
-//@line 937 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 977 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
// see @notify
// we cannot use opener's setTimeout, see bug 420405
@@ -882,13 +922,13 @@ nsUnknownContentTypeDialog.prototype = {
// Retrieve the pretty description from the file
getFileDisplayName: function getFileDisplayName(file)
{
-//@line 999 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 1039 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
return file.leafName;
},
// chooseApp: Open file picker and prompt user for application.
chooseApp: function() {
-//@line 1070 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 1110 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
@@ -914,9 +954,9 @@ nsUnknownContentTypeDialog.prototype = {
var otherHandler = this.dialogElement("otherHandler");
otherHandler.removeAttribute("hidden");
otherHandler.setAttribute("path", this.getPath(this.chosenApp.executable));
-//@line 1100 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 1140 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
otherHandler.label = this.chosenApp.executable.leafName;
-//@line 1102 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 1142 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
this.dialogElement("openHandler").selectedIndex = 1;
this.dialogElement("openHandler").setAttribute("lastSelectedItemID", "otherHandler");
@@ -929,7 +969,7 @@ nsUnknownContentTypeDialog.prototype = {
lastSelectedID = "defaultHandler";
openHandler.selectedItem = this.dialogElement(lastSelectedID);
}
-//@line 1115 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
+//@line 1155 "/builds/slave/linux_build/build/toolkit/mozapps/downloads/src/nsHelperAppDlg.js.in"
},
// Turn this on to get debugging messages.
@@ -979,14 +1019,8 @@ nsUnknownContentTypeDialog.prototype = {
// This Component's module implementation. All the code below is used to get this
// component registered and accessible via XPCOM.
var module = {
- firstTime: true,
-
// registerSelf: Register this component.
registerSelf: function (compMgr, fileSpec, location, type) {
- if (this.firstTime) {
- this.firstTime = false;
- throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
- }
compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
compMgr.registerFactoryLocation( this.cid,
diff --git a/tools/xo_bundle/components/nsLivemarkService.js b/tools/xo_bundle/components/nsLivemarkService.js
index 62d906d..dd79a0c 100755
--- a/tools/xo_bundle/components/nsLivemarkService.js
+++ b/tools/xo_bundle/components/nsLivemarkService.js
@@ -48,7 +48,7 @@ const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/lang.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/lang.js"
/**
@@ -128,7 +128,7 @@ Function.prototype.inherits = function(parentCtor) {
this.superClass_ = parentCtor.prototype;
this.prototype = new tempCtor();
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/observer.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/observer.js"
// A couple of classes to simplify creating observers.
@@ -228,7 +228,7 @@ G_ObserverServiceObserver.prototype.observe_ = function(subject, topic, data) {
this.unregister();
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/alarm.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/alarm.js"
// An Alarm fires a callback after a certain amount of time, or at
@@ -374,7 +374,7 @@ G_ConditionalAlarm.prototype.notify = function(timer) {
this.cancel();
}
}
-//@line 54 "/builds/moz2_slave/linux_build/build/toolkit/components/places/src/nsLivemarkService.js"
+//@line 54 "/builds/slave/linux_build/build/toolkit/components/places/src/nsLivemarkService.js"
const LS_CLASSID = Components.ID("{dca61eb5-c7cd-4df1-b0fb-d0722baba251}");
const LS_CLASSNAME = "Livemark Service";
@@ -419,33 +419,6 @@ const IDLE_TIMELIMIT = 1800000;
// This cap is used only if the user sets a very high expiration time (>4h)
const MAX_REFRESH_TIME = 3600000;
-/* We don't have strings, so this is currently not used.
-const PLACES_BUNDLE_URI = "chrome://places/locale/places.properties";
-
-function LOG(str) {
- dump("*** " + str + "\n");
-}
-
-var gStringBundle;
-function GetString(name)
-{
- try {
- if (!gStringBundle) {
- var bundleService = Cc[SB_CONTRACTID].getService();
- bundleService = bundleService.QueryInterface(Ci.nsIStringBundleService);
- gStringBundle = bundleService.createBundle(PLACES_BUNDLE_URI);
- }
-
- if (gStringBundle)
- return gStringBundle.GetStringFromName(name);
- } catch (ex) {
- LOG("Exception loading string bundle: " + ex.message);
- }
-
- return null;
-}
-*/
-
function MarkLivemarkLoadFailed(aFolderId) {
var ans = Cc[AS_CONTRACTID].getService(Ci.nsIAnnotationService);
// if it failed before, nothing more to do
@@ -504,35 +477,35 @@ function LivemarkService() {
LivemarkService.prototype = {
get _bms() {
- if (!this.__bms)
- this.__bms = Cc[BMS_CONTRACTID].getService(Ci.nsINavBookmarksService);
- return this.__bms;
+ var svc = Cc[BMS_CONTRACTID].getService(Ci.nsINavBookmarksService);
+ this.__defineGetter__("_bms", function() svc);
+ return this._bms;
},
get _history() {
- if (!this.__history)
- this.__history = Cc[NH_CONTRACTID].getService(Ci.nsINavHistoryService);
- return this.__history;
+ var svc = Cc[NH_CONTRACTID].getService(Ci.nsINavHistoryService);
+ this.__defineGetter__("_history", function() svc);
+ return this._history;
},
get _ans() {
- if (!this.__ans)
- this.__ans = Cc[AS_CONTRACTID].getService(Ci.nsIAnnotationService);
- return this.__ans;
+ var svc = Cc[AS_CONTRACTID].getService(Ci.nsIAnnotationService);
+ this.__defineGetter__("_ans", function() svc);
+ return this._ans;
},
get _ios() {
- if (!this.__ios)
- this.__ios = Cc[IO_CONTRACTID].getService(Ci.nsIIOService);
- return this.__ios;
+ var svc = Cc[IO_CONTRACTID].getService(Ci.nsIIOService);
+ this.__defineGetter__("_ios", function() svc);
+ return this._ios;
},
get _idleService() {
- if (!(IS_CONTRACTID in Cc))
- return null;
- if (!this.__idleService)
- this.__idleService = Cc[IS_CONTRACTID].getService(Ci.nsIIdleService);
- return this.__idleService;
+ if (!(IS_CONTRACTID in Cc))
+ return null;
+ var svc = Cc[IS_CONTRACTID].getService(Ci.nsIIdleService);
+ this.__defineGetter__("_idleService", function() svc);
+ return this._idleService;
},
_updateTimer: null,
@@ -736,7 +709,24 @@ LivemarkService.prototype = {
isLivemark: function LS_isLivemark(aFolderId) {
if (aFolderId < 1)
throw Cr.NS_ERROR_INVALID_ARG;
- return this._ans.itemHasAnnotation(aFolderId, LMANNO_FEEDURI);
+ try {
+ this._getLivemarkIndex(aFolderId);
+ return true;
+ }
+ catch (ex) {}
+ return false;
+ },
+
+ getLivemarkIdForFeedURI: function LS_getLivemarkIdForFeedURI(aFeedURI) {
+ if (!(aFeedURI instanceof Ci.nsIURI))
+ throw Cr.NS_ERROR_INVALID_ARG;
+
+ for (var i = 0; i < this._livemarks.length; ++i) {
+ if (this._livemarks[i].feedURI.equals(aFeedURI))
+ return this._livemarks[i].folderId;
+ }
+
+ return -1;
},
_ensureLivemark: function LS__ensureLivemark(aFolderId) {
@@ -821,8 +811,9 @@ LivemarkService.prototype = {
onItemChanged: function() { },
onItemVisited: function() { },
onItemMoved: function() { },
+ onBeforeItemRemoved: function() { },
- onItemRemoved: function(aItemId, aParentId, aIndex) {
+ onItemRemoved: function(aItemId, aParentId, aIndex, aItemType) {
// we don't need to remove annotations since itemAnnotations
// are already removed with the bookmark
try {
@@ -853,7 +844,7 @@ LivemarkService.prototype = {
aIID.equals(Ci.nsINavBookmarkObserver) ||
aIID.equals(Ci.nsISupports))
return this;
- throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ throw Cr.NS_ERROR_NO_INTERFACE;
}
};
@@ -987,7 +978,12 @@ LivemarkLoadListener.prototype = {
this._processor.listener = this;
this._processor.parseAsync(null, channel.URI);
- this._processor.onStartRequest(aRequest, aContext);
+ try {
+ this._processor.onStartRequest(aRequest, aContext);
+ }
+ catch (ex) {
+ Components.utils.reportError("Livemark Service: feed processor received an invalid channel for " + channel.URI.spec);
+ }
},
/**
@@ -995,11 +991,16 @@ LivemarkLoadListener.prototype = {
*/
onStopRequest: function LLL_onStopRequest(aRequest, aContext, aStatus) {
if (!Components.isSuccessCode(aStatus)) {
- // Something went wrong, try to load again in a bit
- this._setResourceTTL(ERROR_EXPIRATION);
this._isAborted = true;
- MarkLivemarkLoadFailed(this._livemark.folderId);
this._livemark.locked = false;
+ var lmService = Cc[LS_CONTRACTID].getService(Ci.nsILivemarkService);
+ // One of the reasons we could abort a request is when a livemark is
+ // removed, in such a case the livemark itemId would already be invalid.
+ if (lmService.isLivemark(this._livemark.folderId)) {
+ // Something went wrong, try to load again in a bit
+ this._setResourceTTL(ERROR_EXPIRATION);
+ MarkLivemarkLoadFailed(this._livemark.folderId);
+ }
return;
}
// Set an expiration on the livemark, for reloading the data
diff --git a/tools/xo_bundle/components/nsLoginManager.js b/tools/xo_bundle/components/nsLoginManager.js
index 770fd6c..0c6bc58 100755
--- a/tools/xo_bundle/components/nsLoginManager.js
+++ b/tools/xo_bundle/components/nsLoginManager.js
@@ -51,20 +51,7 @@ LoginManager.prototype = {
contractID: "@mozilla.org/login-manager;1",
classID: Components.ID("{cb9e0de8-3598-4ed7-857b-827f011ad5d8}"),
QueryInterface : XPCOMUtils.generateQI([Ci.nsILoginManager,
- Ci.nsISupportsWeakReference,
- Ci.nsILoginManager_MOZILLA_1_9_1,
- Ci.nsIClassInfo]),
-
- /* ---------- extra requirements for nsIClassInfo ---------- */
- getInterfaces: function(countRef) {
- let interfaces = [Ci.nsILoginManager, Ci.nsISupportsWeakReference,
- Ci.nsILoginManager_MOZILLA_1_9_1, Ci.nsIClassInfo];
- countRef.value = interfaces.length;
- return interfaces;
- },
- getHelperForLanguage: function (language) null,
- implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
- flags: Ci.nsIClassInfo.SINGLETON,
+ Ci.nsISupportsWeakReference]),
/* ---------- private memebers ---------- */
@@ -362,6 +349,9 @@ LoginManager.prototype = {
handleEvent : function (event) {
+ if (!event.isTrusted)
+ return;
+
this._pwmgr.log("domEventListener: got event " + event.type);
switch (event.type) {
@@ -386,9 +376,13 @@ LoginManager.prototype = {
var [usernameField, passwordField, ignored] =
this._pwmgr._getFormFields(acForm, false);
if (usernameField == acInputField && passwordField) {
+ let oldValue = passwordField.value;
// Clobber any existing password.
passwordField.value = "";
- this._pwmgr._fillForm(acForm, true, true, null);
+ let [didFillForm, foundLogins] =
+ this._pwmgr._fillForm(acForm, true, true, null);
+ if (!didFillForm)
+ passwordField.value = oldValue;
} else {
this._pwmgr.log("Oops, form changed before AC invoked");
}
@@ -608,9 +602,11 @@ LoginManager.prototype = {
var result = null;
- if (aPreviousResult) {
+ if (aPreviousResult &&
+ aSearchString.substr(0, aPreviousResult.searchString.length) == aPreviousResult.searchString) {
this.log("Using previous autocomplete result");
result = aPreviousResult;
+ result.wrappedJSObject.searchString = aSearchString;
// We have a list of results for a shorter search string, so just
// filter them further based on the new search string.
@@ -1255,13 +1251,17 @@ LoginManager.prototype = {
*/
_notifyFoundLogins : function (didntFillReason, usernameField,
passwordField, foundLogins, selectedLogin) {
+ // We need .setProperty(), which is a method on the original
+ // nsIWritablePropertyBag. Strangley enough, nsIWritablePropertyBag2
+ // doesn't inherit from that, so the additional QI is needed.
let formInfo = Cc["@mozilla.org/hash-property-bag;1"].
- createInstance(Ci.nsIWritablePropertyBag2);
+ createInstance(Ci.nsIWritablePropertyBag2).
+ QueryInterface(Ci.nsIWritablePropertyBag);
formInfo.setPropertyAsACString("didntFillReason", didntFillReason);
formInfo.setPropertyAsInterface("usernameField", usernameField);
formInfo.setPropertyAsInterface("passwordField", passwordField);
- formInfo.setPropertyAsInterface("foundLogins", foundLogins.concat());
+ formInfo.setProperty("foundLogins", foundLogins.concat());
formInfo.setPropertyAsInterface("selectedLogin", selectedLogin);
this._observerService.notifyObservers(formInfo,
@@ -1332,6 +1332,12 @@ UserAutoCompleteResult.prototype = {
// private
logins : null,
+ // Allow autoCompleteSearch to get at the JS object so it can
+ // modify some readonly properties for internal use.
+ get wrappedJSObject() {
+ return this;
+ },
+
// Interfaces from idl...
searchString : null,
searchResult : Ci.nsIAutoCompleteResult.RESULT_NOMATCH,
diff --git a/tools/xo_bundle/components/nsLoginManagerPrompter.js b/tools/xo_bundle/components/nsLoginManagerPrompter.js
index 4af1738..d7b204c 100755
--- a/tools/xo_bundle/components/nsLoginManagerPrompter.js
+++ b/tools/xo_bundle/components/nsLoginManagerPrompter.js
@@ -50,18 +50,42 @@ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
* Invoked by NS_NewAuthPrompter2()
* [embedding/components/windowwatcher/src/nsPrompt.cpp]
*/
-function LoginManagerPromptFactory() {}
+function LoginManagerPromptFactory() {
+ var observerService = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ observerService.addObserver(this, "quit-application-granted", true);
+}
LoginManagerPromptFactory.prototype = {
classDescription : "LoginManagerPromptFactory",
contractID : "@mozilla.org/passwordmanager/authpromptfactory;1",
classID : Components.ID("{749e62f4-60ae-4569-a8a2-de78b649660e}"),
- QueryInterface : XPCOMUtils.generateQI([Ci.nsIPromptFactory]),
+ QueryInterface : XPCOMUtils.generateQI([Ci.nsIPromptFactory, Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+
+ _asyncPrompts : {},
+ _asyncPromptInProgress : false,
+
+ observe : function (subject, topic, data) {
+ if (topic == "quit-application-granted") {
+ var asyncPrompts = this._asyncPrompts;
+ this._asyncPrompts = {};
+ for each (var asyncPrompt in asyncPrompts) {
+ for each (var consumer in asyncPrompt.consumers) {
+ if (consumer.callback) {
+ this.log("Canceling async auth prompt callback " + consumer.callback);
+ try {
+ consumer.callback.onAuthCancelled(consumer.context, true);
+ } catch (e) { /* Just ignore exceptions from the callback */ }
+ }
+ }
+ }
+ }
+ },
getPrompt : function (aWindow, aIID) {
var prompt = new LoginManagerPrompter().QueryInterface(aIID);
- prompt.init(aWindow);
+ prompt.init(aWindow, this);
return prompt;
}
}; // end of LoginManagerPromptFactory implementation
@@ -98,6 +122,7 @@ LoginManagerPrompter.prototype = {
Ci.nsIAuthPrompt2,
Ci.nsILoginManagerPrompter]),
+ _factory : null,
_window : null,
_debug : false, // mirrors signon.debug
@@ -165,6 +190,14 @@ LoginManagerPrompter.prototype = {
return this.__ioService;
},
+ __threadManager: null,
+ get _threadManager() {
+ if (!this.__threadManager)
+ this.__threadManager = Cc["@mozilla.org/thread-manager;1"].
+ getService(Ci.nsIThreadManager);
+ return this.__threadManager;
+ },
+
__ellipsis : null,
get _ellipsis() {
@@ -556,10 +589,114 @@ LoginManagerPrompter.prototype = {
return ok;
},
- asyncPromptAuth : function () {
- return NS_ERROR_NOT_IMPLEMENTED;
+ asyncPromptAuth : function (aChannel, aCallback, aContext, aLevel, aAuthInfo) {
+ var cancelable = null;
+
+ try {
+ this.log("===== asyncPromptAuth called =====");
+
+ // If the user submits a login but it fails, we need to remove the
+ // notification bar that was displayed. Conveniently, the user will
+ // be prompted for authentication again, which brings us here.
+ var notifyBox = this._getNotifyBox();
+ if (notifyBox)
+ this._removeLoginNotifications(notifyBox);
+
+ cancelable = this._newAsyncPromptConsumer(aCallback, aContext);
+
+ var [hostname, httpRealm] = this._getAuthTarget(aChannel, aAuthInfo);
+
+ var hashKey = aLevel + "|" + hostname + "|" + httpRealm;
+ this.log("Async prompt key = " + hashKey);
+ var asyncPrompt = this._factory._asyncPrompts[hashKey];
+ if (asyncPrompt) {
+ this.log("Prompt bound to an existing one in the queue, callback = " + aCallback);
+ asyncPrompt.consumers.push(cancelable);
+ return cancelable;
+ }
+
+ this.log("Adding new prompt to the queue, callback = " + aCallback);
+ asyncPrompt = {
+ consumers: [cancelable],
+ channel: aChannel,
+ authInfo: aAuthInfo,
+ level: aLevel
+ }
+
+ this._factory._asyncPrompts[hashKey] = asyncPrompt;
+ this._doAsyncPrompt();
+ }
+ catch (e) {
+ Components.utils.reportError("LoginManagerPrompter: " +
+ "asyncPromptAuth: " + e + "\nFalling back to promptAuth\n");
+ // Fail the prompt operation to let the consumer fall back
+ // to synchronous promptAuth method
+ throw e;
+ }
+
+ return cancelable;
},
+ _doAsyncPrompt : function() {
+ if (this._factory._asyncPromptInProgress) {
+ this.log("_doAsyncPrompt bypassed, already in progress");
+ return;
+ }
+
+ // Find the first prompt key we have in the queue
+ var hashKey = null;
+ for (hashKey in this._factory._asyncPrompts)
+ break;
+
+ if (!hashKey) {
+ this.log("_doAsyncPrompt:run bypassed, no prompts in the queue");
+ return;
+ }
+
+ this._factory._asyncPromptInProgress = true;
+
+ var self = this;
+ var runnable = {
+ run : function() {
+ var ok = false;
+ var prompt = self._factory._asyncPrompts[hashKey];
+ try {
+ self.log("_doAsyncPrompt:run - performing the prompt for '" + hashKey + "'");
+ ok = self.promptAuth(
+ prompt.channel,
+ prompt.level,
+ prompt.authInfo
+ );
+ } catch (e) {
+ Components.utils.reportError("LoginManagerPrompter: " +
+ "_doAsyncPrompt:run: " + e + "\n");
+ }
+
+ delete self._factory._asyncPrompts[hashKey];
+ self._factory._asyncPromptInProgress = false;
+
+ for each (var consumer in prompt.consumers) {
+ if (!consumer.callback)
+ // Not having a callback means that consumer didn't provide it
+ // or canceled the notification
+ continue;
+
+ self.log("Calling back to " + consumer.callback + " ok=" + ok);
+ try {
+ if (ok)
+ consumer.callback.onAuthAvailable(consumer.context, prompt.authInfo);
+ else
+ consumer.callback.onAuthCancelled(consumer.context, true);
+ } catch (e) { /* Throw away exceptions caused by callback */ }
+ }
+ self._doAsyncPrompt();
+ }
+ }
+
+ this._threadManager.mainThread.dispatch(runnable,
+ Ci.nsIThread.DISPATCH_NORMAL);
+ this.log("_doAsyncPrompt:run dispatched");
+ },
@@ -572,8 +709,9 @@ LoginManagerPrompter.prototype = {
* init
*
*/
- init : function (aWindow) {
+ init : function (aWindow, aFactory) {
this._window = aWindow;
+ this._factory = aFactory || null;
var prefBranch = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefService).getBranch("signon.");
@@ -1218,6 +1356,19 @@ LoginManagerPrompter.prototype = {
aAuthInfo.username = username;
}
aAuthInfo.password = password;
+ },
+
+ _newAsyncPromptConsumer : function(aCallback, aContext) {
+ return {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsICancelable]),
+ callback: aCallback,
+ context: aContext,
+ cancel: function() {
+ this.callback.onAuthCancelled(this.context, false);
+ this.callback = null;
+ this.context = null;
+ }
+ }
}
}; // end of LoginManagerPrompter implementation
diff --git a/tools/xo_bundle/components/nsMicrosummaryService.js b/tools/xo_bundle/components/nsMicrosummaryService.js
index f51c0cd..a691d92 100755
--- a/tools/xo_bundle/components/nsMicrosummaryService.js
+++ b/tools/xo_bundle/components/nsMicrosummaryService.js
@@ -1,4 +1,4 @@
-//@line 40 "/builds/moz2_slave/linux_build/build/browser/components/microsummaries/src/nsMicrosummaryService.js"
+//@line 41 "/builds/slave/linux_build/build/browser/components/microsummaries/src/nsMicrosummaryService.js"
const Cc = Components.classes;
const Ci = Components.interfaces;
@@ -32,6 +32,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function MicrosummaryService() {
this._obs.addObserver(this, "xpcom-shutdown", true);
+ this._ans.addObserver(this, false);
Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefService).
@@ -45,39 +46,35 @@ function MicrosummaryService() {
MicrosummaryService.prototype = {
// Bookmarks Service
- __bms: null,
get _bms() {
- if (!this.__bms)
- this.__bms = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
- getService(Ci.nsINavBookmarksService);
- return this.__bms;
+ var svc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
+ getService(Ci.nsINavBookmarksService);
+ this.__defineGetter__("_bms", function() svc);
+ return this._bms;
},
// Annotation Service
- __ans: null,
get _ans() {
- if (!this.__ans)
- this.__ans = Cc["@mozilla.org/browser/annotation-service;1"].
- getService(Ci.nsIAnnotationService);
- return this.__ans;
+ var svc = Cc["@mozilla.org/browser/annotation-service;1"].
+ getService(Ci.nsIAnnotationService);
+ this.__defineGetter__("_ans", function() svc);
+ return this._ans;
},
// IO Service
- __ios: null,
get _ios() {
- if (!this.__ios)
- this.__ios = Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService);
- return this.__ios;
+ var svc = Cc["@mozilla.org/network/io-service;1"].
+ getService(Ci.nsIIOService);
+ this.__defineGetter__("_ios", function() svc);
+ return this._ios;
},
// Observer Service
- __obs: null,
get _obs() {
- if (!this.__obs)
- this.__obs = Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
- return this.__obs;
+ var svc = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ this.__defineGetter__("_obs", function() svc);
+ return this._obs;
},
/**
@@ -118,8 +115,15 @@ MicrosummaryService.prototype = {
classDescription: "Microsummary Service",
contractID: "@mozilla.org/microsummary/service;1",
classID: Components.ID("{460a9792-b154-4f26-a922-0f653e2c8f91}"),
+ _xpcom_categories: [{ category: "update-timer",
+ value: "@mozilla.org/microsummary/service;1," +
+ "getService,microsummary-generator-update-timer," +
+ "browser.microsummary.generatorUpdateInterval," +
+ GENERATOR_INTERVAL }],
QueryInterface: XPCOMUtils.generateQI([Ci.nsIMicrosummaryService,
+ Ci.nsITimerCallback,
Ci.nsISupportsWeakReference,
+ Ci.nsIAnnotationObserver,
Ci.nsIObserver]),
// nsIObserver
@@ -135,6 +139,11 @@ MicrosummaryService.prototype = {
}
},
+ // cross-session timer used to periodically check for generator updates.
+ notify: function MSS_notify(timer) {
+ this._updateGenerators();
+ },
+
_initTimers: function MSS__initTimers() {
if (this._timer)
this._timer.cancel();
@@ -151,27 +160,17 @@ MicrosummaryService.prototype = {
this._timer.initWithCallback(callback,
CHECK_INTERVAL,
this._timer.TYPE_REPEATING_SLACK);
-
- // Setup a cross-session timer to periodically check for generator updates.
- var updateManager = Cc["@mozilla.org/updates/timer-manager;1"].
- getService(Ci.nsIUpdateTimerManager);
- var interval = getPref("browser.microsummary.generatorUpdateInterval",
- GENERATOR_INTERVAL);
- var updateCallback = {
- _svc: this,
- notify: function(timer) { this._svc._updateGenerators() }
- };
- updateManager.registerTimer("microsummary-generator-update-timer",
- updateCallback, interval);
},
_destroy: function MSS__destroy() {
+ this._obs.removeObserver(this, "xpcom-shutdown", true);
+ this._ans.removeObserver(this);
this._timer.cancel();
this._timer = null;
},
_updateMicrosummaries: function MSS__updateMicrosummaries() {
- var bookmarks = this._getBookmarks();
+ var bookmarks = this._bookmarks;
var now = Date.now();
var updateInterval = this._updateInterval;
@@ -507,7 +506,7 @@ MicrosummaryService.prototype = {
*
*/
_changeField: function MSS__changeField(fieldName, oldValue, newValue) {
- var bookmarks = this._getBookmarks();
+ var bookmarks = this._bookmarks;
for ( var i = 0; i < bookmarks.length; i++ ) {
var bookmarkID = bookmarks[i];
@@ -519,27 +518,19 @@ MicrosummaryService.prototype = {
},
/**
- * Get the set of bookmarks with microsummaries.
+ * Get the set of bookmarks that have microsummaries.
*
- * This is the internal version of this method, which is not accessible
- * via XPCOM but is more performant; inside this component, use this version.
- * Outside the component, use getBookmarks (no underscore prefix) instead.
+ * This caches the list of microsummarized bookmarks. The cache is
+ * managed by observing the annotation service, and updating
+ * when a microsummary annotation is added or removed.
*
- * @returns an array of place: uris representing bookmarks items
+ * @returns an array of item ids for microsummarized bookmarks
*
*/
- _getBookmarks: function MSS__getBookmarks() {
- var bookmarks;
-
- // This try/catch block is a temporary workaround for bug 336194.
- try {
- bookmarks = this._ans.getItemsWithAnnotation(ANNO_MICSUM_GEN_URI, {});
- }
- catch(e) {
- bookmarks = [];
- }
-
- return bookmarks;
+ get _bookmarks() {
+ var bookmarks = this._ans.getItemsWithAnnotation(ANNO_MICSUM_GEN_URI, {});
+ this.__defineGetter__("_bookmarks", function() bookmarks);
+ return this._bookmarks;
},
_setAnnotation: function MSS__setAnnotation(aBookmarkId, aFieldName, aFieldValue) {
@@ -554,14 +545,14 @@ MicrosummaryService.prototype = {
* Get the set of bookmarks with microsummaries.
*
* This is the external version of this method and is accessible via XPCOM.
- * Use it outside this component. Inside the component, use _getBookmarks
+ * Use it outside this component. Inside the component, use _bookmarks
* (with underscore prefix) instead for performance.
*
* @returns an nsISimpleEnumerator enumeration of bookmark IDs
*
*/
getBookmarks: function MSS_getBookmarks() {
- return new ArrayEnumerator(this._getBookmarks());
+ return new ArrayEnumerator(this._bookmarks);
},
/**
@@ -649,15 +640,15 @@ MicrosummaryService.prototype = {
/**
* Whether or not the given bookmark has a current microsummary.
*
- * @param bookmarkID
- * the bookmark for which to set the current microsummary
+ * @param bookmarkId
+ * the bookmark id to check
*
* @returns a boolean representing whether or not the given bookmark
- * has a current microsummary
+ * currently has a microsummary
*
*/
- hasMicrosummary: function MSS_hasMicrosummary(bookmarkID) {
- return this._ans.itemHasAnnotation(bookmarkID, ANNO_MICSUM_GEN_URI);
+ hasMicrosummary: function MSS_hasMicrosummary(aBookmarkId) {
+ return (this._bookmarks.indexOf(aBookmarkId) != -1);
},
/**
@@ -679,7 +670,7 @@ MicrosummaryService.prototype = {
throw Cr.NS_ERROR_INVALID_ARG;
if (this.hasMicrosummary(aBookmarkID)) {
- currentMicrosummarry = this.getMicrosummary(aBookmarkID);
+ var currentMicrosummarry = this.getMicrosummary(aBookmarkID);
if (aMicrosummary.equals(currentMicrosummarry))
return true;
}
@@ -728,6 +719,9 @@ MicrosummaryService.prototype = {
try {
this._svc._updateMicrosummary(this._bookmarkID, microsummary);
}
+ catch (ex) {
+ Cu.reportError("refreshMicrosummary() observer: " + ex);
+ }
finally {
this._svc = null;
this._bookmarkID = null;
@@ -747,7 +741,23 @@ MicrosummaryService.prototype = {
microsummary.update();
return microsummary;
- }
+ },
+
+ // nsIAnnotationObserver
+ onItemAnnotationSet: function(aItemId, aAnnotationName) {
+ if (aAnnotationName == ANNO_MICSUM_GEN_URI &&
+ this._bookmarks.indexOf(aItemId) == -1)
+ this._bookmarks.push(aItemId);
+ },
+ onItemAnnotationRemoved: function(aItemId, aAnnotationName) {
+ var index = this._bookmarks.indexOf(aItemId);
+ var isMicsumAnno = aAnnotationName == ANNO_MICSUM_GEN_URI ||
+ !aAnnotationName.length; /* all annos were removed */
+ if (index > -1 && isMicsumAnno)
+ this._bookmarks.splice(index, 1);
+ },
+ onPageAnnotationSet: function(aUri, aAnnotationName) {},
+ onPageAnnotationRemoved: function(aUri, aAnnotationName) {},
};
@@ -989,7 +999,7 @@ Microsummary.prototype = {
/**
* Try to reinstall a missing local generator that was originally installed
- * from a URL using nsSidebar::addMicrosumaryGenerator.
+ * from a URL using nsSidebar::addMicrosummaryGenerator.
*
*/
_reinstallMissingGenerator: function MS__reinstallMissingGenerator() {
@@ -1560,7 +1570,7 @@ MicrosummarySet.prototype = {
},
/**
- * Determines whether the given microsumary is already represented in the
+ * Determines whether the given microsummary is already represented in the
* set.
*/
hasItemForMicrosummary: function MSSet_hasItemForMicrosummary(aMicrosummary) {
@@ -2097,6 +2107,7 @@ MicrosummaryResource.prototype = {
this._iframe.docShell.allowMetaRedirects = false;
this._iframe.docShell.allowSubframes = false;
this._iframe.docShell.allowImages = false;
+ this._iframe.docShell.allowDNSPrefetch = false;
var parseHandler = {
_self: this,
diff --git a/tools/xo_bundle/components/nsPlacesAutoComplete.js b/tools/xo_bundle/components/nsPlacesAutoComplete.js
new file mode 100644
index 0000000..c64bf28
--- /dev/null
+++ b/tools/xo_bundle/components/nsPlacesAutoComplete.js
@@ -0,0 +1,1068 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: sw=2 ts=2 sts=2 expandtab
+ * ***** 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.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Shawn Wilsher <me@shawnwilsher.com> (Original Author)
+ *
+ * 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 ***** */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+////////////////////////////////////////////////////////////////////////////////
+//// Constants
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+
+// This is just a helper for the next constant.
+function book_tag_sql_fragment(aName, aColumn, aForTag)
+{
+ return ["(",
+ "SELECT ", aColumn, " ",
+ "FROM moz_bookmarks b ",
+ "JOIN moz_bookmarks t ",
+ "ON t.id = b.parent ",
+ "AND t.parent ", (aForTag ? "" : "!"), "= :parent ",
+ "WHERE b.type = ", Ci.nsINavBookmarksService.TYPE_BOOKMARK, " ",
+ "AND b.fk = h.id ",
+ (aForTag ? "AND LENGTH(t.title) > 0" :
+ "ORDER BY b.lastModified DESC LIMIT 1"),
+ ") AS ", aName].join("");
+}
+
+// This SQL query fragment provides the following:
+// - the parent folder for bookmarked entries (kQueryIndexParent)
+// - the bookmark title, if it is a bookmark (kQueryIndexBookmarkTitle)
+// - the tags associated with a bookmarked entry (kQueryIndexTags)
+const kBookTagSQLFragment =
+ book_tag_sql_fragment("parent", "b.parent", false) + ", " +
+ book_tag_sql_fragment("bookmark", "b.title", false) + ", " +
+ book_tag_sql_fragment("tags", "GROUP_CONCAT(t.title, ',')", true);
+
+// observer topics
+const kQuitApplication = "quit-application";
+const kPrefChanged = "nsPref:changed";
+
+// Match type constants. These indicate what type of search function we should
+// be using.
+const MATCH_ANYWHERE = Ci.mozIPlacesAutoComplete.MATCH_ANYWHERE;
+const MATCH_BOUNDARY_ANYWHERE = Ci.mozIPlacesAutoComplete.MATCH_BOUNDARY_ANYWHERE;
+const MATCH_BOUNDARY = Ci.mozIPlacesAutoComplete.MATCH_BOUNDARY;
+const MATCH_BEGINNING = Ci.mozIPlacesAutoComplete.MATCH_BEGINNING;
+
+// AutoComplete index constants. All AutoComplete queries will provide these
+// columns in this order.
+const kQueryIndexURL = 0;
+const kQueryIndexTitle = 1;
+const kQueryIndexFaviconURL = 2;
+const kQueryIndexParentId = 3;
+const kQueryIndexBookmarkTitle = 4;
+const kQueryIndexTags = 5;
+const kQueryIndexVisitCount = 6;
+const kQueryIndexTyped = 7;
+const kQueryIndexPlaceId = 8;
+const kQueryIndexQueryType = 9;
+
+// AutoComplete query type constants. Describes the various types of queries
+// that we can process.
+const kQueryTypeKeyword = 0;
+const kQueryTypeFiltered = 1;
+
+// This separator is used as an RTL-friendly way to split the title and tags.
+// It can also be used by an nsIAutoCompleteResult consumer to re-split the
+// "comment" back into the title and the tag.
+const kTitleTagsSeparator = " \u2013 ";
+
+const kBrowserUrlbarBranch = "browser.urlbar.";
+
+////////////////////////////////////////////////////////////////////////////////
+//// Global Functions
+
+/**
+ * Generates the SQL subquery to get the best favicon for a given revhost. This
+ * is the favicon for the most recent visit.
+ *
+ * @param aTableName
+ * The table to join to the moz_favicons table with. This must have a
+ * column called favicon_id.
+ * @return the SQL subquery (in string form) to get the best favicon.
+ */
+function best_favicon_for_revhost(aTableName)
+{
+ return "(" +
+ "SELECT f.url " +
+ "FROM " + aTableName + " " +
+ "JOIN moz_favicons f ON f.id = favicon_id " +
+ "WHERE rev_host = IFNULL( " +
+ "(SELECT rev_host FROM moz_places_temp WHERE id = b.fk), " +
+ "(SELECT rev_host FROM moz_places WHERE id = b.fk) " +
+ ") " +
+ "ORDER BY frecency DESC " +
+ "LIMIT 1 " +
+ ")";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//// AutoCompleteStatementCallbackWrapper class
+
+/**
+ * Wraps a callback and ensures that handleCompletion is not dispatched if the
+ * query is no longer tracked.
+ *
+ * @param aCallback
+ * A reference to a nsPlacesAutoComplete.
+ * @param aDBConnection
+ * The database connection to execute the queries on.
+ */
+function AutoCompleteStatementCallbackWrapper(aCallback,
+ aDBConnection)
+{
+ this._callback = aCallback;
+ this._db = aDBConnection;
+}
+
+AutoCompleteStatementCallbackWrapper.prototype = {
+ //////////////////////////////////////////////////////////////////////////////
+ //// mozIStorageStatementCallback
+
+ handleResult: function ACSCW_handleResult(aResultSet)
+ {
+ this._callback.handleResult.apply(this._callback, arguments);
+ },
+
+ handleError: function ACSCW_handleError(aError)
+ {
+ this._callback.handleError.apply(this._callback, arguments);
+ },
+
+ handleCompletion: function ACSCW_handleCompletion(aReason)
+ {
+ // Only dispatch handleCompletion if we are not done searching and are a
+ // pending search.
+ let callback = this._callback;
+ if (!callback.isSearchComplete() && callback.isPendingSearch(this._handle))
+ callback.handleCompletion.apply(callback, arguments);
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// AutoCompleteStatementCallbackWrapper
+
+ /**
+ * Executes the specified query asynchronously. This object will notify
+ * this._callback if we should notify (logic explained in handleCompletion).
+ *
+ * @param aQueries
+ * The queries to execute asynchronously.
+ * @return a mozIStoragePendingStatement that can be used to cancel the
+ * queries.
+ */
+ executeAsync: function ACSCW_executeAsync(aQueries)
+ {
+ return this._handle = this._db.executeAsync(aQueries, aQueries.length,
+ this);
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsISupports
+
+ QueryInterface: XPCOMUtils.generateQI([
+ Ci.mozIStorageStatementCallback,
+ ])
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//// nsPlacesAutoComplete class
+
+function nsPlacesAutoComplete()
+{
+ //////////////////////////////////////////////////////////////////////////////
+ //// Shared Constants for Smart Getters
+
+ // Define common pieces of various queries.
+ // TODO bug 412736 in case of a frecency tie, break it with h.typed and
+ // h.visit_count which is better than nothing. This is slow, so not doing it
+ // yet...
+ // Note: h.frecency is only selected because we need it for ordering.
+ function sql_base_fragment(aTableName) {
+ return "SELECT h.url, h.title, f.url, " + kBookTagSQLFragment + ", " +
+ "h.visit_count, h.typed, h.id, :query_type, h.frecency " +
+ "FROM " + aTableName + " h " +
+ "LEFT OUTER JOIN moz_favicons f ON f.id = h.favicon_id " +
+ "WHERE h.frecency <> 0 " +
+ "AND AUTOCOMPLETE_MATCH(:searchString, h.url, " +
+ "IFNULL(bookmark, h.title), tags, " +
+ "h.visit_count, h.typed, parent, " +
+ ":matchBehavior, :searchBehavior) " +
+ "{ADDITIONAL_CONDITIONS} ";
+ }
+ const SQL_BASE = sql_base_fragment("moz_places_temp") +
+ "UNION ALL " +
+ sql_base_fragment("moz_places") +
+ "AND +h.id NOT IN (SELECT id FROM moz_places_temp) " +
+ "ORDER BY h.frecency DESC, h.id DESC " +
+ "LIMIT :maxResults";
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// Smart Getters
+
+ this.__defineGetter__("_db", function() {
+ delete this._db;
+ return this._db = Cc["@mozilla.org/browser/nav-history-service;1"].
+ getService(Ci.nsPIPlacesDatabase).
+ DBConnection;
+ });
+
+ this.__defineGetter__("_bh", function() {
+ delete this._bh;
+ return this._bh = Cc["@mozilla.org/browser/global-history;2"].
+ getService(Ci.nsIBrowserHistory);
+ });
+
+ this.__defineGetter__("_textURIService", function() {
+ delete this._textURIService;
+ return this._textURIService = Cc["@mozilla.org/intl/texttosuburi;1"].
+ getService(Ci.nsITextToSubURI);
+ });
+
+ this.__defineGetter__("_bs", function() {
+ delete this._bs;
+ return this._bs = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
+ getService(Ci.nsINavBookmarksService);
+ });
+
+ this.__defineGetter__("_ioService", function() {
+ delete this._ioService;
+ return this._ioService = Cc["@mozilla.org/network/io-service;1"].
+ getService(Ci.nsIIOService);
+ });
+
+ this.__defineGetter__("_faviconService", function() {
+ delete this._faviconService;
+ return this._faviconService = Cc["@mozilla.org/browser/favicon-service;1"].
+ getService(Ci.nsIFaviconService);
+ });
+
+ this.__defineGetter__("_defaultQuery", function() {
+ delete this._defaultQuery;
+ let replacementText = "";
+ return this._defaultQuery = this._db.createStatement(
+ SQL_BASE.replace("{ADDITIONAL_CONDITIONS}", replacementText, "g")
+ );
+ });
+
+ this.__defineGetter__("_historyQuery", function() {
+ delete this._historyQuery;
+ let replacementText = "AND h.visit_count > 0";
+ return this._historyQuery = this._db.createStatement(
+ SQL_BASE.replace("{ADDITIONAL_CONDITIONS}", replacementText, "g")
+ );
+ });
+
+ this.__defineGetter__("_bookmarkQuery", function() {
+ delete this._bookmarkQuery;
+ let replacementText = "AND bookmark IS NOT NULL";
+ return this._bookmarkQuery = this._db.createStatement(
+ SQL_BASE.replace("{ADDITIONAL_CONDITIONS}", replacementText, "g")
+ );
+ });
+
+ this.__defineGetter__("_tagsQuery", function() {
+ delete this._tagsQuery;
+ let replacementText = "AND tags IS NOT NULL";
+ return this._tagsQuery = this._db.createStatement(
+ SQL_BASE.replace("{ADDITIONAL_CONDITIONS}", replacementText, "g")
+ );
+ });
+
+ this.__defineGetter__("_typedQuery", function() {
+ delete this._typedQuery;
+ let replacementText = "AND h.typed = 1";
+ return this._typedQuery = this._db.createStatement(
+ SQL_BASE.replace("{ADDITIONAL_CONDITIONS}", replacementText, "g")
+ );
+ });
+
+ this.__defineGetter__("_adaptiveQuery", function() {
+ delete this._adaptiveQuery;
+ // In this query, we are taking kBookTagSQLFragment only for h.id because it
+ // uses data from the moz_bookmarks table and we sync tables on bookmark
+ // insert. So, most likely, h.id will always be populated when we have any
+ // bookmark. We still need to join on moz_places_temp for other data (eg.
+ // title).
+ return this._adaptiveQuery = this._db.createStatement(
+ "/* do not warn (bug 487789) */ " +
+ "SELECT IFNULL(h_t.url, h.url) AS c_url, " +
+ "IFNULL(h_t.title, h.title) AS c_title, f.url, " +
+ kBookTagSQLFragment + ", " +
+ "IFNULL(h_t.visit_count, h.visit_count) AS c_visit_count, " +
+ "IFNULL(h_t.typed, h.typed) AS c_typed, " +
+ "IFNULL(h_t.id, h.id), :query_type, rank " +
+ "FROM ( " +
+ "SELECT ROUND(MAX(((i.input = :search_string) + " +
+ "(SUBSTR(i.input, 1, LENGTH(:search_string)) = :search_string)) * " +
+ "i.use_count), 1) AS rank, place_id " +
+ "FROM moz_inputhistory i " +
+ "GROUP BY i.place_id " +
+ "HAVING rank > 0 " +
+ ") AS i " +
+ "LEFT JOIN moz_places h ON h.id = i.place_id " +
+ "LEFT JOIN moz_places_temp h_t ON h_t.id = i.place_id " +
+ "LEFT JOIN moz_favicons f ON f.id = IFNULL(h_t.favicon_id, h.favicon_id) " +
+ "WHERE c_url NOTNULL " +
+ "AND AUTOCOMPLETE_MATCH(:searchString, c_url, " +
+ "IFNULL(bookmark, c_title), tags, " +
+ "c_visit_count, c_typed, parent, " +
+ ":matchBehavior, :searchBehavior) " +
+ "ORDER BY rank DESC, IFNULL(h_t.frecency, h.frecency) DESC"
+ );
+ });
+
+ this.__defineGetter__("_keywordQuery", function() {
+ delete this._keywordQuery;
+ return this._keywordQuery = this._db.createStatement(
+ "/* do not warn (bug 487787) */ " +
+ "SELECT IFNULL( " +
+ "(SELECT REPLACE(url, '%s', :query_string) FROM moz_places_temp WHERE id = b.fk), " +
+ "(SELECT REPLACE(url, '%s', :query_string) FROM moz_places WHERE id = b.fk) " +
+ ") AS search_url, IFNULL(h_t.title, h.title), " +
+ "COALESCE(f.url, " + best_favicon_for_revhost("moz_places_temp") + "," +
+ best_favicon_for_revhost("moz_places") + "), b.parent, " +
+ "b.title, NULL, IFNULL(h_t.visit_count, h.visit_count), " +
+ "IFNULL(h_t.typed, h.typed), COALESCE(h_t.id, h.id, b.fk), " +
+ ":query_type " +
+ "FROM moz_keywords k " +
+ "JOIN moz_bookmarks b ON b.keyword_id = k.id " +
+ "LEFT JOIN moz_places AS h ON h.url = search_url " +
+ "LEFT JOIN moz_places_temp AS h_t ON h_t.url = search_url " +
+ "LEFT JOIN moz_favicons f ON f.id = IFNULL(h_t.favicon_id, h.favicon_id) " +
+ "WHERE LOWER(k.keyword) = LOWER(:keyword) " +
+ "ORDER BY IFNULL(h_t.frecency, h.frecency) DESC"
+ );
+ });
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// Initialization
+
+ // load preferences
+ this._prefs = Cc["@mozilla.org/preferences-service;1"].
+ getService(Ci.nsIPrefService).
+ getBranch(kBrowserUrlbarBranch);
+ this._loadPrefs(true);
+
+ // register observers
+ this._os = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ this._os.addObserver(this, kQuitApplication, false);
+
+}
+
+nsPlacesAutoComplete.prototype = {
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsIAutoCompleteSearch
+
+ startSearch: function PAC_startSearch(aSearchString, aSearchParam,
+ aPreviousResult, aListener)
+ {
+ // Note: We don't use aPreviousResult to make sure ordering of results are
+ // consistent. See bug 412730 for more details.
+
+ // We want to store the original string with no leading or trailing
+ // whitespace for case sensitive searches.
+ this._originalSearchString = aSearchString.trim();
+
+ this._currentSearchString =
+ this._fixupSearchText(this._originalSearchString.toLowerCase());
+
+ this._listener = aListener;
+ let result = Cc["@mozilla.org/autocomplete/simple-result;1"].
+ createInstance(Ci.nsIAutoCompleteSimpleResult);
+ result.setSearchString(aSearchString);
+ result.setListener(this);
+ this._result = result;
+
+ // If we are not enabled, we need to return now.
+ if (!this._enabled) {
+ this._finishSearch(true);
+ return;
+ }
+
+ // Reset our search behavior to the default.
+ if (this._currentSearchString)
+ this._behavior = this._defaultBehavior;
+ else
+ this._behavior = this._emptySearchDefaultBehavior;
+
+ // For any given search, we run up to three queries:
+ // 1) keywords (this._keywordQuery)
+ // 2) adaptive learning (this._adaptiveQuery)
+ // 3) query from this._getSearch
+ // We always run (2) and (3), but (1) only gets ran if we get any filtered
+ // tokens from this._getSearch (if there are no tokens, there is nothing to
+ // match, so there is no reason to run the query).
+ let {query, tokens} =
+ this._getSearch(this._getUnfilteredSearchTokens(this._currentSearchString));
+ let queries = tokens.length ?
+ [this._getBoundKeywordQuery(tokens), this._getBoundAdaptiveQuery(), query] :
+ [this._getBoundAdaptiveQuery(), query];
+
+ // Start executing our queries.
+ this._executeQueries(queries);
+
+ // Set up our persistent state for the duration of the search.
+ this._searchTokens = tokens;
+ this._usedPlaceIds = {};
+ },
+
+ stopSearch: function PAC_stopSearch()
+ {
+ // We need to cancel our searches so we do not get any [more] results.
+ // However, it's possible we haven't actually started any searches, so this
+ // method may throw because this._pendingQuery may be undefined.
+ if (this._pendingQuery)
+ this._stopActiveQuery();
+
+ this._finishSearch(false);
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsIAutoCompleteSimpleResultListener
+
+ onValueRemoved: function PAC_onValueRemoved(aResult, aURISpec, aRemoveFromDB)
+ {
+ if (aRemoveFromDB)
+ this._bh.removePage(this._ioService.newURI(aURISpec, null, null));
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// mozIStorageStatementCallback
+
+ handleResult: function PAC_handleResult(aResultSet)
+ {
+ let row, haveMatches = false;
+ while (row = aResultSet.getNextRow()) {
+ let match = this._processRow(row);
+ haveMatches = haveMatches || match;
+
+ if (this._result.matchCount == this._maxRichResults) {
+ // We have enough results, so stop running our search.
+ this._stopActiveQuery();
+
+ // And finish our search.
+ this._finishSearch(true);
+ return;
+ }
+
+ }
+
+ // Notify about results if we've gotten them.
+ if (haveMatches)
+ this._notifyResults(true);
+ },
+
+ handleError: function PAC_handleError(aError)
+ {
+ Components.utils.reportError("Places AutoComplete: " + aError);
+ },
+
+ handleCompletion: function PAC_handleCompletion(aReason)
+ {
+ // If we have already finished our search, we should bail out early.
+ if (this.isSearchComplete())
+ return;
+
+ // If we do not have enough results, and our match type is
+ // MATCH_BOUNDARY_ANYWHERE, search again with MATCH_ANYWHERE to get more
+ // results.
+ if (this._matchBehavior == MATCH_BOUNDARY_ANYWHERE &&
+ this._result.matchCount < this._maxRichResults && !this._secondPass) {
+ this._secondPass = true;
+ let queries = [
+ this._getBoundAdaptiveQuery(MATCH_ANYWHERE),
+ this._getBoundSearchQuery(MATCH_ANYWHERE, this._searchTokens),
+ ];
+ this._executeQueries(queries);
+ return;
+ }
+
+ this._finishSearch(true);
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsIObserver
+
+ observe: function PAC_observe(aSubject, aTopic, aData)
+ {
+ if (aTopic == kQuitApplication) {
+ this._os.removeObserver(this, kQuitApplication);
+
+ // Remove our preference observer.
+ this._prefs.removeObserver("", this);
+ delete this._prefs;
+
+ // Finalize the statements that we have used.
+ let stmts = [
+ "_defaultQuery",
+ "_historyQuery",
+ "_bookmarkQuery",
+ "_tagsQuery",
+ "_typedQuery",
+ "_adaptiveQuery",
+ "_keywordQuery",
+ ];
+ for (let i = 0; i < stmts.length; i++) {
+ // We do not want to create any query we haven't already created, so
+ // see if it is a getter first. __lookupGetter__ returns null if it is
+ // actually a statement.
+ if (!this.__lookupGetter__(stmts[i]))
+ this[stmts[i]].finalize();
+ }
+ }
+ else if (aTopic == kPrefChanged) {
+ this._loadPrefs();
+ }
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsPlacesAutoComplete
+
+ /**
+ * Used to unescape encoded URI strings, and drop information that we do not
+ * care about for searching.
+ *
+ * @param aURIString
+ * The text to unescape and modify.
+ * @return the modified uri.
+ */
+ _fixupSearchText: function PAC_fixupSearchText(aURIString)
+ {
+ let uri = aURIString;
+
+ if (uri.indexOf("http://") == 0)
+ uri = uri.slice(7);
+ else if (uri.indexOf("https://") == 0)
+ uri = uri.slice(8);
+ else if (uri.indexOf("ftp://") == 0)
+ uri = uri.slice(6);
+
+ return this._textURIService.unEscapeURIForUI("UTF-8", uri);
+ },
+
+ /**
+ * Generates the tokens used in searching from a given string.
+ *
+ * @param aSearchString
+ * The string to generate tokens from.
+ * @return an array of tokens.
+ */
+ _getUnfilteredSearchTokens: function PAC_unfilteredSearchTokens(aSearchString)
+ {
+ // Calling split on an empty string will return an array containing one
+ // empty string. We don't want that, as it'll break our logic, so return an
+ // empty array then.
+ return aSearchString.length ? aSearchString.split(" ") : [];
+ },
+
+ /**
+ * Properly cleans up when searching is completed.
+ *
+ * @param aNotify
+ * Indicates if we should notify the AutoComplete listener about our
+ * results or not.
+ */
+ _finishSearch: function PAC_finishSearch(aNotify)
+ {
+ // Notify about results if we are supposed to.
+ if (aNotify)
+ this._notifyResults(false);
+
+ // Clear our state
+ delete this._originalSearchString;
+ delete this._currentSearchString;
+ delete this._searchTokens;
+ delete this._listener;
+ delete this._result;
+ delete this._usedPlaceIds;
+ delete this._pendingQuery;
+ this._secondPass = false;
+ },
+
+ /**
+ * Executes the given queries asynchronously.
+ *
+ * @param aQueries
+ * The queries to execute.
+ */
+ _executeQueries: function PAC_executeQueries(aQueries)
+ {
+ // Because we might get a handleCompletion for canceled queries, we want to
+ // filter out queries we no longer care about (described in the
+ // handleCompletion implementation of AutoCompleteStatementCallbackWrapper).
+
+ // Create our wrapper object and execute the queries.
+ let wrapper = new AutoCompleteStatementCallbackWrapper(this, this._db);
+ this._pendingQuery = wrapper.executeAsync(aQueries);
+ },
+
+ /**
+ * Stops executing our active query.
+ */
+ _stopActiveQuery: function PAC_stopActiveQuery()
+ {
+ this._pendingQuery.cancel();
+ delete this._pendingQuery;
+ },
+
+ /**
+ * Notifies the listener about results.
+ *
+ * @param aSearchOngoing
+ * Indicates if the search is ongoing or not.
+ */
+ _notifyResults: function PAC_notifyResults(aSearchOngoing)
+ {
+ let result = this._result;
+ let resultCode = result.matchCount ? "RESULT_SUCCESS" : "RESULT_NOMATCH";
+ if (aSearchOngoing)
+ resultCode += "_ONGOING";
+ result.setSearchResult(Ci.nsIAutoCompleteResult[resultCode]);
+ result.setDefaultIndex(result.matchCount ? 0 : -1);
+ this._listener.onSearchResult(this, result);
+ },
+
+ /**
+ * Loads the preferences that we care about.
+ *
+ * @param [optional] aRegisterObserver
+ * Indicates if the preference observer should be added or not. The
+ * default value is false.
+ */
+ _loadPrefs: function PAC_loadPrefs(aRegisterObserver)
+ {
+ let self = this;
+ function safeGetter(aName, aDefault) {
+ let types = {
+ boolean: "Bool",
+ number: "Int",
+ string: "Char"
+ };
+ let type = types[typeof(aDefault)];
+ if (!type)
+ throw "Unknown type!";
+
+ // If the pref isn't set, we want to use the default.
+ try {
+ return self._prefs["get" + type + "Pref"](aName);
+ }
+ catch (e) {
+ return aDefault;
+ }
+ }
+
+ this._enabled = safeGetter("autocomplete.enabled", true);
+ this._matchBehavior = safeGetter("matchBehavior", MATCH_BOUNDARY_ANYWHERE);
+ this._filterJavaScript = safeGetter("filter.javascript", true);
+ this._maxRichResults = safeGetter("maxRichResults", 25);
+ this._restrictHistoryToken = safeGetter("restrict.history", "^");
+ this._restrictBookmarkToken = safeGetter("restrict.bookmark", "*");
+ this._restrictTypedToken = safeGetter("restrict.typed", "~");
+ this._restrictTagToken = safeGetter("restrict.tag", "+");
+ this._matchTitleToken = safeGetter("match.title", "#");
+ this._matchURLToken = safeGetter("match.url", "@");
+ this._defaultBehavior = safeGetter("default.behavior", 0);
+ // Further restrictions to apply for "empty searches" (i.e. searches for "").
+ // By default we use (HISTORY | TYPED) = 33.
+ this._emptySearchDefaultBehavior = this._defaultBehavior |
+ safeGetter("default.behavior.emptyRestriction", 33);
+
+ // Validate matchBehavior; default to MATCH_BOUNDARY_ANYWHERE.
+ if (this._matchBehavior != MATCH_ANYWHERE &&
+ this._matchBehavior != MATCH_BOUNDARY &&
+ this._matchBehavior != MATCH_BEGINNING)
+ this._matchBehavior = MATCH_BOUNDARY_ANYWHERE;
+
+ // register observer
+ if (aRegisterObserver) {
+ let pb = this._prefs.QueryInterface(Ci.nsIPrefBranch2);
+ pb.addObserver("", this, false);
+ }
+ },
+
+ /**
+ * Given an array of tokens, this function determines which query should be
+ * ran. It also removes any special search tokens.
+ *
+ * @param aTokens
+ * An array of search tokens.
+ * @return an object with two properties:
+ * query: the correctly optimized, bound query to search the database
+ * with.
+ * tokens: the filtered list of tokens to search with.
+ */
+ _getSearch: function PAC_getSearch(aTokens)
+ {
+ // Set the proper behavior so our call to _getBoundSearchQuery gives us the
+ // correct query.
+ for (let i = aTokens.length - 1; i >= 0; i--) {
+ switch (aTokens[i]) {
+ case this._restrictHistoryToken:
+ this._setBehavior("history");
+ break;
+ case this._restrictBookmarkToken:
+ this._setBehavior("bookmark");
+ break;
+ case this._restrictTagToken:
+ this._setBehavior("tag");
+ break;
+ case this._matchTitleToken:
+ this._setBehavior("title");
+ break;
+ case this._matchURLToken:
+ this._setBehavior("url");
+ break;
+ case this._restrictTypedToken:
+ this._setBehavior("typed");
+ break;
+ default:
+ // We do not want to remove the token if we did not match.
+ continue;
+ };
+
+ aTokens.splice(i, 1);
+ }
+
+ // Set the right JavaScript behavior based on our preference. Note that the
+ // preference is whether or not we should filter JavaScript, and the
+ // behavior is if we should search it or not.
+ if (!this._filterJavaScript)
+ this._setBehavior("javascript");
+
+ return {
+ query: this._getBoundSearchQuery(this._matchBehavior, aTokens),
+ tokens: aTokens
+ };
+ },
+
+ /**
+ * Obtains the search query to be used based on the previously set search
+ * behaviors (accessed by this._hasBehavior). The query is bound and ready to
+ * execute.
+ *
+ * @param aMatchBehavior
+ * How this query should match its tokens to the search string.
+ * @param aTokens
+ * An array of search tokens.
+ * @return the correctly optimized query to search the database with and the
+ * new list of tokens to search with. The query has all the needed
+ * parameters bound, so consumers can execute it without doing any
+ * additional work.
+ */
+ _getBoundSearchQuery: function PAC_getBoundSearchQuery(aMatchBehavior,
+ aTokens)
+ {
+ // We use more optimized queries for restricted searches, so we will always
+ // return the most restrictive one to the least restrictive one if more than
+ // one token is found.
+ let query = this._hasBehavior("tag") ? this._tagsQuery :
+ this._hasBehavior("bookmark") ? this._bookmarkQuery :
+ this._hasBehavior("typed") ? this._typedQuery :
+ this._hasBehavior("history") ? this._historyQuery :
+ this._defaultQuery;
+
+ // Bind the needed parameters to the query so consumers can use it.
+ let (params = query.params) {
+ params.parent = this._bs.tagsFolder;
+ params.query_type = kQueryTypeFiltered;
+ params.matchBehavior = aMatchBehavior;
+ params.searchBehavior = this._behavior;
+
+ // We only want to search the tokens that we are left with - not the
+ // original search string.
+ params.searchString = aTokens.join(" ");
+
+ // Limit the query to the the maximum number of desired results.
+ // This way we can avoid doing more work than needed.
+ params.maxResults = this._maxRichResults;
+ }
+
+ return query;
+ },
+
+ /**
+ * Obtains the keyword query with the properly bound parameters.
+ *
+ * @param aTokens
+ * The array of search tokens to check against.
+ * @return the bound keyword query.
+ */
+ _getBoundKeywordQuery: function PAC_getBoundKeywordQuery(aTokens)
+ {
+ // The keyword is the first word in the search string, with the parameters
+ // following it.
+ let searchString = this._originalSearchString;
+ let queryString = searchString.substring(searchString.indexOf(" ") + 1);
+
+ // We need to escape the parameters as if they were the query in a URL
+ queryString = encodeURIComponent(queryString).replace("%20", "+", "g");
+
+ // The first word could be a keyword, so that's what we'll search.
+ let keyword = aTokens[0];
+
+ let query = this._keywordQuery;
+ let (params = query.params) {
+ params.keyword = keyword;
+ params.query_string = queryString;
+ params.query_type = kQueryTypeKeyword;
+ }
+
+ return query;
+ },
+
+ /**
+ * Obtains the adaptive query with the properly bound parameters.
+ *
+ * @return the bound adaptive query.
+ */
+ _getBoundAdaptiveQuery: function PAC_getBoundAdaptiveQuery(aMatchBehavior)
+ {
+ // If we were not given a match behavior, use the stored match behavior.
+ if (arguments.length == 0)
+ aMatchBehavior = this._matchBehavior;
+
+ let query = this._adaptiveQuery;
+ let (params = query.params) {
+ params.parent = this._bs.tagsFolder;
+ params.search_string = this._currentSearchString;
+ params.query_type = kQueryTypeFiltered;
+ params.matchBehavior = aMatchBehavior;
+ params.searchBehavior = this._behavior;
+ }
+
+ return query;
+ },
+
+ /**
+ * Processes a mozIStorageRow to generate the proper data for the AutoComplete
+ * result. This will add an entry to the current result if it matches the
+ * criteria.
+ *
+ * @param aRow
+ * The row to process.
+ * @return true if the row is accepted, and false if not.
+ */
+ _processRow: function PAC_processRow(aRow)
+ {
+ // Before we do any work, make sure this entry isn't already in our results.
+ let entryId = aRow.getResultByIndex(kQueryIndexPlaceId);
+ if (this._inResults(entryId))
+ return false;
+
+ let escapedEntryURL = aRow.getResultByIndex(kQueryIndexURL);
+ let entryTitle = aRow.getResultByIndex(kQueryIndexTitle) || "";
+ let entryFavicon = aRow.getResultByIndex(kQueryIndexFaviconURL) || "";
+ let entryParentId = aRow.getResultByIndex(kQueryIndexParentId);
+ let entryBookmarkTitle = entryParentId ?
+ aRow.getResultByIndex(kQueryIndexBookmarkTitle) : null;
+ let entryTags = aRow.getResultByIndex(kQueryIndexTags) || "";
+
+ // Always prefer the bookmark title unless it is empty
+ let title = entryBookmarkTitle || entryTitle;
+
+ let style;
+ if (aRow.getResultByIndex(kQueryIndexQueryType) == kQueryTypeKeyword) {
+ // If we do not have a title, then we must have a keyword, so let the UI
+ // know it is a keyword. Otherwise, we found an exact page match, so just
+ // show the page like a regular result. Because the page title is likely
+ // going to be more specific than the bookmark title (keyword title).
+ if (!entryTitle)
+ style = "keyword";
+ else
+ title = entryTitle;
+ }
+
+ // We will always prefer to show tags if we have them.
+ let showTags = !!entryTags;
+
+ // However, we'll act as if a page is not bookmarked or tagged if the user
+ // only wants only history and not bookmarks or tags.
+ if (this._hasBehavior("history") &&
+ !(this._hasBehavior("bookmark") || this._hasBehavior("tag"))) {
+ showTags = false;
+ style = "favicon";
+ }
+
+ // If we have tags and should show them, we need to add them to the title.
+ if (showTags)
+ title += kTitleTagsSeparator + entryTags;
+
+ // We have to determine the right style to display. Tags show the tag icon,
+ // bookmarks get the bookmark icon, and keywords get the keyword icon. If
+ // the result does not fall into any of those, it just gets the favicon.
+ if (!style) {
+ // It is possible that we already have a style set (from a keyword
+ // search or because of the user's preferences), so only set it if we
+ // haven't already done so.
+ if (showTags)
+ style = "tag";
+ else if (entryParentId)
+ style = "bookmark";
+ else
+ style = "favicon";
+ }
+
+ // And finally add this to our results.
+ this._addToResults(entryId, escapedEntryURL, title, entryFavicon, style);
+ return true;
+ },
+
+ /**
+ * Checks to see if the given place has already been added to the results.
+ *
+ * @param aPlaceId
+ * The place_id to check for.
+ * @return true if the place has been added, false otherwise.
+ */
+ _inResults: function PAC_inResults(aPlaceId)
+ {
+ return (aPlaceId in this._usedPlaceIds);
+ },
+
+ /**
+ * Adds a result to the AutoComplete results. Also tracks that we've added
+ * this place_id into the result set.
+ *
+ * @param aPlaceId
+ * The place_id of the item to be added to the result set. This is
+ * used by _inResults.
+ * @param aURISpec
+ * The URI spec for the entry.
+ * @param aTitle
+ * The title to give the entry.
+ * @param aFaviconSpec
+ * The favicon to give to the entry.
+ * @param aStyle
+ * Indicates how the entry should be styled when displayed.
+ */
+ _addToResults: function PAC_addToResults(aPlaceId, aURISpec, aTitle,
+ aFaviconSpec, aStyle)
+ {
+ // Add this to our internal tracker to ensure duplicates do not end up in
+ // the result. _usedPlaceIds is an Object that is being used as a set.
+ this._usedPlaceIds[aPlaceId] = true;
+
+ // Obtain the favicon for this URI.
+ let favicon;
+ if (aFaviconSpec) {
+ let uri = this._ioService.newURI(aFaviconSpec, null, null);
+ favicon = this._faviconService.getFaviconLinkForIcon(uri).spec;
+ }
+ favicon = favicon || this._faviconService.defaultFavicon.spec;
+
+ this._result.appendMatch(aURISpec, aTitle, favicon, aStyle);
+ },
+
+ /**
+ * Determines if the specified AutoComplete behavior is set.
+ *
+ * @param aType
+ * The behavior type to test for.
+ * @return true if the behavior is set, false otherwise.
+ */
+ _hasBehavior: function PAC_hasBehavior(aType)
+ {
+ return (this._behavior &
+ Ci.mozIPlacesAutoComplete["BEHAVIOR_" + aType.toUpperCase()]);
+ },
+
+ /**
+ * Enables the desired AutoComplete behavior.
+ *
+ * @param aType
+ * The behavior type to set.
+ */
+ _setBehavior: function PAC_setBehavior(aType)
+ {
+ this._behavior |=
+ Ci.mozIPlacesAutoComplete["BEHAVIOR_" + aType.toUpperCase()];
+ },
+
+ /**
+ * Determines if we are done searching or not.
+ *
+ * @return true if we have completed searching, false otherwise.
+ */
+ isSearchComplete: function PAC_isSearchComplete()
+ {
+ // If _pendingQuery is null, we should no longer do any work since we have
+ // already called _finishSearch. This means we completed our search.
+ return this._pendingQuery == null;
+ },
+
+ /**
+ * Determines if the given handle of a pending statement is a pending search
+ * or not.
+ *
+ * @param aHandle
+ * A mozIStoragePendingStatement to check and see if we are waiting for
+ * results from it still.
+ * @return true if it is a pending query, false otherwise.
+ */
+ isPendingSearch: function PAC_isPendingSearch(aHandle)
+ {
+ return this._pendingQuery == aHandle;
+ },
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// nsISupports
+
+ classDescription: "AutoComplete result generator for Places.",
+ classID: Components.ID("d0272978-beab-4adc-a3d4-04b76acfa4e7"),
+ contractID: "@mozilla.org/autocomplete/search;1?name=history",
+
+ QueryInterface: XPCOMUtils.generateQI([
+ Ci.nsIAutoCompleteSearch,
+ Ci.nsIAutoCompleteSimpleResultListener,
+ Ci.mozIStorageStatementCallback,
+ Ci.nsIObserver,
+ ])
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//// Module Registration
+
+let components = [nsPlacesAutoComplete];
+function NSGetModule(compMgr, fileSpec)
+{
+ return XPCOMUtils.generateModule(components);
+}
diff --git a/tools/xo_bundle/components/nsPlacesDBFlush.js b/tools/xo_bundle/components/nsPlacesDBFlush.js
index 4e84d5f..c6530e7 100755
--- a/tools/xo_bundle/components/nsPlacesDBFlush.js
+++ b/tools/xo_bundle/components/nsPlacesDBFlush.js
@@ -51,8 +51,24 @@ const Cu = Components.utils;
const kQuitApplication = "quit-application";
const kSyncFinished = "places-sync-finished";
-const kSyncPrefName = "syncDBTableIntervalInSecs";
+const kSyncPrefName = "places.syncDBTableIntervalInSecs";
const kDefaultSyncInterval = 120;
+const kExpireDaysPrefName = "browser.history_expire_days";
+const kDefaultExpireDays = 90;
+
+// The number of milliseconds in a day.
+const kMSPerDay = 86400000;
+
+// The max number of entries we will flush out when we expire.
+const kMaxExpire = 24;
+
+// Query Constants. These describe the queries we use.
+const kQuerySyncPlacesId = 0;
+const kQuerySyncHistoryVisitsId = 1;
+const kQuerySelectExpireVisitsId = 2;
+const kQueryExpireVisitsId = 3;
+const kQuerySelectExpireHistoryOrphansId = 4;
+const kQueryExpireHistoryOrphansId = 5;
////////////////////////////////////////////////////////////////////////////////
//// nsPlacesDBFlush class
@@ -60,29 +76,43 @@ const kDefaultSyncInterval = 120;
function nsPlacesDBFlush()
{
this._prefs = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefService).
- getBranch("places.");
+ getService(Ci.nsIPrefBranch);
// Get our sync interval
try {
- // We want to silently fail if the preference does not exist, and use a
- // default to fallback to.
+ // We want to silently fail since getIntPref throws if it does not exist,
+ // and use a default to fallback to.
this._syncInterval = this._prefs.getIntPref(kSyncPrefName);
if (this._syncInterval <= 0)
this._syncInterval = kDefaultSyncInterval;
}
catch (e) {
- // The preference did not exist, so default to two minutes.
+ // The preference did not exist, so use the default.
this._syncInterval = kDefaultSyncInterval;
}
+ // Get our maximum allowable age of visits in days.
+ try {
+ // We want to silently fail since getIntPref throws if it does not exist,
+ // and use a default to fallback to.
+ this._expireDays = this._prefs.getIntPref(kExpireDaysPrefName);
+ if (this._expireDays <= 0)
+ this._expireDays = kDefaultExpireDays;
+ }
+ catch (e) {
+ // The preference did not exist, so use the default.
+ this._expireDays = kDefaultExpireDays;
+ }
+
// Register observers
this._os = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
this._os.addObserver(this, kQuitApplication, false);
- this._prefs.QueryInterface(Ci.nsIPrefBranch2)
- .addObserver("", this, false);
+ let (pb2 = this._prefs.QueryInterface(Ci.nsIPrefBranch2)) {
+ pb2.addObserver(kSyncPrefName, this, false);
+ pb2.addObserver(kExpireDaysPrefName, this, false);
+ }
// Create our timer to update everything
this._timer = this._newTimer();
@@ -97,6 +127,18 @@ function nsPlacesDBFlush()
DBConnection;
});
+ this.__defineGetter__("_ios", function() {
+ delete this._ios;
+ return this._ios = Cc["@mozilla.org/network/io-service;1"].
+ getService(Ci.nsIIOService);
+ });
+
+ this.__defineGetter__("_hsn", function() {
+ delete this._hsn;
+ return this._hsn = Cc["@mozilla.org/browser/nav-history-service;1"].
+ getService(Ci.nsPIPlacesHistoryListenersNotifier);
+ });
+
this.__defineGetter__("_bs", function() {
delete this._bs;
return this._bs = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
@@ -112,7 +154,10 @@ nsPlacesDBFlush.prototype = {
{
if (aTopic == kQuitApplication) {
this._os.removeObserver(this, kQuitApplication);
- this._prefs.QueryInterface(Ci.nsIPrefBranch2).removeObserver("", this);
+ let (pb2 = this._prefs.QueryInterface(Ci.nsIPrefBranch2)) {
+ pb2.removeObserver(kSyncPrefName, this);
+ pb2.removeObserver(kExpireDaysPrefName, this);
+ }
this._timer.cancel();
this._timer = null;
// Other components could still make changes to history at this point,
@@ -127,7 +172,7 @@ nsPlacesDBFlush.prototype = {
let pip = Cc["@mozilla.org/browser/nav-history-service;1"].
getService(Ci.nsPIPlacesDatabase);
pip.commitPendingChanges();
- this._self._syncTables(["places", "historyvisits"]);
+ this._self._flushWithQueries([kQuerySyncPlacesId, kQuerySyncHistoryVisitsId]);
// Close the database connection, this was the last sync and we can't
// ensure database coherence from now on.
pip.finalizeInternalStatements();
@@ -139,7 +184,7 @@ nsPlacesDBFlush.prototype = {
}
else if (aTopic == "nsPref:changed" && aData == kSyncPrefName) {
// Get the new pref value, and then update our timer
- this._syncInterval = aSubject.getIntPref(kSyncPrefName);
+ this._syncInterval = this._prefs.getIntPref(kSyncPrefName);
if (this._syncInterval <= 0)
this._syncInterval = kDefaultSyncInterval;
@@ -151,6 +196,12 @@ nsPlacesDBFlush.prototype = {
this._timer.cancel();
this._timer = this._newTimer();
}
+ else if (aTopic == "nsPref:changed" && aData == kExpireDaysPrefName) {
+ // Get the new pref and store it.
+ this._expireDays = this._prefs.getIntPref(kExpireDaysPrefName);
+ if (this._expireDays <= 0)
+ this._expireDays = kDefaultExpireDays;
+ }
},
//////////////////////////////////////////////////////////////////////////////
@@ -173,25 +224,27 @@ nsPlacesDBFlush.prototype = {
this._timer = this._newTimer();
// We need to sync now
- this._syncTables(["places", "historyvisits"]);
+ this._flushWithQueries([kQuerySyncPlacesId, kQuerySyncHistoryVisitsId]);
},
- onItemAdded: function(aItemId, aParentId, aIndex)
+ onItemAdded: function(aItemId, aParentId, aIndex, aItemType)
{
- // Sync only if we added a TYPE_BOOKMARK item
- if (!this._inBatchMode &&
- this._bs.getItemType(aItemId) == this._bs.TYPE_BOOKMARK)
- this._syncTables(["places"]);
+ // Sync only if we added a TYPE_BOOKMARK item. Note, we want to run the
+ // least amount of queries as possible here for performance reasons.
+ if (!this._inBatchMode && aItemType == this._bs.TYPE_BOOKMARK)
+ this._flushWithQueries([kQuerySyncPlacesId]);
},
onItemChanged: function DBFlush_onItemChanged(aItemId, aProperty,
- aIsAnnotationProperty,
- aValue)
+ aIsAnnotationProperty,
+ aNewValue, aLastModified,
+ aItemType)
{
if (!this._inBatchMode && aProperty == "uri")
- this._syncTables(["places"]);
+ this._flushWithQueries([kQuerySyncPlacesId]);
},
+ onBeforeItemRemoved: function() { },
onItemRemoved: function() { },
onItemVisited: function() { },
onItemMoved: function() { },
@@ -209,6 +262,7 @@ nsPlacesDBFlush.prototype = {
//onEndUpdateBatch: function() { },
onVisit: function(aURI, aVisitID, aTime, aSessionID, aReferringID, aTransitionType) { },
onTitleChanged: function(aURI, aPageTitle) { },
+ onBeforeDeleteURI: function(aURI) { },
onDeleteURI: function(aURI) { },
onClearHistory: function() { },
onPageChanged: function(aURI, aWhat, aValue) { },
@@ -217,11 +271,41 @@ nsPlacesDBFlush.prototype = {
//////////////////////////////////////////////////////////////////////////////
//// nsITimerCallback
- notify: function() this._syncTables(["places", "historyvisits"]),
+ notify: function DBFlush_timerCallback()
+ {
+ let queries = [
+ kQuerySelectExpireVisitsId,
+ kQueryExpireVisitsId,
+ kQuerySelectExpireHistoryOrphansId,
+ kQueryExpireHistoryOrphansId,
+ kQuerySyncPlacesId,
+ kQuerySyncHistoryVisitsId,
+ ];
+ this._flushWithQueries(queries);
+ },
//////////////////////////////////////////////////////////////////////////////
//// mozIStorageStatementCallback
+ handleResult: function DBFlush_handleResult(aResultSet)
+ {
+ // The only results we'll ever get back is for notifying about expiration.
+ if (!this._expiredResults)
+ this._expiredResults = [];
+
+ let row;
+ while (row = aResultSet.getNextRow()) {
+ if (row.getResultByName("hidden"))
+ continue;
+
+ this._expiredResults.push({
+ uri: this._ios.newURI(row.getResultByName("url"), null, null),
+ visitDate: row.getResultByName("visit_date"),
+ wholeEntry: (row.getResultByName("whole_entry") == 1)
+ });
+ }
+ },
+
handleError: function DBFlush_handleError(aError)
{
Cu.reportError("Async statement execution returned with '" +
@@ -231,6 +315,18 @@ nsPlacesDBFlush.prototype = {
handleCompletion: function DBFlush_handleCompletion(aReason)
{
if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) {
+ // Dispatch to history that we've finished expiring if we have results.
+ if (this._expiredResults) {
+ while (this._expiredResults.length) {
+ let visit = this._expiredResults.shift();
+ this._hsn.notifyOnPageExpired(visit.uri, visit.visitDate,
+ visit.wholeEntry);
+ }
+
+ // And reset it...
+ delete this._expiredResults;
+ }
+
// Dispatch a notification that sync has finished.
this._os.notifyObservers(null, kSyncFinished, null);
}
@@ -241,19 +337,20 @@ nsPlacesDBFlush.prototype = {
_syncInterval: kDefaultSyncInterval,
/**
- * Execute async statements to sync temporary places table.
- * @param aTableNames
- * array of table names that should be synced, as moz_{TableName}_temp.
+ * Execute async statements to flush tables with the specified queries.
+ *
+ * @param aQueryNames
+ * The names of the queries to use with this flush.
*/
- _syncTables: function DBFlush_syncTables(aTableNames)
+ _flushWithQueries: function DBFlush_flushWithQueries(aQueryNames)
{
// No need to do extra work if we are in batch mode
if (this._inBatchMode)
return;
let statements = [];
- for (let i = 0; i < aTableNames.length; i++)
- statements.push(this._getSyncTableStatement(aTableNames[i]));
+ for (let i = 0; i < aQueryNames.length; i++)
+ statements.push(this._getQuery(aQueryNames[i]));
// Execute sync statements async in a transaction
this._db.executeAsync(statements, statements.length, this);
@@ -276,42 +373,134 @@ nsPlacesDBFlush.prototype = {
* into the permanent one.
* Most of the work is done through triggers defined in nsPlacesTriggers.h,
* they sync back to disk, then delete the data in the temporary table.
- * @param aTableName
- * name of the table to build statement for, as moz_{TableName}_temp.
+ *
+ * @param aQueryType
+ * Type of the query to build statement for.
*/
- _cachedStatements: {},
- _getSyncTableStatement: function DBFlush_getSyncTableStatement(aTableName)
+ _cachedStatements: [],
+ _getQuery: function DBFlush_getQuery(aQueryType)
{
// Statement creating can be expensive, so always cache if we can.
- if (aTableName in this._cachedStatements)
- return this._cachedStatements[aTableName];
-
- // Delete all the data in the temp table.
- // We have triggers setup that ensure that the data is transferred over
- // upon deletion.
- let condition = "";
- switch(aTableName) {
- case "historyvisits":
+ if (aQueryType in this._cachedStatements) {
+ let stmt = this._cachedStatements[aQueryType];
+
+ // Bind the appropriate parameters.
+ let params = stmt.params;
+ switch (aQueryType) {
+ case kQuerySyncHistoryVisitsId:
+ case kQuerySyncPlacesId:
+ params.transition_type = Ci.nsINavHistoryService.TRANSITION_EMBED;
+ break;
+ case kQuerySelectExpireVisitsId:
+ case kQueryExpireVisitsId:
+ params.visit_date = (Date.now() - (this._expireDays * kMSPerDay)) * 1000;
+ params.max_expire = kMaxExpire;
+ break;
+ case kQuerySelectExpireHistoryOrphansId:
+ case kQueryExpireHistoryOrphansId:
+ params.max_expire = kMaxExpire;
+ break;
+ }
+
+ return stmt;
+ }
+
+ switch(aQueryType) {
+ case kQuerySyncHistoryVisitsId:
// For history table we want to leave embed visits in memory, since
// those are expired with current session, so we are filtering them out.
- condition = "WHERE visit_type <> " + Ci.nsINavHistoryService.TRANSITION_EMBED;
+ this._cachedStatements[aQueryType] = this._db.createStatement(
+ "DELETE FROM moz_historyvisits_temp " +
+ "WHERE visit_type <> :transition_type"
+ );
break;
- case "places":
+
+ case kQuerySyncPlacesId:
// For places table we want to leave places associated with embed visits
// in memory, they usually have hidden = 1 and at least an embed visit
// in historyvisits_temp table.
- condition = "WHERE id IN (SELECT id FROM moz_places_temp h " +
- "WHERE h.hidden <> 1 OR NOT EXISTS ( " +
- "SELECT id FROM moz_historyvisits_temp " +
- "WHERE place_id = h.id AND visit_type = " +
- Ci.nsINavHistoryService.TRANSITION_EMBED +
- " LIMIT 1) " +
- ")";
+ this._cachedStatements[aQueryType] = this._db.createStatement(
+ "DELETE FROM moz_places_temp " +
+ "WHERE id IN ( " +
+ "SELECT id FROM moz_places_temp h " +
+ "WHERE h.hidden <> 1 OR NOT EXISTS ( " +
+ "SELECT id FROM moz_historyvisits_temp " +
+ "WHERE place_id = h.id AND visit_type = :transition_type " +
+ "LIMIT 1 " +
+ ") " +
+ ")"
+ );
break;
+
+ case kQuerySelectExpireVisitsId:
+ // Determine which entries will be flushed out from moz_historyvisits
+ // when kQueryExpireVisitsId runs.
+ this._cachedStatements[aQueryType] = this._db.createStatement(
+ "SELECT h.url, v.visit_date, h.hidden, 0 AS whole_entry " +
+ "FROM moz_places h " +
+ "JOIN moz_historyvisits v ON h.id = v.place_id " +
+ "WHERE v.visit_date < :visit_date " +
+ "ORDER BY v.visit_date ASC " +
+ "LIMIT :max_expire"
+ );
+ break;
+
+ case kQueryExpireVisitsId:
+ // Expire entries from moz_historyvisits.
+ this._cachedStatements[aQueryType] = this._db.createStatement(
+ "DELETE FROM moz_historyvisits " +
+ "WHERE id IN ( " +
+ "SELECT id " +
+ "FROM moz_historyvisits " +
+ "WHERE visit_date < :visit_date " +
+ "ORDER BY visit_date ASC " +
+ "LIMIT :max_expire " +
+ ")"
+ );
+ break;
+
+ case kQuerySelectExpireHistoryOrphansId:
+ // Determine which entries will be flushed out from moz_places
+ // when kQueryExpireHistoryOrphansId runs.
+ this._cachedStatements[aQueryType] = this._db.createStatement(
+ "SELECT h.url, h.last_visit_date AS visit_date, h.hidden, " +
+ "1 as whole_entry FROM moz_places h " +
+ "LEFT JOIN moz_historyvisits v ON h.id = v.place_id " +
+ "LEFT JOIN moz_historyvisits_temp v_t ON h.id = v_t.place_id " +
+ "LEFT JOIN moz_bookmarks b ON h.id = b.fk " +
+ "WHERE v.id IS NULL " +
+ "AND v_t.id IS NULL " +
+ "AND b.id IS NULL " +
+ "AND SUBSTR(h.url, 1, 6) <> 'place:' " +
+ "LIMIT :max_expire"
+ );
+ break;
+
+ case kQueryExpireHistoryOrphansId:
+ // Flush out entries from moz_historyvisits.
+ this._cachedStatements[aQueryType] = this._db.createStatement(
+ "DELETE FROM moz_places_view " +
+ "WHERE id IN ( " +
+ "SELECT h.id FROM moz_places h " +
+ "LEFT JOIN moz_historyvisits v ON h.id = v.place_id " +
+ "LEFT JOIN moz_historyvisits_temp v_t ON h.id = v_t.place_id " +
+ "LEFT JOIN moz_bookmarks b ON h.id = b.fk " +
+ "WHERE v.id IS NULL " +
+ "AND v_t.id IS NULL " +
+ "AND b.id IS NULL " +
+ "AND SUBSTR(h.url, 1, 6) <> 'place:' " +
+ "LIMIT :max_expire" +
+ ")"
+ );
+ break;
+
+ default:
+ throw "Unexpected statement!";
}
- let sql = "DELETE FROM moz_" + aTableName + "_temp " + condition;
- return this._cachedStatements[aTableName] = this._db.createStatement(sql);
+ // We only bind our own parameters when we have a cached statement, so we
+ // call ourself since we now have a cached statement.
+ return this._getQuery(aQueryType);
},
/**
diff --git a/tools/xo_bundle/components/nsPlacesTransactionsService.js b/tools/xo_bundle/components/nsPlacesTransactionsService.js
index 7f0e43c..bac6670 100755
--- a/tools/xo_bundle/components/nsPlacesTransactionsService.js
+++ b/tools/xo_bundle/components/nsPlacesTransactionsService.js
@@ -44,6 +44,7 @@ let Cr = Components.results;
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
const DESCRIPTION_ANNO = "bookmarkProperties/description";
+const GUID_ANNO = "placesInternal/GUID";
const CLASS_ID = Components.ID("c0844a84-5a12-4808-80a8-809cb002bb4f");
const CONTRACT_ID = "@mozilla.org/browser/placesTransactionsService;1";
@@ -128,7 +129,7 @@ placesTransactionsService.prototype = {
// if the item is a livemark container we will not save its children and
// will use createLivemark to undo.
- if (PlacesUtils.livemarks.isLivemark(aItemId))
+ if (PlacesUtils.itemIsLivemark(aItemId))
return new placesRemoveLivemarkTransaction(aItemId);
return new placesRemoveItemTransaction(aItemId);
@@ -329,13 +330,29 @@ function placesAggregateTransactions(name, transactions) {
this._name = name;
this.container = -1;
this.redoTransaction = this.doTransaction;
+
+ // Check child transactions number. We will batch if we have more than
+ // MIN_TRANSACTIONS_FOR_BATCH total number of transactions.
+ var countTransactions = function(aTransactions, aTxnCount) {
+ for (let i = 0;
+ i < aTransactions.length && aTxnCount < MIN_TRANSACTIONS_FOR_BATCH;
+ i++, aTxnCount++) {
+ let txn = aTransactions[i].wrappedJSObject;
+ if (txn && txn.childTransactions && txn.childTransactions.length)
+ aTxnCount = countTransactions(txn.childTransactions, aTxnCount);
+ }
+ return aTxnCount;
+ }
+
+ var txnCount = countTransactions(transactions, 0);
+ this._useBatch = txnCount >= MIN_TRANSACTIONS_FOR_BATCH;
}
placesAggregateTransactions.prototype = {
__proto__: placesBaseTransaction.prototype,
doTransaction: function PAT_doTransaction() {
- if (this._transactions.length >= MIN_TRANSACTIONS_FOR_BATCH) {
+ if (this._useBatch) {
var callback = {
_self: this,
runBatched: function() {
@@ -349,7 +366,7 @@ placesAggregateTransactions.prototype = {
},
undoTransaction: function PAT_undoTransaction() {
- if (this._transactions.length >= MIN_TRANSACTIONS_FOR_BATCH) {
+ if (this._useBatch) {
var callback = {
_self: this,
runBatched: function() {
@@ -363,7 +380,9 @@ placesAggregateTransactions.prototype = {
},
commit: function PAT_commit(aUndo) {
- var transactions = this._transactions;
+ // Use a copy of the transactions array, so we won't reverse the original
+ // one on undoing.
+ var transactions = this._transactions.slice(0);
if (aUndo)
transactions.reverse();
for (var i = 0; i < transactions.length; i++) {
@@ -386,7 +405,7 @@ function placesCreateFolderTransactions(aName, aContainer, aIndex,
this._index = typeof(aIndex) == "number" ? aIndex : -1;
this._annotations = aAnnotations;
this._id = null;
- this._childItemsTransactions = aChildItemsTransactions || [];
+ this.childTransactions = aChildItemsTransactions || [];
this.redoTransaction = this.doTransaction;
}
@@ -403,21 +422,34 @@ placesCreateFolderTransactions.prototype = {
if (this._annotations && this._annotations.length > 0)
PlacesUtils.setAnnotationsForItem(this._id, this._annotations);
- for (var i = 0; i < this._childItemsTransactions.length; ++i) {
- var txn = this._childItemsTransactions[i];
- txn.wrappedJSObject.container = this._id;
- txn.doTransaction();
+ if (this.childTransactions.length) {
+ // Set the new container id into child transactions.
+ for (var i = 0; i < this.childTransactions.length; ++i) {
+ this.childTransactions[i].wrappedJSObject.container = this._id;
+ }
+
+ let aggregateTxn = new placesAggregateTransactions("Create folder childTxn",
+ this.childTransactions);
+ aggregateTxn.doTransaction();
}
+
+ if (this._GUID)
+ PlacesUtils.bookmarks.setItemGUID(this._id, this._GUID);
},
undoTransaction: function PCFT_undoTransaction() {
- // Undo transactions should always be done in reverse order.
- for (var i = this._childItemsTransactions.length - 1; i >= 0 ; i--) {
- var txn = this._childItemsTransactions[i];
- txn.undoTransaction();
+ if (this.childTransactions.length) {
+ let aggregateTxn = new placesAggregateTransactions("Create folder childTxn",
+ this.childTransactions);
+ aggregateTxn.undoTransaction();
}
+
+ // If a GUID exists for this item, preserve it before removing the item.
+ if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
+ this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
+
// Remove item only after all child transactions have been reverted.
- PlacesUtils.bookmarks.removeFolder(this._id);
+ PlacesUtils.bookmarks.removeItem(this._id);
}
};
@@ -430,7 +462,7 @@ function placesCreateItemTransactions(aURI, aContainer, aIndex, aTitle,
this._title = aTitle;
this._keyword = aKeyword;
this._annotations = aAnnotations;
- this._childTransactions = aChildTransactions || [];
+ this.childTransactions = aChildTransactions || [];
this.redoTransaction = this.doTransaction;
}
@@ -448,20 +480,32 @@ placesCreateItemTransactions.prototype = {
PlacesUtils.bookmarks.setKeywordForBookmark(this._id, this._keyword);
if (this._annotations && this._annotations.length > 0)
PlacesUtils.setAnnotationsForItem(this._id, this._annotations);
-
- for (var i = 0; i < this._childTransactions.length; ++i) {
- var txn = this._childTransactions[i];
- txn.wrappedJSObject.id = this._id;
- txn.doTransaction();
+
+ if (this.childTransactions.length) {
+ // Set the new item id into child transactions.
+ for (var i = 0; i < this.childTransactions.length; ++i) {
+ this.childTransactions[i].wrappedJSObject.id = this._id;
+ }
+ let aggregateTxn = new placesAggregateTransactions("Create item childTxn",
+ this.childTransactions);
+ aggregateTxn.doTransaction();
}
+ if (this._GUID)
+ PlacesUtils.bookmarks.setItemGUID(this._id, this._GUID);
},
undoTransaction: function PCIT_undoTransaction() {
- // Undo transactions should always be done in reverse order.
- for (var i = this._childTransactions.length - 1; i >= 0; i--) {
- var txn = this._childTransactions[i];
- txn.undoTransaction();
+ if (this.childTransactions.length) {
+ // Undo transactions should always be done in reverse order.
+ let aggregateTxn = new placesAggregateTransactions("Create item childTxn",
+ this.childTransactions);
+ aggregateTxn.undoTransaction();
}
+
+ // If a GUID exists for this item, preserve it before removing the item.
+ if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
+ this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
+
// Remove item only after all child transactions have been reverted.
PlacesUtils.bookmarks.removeItem(this._id);
}
@@ -484,9 +528,15 @@ placesCreateSeparatorTransactions.prototype = {
doTransaction: function PCST_doTransaction() {
this._id = PlacesUtils.bookmarks
.insertSeparator(this.container, this._index);
+ if (this._GUID)
+ PlacesUtils.bookmarks.setItemGUID(this._id, this._GUID);
},
undoTransaction: function PCST_undoTransaction() {
+ // If a GUID exists for this item, preserve it before removing the item.
+ if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
+ this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
+
PlacesUtils.bookmarks.removeItem(this._id);
}
};
@@ -516,10 +566,16 @@ placesCreateLivemarkTransactions.prototype = {
this._index);
if (this._annotations && this._annotations.length > 0)
PlacesUtils.setAnnotationsForItem(this._id, this._annotations);
+ if (this._GUID)
+ PlacesUtils.bookmarks.setItemGUID(this._id, this._GUID);
},
undoTransaction: function PCLT_undoTransaction() {
- PlacesUtils.bookmarks.removeFolder(this._id);
+ // If a GUID exists for this item, preserve it before removing the item.
+ if (PlacesUtils.annotations.itemHasAnnotation(this._id, GUID_ANNO))
+ this._GUID = PlacesUtils.bookmarks.getItemGUID(this._id);
+
+ PlacesUtils.bookmarks.removeItem(this._id);
}
};
@@ -598,9 +654,10 @@ function placesRemoveItemTransaction(aItemId) {
this._id = aItemId;
this._itemType = PlacesUtils.bookmarks.getItemType(this._id);
if (this._itemType == Ci.nsINavBookmarksService.TYPE_FOLDER) {
- this._transactions = [];
- this._removeTxn = PlacesUtils.bookmarks
- .getRemoveFolderTransaction(this._id);
+ this.childTransactions = this._getFolderContentsTransactions();
+ // Remove this folder itself.
+ let txn = PlacesUtils.bookmarks.getRemoveFolderTransaction(this._id);
+ this.childTransactions.push(txn);
}
else if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK) {
this._uri = PlacesUtils.bookmarks.getBookmarkURI(this._id);
@@ -623,14 +680,9 @@ placesRemoveItemTransaction.prototype = {
this._oldIndex = PlacesUtils.bookmarks.getItemIndex(this._id);
if (this._itemType == Ci.nsINavBookmarksService.TYPE_FOLDER) {
- this._saveFolderContents();
-
- // Remove children backwards to preserve parent-child relationships.
- for (var i = this._transactions.length - 1; i >= 0; --i)
- this._transactions[i].doTransaction();
-
- // Remove this folder itself.
- this._removeTxn.doTransaction();
+ let aggregateTxn = new placesAggregateTransactions("Remove item childTxn",
+ this.childTransactions);
+ aggregateTxn.doTransaction();
}
else {
PlacesUtils.bookmarks.removeItem(this._id);
@@ -658,10 +710,9 @@ placesRemoveItemTransaction.prototype = {
PlacesUtils.bookmarks.setKeywordForBookmark(this._id, this._keyword);
}
else if (this._itemType == Ci.nsINavBookmarksService.TYPE_FOLDER) {
- this._removeTxn.undoTransaction();
- // Create children forwards to preserve parent-child relationships.
- for (var i = 0; i < this._transactions.length; ++i)
- this._transactions[i].undoTransaction();
+ let aggregateTxn = new placesAggregateTransactions("Remove item childTxn",
+ this.childTransactions);
+ aggregateTxn.undoTransaction();
}
else // TYPE_SEPARATOR
this._id = PlacesUtils.bookmarks.insertSeparator(this._oldContainer, this._oldIndex);
@@ -674,17 +725,21 @@ placesRemoveItemTransaction.prototype = {
},
/**
- * Create a flat, ordered list of transactions for a depth-first recreation
+ * Returns a flat, ordered list of transactions for a depth-first recreation
* of items within this folder.
*/
- _saveFolderContents: function PRIT__saveFolderContents() {
- this._transactions = [];
+ _getFolderContentsTransactions:
+ function PRIT__getFolderContentsTransactions() {
+ var transactions = [];
var contents =
PlacesUtils.getFolderContents(this._id, false, false).root;
for (var i = 0; i < contents.childCount; ++i) {
- this._transactions
- .push(new placesRemoveItemTransaction(contents.getChild(i).itemId));
+ let txn = new placesRemoveItemTransaction(contents.getChild(i).itemId);
+ transactions.push(txn);
}
+ contents.containerOpen = false;
+ // Reverse transactions to preserve parent-child relationship.
+ return transactions.reverse();
}
};
@@ -991,7 +1046,8 @@ placesSortFolderByNameTransactions.prototype = {
doTransaction: function PSSFBN_doTransaction() {
this._oldOrder = [];
- var contents = PlacesUtils.getFolderContents(this._folderId, false, false).root;
+ var contents =
+ PlacesUtils.getFolderContents(this._folderId, false, false).root;
var count = contents.childCount;
// sort between separators
@@ -1020,6 +1076,8 @@ placesSortFolderByNameTransactions.prototype = {
else
preSep.push(item);
}
+ contents.containerOpen = false;
+
if (preSep.length > 0) {
preSep.sort(sortingMethod);
newOrder = newOrder.concat(preSep);
@@ -1067,12 +1125,18 @@ placesTagURITransaction.prototype = {
this._uri,
PlacesUtils.bookmarks.DEFAULT_INDEX,
PlacesUtils.history.getPageTitle(this._uri));
+ if (this._GUID)
+ PlacesUtils.bookmarks.setItemGUID(this._unfiledItemId, this._GUID);
}
PlacesUtils.tagging.tagURI(this._uri, this._tags);
},
undoTransaction: function PTU_undoTransaction() {
if (this._unfiledItemId != -1) {
+ // If a GUID exists for this item, preserve it before removing the item.
+ if (PlacesUtils.annotations.itemHasAnnotation(this._unfiledItemId, GUID_ANNO)) {
+ this._GUID = PlacesUtils.bookmarks.getItemGUID(this._unfiledItemId);
+ }
PlacesUtils.bookmarks.removeItem(this._unfiledItemId);
this._unfiledItemId = -1;
}
diff --git a/tools/xo_bundle/components/nsPrivateBrowsingService.js b/tools/xo_bundle/components/nsPrivateBrowsingService.js
index af54693..8880b4f 100755
--- a/tools/xo_bundle/components/nsPrivateBrowsingService.js
+++ b/tools/xo_bundle/components/nsPrivateBrowsingService.js
@@ -1,4 +1,4 @@
-//@line 38 "/builds/moz2_slave/linux_build/build/browser/components/privatebrowsing/src/nsPrivateBrowsingService.js"
+//@line 38 "/builds/slave/linux_build/build/browser/components/privatebrowsing/src/nsPrivateBrowsingService.js"
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
@@ -38,6 +38,11 @@ const Ci = Components.interfaces;
const Cu = Components.utils;
const Cr = Components.results;
+const STATE_IDLE = 0;
+const STATE_TRANSITION_STARTED = 1;
+const STATE_WAITING_FOR_RESTORE = 2;
+const STATE_RESTORE_FINISHED = 3;
+
////////////////////////////////////////////////////////////////////////////////
//// PrivateBrowsingService
@@ -45,6 +50,8 @@ function PrivateBrowsingService() {
this._obs.addObserver(this, "profile-after-change", true);
this._obs.addObserver(this, "quit-application-granted", true);
this._obs.addObserver(this, "private-browsing", true);
+ this._obs.addObserver(this, "command-line-startup", true);
+ this._obs.addObserver(this, "sessionstore-browser-state-restored", true);
}
PrivateBrowsingService.prototype = {
@@ -78,26 +85,31 @@ PrivateBrowsingService.prototype = {
// How to treat the non-private session
_saveSession: true,
- // Make sure we don't allow re-enterant changing of the private mode
- _alreadyChangingMode: false,
-
- // Whether we're entering the private browsing mode at application startup
- _autoStart: false,
+ // The current status of the private browsing service
+ _currentStatus: STATE_IDLE,
- // Whether the private browsing mode has been started automatically
+ // Whether the private browsing mode has been started automatically (ie. always-on)
_autoStarted: false,
+ // List of view source window URIs for restoring later
+ _viewSrcURLs: [],
+
+ // List of nsIXULWindows we are going to be closing during the transition
+ _windowsToClose: [],
+
// XPCOM registration
classDescription: "PrivateBrowsing Service",
contractID: "@mozilla.org/privatebrowsing;1",
classID: Components.ID("{c31f4883-839b-45f6-82ad-a6a9bc5ad599}"),
_xpcom_categories: [
+ { category: "command-line-handler", entry: "m-privatebrowsing" },
{ category: "app-startup", service: true }
],
QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrivateBrowsingService,
Ci.nsIObserver,
- Ci.nsISupportsWeakReference]),
+ Ci.nsISupportsWeakReference,
+ Ci.nsICommandLineHandler]),
_unload: function PBS__destroy() {
// Force an exit from the private browsing mode on shutdown
@@ -107,8 +119,8 @@ PrivateBrowsingService.prototype = {
},
_onBeforePrivateBrowsingModeChange: function PBS__onBeforePrivateBrowsingModeChange() {
- // nothing needs to be done here if we're auto-starting
- if (!this._autoStart) {
+ // nothing needs to be done here if we're enabling at startup
+ if (!this._autoStarted) {
let ss = Cc["@mozilla.org/browser/sessionstore;1"].
getService(Ci.nsISessionStore);
let blankState = JSON.stringify({
@@ -122,13 +134,6 @@ PrivateBrowsingService.prototype = {
}]
});
- // whether we should save and close the current session
- this._saveSession = true;
- try {
- if (this._prefs.getBoolPref("browser.privatebrowsing.keep_current_session"))
- this._saveSession = false;
- } catch (ex) {}
-
if (this._inPrivateBrowsing) {
// save the whole browser state in order to restore all windows/tabs later
if (this._saveSession && !this._savedBrowserState) {
@@ -141,6 +146,22 @@ PrivateBrowsingService.prototype = {
this._closePageInfoWindows();
+ // save view-source windows URIs and close them
+ let viewSrcWindowsEnum = Cc["@mozilla.org/appshell/window-mediator;1"].
+ getService(Ci.nsIWindowMediator).
+ getEnumerator("navigator:view-source");
+ while (viewSrcWindowsEnum.hasMoreElements()) {
+ let win = viewSrcWindowsEnum.getNext();
+ if (this._inPrivateBrowsing) {
+ let plainURL = win.getBrowser().currentURI.spec;
+ if (plainURL.indexOf("view-source:") == 0) {
+ plainURL = plainURL.substr(12);
+ this._viewSrcURLs.push(plainURL);
+ }
+ }
+ win.close();
+ }
+
if (!this._quitting && this._saveSession) {
let browserWindow = this._getBrowserWindow();
@@ -153,12 +174,20 @@ PrivateBrowsingService.prototype = {
// just in case the only remaining window after setBrowserState is different.
// it probably shouldn't be with the current sessionstore impl, but we shouldn't
// rely on behaviour the API doesn't guarantee
- let browser = this._getBrowserWindow().gBrowser;
+ browserWindow = this._getBrowserWindow();
+ let browser = browserWindow.gBrowser;
// this ensures a clean slate from which to transition into or out of
// private browsing
browser.addTab();
+ browser.getBrowserForTab(browser.tabContainer.firstChild).stop();
browser.removeTab(browser.tabContainer.firstChild);
+ browserWindow.getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShellTreeItem)
+ .treeOwner
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIXULWindow)
+ .docShell.contentViewer.resetCloseWindow();
}
}
}
@@ -167,18 +196,41 @@ PrivateBrowsingService.prototype = {
},
_onAfterPrivateBrowsingModeChange: function PBS__onAfterPrivateBrowsingModeChange() {
- // nothing to do here if we're auto-starting or the current session is being
+ // nothing to do here if we're enabling at startup or the current session is being
// used
- if (!this._autoStart && this._saveSession) {
+ if (!this._autoStarted && this._saveSession) {
let ss = Cc["@mozilla.org/browser/sessionstore;1"].
getService(Ci.nsISessionStore);
// if we have transitioned out of private browsing mode and the session is
// to be restored, do it now
if (!this._inPrivateBrowsing) {
+ this._currentStatus = STATE_WAITING_FOR_RESTORE;
ss.setBrowserState(this._savedBrowserState);
this._savedBrowserState = null;
this._closePageInfoWindows();
+
+ // re-open all view-source windows
+ let windowWatcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].
+ getService(Ci.nsIWindowWatcher);
+ this._viewSrcURLs.forEach(function(uri) {
+ let args = Cc["@mozilla.org/supports-array;1"].
+ createInstance(Ci.nsISupportsArray);
+ let str = Cc["@mozilla.org/supports-string;1"].
+ createInstance(Ci.nsISupportsString);
+ str.data = uri;
+ args.AppendElement(str);
+ args.AppendElement(null); // charset
+ args.AppendElement(null); // page descriptor
+ args.AppendElement(null); // line number
+ let forcedCharset = Cc["@mozilla.org/supports-PRBool;1"].
+ createInstance(Ci.nsISupportsPRBool);
+ forcedCharset.data = false;
+ args.AppendElement(forcedCharset);
+ windowWatcher.openWindow(null, "chrome://global/content/viewSource.xul",
+ "_blank", "all,dialog=no", args);
+ });
+ this._viewSrcURLs = [];
}
else {
// otherwise, if we have transitioned into private browsing mode, load
@@ -194,11 +246,35 @@ PrivateBrowsingService.prototype = {
}]
};
// Transition into private browsing mode
+ this._currentStatus = STATE_WAITING_FOR_RESTORE;
ss.setBrowserState(JSON.stringify(privateBrowsingState));
}
}
},
+ _notifyIfTransitionComplete: function PBS__notifyIfTransitionComplete() {
+ switch (this._currentStatus) {
+ case STATE_TRANSITION_STARTED:
+ // no session store operation was needed, so just notify of transition completion
+ case STATE_RESTORE_FINISHED:
+ // restore has been completed
+ this._currentStatus = STATE_IDLE;
+ this._obs.notifyObservers(null, "private-browsing-transition-complete", "");
+ break;
+ case STATE_WAITING_FOR_RESTORE:
+ // too soon to notify...
+ break;
+ case STATE_IDLE:
+ // no need to notify
+ break;
+ default:
+ // unexpected state observed
+ Cu.reportError("Unexpected private browsing status reached: " +
+ this._currentStatus);
+ break;
+ }
+ },
+
_canEnterPrivateBrowsingMode: function PBS__canEnterPrivateBrowsingMode() {
let cancelEnter = Cc["@mozilla.org/supports-PRBool;1"].
createInstance(Ci.nsISupportsPRBool);
@@ -221,6 +297,29 @@ PrivateBrowsingService.prototype = {
getMostRecentWindow("navigator:browser");
},
+ _ensureCanCloseWindows: function PBS__ensureCanCloseWindows() {
+ // whether we should save and close the current session
+ this._saveSession = true;
+ try {
+ if (this._prefs.getBoolPref("browser.privatebrowsing.keep_current_session")) {
+ this._saveSession = false;
+ return;
+ }
+ } catch (ex) {}
+
+ let windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"].
+ getService(Ci.nsIWindowMediator);
+ let windowsEnum = windowMediator.getXULWindowEnumerator("navigator:browser");
+
+ while (windowsEnum.hasMoreElements()) {
+ let win = windowsEnum.getNext().QueryInterface(Ci.nsIXULWindow);
+ if (win.docShell.contentViewer.permitUnload(true))
+ this._windowsToClose.push(win);
+ else
+ throw Cr.NS_ERROR_ABORT;
+ }
+ },
+
_closePageInfoWindows: function PBS__closePageInfoWindows() {
let pageInfoEnum = Cc["@mozilla.org/appshell/window-mediator;1"].
getService(Ci.nsIWindowMediator).
@@ -240,11 +339,10 @@ PrivateBrowsingService.prototype = {
// private browsing mode upon startup.
// This won't interfere with the session store component, because
// that component will be initialized on final-ui-startup.
- this._autoStart = this._prefs.getBoolPref("browser.privatebrowsing.autostart");
- if (this._autoStart) {
- this._autoStarted = true;
- this.privateBrowsingEnabled = true;
- this._autoStart = false;
+ if (!this._autoStarted) {
+ this._autoStarted = this._prefs.getBoolPref("browser.privatebrowsing.autostart");
+ if (this._autoStarted)
+ this.privateBrowsingEnabled = true;
}
this._obs.removeObserver(this, "profile-after-change");
break;
@@ -262,17 +360,9 @@ PrivateBrowsingService.prototype = {
getService(Ci.nsIHttpAuthManager);
authMgr.clearAll();
- // Prevent any SSL sockets from remaining open. Without this, SSL
- // websites may fail to load after switching the private browsing mode
- // because the SSL sockets may still be open while the corresponding
- // NSS resources have been destroyed by the logoutAndTeardown call
- // above. See bug 463256 for more information.
- let ios = Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService);
- if (!ios.offline) {
- ios.offline = true;
- ios.offline = false;
- }
+ try {
+ this._prefs.deleteBranch("geo.wifi.access_token.");
+ } catch (ex) {}
if (!this._inPrivateBrowsing) {
// Clear the error console
@@ -282,9 +372,33 @@ PrivateBrowsingService.prototype = {
consoleService.reset();
}
break;
+ case "command-line-startup":
+ this._obs.removeObserver(this, "command-line-startup");
+ aSubject.QueryInterface(Ci.nsICommandLine);
+ this.handle(aSubject);
+ break;
+ case "sessionstore-browser-state-restored":
+ if (this._currentStatus == STATE_WAITING_FOR_RESTORE) {
+ this._currentStatus = STATE_RESTORE_FINISHED;
+ this._notifyIfTransitionComplete();
+ }
+ break;
+ }
+ },
+
+ // nsICommandLineHandler
+
+ handle: function PBS_handle(aCmdLine) {
+ if (aCmdLine.handleFlag("private", false)) {
+ this.privateBrowsingEnabled = true;
+ this._autoStarted = true;
}
},
+ get helpInfo PBS_get_helpInfo() {
+ return " -private Enable private browsing mode.\n";
+ },
+
// nsIPrivateBrowsingService
/**
@@ -303,11 +417,11 @@ PrivateBrowsingService.prototype = {
// status of the service while it's in the process of another transition.
// So, we detect a reentrant call here and throw an error.
// This is documented in nsIPrivateBrowsingService.idl.
- if (this._alreadyChangingMode)
+ if (this._currentStatus != STATE_IDLE)
throw Cr.NS_ERROR_FAILURE;
try {
- this._alreadyChangingMode = true;
+ this._currentStatus = STATE_TRANSITION_STARTED;
if (val != this._inPrivateBrowsing) {
if (val) {
@@ -319,8 +433,9 @@ PrivateBrowsingService.prototype = {
return;
}
- this._autoStarted = val ?
- this._prefs.getBoolPref("browser.privatebrowsing.autostart") : false;
+ this._ensureCanCloseWindows();
+
+ this._autoStarted = this._prefs.getBoolPref("browser.privatebrowsing.autostart");
this._inPrivateBrowsing = val != false;
let data = val ? "enter" : "exit";
@@ -341,10 +456,17 @@ PrivateBrowsingService.prototype = {
this._onAfterPrivateBrowsingModeChange();
}
} catch (ex) {
- Cu.reportError("Exception thrown while processing the " +
- "private browsing mode change request: " + ex.toString());
+ // We aborted the transition to/from private browsing, we must restore the
+ // beforeunload handling on all the windows for which we switched it off.
+ for (let i = 0; i < this._windowsToClose.length; i++)
+ this._windowsToClose[i].docShell.contentViewer.resetCloseWindow();
+ // We don't log an error when the transition is canceled from beforeunload
+ if (ex != Cr.NS_ERROR_ABORT)
+ Cu.reportError("Exception thrown while processing the " +
+ "private browsing mode change request: " + ex.toString());
} finally {
- this._alreadyChangingMode = false;
+ this._windowsToClose = [];
+ this._notifyIfTransitionComplete();
}
},
@@ -352,7 +474,7 @@ PrivateBrowsingService.prototype = {
* Whether private browsing has been started automatically.
*/
get autoStarted PBS_get_autoStarted() {
- return this._autoStarted;
+ return this._inPrivateBrowsing && this._autoStarted;
},
removeDataFromDomain: function PBS_removeDataFromDomain(aDomain)
diff --git a/tools/xo_bundle/components/nsSafebrowsingApplication.js b/tools/xo_bundle/components/nsSafebrowsingApplication.js
index cba7a15..493676b 100755
--- a/tools/xo_bundle/components/nsSafebrowsingApplication.js
+++ b/tools/xo_bundle/components/nsSafebrowsingApplication.js
@@ -10,7 +10,7 @@ Function.prototype.inherits = function(parentCtor) {
this.prototype = new tempCtor();
}
-//@line 36 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/application.js"
+//@line 36 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/application.js"
// We instantiate this variable when we create the application.
var gDataProvider = null;
@@ -32,7 +32,7 @@ var gDataProvider = null;
function PROT_Application() {
this.debugZone= "application";
-//@line 83 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/application.js"
+//@line 83 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/application.js"
// expose some classes
this.PROT_PhishingWarden = PROT_PhishingWarden;
@@ -83,47 +83,15 @@ PROT_Application.prototype.getReportURL = function(name) {
return gDataProvider["getReport" + name + "URL"]();
}
-/**
- * about:blocked implementation
- */
-PROT_Application.prototype.newChannel = function(uri) {
- var ioService = Cc["@mozilla.org/network/io-service;1"]
- .getService(Ci.nsIIOService);
- var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"]
- .getService(Ci.nsIScriptSecurityManager);
-
- var childURI = ioService.newURI("chrome://browser/content/safebrowsing/blockedSite.xhtml",
- null, null);
- var channel = ioService.newChannelFromURI(childURI);
- channel.originalURI = uri;
-
- // Drop chrome privilege
- var principal = secMan.getCodebasePrincipal(uri);
- channel.owner = principal;
-
- return channel;
-}
-
-PROT_Application.prototype.getURIFlags = function(uri) {
- // We don't particularly *want* people linking to this from
- // untrusted content, but given that bad sites can cause this page
- // to appear (e.g. by having an iframe pointing to known malware),
- // we should code as though this is explicitly possible.
- return Ci.nsIAboutModule.ALLOW_SCRIPT |
- Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT;
-}
-
PROT_Application.prototype.QueryInterface = function(iid) {
if (iid.equals(Ci.nsISupports) ||
iid.equals(Ci.nsISupportsWeakReference) ||
- iid.equals(Ci.nsIObserver) ||
- iid.equals(Ci.nsIAboutModule))
+ iid.equals(Ci.nsIObserver))
return this;
- Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
- return null;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
}
-//@line 37 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/globalstore.js"
+//@line 37 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/globalstore.js"
// A class that encapsulates data provider specific values. The
@@ -145,9 +113,9 @@ PROT_Application.prototype.QueryInterface = function(iid) {
const kDataProviderIdPref = 'browser.safebrowsing.dataProvider';
const kProviderBasePref = 'browser.safebrowsing.provider.';
-//@line 59 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/globalstore.js"
+//@line 59 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/globalstore.js"
const MOZ_OFFICIAL_BUILD = true;
-//@line 63 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/globalstore.js"
+//@line 63 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/globalstore.js"
const MOZ_PARAM_LOCALE = /\{moz:locale\}/g;
const MOZ_PARAM_CLIENT = /\{moz:client\}/g;
@@ -316,7 +284,7 @@ PROT_DataProvider.prototype.getReportMalwareURL = function() {
PROT_DataProvider.prototype.getReportMalwareErrorURL = function() {
return this.reportMalwareErrorURL_;
}
-//@line 37 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/list-warden.js"
+//@line 37 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/list-warden.js"
// A warden that knows how to register lists with a listmanager and keep them
// updated if necessary. The ListWarden also provides a simple interface to
@@ -416,7 +384,7 @@ PROT_ListWarden.prototype.registerWhiteTable = function(tableName) {
}
return result;
}
-//@line 36 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/phishing-warden.js"
+//@line 36 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/phishing-warden.js"
// The warden checks request to see if they are for phishy pages. It
@@ -545,7 +513,7 @@ PROT_PhishingWarden.prototype.onPhishWardenEnabledPrefChanged = function(
this.prefs_.getPref(prefName, this.phishWardenEnabled_);
this.maybeToggleUpdateChecking();
}
-//@line 37 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/content/malware-warden.js"
+//@line 37 "/builds/slave/linux_build/build/browser/components/safebrowsing/content/malware-warden.js"
// This warden manages updates to the malware list
@@ -666,7 +634,7 @@ PROT_MalwareWarden.prototype.onMalwareWardenEnabledPrefChanged = function(
this.prefs_.getPref(prefName, this.malwareWardenEnabled_);
this.maybeToggleUpdateChecking();
}
-//@line 18 "/builds/moz2_slave/linux_build/build/browser/components/safebrowsing/src/nsSafebrowsingApplication.js"
+//@line 18 "/builds/slave/linux_build/build/browser/components/safebrowsing/src/nsSafebrowsingApplication.js"
var modScope = this;
function Init() {
@@ -707,13 +675,6 @@ SafebrowsingApplicationMod.prototype.registerSelf = function(compMgr, fileSpec,
fileSpec,
loc,
type);
-
- compMgr.registerFactoryLocation(this.cid,
- "UrlClassifier Blocked Error Page",
- "@mozilla.org/network/protocol/about;1?what=blocked",
- fileSpec,
- loc,
- type);
};
SafebrowsingApplicationMod.prototype.getClassObject = function(compMgr, cid, iid) {
diff --git a/tools/xo_bundle/components/nsSearchService.js b/tools/xo_bundle/components/nsSearchService.js
index 5c40314..a267673 100755
--- a/tools/xo_bundle/components/nsSearchService.js
+++ b/tools/xo_bundle/components/nsSearchService.js
@@ -1,4 +1,4 @@
-//@line 40 "/builds/moz2_slave/linux_build/build/toolkit/components/search/nsSearchService.js"
+//@line 40 "/builds/slave/linux_build/build/toolkit/components/search/nsSearchService.js"
const Ci = Components.interfaces;
const Cc = Components.classes;
@@ -24,6 +24,7 @@ const NS_APP_USER_PROFILE_50_DIR = "ProfD";
const SEARCH_APP_DIR = 1;
const SEARCH_PROFILE_DIR = 2;
const SEARCH_IN_EXTENSION = 3;
+const SEARCH_JAR = 4;
// See documentation in nsIBrowserSearchService.idl.
const SEARCH_ENGINE_TOPIC = "browser-search-engine-modified";
@@ -54,7 +55,7 @@ const CACHE_INVALIDATION_DELAY = 1000;
// Current cache version. This should be incremented if the format of the cache
// file is modified.
-const CACHE_VERSION = 5;
+const CACHE_VERSION = 6;
const ICON_DATAURL_PREFIX = "data:image/x-icon;base64,";
@@ -107,9 +108,9 @@ const BROWSER_SEARCH_PREF = "browser.search.";
const USER_DEFINED = "{searchTerms}";
// Custom search parameters
-//@line 149 "/builds/moz2_slave/linux_build/build/toolkit/components/search/nsSearchService.js"
+//@line 150 "/builds/slave/linux_build/build/toolkit/components/search/nsSearchService.js"
const MOZ_OFFICIAL = "official";
-//@line 153 "/builds/moz2_slave/linux_build/build/toolkit/components/search/nsSearchService.js"
+//@line 154 "/builds/slave/linux_build/build/toolkit/components/search/nsSearchService.js"
const MOZ_DISTRIBUTION_ID = "org.mozilla";
const MOZ_PARAM_LOCALE = /\{moz:locale\}/g;
@@ -181,6 +182,12 @@ __defineGetter__("gPrefSvc", function() {
getService(Ci.nsIPrefBranch);
});
+__defineGetter__("gChromeReg", function() {
+ delete this.gChromeReg;
+ return this.gChromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"].
+ getService(Ci.nsIChromeRegistry);
+});
+
/**
* Prefixed to all search debug output.
*/
@@ -196,7 +203,7 @@ function DO_LOG(aText) {
consoleService.logStringMessage(aText);
}
-//@line 251 "/builds/moz2_slave/linux_build/build/toolkit/components/search/nsSearchService.js"
+//@line 258 "/builds/slave/linux_build/build/toolkit/components/search/nsSearchService.js"
/**
* Otherwise, don't log at all by default. This can be overridden at startup
@@ -204,7 +211,7 @@ function DO_LOG(aText) {
*/
var LOG = function(){};
-//@line 259 "/builds/moz2_slave/linux_build/build/toolkit/components/search/nsSearchService.js"
+//@line 266 "/builds/slave/linux_build/build/toolkit/components/search/nsSearchService.js"
/**
* Presents an assertion dialog in non-release builds and throws.
@@ -685,9 +692,8 @@ function QueryParameter(aName, aValue) {
* aParamValue as the value of the OS_PARAM_USER_DEFINED parameter.
* This value must already be escaped appropriately - it is inserted
* as-is.
- * @param aQueryEncoding
- * The value to use for the OS_PARAM_INPUT_ENCODING parameter. See
- * definition in the OpenSearch spec.
+ * @param aEngine
+ * The engine which owns the string being acted on.
*
* @see http://opensearch.a9.com/spec/1.1/querysyntax/#core
*/
@@ -939,13 +945,15 @@ function Engine(aLocation, aSourceDataType, aIsReadOnly) {
this._readOnly = aIsReadOnly;
this._urls = [];
- if (aLocation.cached) {
- this._file = aLocation.value;
+ if (aLocation.type) {
+ if (aLocation.type == "filePath")
+ this._file = aLocation.value;
+ else if (aLocation.type == "uri")
+ this._uri = aLocation.value;
} else if (aLocation instanceof Ci.nsILocalFile) {
// we already have a file (e.g. loading engines from disk)
this._file = aLocation;
} else if (aLocation instanceof Ci.nsIURI) {
- this._uri = aLocation;
switch (aLocation.scheme) {
case "https":
case "http":
@@ -953,6 +961,7 @@ function Engine(aLocation, aSourceDataType, aIsReadOnly) {
case "data":
case "file":
case "resource":
+ case "chrome":
this._uri = aLocation;
break;
default:
@@ -1016,8 +1025,18 @@ Engine.prototype = {
"the current engine");
},
// The URI object from which the engine was retrieved.
- // This is null for local plugins, and is used for error messages and logging.
- _uri: null,
+ // This is null for engines loaded from disk, but present for engines loaded
+ // from chrome:// URIs.
+ __uri: null,
+ get _uri() {
+ if (this.__uri && !(this.__uri instanceof Ci.nsIURI))
+ this.__uri = makeURI(this.__uri);
+
+ return this.__uri;
+ },
+ set _uri(aValue) {
+ this.__uri = aValue;
+ },
// Whether to obtain user confirmation before adding the engine. This is only
// used when the engine is first added to the list.
_confirm: false,
@@ -1113,6 +1132,29 @@ Engine.prototype = {
chan.notificationCallbacks = listener;
chan.asyncOpen(listener, null);
},
+
+ _initFromURISync: function SRCH_ENG_initFromURISync() {
+ ENSURE_WARN(this._uri instanceof Ci.nsIURI,
+ "Must have URI when calling _initFromURISync!",
+ Cr.NS_ERROR_UNEXPECTED);
+
+ ENSURE_WARN(this._uri.schemeIs("chrome"), "_initFromURISync called for non-chrome URI",
+ Cr.NS_ERROR_FAILURE);
+
+ LOG("_initFromURISync: Loading engine from: \"" + this._uri.spec + "\".");
+
+ var chan = gIoSvc.newChannelFromURI(this._uri);
+
+ var stream = chan.open();
+ var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
+ createInstance(Ci.nsIDOMParser);
+ var doc = parser.parseFromStream(stream, "UTF-8", stream.available(), "text/xml");
+
+ this._data = doc.documentElement;
+
+ // Now that the data is loaded, initialize the engine object
+ this._initFromData();
+ },
/**
* Attempts to find an EngineURL object in the set of EngineURLs for
@@ -1142,7 +1184,10 @@ Engine.prototype = {
var dialogMessage =
stringBundle.formatStringFromName("addEngineConfirmation",
[this._name, this._uri.host], 2);
- var checkboxMessage = stringBundle.GetStringFromName("addEngineUseNowText");
+ var checkboxMessage = null;
+ if (!getBoolPref(BROWSER_SEARCH_PREF + "noCurrentEngine", false))
+ checkboxMessage = stringBundle.GetStringFromName("addEngineUseNowText");
+
var addButtonLabel =
stringBundle.GetStringFromName("addEngineAddButtonLabel");
@@ -1587,6 +1632,7 @@ Engine.prototype = {
this._parseURL(child);
} catch (ex) {
// Parsing of the element failed, just skip it.
+ LOG("_parseAsOpenSearch: failed to parse URL child: " + ex);
}
break;
case "Image":
@@ -1973,12 +2019,15 @@ Engine.prototype = {
_id: this._id,
_name: this._name,
description: this.description,
- filePath: this._file.QueryInterface(Ci.nsILocalFile).persistentDescriptor,
__searchForm: this.__searchForm,
_iconURL: this._iconURL,
_urls: [url._serializeToJSON() for each(url in this._urls)]
};
+ if (this._file instanceof Ci.nsILocalFile)
+ json.filePath = this._file.persistentDescriptor;
+ if (this._uri)
+ json._url = this._uri.spec;
if (this._installLocation != SEARCH_APP_DIR || !aFilter)
json._installLocation = this._installLocation;
if (this._updateInterval || !aFilter)
@@ -2162,7 +2211,7 @@ Engine.prototype = {
// Where the engine is being loaded from: will return the URI's spec if the
// engine is being downloaded and does not yet have a file. This is only used
- // for logging.
+ // for logging and error messages.
get _location() {
if (this._file)
return this._file.path;
@@ -2177,28 +2226,51 @@ Engine.prototype = {
// use this as the identifier to store data in the sqlite database
__id: null,
get _id() {
- if (!this.__id) {
- ENSURE_WARN(this._file, "No _file for id!", Cr.NS_ERROR_FAILURE);
-
- if (this._isInProfile)
- return this.__id = "[profile]/" + this._file.leafName;
- if (this._isInAppDir)
- return this.__id = "[app]/" + this._file.leafName;
-
- // We're not in the profile or appdir, so this must be an extension-shipped
- // plugin. Use the full path.
- return this.__id = this._file.path;
+ if (this.__id)
+ return this.__id;
+
+ // Treat engines loaded from JARs the same way we treat app shipped
+ // engines.
+ // Theoretically, these could also come from extensions, but there's no
+ // real way for extensions to register their chrome locations at the
+ // moment, so let's not deal with that case.
+ // This means we're vulnerable to conflicts if a file loaded from a JAR
+ // has the same filename as a file loaded from the app dir, but with a
+ // different engine name. People using the JAR functionality should be
+ // careful not to do that!
+ if (this._isInAppDir || this._isInJAR) {
+ let leafName;
+ if (this._file)
+ leafName = this._file.leafName;
+ else {
+ // If we've reached this point, we must be loaded from a JAR, which
+ // also means we should have a URL.
+ ENSURE_WARN(this._isInJAR && (this._uri instanceof Ci.nsIURL),
+ "_id: not inJAR, or no URI", Cr.NS_ERROR_UNEXPECTED);
+ leafName = this._uri.fileName;
+ }
+
+ return this.__id = "[app]/" + leafName;
}
- return this.__id;
+
+ ENSURE_WARN(this._file, "_id: no _file!", Cr.NS_ERROR_UNEXPECTED);
+
+ if (this._isInProfile)
+ return this.__id = "[profile]/" + this._file.leafName;
+
+ // We're not in the profile or appdir, so this must be an extension-shipped
+ // plugin. Use the full filename.
+ return this.__id = this._file.path;
},
get _installLocation() {
- ENSURE_WARN(this._file && this._file.exists(),
- "_installLocation: engine has no file!",
- Cr.NS_ERROR_FAILURE);
-
if (this.__installLocation === null) {
- if (this._file.parent.equals(getDir(NS_APP_SEARCH_DIR)))
+ if (!this._file) {
+ ENSURE_WARN(this._uri, "Engines without files must have URIs",
+ Cr.NS_ERROR_UNEXPECTED);
+ this.__installLocation = SEARCH_JAR;
+ }
+ else if (this._file.parent.equals(getDir(NS_APP_SEARCH_DIR)))
this.__installLocation = SEARCH_APP_DIR;
else if (this._file.parent.equals(getDir(NS_APP_USER_SEARCH_DIR)))
this.__installLocation = SEARCH_PROFILE_DIR;
@@ -2209,6 +2281,9 @@ Engine.prototype = {
return this.__installLocation;
},
+ get _isInJAR() {
+ return this._installLocation == SEARCH_JAR;
+ },
get _isInAppDir() {
return this._installLocation == SEARCH_APP_DIR;
},
@@ -2247,7 +2322,7 @@ Engine.prototype = {
this._searchForm = makeURI(htmlUrl.template).prePath;
}
- return this._searchForm;
+ return ParamSubstitution(this._searchForm, "", this);
},
get queryCharset() {
@@ -2370,7 +2445,12 @@ SearchService.prototype = {
engineMetadataService.init();
engineUpdateService.init();
- this._loadEngines();
+ try {
+ this._loadEngines();
+ } catch (ex) {
+ LOG("_init: failure loading engines: " + ex);
+ }
+
this._addObservers();
// Now that all engines are loaded, build the sorted engine list
@@ -2404,15 +2484,48 @@ SearchService.prototype = {
cache.directories = {};
+
+ function getParent(engine) {
+ if (engine._file)
+ return engine._file.parent;
+
+ let uri = engine._uri;
+ if (!uri.schemeIs("chrome")) {
+ LOG("getParent: engine URI must be a chrome URI if it has no file");
+ return null;
+ }
+
+ // use the underlying JAR file, for chrome URIs
+ try {
+ uri = gChromeReg.convertChromeURL(uri);
+ if (uri instanceof Ci.nsINestedURI)
+ uri = uri.innermostURI;
+ uri.QueryInterface(Ci.nsIFileURL)
+
+ return uri.file;
+ } catch (ex) {
+ LOG("getParent: couldn't map chrome:// URI to a file: " + ex)
+ }
+
+ return null;
+ }
+
for each (let engine in this._engines) {
- let parent = engine._file.parent;
- if (!cache.directories[parent.path]) {
+ let parent = getParent(engine);
+ if (!parent) {
+ LOG("Error: no parent for engine " + engine._location + ", failing to cache it");
+
+ continue;
+ }
+
+ let cacheKey = parent.path;
+ if (!cache.directories[cacheKey]) {
let cacheEntry = {};
cacheEntry.lastModifiedTime = parent.lastModifiedTime;
cacheEntry.engines = [];
- cache.directories[parent.path] = cacheEntry;
+ cache.directories[cacheKey] = cacheEntry;
}
- cache.directories[parent.path].engines.push(engine._serializeToJSON(true));
+ cache.directories[cacheKey].engines.push(engine._serializeToJSON(true));
}
let json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
@@ -2455,13 +2568,21 @@ SearchService.prototype = {
loadDirs.push(dir);
}
+ let loadFromJARs = getBoolPref(BROWSER_SEARCH_PREF + "loadFromJars", false);
+ let chromeURIs = [];
+ let chromeFiles = [];
+ if (loadFromJARs)
+ [chromeFiles, chromeURIs] = this._findJAREngines();
+
+ let toLoad = chromeFiles.concat(loadDirs);
+
function modifiedDir(aDir) {
return (!cache.directories[aDir.path] ||
cache.directories[aDir.path].lastModifiedTime != aDir.lastModifiedTime);
}
- function notInLoadDirs(aCachePath, aIndex)
- aCachePath != loadDirs[aIndex].path;
+ function notInToLoad(aCachePath, aIndex)
+ aCachePath != toLoad[aIndex].path;
let buildID = Cc["@mozilla.org/xre/app-info;1"].
getService(Ci.nsIXULAppInfo).platformBuildID;
@@ -2471,14 +2592,16 @@ SearchService.prototype = {
cache.version != CACHE_VERSION ||
cache.locale != getLocale() ||
cache.buildID != buildID ||
- cachePaths.length != loadDirs.length ||
- cachePaths.some(notInLoadDirs) ||
- loadDirs.some(modifiedDir);
+ cachePaths.length != toLoad.length ||
+ cachePaths.some(notInToLoad) ||
+ toLoad.some(modifiedDir);
if (!cacheEnabled || rebuildCache) {
LOG("_loadEngines: Absent or outdated cache. Loading engines from disk.");
loadDirs.forEach(this._loadEnginesFromDir, this);
+ this._loadFromChromeURLs(chromeURIs);
+
if (cacheEnabled)
this._buildCache();
return;
@@ -2594,10 +2717,21 @@ SearchService.prototype = {
LOG("_loadEnginesFromCache: Loading from cache. " + engines.length + " engines to load.");
for (let i = 0; i < engines.length; i++) {
let json = engines[i];
- let engine = new Engine({cached: true, value: json.filePath}, json._dataType,
- json._readOnly);
- engine._initWithJSON(json);
- this._addEngineToStore(engine);
+
+ try {
+ let engine;
+ if (json.filePath)
+ engine = new Engine({type: "filePath", value: json.filePath}, json._dataType,
+ json._readOnly);
+ else if (json._url)
+ engine = new Engine({type: "uri", value: json._url}, json._dataType, json._readOnly);
+
+ engine._initWithJSON(json);
+ this._addEngineToStore(engine);
+ } catch (ex) {
+ LOG("Failed to load " + engines[i]._name + " from cache: " + ex);
+ LOG("Engine JSON: " + engines[i].toSource());
+ }
}
},
@@ -2610,7 +2744,6 @@ SearchService.prototype = {
var files = aDir.directoryEntries
.QueryInterface(Ci.nsIDirectoryEnumerator);
- var addedEngines = [];
while (files.hasMoreElements()) {
var file = files.nextFile;
@@ -2666,9 +2799,83 @@ SearchService.prototype = {
}
this._addEngineToStore(addedEngine);
- addedEngines.push(addedEngine);
}
- return addedEngines;
+ },
+
+ _loadFromChromeURLs: function SRCH_SVC_loadFromChromeURLs(aURLs) {
+ aURLs.forEach(function (url) {
+ try {
+ LOG("_loadFromChromeURLs: loading engine from chrome url: " + url);
+
+ let engine = new Engine(makeURI(url), SEARCH_DATA_XML, true);
+
+ engine._initFromURISync();
+
+ this._addEngineToStore(engine);
+ } catch (ex) {
+ LOG("_loadFromChromeURLs: failed to load engine: " + ex);
+ }
+ }, this);
+ },
+
+ _findJAREngines: function SRCH_SVC_findJAREngines() {
+ LOG("_findJAREngines: looking for engines in JARs")
+
+ let rootURIPref = ""
+ try {
+ rootURIPref = gPrefSvc.getCharPref(BROWSER_SEARCH_PREF + "jarURIs");
+ } catch (ex) {}
+
+ if (!rootURIPref) {
+ LOG("_findJAREngines: no JAR URIs were specified");
+
+ return [[], []];
+ }
+
+ let rootURIs = rootURIPref.split(",");
+ let uris = [];
+ let chromeFiles = [];
+
+ rootURIs.forEach(function (root) {
+ // Find the underlying JAR file for this chrome package (_loadEngines uses
+ // it to determine whether it needs to invalidate the cache)
+ let chromeFile;
+ try {
+ let chromeURI = gChromeReg.convertChromeURL(makeURI(root));
+ chromeURI.QueryInterface(Ci.nsIJARURI);
+ let fileURI = chromeURI.JARFile;
+ fileURI.QueryInterface(Ci.nsIFileURL);
+ chromeFile = fileURI.file;
+ } catch (ex) {
+ LOG("_findJAREngines: failed to get chromeFile for " + root + ": " + ex);
+ }
+
+ if (!chromeFile)
+ return;
+
+ chromeFiles.push(chromeFile);
+
+ // Read list.txt from the chrome package to find the engines we need to
+ // load
+ let listURL = root + "list.txt";
+ let names = [];
+ try {
+ let chan = gIoSvc.newChannelFromURI(makeURI(listURL));
+ let sis = Cc["@mozilla.org/scriptableinputstream;1"].
+ createInstance(Ci.nsIScriptableInputStream);
+ sis.init(chan.open());
+ let list = sis.read(sis.available());
+ names = list.split("\n").filter(function (n) !!n);
+ } catch (ex) {
+ LOG("_findJAREngines: failed to retrieve list.txt from " + listURL + ": " + ex);
+
+ return;
+ }
+
+ names.forEach(function (n) uris.push(root + n + ".xml"));
+ });
+
+ return [chromeFiles, uris];
},
_saveSortedEngineList: function SRCH_SVC_saveSortedEngineList() {
@@ -2693,6 +2900,7 @@ SearchService.prototype = {
},
_buildSortedEngineList: function SRCH_SVC_buildSortedEngineList() {
+ LOG("_buildSortedEngineList: building list");
var addedEngines = { };
this._sortedEngines = [];
var engine;
@@ -2790,6 +2998,9 @@ SearchService.prototype = {
* @see nsIURL::fileBaseName
*/
_convertSherlockFile: function SRCH_SVC_convertSherlock(aEngine, aBaseName) {
+ ENSURE_WARN(aEngine._file, "can't convert an engine with no file",
+ Cr.NS_ERROR_UNEXPECTED);
+
var oldSherlockFile = aEngine._file;
// Back up the old file
@@ -3488,7 +3699,7 @@ function NSGetModule(componentManager, fileSpec) {
return gModule;
}
-//@line 44 "/builds/moz2_slave/linux_build/build/toolkit/content/debug.js"
+//@line 44 "/builds/slave/linux_build/build/toolkit/content/debug.js"
var EXPORTED_SYMBOLS = ["NS_ASSERT"];
diff --git a/tools/xo_bundle/components/nsSearchSuggestions.js b/tools/xo_bundle/components/nsSearchSuggestions.js
index cfc4ad4..691fb73 100755
--- a/tools/xo_bundle/components/nsSearchSuggestions.js
+++ b/tools/xo_bundle/components/nsSearchSuggestions.js
@@ -75,7 +75,7 @@ function SuggestAutoCompleteResult(searchString,
this._errorDescription = errorDescription;
this._results = results;
this._comments = comments;
- this._formHistoryResult = formHistoryResult;
+ this._formHistResult = formHistoryResult;
}
SuggestAutoCompleteResult.prototype = {
/**
@@ -120,7 +120,7 @@ SuggestAutoCompleteResult.prototype = {
* A reference to the form history nsIAutocompleteResult that we're wrapping.
* We use this to forward removeEntryAt calls as needed.
*/
- _formHistoryResult: null,
+ _formHistResult: null,
/**
* @return the user's query string
@@ -211,10 +211,10 @@ SuggestAutoCompleteResult.prototype = {
// Forward the removeValueAt call to the underlying result if we have one
// Note: this assumes that the form history results were added to the top
// of our arrays.
- if (removeFromDatabase && this._formHistoryResult &&
- index < this._formHistoryResult.matchCount) {
+ if (removeFromDatabase && this._formHistResult &&
+ index < this._formHistResult.matchCount) {
// Delete the history result from the DB
- this._formHistoryResult.removeValueAt(index, true);
+ this._formHistResult.removeValueAt(index, true);
}
this._results.splice(index, 1);
this._comments.splice(index, 1);
@@ -418,11 +418,11 @@ SuggestAutoComplete.prototype = {
* This sends an autocompletion request to the form history service,
* which will call onSearchResults with the results of the query.
*/
- _startHistorySearch: function SAC_SHSearch(searchString, searchParam, previousResult) {
+ _startHistorySearch: function SAC_SHSearch(searchString, searchParam) {
var formHistory =
Cc["@mozilla.org/autocomplete/search;1?name=form-history"].
createInstance(Ci.nsIAutoCompleteSearch);
- formHistory.startSearch(searchString, searchParam, previousResult, this);
+ formHistory.startSearch(searchString, searchParam, this._formHistoryResult, this);
},
/**
@@ -609,6 +609,10 @@ SuggestAutoComplete.prototype = {
* we notify when results are ready.
*/
startSearch: function(searchString, searchParam, previousResult, listener) {
+ // Don't reuse a previous form history result when it no longer applies.
+ if (!previousResult)
+ this._formHistoryResult = null;
+
var searchService = Cc["@mozilla.org/browser/search-service;1"].
getService(Ci.nsIBrowserSearchService);
@@ -634,7 +638,7 @@ SuggestAutoComplete.prototype = {
// has no suggest functionality, or we're in backoff mode; so just use
// local history.
this._sentSuggestRequest = false;
- this._startHistorySearch(searchString, searchParam, previousResult);
+ this._startHistorySearch(searchString, searchParam);
return;
}
@@ -657,7 +661,7 @@ SuggestAutoComplete.prototype = {
if (this._includeFormHistory) {
this._sentSuggestRequest = true;
- this._startHistorySearch(searchString, searchParam, previousResult);
+ this._startHistorySearch(searchString, searchParam);
}
},
diff --git a/tools/xo_bundle/components/nsSessionStartup.js b/tools/xo_bundle/components/nsSessionStartup.js
index 78ab3ce..3624645 100755
--- a/tools/xo_bundle/components/nsSessionStartup.js
+++ b/tools/xo_bundle/components/nsSessionStartup.js
@@ -1,9 +1,9 @@
/*
-//@line 38 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStartup.js"
+//@line 38 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStartup.js"
*/
/**
-//@line 65 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStartup.js"
+//@line 65 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStartup.js"
*/
/* :::::::: Constants and Helpers ::::::::::::::: */
diff --git a/tools/xo_bundle/components/nsSessionStore.js b/tools/xo_bundle/components/nsSessionStore.js
index d7446cb..e1ca95e 100755
--- a/tools/xo_bundle/components/nsSessionStore.js
+++ b/tools/xo_bundle/components/nsSessionStore.js
@@ -21,7 +21,9 @@
* Contributor(s):
* Dietrich Ayala <dietrich@mozilla.com>
* Ehsan Akhgari <ehsan.akhgari@gmail.com>
+ * Michael Kraft <morac99-firefox@yahoo.com>
* Paul O’Shannessy <paul@oshannessy.com>
+ * Nils Maier <maierman@web.de>
*
* 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
@@ -68,15 +70,13 @@ const PRIVACY_ENCRYPTED = 1;
const PRIVACY_FULL = 2;
const NOTIFY_WINDOWS_RESTORED = "sessionstore-windows-restored";
-
-const INTERFACES = [Ci.nsISessionStore, Ci.nsIDOMEventListener,
- Ci.nsIObserver, Ci.nsISupportsWeakReference,
- Ci.nsISessionStore_MOZILLA_1_9_1, Ci.nsIClassInfo];
+const NOTIFY_BROWSER_STATE_RESTORED = "sessionstore-browser-state-restored";
// global notifications observed
const OBSERVING = [
"domwindowopened", "domwindowclosed",
"quit-application-requested", "quit-application-granted",
+ "browser-lastwindow-close-granted",
"quit-application", "browser:purge-session-history",
"private-browsing", "browser:purge-domain-data",
"private-browsing-change-granted"
@@ -101,11 +101,17 @@ const WINDOW_HIDEABLE_FEATURES = [
docShell capabilities to (re)store
Restored in restoreHistory()
eg: browser.docShell["allow" + aCapability] = false;
+
+XXX keep these in sync with all the attributes starting
+ with "allow" in /docshell/base/nsIDocShell.idl
*/
const CAPABILITIES = [
- "Subframes", "Plugins", "Javascript", "MetaRedirects", "Images"
+ "Subframes", "Plugins", "Javascript", "MetaRedirects", "Images",
+ "DNSPrefetch", "Auth"
];
+//@line 116 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function debug(aMsg) {
@@ -114,6 +120,12 @@ function debug(aMsg) {
.logStringMessage(aMsg);
}
+__defineGetter__("NetUtil", function() {
+ delete this.NetUtil;
+ Cu.import("resource://gre/modules/NetUtil.jsm");
+ return NetUtil;
+});
+
/* :::::::: The Service ::::::::::::::: */
function SessionStoreService() {
@@ -123,16 +135,10 @@ SessionStoreService.prototype = {
classDescription: "Browser Session Store Service",
contractID: "@mozilla.org/browser/sessionstore;1",
classID: Components.ID("{5280606b-2510-4fe0-97ef-9b5a22eafe6b}"),
- QueryInterface: XPCOMUtils.generateQI(INTERFACES),
-
- // extra requirements for nsIClassInfo
- getInterfaces: function sss_getInterfaces(aCountRef) {
- aCountRef.value = INTERFACES.length;
- return INTERFACES;
- },
- getHelperForLanguage: function sss_getHelperForLanguage (aLanguage) null,
- implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
- flags: Ci.nsIClassInfo.SINGLETON,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISessionStore,
+ Ci.nsIDOMEventListener,
+ Ci.nsIObserver,
+ Ci.nsISupportsWeakReference]),
// xul:tab attributes to (re)store (extensions might want to hook in here);
// the favicon is always saved for the about:sessionrestore page
@@ -147,9 +153,13 @@ SessionStoreService.prototype = {
// when crash recovery is disabled, session data is not written to disk
_resume_from_crash: true,
- // During the initial restore tracks the number of windows yet to be restored
+ // During the initial restore and setBrowserState calls tracks the number of
+ // windows yet to be restored
_restoreCount: 0,
+ // whether a setBrowserState call is in progress
+ _browserSetState: false,
+
// time in milliseconds (Date.now()) when the session was last written to file
_lastSaveTime: 0,
@@ -174,6 +184,14 @@ SessionStoreService.prototype = {
// whether we clearing history on shutdown
_clearingOnShutdown: false,
+ // List of windows that are being closed during setBrowserState.
+ _closingWindows: [],
+
+//@line 193 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+ // whether the last window was closed and should be restored
+ _restoreLastWindow: false,
+//@line 196 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+
/* ........ Global Event Handlers .............. */
/**
@@ -192,11 +210,11 @@ SessionStoreService.prototype = {
getService(Ci.nsIPrefService).getBranch("browser.");
this._prefBranch.QueryInterface(Ci.nsIPrefBranch2);
- var observerService = Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
+ this._observerService = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
OBSERVING.forEach(function(aTopic) {
- observerService.addObserver(this, aTopic, true);
+ this._observerService.addObserver(this, aTopic, true);
}, this);
var pbs = Cc["@mozilla.org/privatebrowsing;1"].
@@ -261,6 +279,8 @@ SessionStoreService.prototype = {
// make sure that at least the first window doesn't have anything hidden
delete this._initialState.windows[0].hidden;
+ // Since nothing is hidden in the first window, it cannot be a popup
+ delete this._initialState.windows[0].isPopup;
}
catch (ex) { debug("The session file is invalid: " + ex); }
}
@@ -321,6 +341,14 @@ SessionStoreService.prototype = {
}, false);
break;
case "domwindowclosed": // catch closed windows
+ if (this._closingWindows.length > 0) {
+ let index = this._closingWindows.indexOf(aSubject);
+ if (index != -1) {
+ this._closingWindows.splice(index, 1);
+ if (this._closingWindows.length == 0)
+ this._sendRestoreCompletedNotifications(true);
+ }
+ }
this.onClose(aSubject);
break;
case "quit-application-requested":
@@ -334,6 +362,15 @@ SessionStoreService.prototype = {
// freeze the data at what we've got (ignoring closing windows)
this._loadState = STATE_QUITTING;
break;
+//@line 368 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+ case "browser-lastwindow-close-granted":
+ // last browser window is quitting.
+ // remember to restore the last window when another browser window is openend
+ // do not account for pref(resume_session_once) at this point, as it might be
+ // set by another observer getting this notice after us
+ this._restoreLastWindow = true;
+ break;
+//@line 376 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
case "quit-application":
if (aData == "restart") {
this._prefBranch.setBoolPref("sessionstore.resume_session_once", true);
@@ -345,8 +382,8 @@ SessionStoreService.prototype = {
case "browser:purge-session-history": // catch sanitization
let openWindows = {};
this._forEachBrowserWindow(function(aWindow) {
- Array.forEach(aWindow.getBrowser().browsers, function(aBrowser) {
- delete aBrowser.parentNode.__SS_data;
+ Array.forEach(aWindow.gBrowser.browsers, function(aBrowser) {
+ delete aBrowser.__SS_data;
});
openWindows[aWindow.__SSi] = true;
});
@@ -499,36 +536,35 @@ SessionStoreService.prototype = {
* Implement nsIDOMEventListener for handling various window and tab events
*/
handleEvent: function sss_handleEvent(aEvent) {
+ var win = aEvent.currentTarget.ownerDocument.defaultView;
switch (aEvent.type) {
case "load":
case "pageshow":
- this.onTabLoad(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent);
+ this.onTabLoad(win, aEvent.currentTarget, aEvent);
break;
case "change":
case "input":
case "DOMAutoComplete":
- this.onTabInput(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget);
+ this.onTabInput(win, aEvent.currentTarget);
break;
case "scroll":
- this.onTabScroll(aEvent.currentTarget.ownerDocument.defaultView);
+ this.onTabScroll(win);
break;
case "TabOpen":
case "TabClose":
- var panelID = aEvent.originalTarget.linkedPanel;
- var tabpanel = aEvent.originalTarget.ownerDocument.getElementById(panelID);
+ let browser = aEvent.originalTarget.linkedBrowser;
if (aEvent.type == "TabOpen") {
- this.onTabAdd(aEvent.currentTarget.ownerDocument.defaultView, tabpanel);
+ this.onTabAdd(win, browser);
}
else {
// aEvent.detail determines if the tab was closed by moving to a different window
if (!aEvent.detail)
- this.onTabClose(aEvent.currentTarget.ownerDocument.defaultView, aEvent.originalTarget);
- this.onTabRemove(aEvent.currentTarget.ownerDocument.defaultView, tabpanel);
+ this.onTabClose(win, aEvent.originalTarget);
+ this.onTabRemove(win, browser);
}
break;
case "TabSelect":
- var tabpanels = aEvent.currentTarget.mPanelContainer;
- this.onTabSelect(aEvent.currentTarget.ownerDocument.defaultView, tabpanels);
+ this.onTabSelect(win);
break;
}
},
@@ -573,19 +609,16 @@ SessionStoreService.prototype = {
this.restoreWindow(aWindow, this._initialState, this._isCmdLineEmpty(aWindow));
delete this._initialState;
- // mark ourselves as running
+ // _loadState changed from "stopped" to "running"
+ // force a save operation so that crashes happening during startup are correctly counted
this.saveState(true);
}
else {
// Nothing to restore, notify observers things are complete.
- var observerService = Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
- observerService.notifyObservers(null, NOTIFY_WINDOWS_RESTORED, "");
+ this._observerService.notifyObservers(null, NOTIFY_WINDOWS_RESTORED, "");
-//@line 586 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
// the next delayed save request should execute immediately
this._lastSaveTime -= this._interval;
-//@line 593 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
}
}
// this window was opened by _openWindowWithState
@@ -593,13 +626,43 @@ SessionStoreService.prototype = {
let followUp = this._statesToRestore[aWindow.__SS_restoreID].windows.length == 1;
this.restoreWindow(aWindow, this._statesToRestore[aWindow.__SS_restoreID], true, followUp);
}
-
- var tabbrowser = aWindow.getBrowser();
- var tabpanels = tabbrowser.mPanelContainer;
+//@line 632 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+ else if (this._restoreLastWindow && aWindow.toolbar.visible &&
+ this._closedWindows.length && this._doResumeSession() &&
+ !this._inPrivateBrowsing) {
+
+ // default to the most-recently closed window
+ // don't use popup windows
+ let state = null;
+ this._closedWindows = this._closedWindows.filter(function(aWinState) {
+ if (!state && !aWinState.isPopup) {
+ state = aWinState;
+ return false;
+ }
+ return true;
+ });
+ if (state) {
+ delete state.hidden;
+ state = { windows: [state] };
+ this._restoreCount = 1;
+ this.restoreWindow(aWindow, state, this._isCmdLineEmpty(aWindow));
+ }
+ // we actually restored the session just now.
+ this._prefBranch.setBoolPref("sessionstore.resume_session_once", false);
+ }
+ if (this._restoreLastWindow && aWindow.toolbar.visible) {
+ // always reset (if not a popup window)
+ // we don't want to restore a window directly after, for example,
+ // undoCloseWindow was executed.
+ this._restoreLastWindow = false;
+ }
+//@line 662 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+
+ var tabbrowser = aWindow.gBrowser;
// add tab change listeners to all already existing tabs
- for (var i = 0; i < tabpanels.childNodes.length; i++) {
- this.onTabAdd(aWindow, tabpanels.childNodes[i], true);
+ for (let i = 0; i < tabbrowser.browsers.length; i++) {
+ this.onTabAdd(aWindow, tabbrowser.browsers[i], true);
}
// notification of tab add/remove/selection
tabbrowser.addEventListener("TabOpen", this, true);
@@ -634,8 +697,7 @@ SessionStoreService.prototype = {
delete this.windowToFocus;
}
- var tabbrowser = aWindow.getBrowser();
- var tabpanels = tabbrowser.mPanelContainer;
+ var tabbrowser = aWindow.gBrowser;
tabbrowser.removeEventListener("TabOpen", this, true);
tabbrowser.removeEventListener("TabClose", this, true);
@@ -667,8 +729,8 @@ SessionStoreService.prototype = {
this.saveStateDelayed();
}
- for (var i = 0; i < tabpanels.childNodes.length; i++) {
- this.onTabRemove(aWindow, tabpanels.childNodes[i], true);
+ for (let i = 0; i < tabbrowser.browsers.length; i++) {
+ this.onTabRemove(aWindow, tabbrowser.browsers[i], true);
}
// cache the window state until the window is completely gone
@@ -681,42 +743,44 @@ SessionStoreService.prototype = {
* set up listeners for a new tab
* @param aWindow
* Window reference
- * @param aPanel
- * TabPanel reference
+ * @param aBrowser
+ * Browser reference
* @param aNoNotification
* bool Do not save state if we're updating an existing tab
*/
- onTabAdd: function sss_onTabAdd(aWindow, aPanel, aNoNotification) {
- aPanel.addEventListener("load", this, true);
- aPanel.addEventListener("pageshow", this, true);
- aPanel.addEventListener("change", this, true);
- aPanel.addEventListener("input", this, true);
- aPanel.addEventListener("DOMAutoComplete", this, true);
- aPanel.addEventListener("scroll", this, true);
+ onTabAdd: function sss_onTabAdd(aWindow, aBrowser, aNoNotification) {
+ aBrowser.addEventListener("load", this, true);
+ aBrowser.addEventListener("pageshow", this, true);
+ aBrowser.addEventListener("change", this, true);
+ aBrowser.addEventListener("input", this, true);
+ aBrowser.addEventListener("DOMAutoComplete", this, true);
+ aBrowser.addEventListener("scroll", this, true);
if (!aNoNotification) {
this.saveStateDelayed(aWindow);
}
+
+ this._updateCrashReportURL(aWindow);
},
/**
* remove listeners for a tab
* @param aWindow
* Window reference
- * @param aPanel
- * TabPanel reference
+ * @param aBrowser
+ * Browser reference
* @param aNoNotification
* bool Do not save state if we're updating an existing tab
*/
- onTabRemove: function sss_onTabRemove(aWindow, aPanel, aNoNotification) {
- aPanel.removeEventListener("load", this, true);
- aPanel.removeEventListener("pageshow", this, true);
- aPanel.removeEventListener("change", this, true);
- aPanel.removeEventListener("input", this, true);
- aPanel.removeEventListener("DOMAutoComplete", this, true);
- aPanel.removeEventListener("scroll", this, true);
+ onTabRemove: function sss_onTabRemove(aWindow, aBrowser, aNoNotification) {
+ aBrowser.removeEventListener("load", this, true);
+ aBrowser.removeEventListener("pageshow", this, true);
+ aBrowser.removeEventListener("change", this, true);
+ aBrowser.removeEventListener("input", this, true);
+ aBrowser.removeEventListener("DOMAutoComplete", this, true);
+ aBrowser.removeEventListener("scroll", this, true);
- delete aPanel.__SS_data;
+ delete aBrowser.__SS_data;
if (!aNoNotification) {
this.saveStateDelayed(aWindow);
@@ -728,7 +792,7 @@ SessionStoreService.prototype = {
* @param aWindow
* Window reference
* @param aTab
- * TabPanel reference
+ * Tab reference
*/
onTabClose: function sss_onTabClose(aWindow, aTab) {
// notify the tabbrowser that the tab state will be retrieved for the last time
@@ -769,19 +833,19 @@ SessionStoreService.prototype = {
* When a tab loads, save state.
* @param aWindow
* Window reference
- * @param aPanel
- * TabPanel reference
+ * @param aBrowser
+ * Browser reference
* @param aEvent
* Event obj
*/
- onTabLoad: function sss_onTabLoad(aWindow, aPanel, aEvent) {
+ onTabLoad: function sss_onTabLoad(aWindow, aBrowser, aEvent) {
// react on "load" and solitary "pageshow" events (the first "pageshow"
// following "load" is too late for deleting the data caches)
if (aEvent.type != "load" && !aEvent.persisted) {
return;
}
- delete aPanel.__SS_data;
+ delete aBrowser.__SS_data;
this.saveStateDelayed(aWindow);
// attempt to update the current URL we send in a crash report
@@ -789,21 +853,21 @@ SessionStoreService.prototype = {
},
/**
- * Called when a tabpanel sends the "input" notification
+ * Called when a browser sends the "input" notification
* @param aWindow
* Window reference
- * @param aPanel
- * TabPanel reference
+ * @param aBrowser
+ * Browser reference
*/
- onTabInput: function sss_onTabInput(aWindow, aPanel) {
- if (aPanel.__SS_data)
- delete aPanel.__SS_data._formDataSaved;
+ onTabInput: function sss_onTabInput(aWindow, aBrowser) {
+ if (aBrowser.__SS_data)
+ delete aBrowser.__SS_data._formDataSaved;
this.saveStateDelayed(aWindow, 3000);
},
/**
- * Called when a tabpanel sends a "scroll" notification
+ * Called when a browser sends a "scroll" notification
* @param aWindow
* Window reference
*/
@@ -815,12 +879,10 @@ SessionStoreService.prototype = {
* When a tab is selected, save session data
* @param aWindow
* Window reference
- * @param aPanels
- * TabPanel reference
*/
- onTabSelect: function sss_onTabSelect(aWindow, aPanels) {
+ onTabSelect: function sss_onTabSelect(aWindow) {
if (this._loadState == STATE_RUNNING) {
- this._windows[aWindow.__SSi].selected = aPanels.selectedIndex;
+ this._windows[aWindow.__SSi].selected = aWindow.gBrowser.tabContainer.selectedIndex;
this.saveStateDelayed(aWindow);
// attempt to update the current URL we send in a crash report
@@ -841,23 +903,31 @@ SessionStoreService.prototype = {
catch (ex) { /* invalid state object - don't restore anything */ }
if (!state || !state.windows)
throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
-
+
+ this._browserSetState = true;
+
var window = this._getMostRecentBrowserWindow();
if (!window) {
+ this._restoreCount = 1;
this._openWindowWithState(state);
return;
}
+ // make sure closed window data isn't kept
+ this._closedWindows = [];
+
+ // determine how many windows are meant to be restored
+ this._restoreCount = state.windows ? state.windows.length : 0;
+
+ var self = this;
// close all other browser windows
this._forEachBrowserWindow(function(aWindow) {
if (aWindow != window) {
+ self._closingWindows.push(aWindow);
aWindow.close();
}
});
- // make sure closed window data isn't kept
- this._closedWindows = [];
-
// restore to the given state
this.restoreWindow(window, state, true);
},
@@ -965,6 +1035,21 @@ SessionStoreService.prototype = {
return tab;
},
+ forgetClosedTab: function sss_forgetClosedTab(aWindow, aIndex) {
+ if (!aWindow.__SSi)
+ throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
+
+ var closedTabs = this._windows[aWindow.__SSi]._closedTabs;
+
+ // default to the most-recently closed tab
+ aIndex = aIndex || 0;
+ if (!(aIndex in closedTabs))
+ throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
+
+ // remove closed tab from the array
+ closedTabs.splice(aIndex, 1);
+ },
+
getClosedWindowCount: function sss_getClosedWindowCount() {
return this._closedWindows.length;
},
@@ -974,10 +1059,7 @@ SessionStoreService.prototype = {
},
undoCloseWindow: function sss_undoCloseWindow(aIndex) {
- // default to the most-recently closed window
- aIndex = aIndex || 0;
-
- if (!aIndex in this._closedWindows)
+ if (!(aIndex in this._closedWindows))
throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
// reopen the window
@@ -987,6 +1069,16 @@ SessionStoreService.prototype = {
return window;
},
+ forgetClosedWindow: function sss_forgetClosedWindow(aIndex) {
+ // default to the most-recently closed window
+ aIndex = aIndex || 0;
+ if (!(aIndex in this._closedWindows))
+ throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG);
+
+ // remove closed window from the array
+ this._closedWindows.splice(aIndex, 1);
+ },
+
getWindowValue: function sss_getWindowValue(aWindow, aKey) {
if (aWindow.__SSi) {
var data = this._windows[aWindow.__SSi].extData || {};
@@ -1081,9 +1173,9 @@ SessionStoreService.prototype = {
if (!browser || !browser.currentURI)
// can happen when calling this function right after .addTab()
return tabData;
- else if (browser.parentNode.__SS_data && browser.parentNode.__SS_data._tabStillLoading)
+ else if (browser.__SS_data && browser.__SS_data._tabStillLoading)
// use the data to be restored when the tab hasn't been completely loaded
- return browser.parentNode.__SS_data;
+ return browser.__SS_data;
var history = null;
try {
@@ -1093,10 +1185,10 @@ SessionStoreService.prototype = {
// XXXzeniko anchor navigation doesn't reset __SS_data, so we could reuse
// data even when we shouldn't (e.g. Back, different anchor)
- if (history && browser.parentNode.__SS_data &&
- browser.parentNode.__SS_data.entries[history.index] &&
+ if (history && browser.__SS_data &&
+ browser.__SS_data.entries[history.index] &&
history.index < this._sessionhistory_max_entries - 1 && !aFullData) {
- tabData = browser.parentNode.__SS_data;
+ tabData = browser.__SS_data;
tabData.index = history.index + 1;
}
else if (history && history.count > 0) {
@@ -1107,14 +1199,23 @@ SessionStoreService.prototype = {
// make sure not to cache privacy sensitive data which shouldn't get out
if (!aFullData)
- browser.parentNode.__SS_data = tabData;
+ browser.__SS_data = tabData;
}
else if (browser.currentURI.spec != "about:blank" ||
browser.contentDocument.body.hasChildNodes()) {
tabData.entries[0] = { url: browser.currentURI.spec };
tabData.index = 1;
}
-
+
+ // If there is a userTypedValue set, then either the user has typed something
+ // in the URL bar, or a new tab was opened with a URI to load. userTypedClear
+ // is used to indicate whether the tab was in some sort of loading state with
+ // userTypedValue.
+ if (browser.userTypedValue) {
+ tabData.userTypedValue = browser.userTypedValue;
+ tabData.userTypedClear = browser.userTypedClear;
+ }
+
var disallow = [];
for (var i = 0; i < CAPABILITIES.length; i++)
if (!browser.docShell["allow" + CAPABILITIES[i]])
@@ -1174,6 +1275,9 @@ SessionStoreService.prototype = {
}
entry.ID = aEntry.ID;
+ if (aEntry.referrerURI)
+ entry.referrer = aEntry.referrerURI.spec;
+
if (aEntry.contentType)
entry.contentType = aEntry.contentType;
@@ -1272,7 +1376,6 @@ SessionStoreService.prototype = {
let storageData = {};
let hasContent = false;
- aDocShell.QueryInterface(Ci.nsIDocShell_MOZILLA_1_9_1_SessionStorage);
for (let i = 0; i < aHistory.count; i++) {
let uri = aHistory.getEntryAtIndex(i, false).URI;
// sessionStorage is saved per origin (cf. nsDocShell::GetSessionStorageForURI)
@@ -1331,8 +1434,8 @@ SessionStoreService.prototype = {
for (var i = 0; i < browsers.length; i++) {
try {
var tabData = this._windows[aWindow.__SSi].tabs[i];
- if (browsers[i].parentNode.__SS_data &&
- browsers[i].parentNode.__SS_data._tabStillLoading)
+ if (browsers[i].__SS_data &&
+ browsers[i].__SS_data._tabStillLoading)
continue; // ignore incompletely initialized tabs
this._updateTextAndScrollDataForTab(aWindow, browsers[i], tabData);
}
@@ -1481,7 +1584,7 @@ SessionStoreService.prototype = {
if (node.type != "file")
data[id] = node.type == "checkbox" || node.type == "radio" ? node.checked : node.value;
else
- data[id] = { type: "file", value: node.value };
+ data[id] = { type: "file", fileList: node.mozGetFileNameArray({}) };
}
else if (node instanceof Ci.nsIDOMHTMLTextAreaElement)
data[id] = node.value;
@@ -1504,17 +1607,12 @@ SessionStoreService.prototype = {
_updateCookieHosts: function sss_updateCookieHosts(aWindow) {
var hosts = this._windows[aWindow.__SSi]._hosts = {};
- // get all possible subdomain levels for a given URL
- var _this = this;
+ // get the domain for each URL
function extractHosts(aEntry) {
- if (/^https?:\/\/(?:[^@\/\s]+@)?([\w.-]+)/.test(aEntry.url) &&
- !hosts[RegExp.$1] && _this._checkPrivacyLevel(_this._getURIFromString(aEntry.url).schemeIs("https"))) {
- var host = RegExp.$1;
- var ix;
- for (ix = host.indexOf(".") + 1; ix; ix = host.indexOf(".", ix) + 1) {
- hosts[host.substr(ix)] = true;
+ if (/^https?:\/\/(?:[^@\/\s]+@)?([\w.-]+)/.test(aEntry.url)) {
+ if (!hosts[RegExp.$1] && _this._checkPrivacyLevel(_this._getURIFromString(aEntry.url).schemeIs("https"))) {
+ hosts[RegExp.$1] = true;
}
- hosts[host] = true;
}
else if (/^file:\/\/([^\/]*)/.test(aEntry.url)) {
hosts[RegExp.$1] = true;
@@ -1523,7 +1621,8 @@ SessionStoreService.prototype = {
aEntry.children.forEach(extractHosts);
}
}
-
+
+ var _this = this;
this._windows[aWindow.__SSi].tabs.forEach(function(aTabData) { aTabData.entries.forEach(extractHosts); });
},
@@ -1533,36 +1632,52 @@ SessionStoreService.prototype = {
* array of Window references
*/
_updateCookies: function sss_updateCookies(aWindows) {
- var cookiesEnum = Cc["@mozilla.org/cookiemanager;1"].
- getService(Ci.nsICookieManager).enumerator;
+ function addCookieToHash(aHash, aHost, aPath, aName, aCookie) {
+ // lazily build up a 3-dimensional hash, with
+ // aHost, aPath, and aName as keys
+ if (!aHash[aHost])
+ aHash[aHost] = {};
+ if (!aHash[aHost][aPath])
+ aHash[aHost][aPath] = {};
+ aHash[aHost][aPath][aName] = aCookie;
+ }
+
+ var cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
// collect the cookies per window
for (var i = 0; i < aWindows.length; i++)
aWindows[i].cookies = [];
-
+
+ var jscookies = {};
+ var _this = this;
// MAX_EXPIRY should be 2^63-1, but JavaScript can't handle that precision
var MAX_EXPIRY = Math.pow(2, 62);
- while (cookiesEnum.hasMoreElements()) {
- var cookie = cookiesEnum.getNext().QueryInterface(Ci.nsICookie2);
- if (cookie.isSession && this._checkPrivacyLevel(cookie.isSecure)) {
- var jscookie = null;
- aWindows.forEach(function(aWindow) {
- if (aWindow._hosts && aWindow._hosts[cookie.rawHost]) {
- // serialize the cookie when it's first needed
- if (!jscookie) {
- jscookie = { host: cookie.host, value: cookie.value };
+ aWindows.forEach(function(aWindow) {
+ for (var host in aWindow._hosts) {
+ var list = cm.getCookiesFromHost(host);
+ while (list.hasMoreElements()) {
+ var cookie = list.getNext().QueryInterface(Ci.nsICookie2);
+ if (cookie.isSession && _this._checkPrivacyLevel(cookie.isSecure)) {
+ // use the cookie's host, path, and name as keys into a hash,
+ // to make sure we serialize each cookie only once
+ if (!(cookie.host in jscookies &&
+ cookie.path in jscookies[cookie.host] &&
+ cookie.name in jscookies[cookie.host][cookie.path])) {
+ var jscookie = { "host": cookie.host, "value": cookie.value };
// only add attributes with non-default values (saving a few bits)
if (cookie.path) jscookie.path = cookie.path;
if (cookie.name) jscookie.name = cookie.name;
if (cookie.isSecure) jscookie.secure = true;
if (cookie.isHttpOnly) jscookie.httponly = true;
if (cookie.expiry < MAX_EXPIRY) jscookie.expiry = cookie.expiry;
+
+ addCookieToHash(jscookies, cookie.host, cookie.path, cookie.name, jscookie);
}
- aWindow.cookies.push(jscookie);
+ aWindow.cookies.push(jscookies[cookie.host][cookie.path][cookie.name]);
}
- });
+ }
}
- }
-
+ });
+
// don't include empty cookie sections
for (i = 0; i < aWindows.length; i++)
if (aWindows[i].cookies.length == 0)
@@ -1631,7 +1746,7 @@ SessionStoreService.prototype = {
nonPopupCount++;
}
this._updateCookies(total);
-
+
// collect the data for all windows yet to be restored
for (ix in this._statesToRestore) {
for each (let winData in this._statesToRestore[ix].windows) {
@@ -1644,7 +1759,7 @@ SessionStoreService.prototype = {
// shallow copy this._closedWindows to preserve current state
let lastClosedWindowsCopy = this._closedWindows.slice();
-//@line 1652 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+//@line 1765 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
// if no non-popup browser window remains open, return the state of the last closed window(s)
if (nonPopupCount == 0 && lastClosedWindowsCopy.length > 0) {
// prepend the last non-popup browser window, so that if the user loads more tabs
@@ -1653,7 +1768,7 @@ SessionStoreService.prototype = {
total.unshift(lastClosedWindowsCopy.shift())
} while (total[0].isPopup)
}
-//@line 1661 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+//@line 1774 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
if (activeWindow) {
this.activeWindowSSiCache = activeWindow.__SSi || "";
@@ -1720,13 +1835,13 @@ SessionStoreService.prototype = {
try {
var root = typeof aState == "string" ? this._safeEval(aState) : aState;
if (!root.windows[0]) {
- this._notifyIfAllWindowsRestored();
+ this._sendRestoreCompletedNotifications();
return; // nothing to restore
}
}
catch (ex) { // invalid state object - don't restore anything
debug(ex);
- this._notifyIfAllWindowsRestored();
+ this._sendRestoreCompletedNotifications();
return;
}
@@ -1790,20 +1905,21 @@ SessionStoreService.prototype = {
if (aOverwriteTabs) {
this.restoreWindowFeatures(aWindow, winData);
+ delete this._windows[aWindow.__SSi].extData;
}
if (winData.cookies) {
this.restoreCookies(winData.cookies);
}
if (winData.extData) {
- if (aOverwriteTabs || !this._windows[aWindow.__SSi].extData) {
+ if (!this._windows[aWindow.__SSi].extData) {
this._windows[aWindow.__SSi].extData = {};
}
for (var key in winData.extData) {
this._windows[aWindow.__SSi].extData[key] = winData.extData[key];
}
}
- if (winData._closedTabs && (root._firstTabs || aOverwriteTabs)) {
- this._windows[aWindow.__SSi]._closedTabs = winData._closedTabs;
+ if (aOverwriteTabs || root._firstTabs) {
+ this._windows[aWindow.__SSi]._closedTabs = winData._closedTabs || [];
}
this.restoreHistoryPrecursor(aWindow, tabs, winData.tabs,
@@ -1812,7 +1928,7 @@ SessionStoreService.prototype = {
// set smoothScroll back to the original value
tabstrip.smoothScroll = smoothScroll;
- this._notifyIfAllWindowsRestored();
+ this._sendRestoreCompletedNotifications();
},
/**
@@ -1880,14 +1996,13 @@ SessionStoreService.prototype = {
// keep the data around to prevent dataloss in case
// a tab gets closed before it's been properly restored
- browser.parentNode.__SS_data = aTabData[t];
+ browser.__SS_data = aTabData[t];
}
if (aTabs.length > 0) {
// Determine if we can optimize & load visible tabs first
- let tabScrollBoxObject = tabbrowser.tabContainer.mTabstrip.scrollBoxObject;
- let tabBoxObject = aTabs[0].boxObject;
- let maxVisibleTabs = Math.ceil(tabScrollBoxObject.width / tabBoxObject.width);
+ let maxVisibleTabs = Math.ceil(tabbrowser.tabContainer.mTabstrip.scrollClientSize /
+ aTabs[0].clientWidth);
// make sure we restore visible tabs first, if there are enough
if (maxVisibleTabs < aTabs.length && aSelectTab > 1) {
@@ -1967,6 +2082,9 @@ SessionStoreService.prototype = {
delete tab.__SS_extdata;
for (var i = 0; i < tabData.entries.length; i++) {
+ //XXXzpao Wallpaper patch for bug 514751
+ if (!tabData.entries[i].url)
+ continue;
history.addEntry(this._deserializeHistoryEntry(tabData.entries[i], aIdMap), true);
}
@@ -2020,7 +2138,15 @@ SessionStoreService.prototype = {
browser.__SS_restore = this.restoreDocument_proxy;
browser.addEventListener("load", browser.__SS_restore, true);
}
-
+
+ // Handle userTypedValue. Setting userTypedValue seems to update gURLbar
+ // as needed. Calling loadURI will cancel form filling in restoreDocument_proxy
+ if (tabData.userTypedValue) {
+ browser.userTypedValue = tabData.userTypedValue;
+ if (tabData.userTypedClear)
+ browser.loadURI(tabData.userTypedValue, null, null, true);
+ }
+
aWindow.setTimeout(function(){ _this.restoreHistory(aWindow, aTabs, aTabData, aIdMap); }, 0);
},
@@ -2045,6 +2171,8 @@ SessionStoreService.prototype = {
shEntry.loadType = Ci.nsIDocShellLoadInfo.loadHistory;
if (aEntry.contentType)
shEntry.contentType = aEntry.contentType;
+ if (aEntry.referrer)
+ shEntry.referrerURI = ioService.newURI(aEntry.referrer, null, null);
if (aEntry.cacheKey) {
var cacheKey = Cc["@mozilla.org/supports-PRUint32;1"].
@@ -2105,6 +2233,9 @@ SessionStoreService.prototype = {
if (aEntry.children && shEntry instanceof Ci.nsISHContainer) {
for (var i = 0; i < aEntry.children.length; i++) {
+ //XXXzpao Wallpaper patch for bug 514751
+ if (!aEntry.children[i].url)
+ continue;
shEntry.AddChild(this._deserializeHistoryEntry(aEntry.children[i], aIdMap), i);
}
}
@@ -2123,8 +2254,7 @@ SessionStoreService.prototype = {
let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
for (let url in aStorageData) {
let uri = ioService.newURI(url, null, null);
- let docShell_191 = aDocShell.QueryInterface(Ci.nsIDocShell_MOZILLA_1_9_1_SessionStorage);
- let storage = docShell_191.getSessionStorageForURI(uri);
+ let storage = aDocShell.getSessionStorageForURI(uri);
for (let key in aStorageData[url]) {
try {
storage.setItem(key, aStorageData[url][key]);
@@ -2193,8 +2323,8 @@ SessionStoreService.prototype = {
try {
node.selectedIndex = value;
} catch (ex) { /* throws for invalid indices */ }
- else if (value && value.type && value.type == node.type)
- node.value = value.value;
+ else if (value && value.fileList && value.type == "file" && node.type == "file")
+ node.mozSetFileNameArray(value.fileList, value.fileList.length);
else if (value && typeof value.indexOf == "function" && node.options) {
Array.forEach(node.options, function(aOpt, aIx) {
aOpt.selected = value.indexOf(aIx) > -1;
@@ -2344,7 +2474,7 @@ SessionStoreService.prototype = {
}
// since resizing/moving a window brings it to the foreground,
// we might want to re-focus the last focused window
- if (this.windowToFocus) {
+ if (this.windowToFocus && this.windowToFocus.content) {
this.windowToFocus.content.focus();
}
},
@@ -2449,9 +2579,8 @@ SessionStoreService.prototype = {
// parentheses are for backwards compatibility with Firefox 2.0 and 3.0
stateString.data = "(" + this._toJSONString(aStateObj) + ")";
- var observerService = Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
- observerService.notifyObservers(stateString, "sessionstore-state-write", "");
+ this._observerService.notifyObservers(stateString,
+ "sessionstore-state-write", "");
// don't touch the file if an observer has deleted all state data
if (stateString.data)
@@ -2493,7 +2622,7 @@ SessionStoreService.prototype = {
while (windowsEnum.hasMoreElements()) {
var window = windowsEnum.getNext();
- if (window.__SSi) {
+ if (window.__SSi && !window.closed) {
aFunc.call(this, window);
}
}
@@ -2504,9 +2633,26 @@ SessionStoreService.prototype = {
* @returns Window reference
*/
_getMostRecentBrowserWindow: function sss_getMostRecentBrowserWindow() {
- var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator);
- return windowMediator.getMostRecentWindow("navigator:browser");
+ var wm = Cc["@mozilla.org/appshell/window-mediator;1"].
+ getService(Ci.nsIWindowMediator);
+
+ var win = wm.getMostRecentWindow("navigator:browser");
+ if (!win)
+ return null;
+ if (!win.closed)
+ return win;
+
+//@line 2648 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+ win = null;
+ var windowsEnum = wm.getEnumerator("navigator:browser");
+ // this is oldest to newest, so this gets a bit ugly
+ while (windowsEnum.hasMoreElements()) {
+ let nextWin = windowsEnum.getNext();
+ if (!nextWin.closed)
+ win = nextWin;
+ }
+ return win;
+//@line 2666 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
},
/**
@@ -2587,6 +2733,7 @@ SessionStoreService.prototype = {
_getWindowDimension: function sss_getWindowDimension(aWindow, aAttribute) {
if (aAttribute == "sizemode") {
switch (aWindow.windowState) {
+ case aWindow.STATE_FULLSCREEN:
case aWindow.STATE_MAXIMIZED:
return "maximized";
case aWindow.STATE_MINIMIZED:
@@ -2719,15 +2866,17 @@ SessionStoreService.prototype = {
return jsonString;
},
- _notifyIfAllWindowsRestored: function sss_notifyIfAllWindowsRestored() {
- if (this._restoreCount) {
+ _sendRestoreCompletedNotifications:
+ function sss_sendRestoreCompletedNotifications(aOnWindowClose) {
+ if (this._restoreCount && !aOnWindowClose)
this._restoreCount--;
- if (this._restoreCount == 0) {
- // This was the last window restored at startup, notify observers.
- var observerService = Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
- observerService.notifyObservers(null, NOTIFY_WINDOWS_RESTORED, "");
- }
+
+ if (this._restoreCount == 0 && this._closingWindows.length == 0) {
+ // This was the last window restored at startup, notify observers.
+ this._observerService.notifyObservers(null,
+ this._browserSetState ? NOTIFY_BROWSER_STATE_RESTORED : NOTIFY_WINDOWS_RESTORED,
+ "");
+ this._browserSetState = false;
}
},
@@ -2767,7 +2916,7 @@ SessionStoreService.prototype = {
if (this._closedWindows.length <= maxWindowsUndo)
return;
let spliceTo = maxWindowsUndo;
-//@line 2775 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+//@line 2930 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
let normalWindowIndex = 0;
// try to find a non-popup window in this._closedWindows
while (normalWindowIndex < this._closedWindows.length &&
@@ -2775,7 +2924,7 @@ SessionStoreService.prototype = {
normalWindowIndex++;
if (normalWindowIndex >= maxWindowsUndo)
spliceTo = normalWindowIndex + 1;
-//@line 2783 "/builds/moz2_slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
+//@line 2938 "/builds/slave/linux_build/build/browser/components/sessionstore/src/nsSessionStore.js"
this._closedWindows.splice(spliceTo);
},
@@ -2789,25 +2938,26 @@ SessionStoreService.prototype = {
* String data
*/
_writeFile: function sss_writeFile(aFile, aData) {
- // init stream
- var stream = Cc["@mozilla.org/network/safe-file-output-stream;1"].
- createInstance(Ci.nsIFileOutputStream);
- stream.init(aFile, 0x02 | 0x08 | 0x20, 0600, 0);
+ // Initialize the file output stream.
+ var ostream = Cc["@mozilla.org/network/safe-file-output-stream;1"].
+ createInstance(Ci.nsIFileOutputStream);
+ ostream.init(aFile, 0x02 | 0x08 | 0x20, 0600, 0);
- // convert to UTF-8
+ // Obtain a converter to convert our data to a UTF-8 encoded input stream.
var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
- var convertedData = converter.ConvertFromUnicode(aData);
- convertedData += converter.Finish();
- // write and close stream
- stream.write(convertedData, convertedData.length);
- if (stream instanceof Ci.nsISafeOutputStream) {
- stream.finish();
- } else {
- stream.close();
- }
+ // Asynchronously copy the data to the file.
+ var istream = converter.convertToInputStream(aData);
+ var self = this;
+ NetUtil.asyncCopy(istream, ostream, function(rc) {
+ if (Components.isSuccessCode(rc)) {
+ self._observerService.notifyObservers(null,
+ "sessionstore-state-write-complete",
+ "");
+ }
+ });
}
};
diff --git a/tools/xo_bundle/components/nsSidebar.js b/tools/xo_bundle/components/nsSidebar.js
index 63a76da..415ad8d 100755
--- a/tools/xo_bundle/components/nsSidebar.js
+++ b/tools/xo_bundle/components/nsSidebar.js
@@ -1,4 +1,4 @@
-//@line 43 "/builds/moz2_slave/linux_build/build/browser/components/sidebar/src/nsSidebar.js"
+//@line 43 "/builds/slave/linux_build/build/browser/components/sidebar/src/nsSidebar.js"
/*
* No magic constructor behaviour, as is de rigeur for XPCOM.
diff --git a/tools/xo_bundle/components/nsTaggingService.js b/tools/xo_bundle/components/nsTaggingService.js
index 1ca96aa..87459ff 100755
--- a/tools/xo_bundle/components/nsTaggingService.js
+++ b/tools/xo_bundle/components/nsTaggingService.js
@@ -86,7 +86,6 @@ TaggingService.prototype = {
// nsISupports
QueryInterface: XPCOMUtils.generateQI([Ci.nsITaggingService,
- Ci.nsINavBookmarkObserver_MOZILLA_1_9_1_ADDITIONS,
Ci.nsINavBookmarkObserver,
Ci.nsIObserver]),
@@ -116,13 +115,18 @@ TaggingService.prototype = {
/**
* Creates a tag container under the tags-root with the given name.
*
- * @param aName
- * the name for the new container.
- * @returns the id of the new container.
+ * @param aTagName
+ * the name for the new tag.
+ * @returns the id of the new tag container.
*/
- _createTag: function TS__createTag(aName) {
- return this._bms.createFolder(this._bms.tagsFolder, aName,
- this._bms.DEFAULT_INDEX);
+ _createTag: function TS__createTag(aTagName) {
+ var newFolderId = this._bms.createFolder(this._bms.tagsFolder, aTagName,
+ this._bms.DEFAULT_INDEX);
+ // Add the folder to our local cache, so we can avoid doing this in the
+ // observer that would have to check itemType.
+ this._tagFolders[newFolderId] = aTagName;
+
+ return newFolderId;
},
/**
@@ -206,10 +210,10 @@ TaggingService.prototype = {
},
/**
- * Removes the tag container from the tags-root if the given tag is empty.
+ * Removes the tag container from the tags root if the given tag is empty.
*
* @param aTagId
- * the item-id of the tag element under the tags root
+ * the itemId of the tag element under the tags root
*/
_removeTagIfEmpty: function TS__removeTagIfEmpty(aTagId) {
var result = this._getTagResult(aTagId);
@@ -221,7 +225,7 @@ TaggingService.prototype = {
var cc = node.childCount;
node.containerOpen = false;
if (cc == 0)
- this._bms.removeFolder(node.itemId);
+ this._bms.removeItem(node.itemId);
},
// nsITaggingService
@@ -392,21 +396,22 @@ TaggingService.prototype = {
onEndUpdateBatch: function() {
this._inBatch = false;
},
- onItemAdded: function(aItemId, aFolderId, aIndex) {
- if (aFolderId == this._bms.tagsFolder &&
- this._bms.getItemType(aItemId) == this._bms.TYPE_FOLDER)
- this._tagFolders[aItemId] = this._bms.getItemTitle(aItemId);
+
+ onItemAdded: function(aItemId, aFolderId, aIndex, aItemType) {
+ // Nothing to do if this is not a tag.
+ if (aFolderId != this._bms.tagsFolder ||
+ aItemType != this._bms.TYPE_FOLDER)
+ return;
+
+ this._tagFolders[aItemId] = this._bms.getItemTitle(aItemId);
},
- onBeforeItemRemoved: function(aItemId) {
- // Remember the bookmark's URI, because it will be gone by the time
- // onItemRemoved() is called. getBookmarkURI() will throw if the item is
- // not a bookmark, which is fine.
- try {
+
+ onBeforeItemRemoved: function(aItemId, aItemType) {
+ if (aItemType == this._bms.TYPE_BOOKMARK)
this._itemsInRemoval[aItemId] = this._bms.getBookmarkURI(aItemId);
- }
- catch (e) {}
},
- onItemRemoved: function(aItemId, aFolderId, aIndex) {
+
+ onItemRemoved: function(aItemId, aFolderId, aIndex, aItemType) {
var itemURI = this._itemsInRemoval[aItemId];
delete this._itemsInRemoval[aItemId];
@@ -425,12 +430,17 @@ TaggingService.prototype = {
this.untagURI(itemURI, tagIds);
}
},
- onItemChanged: function(aItemId, aProperty, aIsAnnotationProperty, aValue) {
- if (this._tagFolders[aItemId])
+
+ onItemChanged: function(aItemId, aProperty, aIsAnnotationProperty, aNewValue,
+ aLastModified, aItemType) {
+ if (aProperty == "title" && this._tagFolders[aItemId])
this._tagFolders[aItemId] = this._bms.getItemTitle(aItemId);
},
+
onItemVisited: function(aItemId, aVisitID, time) {},
- onItemMoved: function(aItemId, aOldParent, aOldIndex, aNewParent, aNewIndex) {
+
+ onItemMoved: function(aItemId, aOldParent, aOldIndex, aNewParent, aNewIndex,
+ aItemType) {
if (this._tagFolders[aItemId] && this._bms.tagFolder == aOldParent &&
this._bms.tagFolder != aNewParent)
delete this._tagFolders[aItemId];
diff --git a/tools/xo_bundle/components/nsURLFormatter.js b/tools/xo_bundle/components/nsURLFormatter.js
index 0956dee..4be4ec7 100755
--- a/tools/xo_bundle/components/nsURLFormatter.js
+++ b/tools/xo_bundle/components/nsURLFormatter.js
@@ -1,4 +1,4 @@
-//@line 37 "/builds/moz2_slave/linux_build/build/toolkit/components/urlformatter/src/nsURLFormatter.js"
+//@line 37 "/builds/slave/linux_build/build/toolkit/components/urlformatter/src/nsURLFormatter.js"
/**
* @class nsURLFormatterService
*
@@ -7,7 +7,7 @@
* Mozilla Applications linking to Mozilla websites are strongly encouraged to use
* URLs of the following format:
*
- * http[s]://%LOCALE%.%SERVICE%.mozilla.[com|org]/%LOCALE%/
+ * http[s]://%SERVICE%.mozilla.[com|org]/%LOCALE%/
*/
const Cc = Components.classes;
diff --git a/tools/xo_bundle/components/nsUpdateService.js b/tools/xo_bundle/components/nsUpdateService.js
index 7b1d28e..acdff3a 100755
--- a/tools/xo_bundle/components/nsUpdateService.js
+++ b/tools/xo_bundle/components/nsUpdateService.js
@@ -1,29 +1,28 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
-//@line 44 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+//@line 44 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
*/
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/FileUtils.jsm");
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
const PREF_APP_UPDATE_ENABLED = "app.update.enabled";
const PREF_APP_UPDATE_AUTO = "app.update.auto";
const PREF_APP_UPDATE_MODE = "app.update.mode";
const PREF_APP_UPDATE_SILENT = "app.update.silent";
const PREF_APP_UPDATE_INTERVAL = "app.update.interval";
-const PREF_APP_UPDATE_TIMER = "app.update.timer";
const PREF_APP_UPDATE_IDLETIME = "app.update.idletime";
+const PREF_APP_UPDATE_LOG = "app.update.log";
const PREF_APP_UPDATE_PROMPTWAITTIME = "app.update.promptWaitTime";
-const PREF_APP_UPDATE_LOG_BRANCH = "app.update.log.";
const PREF_APP_UPDATE_URL = "app.update.url";
const PREF_APP_UPDATE_URL_OVERRIDE = "app.update.url.override";
const PREF_APP_UPDATE_URL_DETAILS = "app.update.url.details";
const PREF_APP_UPDATE_CHANNEL = "app.update.channel";
+const PREF_APP_UPDATE_BACKGROUND_INTERVAL = "app.update.download.backgroundInterval";
const PREF_APP_UPDATE_SHOW_INSTALLED_UI = "app.update.showInstalledUI";
-const PREF_APP_UPDATE_LASTUPDATETIME_FMT = "app.update.lastUpdateTime.%ID%";
const PREF_APP_UPDATE_INCOMPATIBLE_MODE = "app.update.incompatible.mode";
const PREF_UPDATE_NEVER_BRANCH = "app.update.never.";
const PREF_PARTNER_BRANCH = "app.partner.";
@@ -36,9 +35,11 @@ const URI_BRAND_PROPERTIES = "chrome://branding/locale/brand.properties";
const URI_UPDATES_PROPERTIES = "chrome://mozapps/locale/update/updates.properties";
const URI_UPDATE_NS = "http://www.mozilla.org/2005/app-update";
+const CATEGORY_UPDATE_TIMER = "update-timer";
+
const KEY_APPDIR = "XCurProcD";
const KEY_GRED = "GreD";
-//@line 85 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+//@line 87 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
const DIR_UPDATES = "updates";
const FILE_UPDATE_STATUS = "update.status";
@@ -49,17 +50,9 @@ const FILE_UPDATES_DB = "updates.xml";
const FILE_UPDATE_ACTIVE = "active-update.xml";
const FILE_PERMS_TEST = "update.test";
const FILE_LAST_LOG = "last-update.log";
+const FILE_BACKUP_LOG = "backup-update.log";
const FILE_UPDATE_LOCALE = "update.locale";
-const MODE_RDONLY = 0x01;
-const MODE_WRONLY = 0x02;
-const MODE_CREATE = 0x08;
-const MODE_APPEND = 0x10;
-const MODE_TRUNCATE = 0x20;
-
-const PERMS_FILE = 0644;
-const PERMS_DIRECTORY = 0755;
-
const STATE_NONE = "null";
const STATE_DOWNLOADING = "downloading";
const STATE_PENDING = "pending";
@@ -69,118 +62,157 @@ const STATE_DOWNLOAD_FAILED = "download-failed";
const STATE_FAILED = "failed";
// From updater/errors.h:
-const WRITE_ERROR = 7;
+const WRITE_ERROR = 7;
+const ELEVATION_CANCELED = 9;
const DOWNLOAD_CHUNK_SIZE = 300000; // bytes
const DOWNLOAD_BACKGROUND_INTERVAL = 600; // seconds
const DOWNLOAD_FOREGROUND_INTERVAL = 0;
const UPDATE_WINDOW_NAME = "Update:Wizard";
-const TOOLKIT_ID = "toolkit@mozilla.org";
-
-const POST_UPDATE_CONTRACTID = "@mozilla.org/updates/post-update;1";
-var gApp = null;
-var gPref = null;
-var gABI = null;
-var gOSVersion = null;
var gLocale = null;
-var gConsole = null;
-var gCanUpdate = null;
-var gLogEnabled = { };
-
-// shared code for suppressing bad cert dialogs
-//@line 41 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/shared/src/badCertHandler.js"
-
-/**
- * Only allow built-in certs for HTTPS connections. See bug 340198.
- */
-function checkCert(channel) {
- if (!channel.originalURI.schemeIs("https")) // bypass
- return;
- const Ci = Components.interfaces;
- var cert =
- channel.securityInfo.QueryInterface(Ci.nsISSLStatusProvider).
- SSLStatus.QueryInterface(Ci.nsISSLStatus).serverCert;
+XPCOMUtils.defineLazyServiceGetter(this, "gPref",
+ "@mozilla.org/preferences-service;1",
+ "nsIPrefBranch2");
- var issuer = cert.issuer;
- while (issuer && !cert.equals(issuer)) {
- cert = issuer;
- issuer = cert.issuer;
- }
+XPCOMUtils.defineLazyServiceGetter(this, "gConsole",
+ "@mozilla.org/consoleservice;1",
+ "nsIConsoleService");
- var errorstring = "cert issuer is not built-in";
- if (!issuer)
- throw errorstring;
+XPCOMUtils.defineLazyGetter(this, "gApp", function aus_gApp() {
+ return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).
+ QueryInterface(Ci.nsIXULRuntime);
+});
- issuer = issuer.QueryInterface(Ci.nsIX509Cert3);
- var tokenNames = issuer.getAllTokenNames({});
+XPCOMUtils.defineLazyGetter(this, "gLogEnabled", function aus_gLogEnabled() {
+ return getPref("getBoolPref", PREF_APP_UPDATE_LOG, false);
+});
- if (!tokenNames.some(isBuiltinToken))
- throw errorstring;
-}
+XPCOMUtils.defineLazyGetter(this, "gUpdateBundle", function aus_gUpdateBundle() {
+ return Cc["@mozilla.org/intl/stringbundle;1"].
+ getService(Ci.nsIStringBundleService).
+ createBundle(URI_UPDATES_PROPERTIES);
+});
-function isBuiltinToken(tokenName) {
- return tokenName == "Builtin Object Token";
-}
+// shared code for suppressing bad cert dialogs
+XPCOMUtils.defineLazyGetter(this, "gCertUtils", function aus_gCertUtils() {
+ let temp = { };
+ Components.utils.import("resource://gre/modules/CertUtils.jsm", temp);
+ return temp;
+});
+
+XPCOMUtils.defineLazyGetter(this, "gABI", function aus_gABI() {
+ let abi = null;
+ try {
+ abi = gApp.XPCOMABI;
+ }
+ catch (e) {
+ LOG("gABI - XPCOM ABI unknown: updates are not possible.");
+ }
+//@line 167 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+ return abi;
+});
-/**
- * This class implements nsIBadCertListener. Its job is to prevent "bad cert"
- * security dialogs from being shown to the user. It is better to simply fail
- * if the certificate is bad. See bug 304286.
- */
-function BadCertHandler() {
-}
-BadCertHandler.prototype = {
+XPCOMUtils.defineLazyGetter(this, "gOSVersion", function aus_gOSVersion() {
+ let osVersion;
+ let sysInfo = Cc["@mozilla.org/system-info;1"].
+ getService(Ci.nsIPropertyBag2);
+ try {
+ osVersion = sysInfo.getProperty("name") + " " + sysInfo.getProperty("version");
+ }
+ catch (e) {
+ LOG("gOSVersion - OS Version unknown: updates are not possible.");
+ }
- // nsIChannelEventSink
- onChannelRedirect: function(oldChannel, newChannel, flags) {
- // make sure the certificate of the old channel checks out before we follow
- // a redirect from it. See bug 340198.
- checkCert(oldChannel);
- },
+ if (osVersion) {
+ try {
+ osVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
+ }
+ catch (e) {
+ // Not all platforms have a secondary widget library, so an error is nothing to worry about.
+ }
+ osVersion = encodeURIComponent(osVersion);
+ }
+ return osVersion;
+});
- // Suppress any certificate errors
- notifyCertProblem: function(socketInfo, status, targetSite) {
- return true;
- },
+XPCOMUtils.defineLazyGetter(this, "gCanApplyUpdates", function aus_gCanApplyUpdates() {
+ try {
+ const NORMAL_FILE_TYPE = Ci.nsILocalFile.NORMAL_FILE_TYPE;
+ var updateTestFile = getUpdateFile([FILE_PERMS_TEST]);
+ LOG("gCanApplyUpdates - testing write access " + updateTestFile.path);
+ if (updateTestFile.exists())
+ updateTestFile.remove(false);
+ updateTestFile.create(NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);
+ updateTestFile.remove(false);
+//@line 276 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+ }
+ catch (e) {
+ LOG("gCanApplyUpdates - unable to apply updates. Exception: " + e);
+ // No write privileges to install directory
+ return false;
+ }
- // Suppress any ssl errors
- notifySSLError: function(socketInfo, error, targetSite) {
- return true;
- },
+ LOG("gCanApplyUpdates - able to apply updates");
+ return true;
+});
+
+XPCOMUtils.defineLazyGetter(this, "gCanCheckForUpdates", function aus_gCanCheckForUpdates() {
+ // If the administrator has locked the app update functionality
+ // OFF - this is not just a user setting, so disable the manual
+ // UI too.
+ var enabled = getPref("getBoolPref", PREF_APP_UPDATE_ENABLED, true);
+ if (!enabled && gPref.prefIsLocked(PREF_APP_UPDATE_ENABLED)) {
+ LOG("gCanCheckForUpdates - unable to automatically check for updates, " +
+ "disabled by pref");
+ return false;
+ }
- // nsIInterfaceRequestor
- getInterface: function(iid) {
- return this.QueryInterface(iid);
- },
+ // If we don't know the binary platform we're updating, we can't update.
+ if (!gABI) {
+ LOG("gCanCheckForUpdates - unable to check for updates, unknown ABI");
+ return false;
+ }
- // nsISupports
- QueryInterface: function(iid) {
- if (!iid.equals(Components.interfaces.nsIChannelEventSink) &&
- !iid.equals(Components.interfaces.nsIBadCertListener2) &&
- !iid.equals(Components.interfaces.nsISSLErrorListener) &&
- !iid.equals(Components.interfaces.nsIInterfaceRequestor) &&
- !iid.equals(Components.interfaces.nsISupports))
- throw Components.results.NS_ERROR_NO_INTERFACE;
- return this;
+ // If we don't know the OS version we're updating, we can't update.
+ if (!gOSVersion) {
+ LOG("gCanCheckForUpdates - unable to check for updates, unknown OS " +
+ "version");
+ return false;
}
-};
-//@line 137 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+
+ LOG("gCanCheckForUpdates - able to check for updates");
+ return true;
+});
/**
* Logs a string to the error console.
* @param string
- * The string to write to the error console..
+ * The string to write to the error console.
*/
-function LOG(module, string) {
- if (module in gLogEnabled || "all" in gLogEnabled) {
- dump("*** AUS:SVC " + module + ":" + string + "\n");
- // On startup gConsole may not be initialized
- if (gConsole)
- gConsole.logStringMessage("AUS:SVC " + module + ":" + string);
+function LOG(string) {
+ if (gLogEnabled) {
+ dump("*** AUS:SVC " + string + "\n");
+ gConsole.logStringMessage("AUS:SVC " + string);
+ }
+}
+
+/**
+//@line 338 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+ */
+function getPref(func, preference, defaultValue) {
+ try {
+ return gPref[func](preference);
}
+ catch (e) {
+ }
+ return defaultValue;
+}
+
+function getObserverService() {
+ return Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
}
/**
@@ -198,110 +230,11 @@ function binaryToHex(input) {
}
/**
- * Gets a File URL spec for a nsIFile
- * @param file
- * The file to get a file URL spec to
- * @returns The file URL spec to the file
- */
-function getURLSpecFromFile(file) {
- var ioServ = Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService);
- var fph = ioServ.getProtocolHandler("file").
- QueryInterface(Ci.nsIFileProtocolHandler);
- return fph.getURLSpecFromFile(file);
-}
-
-/**
- * Gets the specified directory at the specified hierarchy under a
- * Directory Service key.
- * @param key
- * The Directory Service Key to start from
- * @param pathArray
- * An array of path components to locate beneath the directory
- * specified by |key|
- * @return nsIFile object for the location specified. If the directory
- * requested does not exist, it is created, along with any
- * parent directories that need to be created.
- */
-function getDir(key, pathArray) {
- return getDirInternal(key, pathArray, true, false);
-}
-
-/**
- * Gets the specified directory at the specified hierarchy under a
- * Directory Service key.
- * @param key
- * The Directory Service Key to start from
- * @param pathArray
- * An array of path components to locate beneath the directory
- * specified by |key|
- * @return nsIFile object for the location specified. If the directory
- * requested does not exist, it is NOT created.
- */
-function getDirNoCreate(key, pathArray) {
- return getDirInternal(key, pathArray, false, false);
-}
-
-/**
- * Gets the specified directory at the specified hierarchy under the
- * update root directory.
- * @param pathArray
- * An array of path components to locate beneath the directory
- * specified by |key|
- * @return nsIFile object for the location specified. If the directory
- * requested does not exist, it is created, along with any
- * parent directories that need to be created.
- */
-function getUpdateDir(pathArray) {
- return getDirInternal(KEY_APPDIR, pathArray, true, true);
-}
-
-/**
- * Gets the specified directory at the specified hierarchy under a
- * Directory Service key.
- * @param key
- * The Directory Service Key to start from
- * @param pathArray
- * An array of path components to locate beneath the directory
- * specified by |key|
- * @param shouldCreate
- * true if the directory hierarchy specified in |pathArray|
- * should be created if it does not exist,
- * false otherwise.
- * @param update
- * true if finding the update directory,
- * false otherwise.
- * @return nsIFile object for the location specified.
+//@line 373 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
*/
-function getDirInternal(key, pathArray, shouldCreate, update) {
- var fileLocator = Cc["@mozilla.org/file/directory_service;1"].
- getService(Ci.nsIProperties);
- var dir = fileLocator.get(key, Ci.nsIFile);
-//@line 254 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
- for (var i = 0; i < pathArray.length; ++i) {
- dir.append(pathArray[i]);
- if (shouldCreate && !dir.exists())
- dir.create(Ci.nsILocalFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
- }
- return dir;
-}
-
-/**
- * Gets the file at the specified hierarchy under a Directory Service key.
- * @param key
- * The Directory Service Key to start from
- * @param pathArray
- * An array of path components to locate beneath the directory
- * specified by |key|. The last item in this array must be the
- * leaf name of a file.
- * @return nsIFile object for the file specified. The file is NOT created
- * if it does not exist, however all required directories along
- * the way are.
- */
-function getFile(key, pathArray) {
- var file = getDir(key, pathArray.slice(0, -1));
- file.append(pathArray[pathArray.length - 1]);
- return file;
+function getUpdateDirCreate(pathArray) {
+//@line 384 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+ return FileUtils.getDir(KEY_APPDIR, pathArray, true);
}
/**
@@ -315,30 +248,12 @@ function getFile(key, pathArray) {
* the way are.
*/
function getUpdateFile(pathArray) {
- var file = getUpdateDir(pathArray.slice(0, -1));
+ var file = getUpdateDirCreate(pathArray.slice(0, -1));
file.append(pathArray[pathArray.length - 1]);
return file;
}
/**
- * Closes a Safe Output Stream
- * @param fos
- * The Safe Output Stream to close
- */
-function closeSafeOutputStream(fos) {
- if (fos instanceof Ci.nsISafeOutputStream) {
- try {
- fos.finish();
- }
- catch (e) {
- fos.close();
- }
- }
- else
- fos.close();
-}
-
-/**
* Returns human readable status text from the updates.properties bundle
* based on an error code
* @param code
@@ -349,19 +264,16 @@ function closeSafeOutputStream(fos) {
* @returns A human readable status text string
*/
function getStatusTextFromCode(code, defaultCode) {
- const updateBundle = Cc["@mozilla.org/intl/stringbundle;1"].
- getService(Ci.nsIStringBundleService).
- createBundle(URI_UPDATES_PROPERTIES);
var reason;
try {
- reason = updateBundle.GetStringFromName("check_error-" + code);
- LOG("General", "getStatusTextFromCode - transfer error: " + reason +
- ", code: " + code);
+ reason = gUpdateBundle.GetStringFromName("check_error-" + code);
+ LOG("getStatusTextFromCode - transfer error: " + reason + ", code: " +
+ code);
}
catch (e) {
// Use the default reason
- reason = updateBundle.GetStringFromName("check_error-" + defaultCode);
- LOG("General", "getStatusTextFromCode - transfer error: " + reason +
+ reason = gUpdateBundle.GetStringFromName("check_error-" + defaultCode);
+ LOG("getStatusTextFromCode - transfer error: " + reason +
", default code: " + defaultCode);
}
return reason;
@@ -369,31 +281,12 @@ function getStatusTextFromCode(code, defaultCode) {
/**
* Get the Active Updates directory
- * @param key
- * The Directory Service Key (optional).
- * If used, don't search local appdata on Win32 and don't create dir.
* @returns The active updates directory, as a nsIFile object
*/
-function getUpdatesDir(key) {
+function getUpdatesDir() {
// Right now, we only support downloading one patch at a time, so we always
// use the same target directory.
- var fileLocator = Cc["@mozilla.org/file/directory_service;1"].
- getService(Ci.nsIProperties);
- var updateDir;
- if (key)
- updateDir = fileLocator.get(key, Ci.nsIFile);
- else {
- updateDir = fileLocator.get(KEY_APPDIR, Ci.nsIFile);
-//@line 366 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
- }
- updateDir.append(DIR_UPDATES);
- updateDir.append("0");
- if (!updateDir.exists() && !key) {
- LOG("General", "getUpdatesDir - update directory " + updateDir.path +
- " doesn't exist, creating...");
- updateDir.create(Ci.nsILocalFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
- }
- return updateDir;
+ return getUpdateDirCreate([DIR_UPDATES, "0"]);
}
/**
@@ -407,8 +300,7 @@ function readStatusFile(dir) {
var statusFile = dir.clone();
statusFile.append(FILE_UPDATE_STATUS);
var status = readStringFromFile(statusFile) || STATE_NONE;
- LOG("General", "readStatusFile - status: " + status + ", path: " +
- statusFile.path);
+ LOG("readStatusFile - status: " + status + ", path: " + statusFile.path);
return status;
}
@@ -429,7 +321,7 @@ function writeStatusFile(dir, state) {
}
/**
-//@line 424 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+//@line 485 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
*/
function writeVersionFile(dir, version) {
var versionFile = dir.clone();
@@ -438,16 +330,12 @@ function writeVersionFile(dir, version) {
}
/**
- * Removes the Updates Directory
- * @param key
- * The Directory Service Key under which update directory resides
- * (optional).
+ * Removes the contents of the Updates Directory
*/
-function cleanUpUpdatesDir(key) {
+function cleanUpUpdatesDir() {
// Bail out if we don't have appropriate permissions
- var updateDir;
try {
- updateDir = getUpdatesDir(key);
+ var updateDir = getUpdatesDir();
}
catch (e) {
return;
@@ -462,12 +350,21 @@ function cleanUpUpdatesDir(key) {
var dir = f.parent.parent;
var logFile = dir.clone();
logFile.append(FILE_LAST_LOG);
- if (logFile.exists())
- logFile.remove(false);
- f.copyTo(dir, FILE_LAST_LOG);
+ if (logFile.exists()) {
+ try {
+ logFile.moveTo(dir, FILE_BACKUP_LOG);
+ }
+ catch (e) {
+ LOG("cleanUpUpdatesDir - failed to rename file " + logFile.path +
+ " to " + FILE_BACKUP_LOG);
+ }
+ }
+ f.moveTo(dir, FILE_LAST_LOG);
+ continue;
}
catch (e) {
- LOG("General", "cleanUpUpdatesDir - failed to copy file: " + f.path);
+ LOG("cleanUpUpdatesDir - failed to move file " + f.path + " to " +
+ dir.path + " and rename it to " + FILE_LAST_LOG);
}
}
// Now, recursively remove this file. The recusive removal is really
@@ -477,27 +374,15 @@ function cleanUpUpdatesDir(key) {
f.remove(true);
}
catch (e) {
- LOG("General", "cleanUpUpdatesDir - failed to remove file: " + f.path);
+ LOG("cleanUpUpdatesDir - failed to remove file " + f.path);
}
}
- try {
- updateDir.remove(false);
- } catch (e) {
- LOG("General", "cleanUpUpdatesDir - failed to remove update directory: " +
- updateDir.path + " - This is almost always bad. Exception = " + e);
- throw e;
- }
- LOG("General", "cleanUpUpdatesDir - successfully removed update directory: " +
- updateDir.path);
}
/**
* Clean up updates list and the updates directory.
- * @param key
- * The Directory Service Key under which update directory resides
- * (optional).
*/
-function cleanupActiveUpdate(key) {
+function cleanupActiveUpdate() {
// Move the update from the Active Update list into the Past Updates list.
var um = Cc["@mozilla.org/updates/update-manager;1"].
getService(Ci.nsIUpdateManager);
@@ -505,28 +390,7 @@ function cleanupActiveUpdate(key) {
um.saveUpdates();
// Now trash the updates directory, since we're done with it
- cleanUpUpdatesDir(key);
-}
-
-/**
- * Gets a preference value, handling the case where there is no default.
- * @param func
- * The name of the preference function to call, on nsIPrefBranch
- * @param preference
- * The name of the preference
- * @param defaultValue
- * The default value to return in the event the preference has
- * no setting
- * @returns The value of the preference, or undefined if there was no
- * user or default value.
- */
-function getPref(func, preference, defaultValue) {
- try {
- return gPref[func](preference);
- }
- catch (e) {
- }
- return defaultValue;
+ cleanUpUpdatesDir();
}
/**
@@ -539,9 +403,9 @@ function getLocale() {
if (gLocale)
return gLocale;
- var localeFile = getFile(KEY_APPDIR, [FILE_UPDATE_LOCALE]);
+ var localeFile = FileUtils.getFile(KEY_APPDIR, [FILE_UPDATE_LOCALE]);
if (!localeFile.exists())
- localeFile = getFile(KEY_GRED, [FILE_UPDATE_LOCALE]);
+ localeFile = FileUtils.getFile(KEY_GRED, [FILE_UPDATE_LOCALE]);
if (!localeFile.exists())
throw Components.Exception(FILE_UPDATE_LOCALE + " file doesn't exist in " +
@@ -549,7 +413,7 @@ function getLocale() {
" directories", Cr.NS_ERROR_FILE_NOT_FOUND);
gLocale = readStringFromFile(localeFile);
- LOG("General", "getLocale - getting locale from file: " + localeFile.path +
+ LOG("getLocale - getting locale from file: " + localeFile.path +
", locale: " + gLocale);
return gLocale;
}
@@ -631,31 +495,14 @@ ArrayEnumerator.prototype = {
};
/**
- * Trims a prefix from a string.
- * @param string
- * The source string
- * @param prefix
- * The prefix to remove.
- * @returns The suffix (string - prefix)
- */
-function stripPrefix(string, prefix) {
- return string.substr(prefix.length);
-}
-
-/**
* Writes a string of text to a file. A newline will be appended to the data
* written to the file. This function only works with ASCII text.
*/
function writeStringToFile(file, text) {
- var fos = Cc["@mozilla.org/network/safe-file-output-stream;1"].
- createInstance(Ci.nsIFileOutputStream);
- var modeFlags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
- if (!file.exists())
- file.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- fos.init(file, modeFlags, PERMS_FILE, 0);
+ var fos = FileUtils.openSafeFileOutputStream(file)
text += "\n";
fos.write(text, text.length);
- closeSafeOutputStream(fos);
+ FileUtils.closeSafeFileOutputStream(fos);
}
/**
@@ -663,14 +510,13 @@ function writeStringToFile(file, text) {
* before the result is returned. This function only works with ASCII text.
*/
function readStringFromFile(file) {
- var fis = Cc["@mozilla.org/network/file-input-stream;1"].
- createInstance(Ci.nsIFileInputStream);
- var modeFlags = MODE_RDONLY;
if (!file.exists()) {
- LOG("General", "readStringFromFile - file doesn't exist: " + file.path);
+ LOG("readStringFromFile - file doesn't exist: " + file.path);
return null;
}
- fis.init(file, modeFlags, PERMS_FILE, 0);
+ var fis = Cc["@mozilla.org/network/file-input-stream;1"].
+ createInstance(Ci.nsIFileInputStream);
+ fis.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
var sis = Cc["@mozilla.org/scriptableinputstream;1"].
createInstance(Ci.nsIScriptableInputStream);
sis.init(fis);
@@ -681,14 +527,7 @@ function readStringFromFile(file) {
return text;
}
-function getObserverService()
-{
- return Cc["@mozilla.org/observer-service;1"].
- getService(Ci.nsIObserverService);
-}
-
-function getDefaultPrefBranch()
-{
+function getDefaultPrefBranch() {
return gPref.QueryInterface(Ci.nsIPrefService).getDefaultBranch(null);
}
/**
@@ -709,7 +548,7 @@ function UpdatePatch(patch) {
break;
case "size":
if (0 == parseInt(attr.value)) {
- LOG("UpdatePatch", "init - 0-sized patch!");
+ LOG("UpdatePatch:init - 0-sized patch!");
throw Cr.NS_ERROR_ILLEGAL_VALUE;
}
// fall through
@@ -872,13 +711,12 @@ function Update(update) {
if (update.hasAttribute("name"))
name = update.getAttribute("name");
else {
- var sbs = Cc["@mozilla.org/intl/stringbundle;1"].
- getService(Ci.nsIStringBundleService);
- var brandBundle = sbs.createBundle(URI_BRAND_PROPERTIES);
- var updateBundle = sbs.createBundle(URI_UPDATES_PROPERTIES);
+ var brandBundle = Cc["@mozilla.org/intl/stringbundle;1"].
+ getService(Ci.nsIStringBundleService).
+ createBundle(URI_BRAND_PROPERTIES);
var appName = brandBundle.GetStringFromName("brandShortName");
- name = updateBundle.formatStringFromName("updateName",
- [appName, this.version], 2);
+ name = gUpdateBundle.formatStringFromName("updateName",
+ [appName, this.version], 2);
}
this.name = name;
}
@@ -1046,51 +884,7 @@ const UpdateServiceFactory = {
* @constructor
*/
function UpdateService() {
- gApp = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).
- QueryInterface(Ci.nsIXULRuntime);
- gPref = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefBranch2);
- gConsole = Cc["@mozilla.org/consoleservice;1"].
- getService(Ci.nsIConsoleService);
-
- // Not all builds have a known ABI
- try {
- gABI = gApp.XPCOMABI;
- }
- catch (e) {
- LOG("UpdateService", "init - XPCOM ABI unknown: updates are not possible.");
- }
-
- var osVersion;
- var sysInfo = Cc["@mozilla.org/system-info;1"].
- getService(Ci.nsIPropertyBag2);
- try {
- osVersion = sysInfo.getProperty("name") + " " + sysInfo.getProperty("version");
- }
- catch (e) {
- LOG("UpdateService", "init - OS Version unknown: updates are not possible.");
- }
-
- if (osVersion) {
- try {
- osVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
- }
- catch (e) {
- // Not all platforms have a secondary widget library, so an error is nothing to worry about.
- }
- gOSVersion = encodeURIComponent(osVersion);
- }
-
-//@line 1084 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
-
- // Start the update timer only after a profile has been selected so that the
- // appropriate values for the update check are read from the user's profile.
- var os = getObserverService();
-
- os.addObserver(this, "profile-after-change", false);
-
- // Observe xpcom-shutdown to unhook pref branch observers above to avoid
- // shutdown leaks.
+ let os = getObserverService();
os.addObserver(this, "xpcom-shutdown", false);
}
@@ -1116,67 +910,29 @@ UpdateService.prototype = {
* Additional data
*/
observe: function AUS_observe(subject, topic, data) {
- var os = getObserverService();
-
switch (topic) {
- case "profile-after-change":
- os.removeObserver(this, "profile-after-change");
- os.addObserver(this, "final-ui-startup", false);
- this._start();
- break;
- case "final-ui-startup":
- os.removeObserver(this, "final-ui-startup");
- this._final_ui_start();
+ case "post-update-processing":
+ // Clean up any extant updates
+ this._postUpdateProcessing();
break;
case "xpcom-shutdown":
+ let os = getObserverService();
os.removeObserver(this, "xpcom-shutdown");
// Prevent leaking the downloader (bug 454964)
this._downloader = null;
-
- // Release Services
- gApp = null;
- gPref = null;
- gConsole = null;
break;
}
},
/**
- * Start the Update Service
- */
- _start: function AUS__start() {
- // Start logging
- this._initLoggingPrefs();
-
- // Register a background update check timer
- var tm = Cc["@mozilla.org/updates/timer-manager;1"].
- getService(Ci.nsIUpdateTimerManager);
- var interval = getPref("getIntPref", PREF_APP_UPDATE_INTERVAL, 86400);
- tm.registerTimer("background-update-timer", this, interval);
- },
-
- /**
- * The following needs to be performed after final-ui-startup (bug 497578)
+ * The following needs to happen during the post-update-processing
+ * notification from nsUpdateServiceStub.js:
* 1. post update processing
* 2. resume of a download that was in progress during a previous session
* 3. start of a complete update download after the failure to apply a partial
* update
*/
- _final_ui_start: function AUS__delayed_start() {
- // Clean up any extant updates
- this._postUpdateProcessing();
-
- // Resume fetching...
- var um = Cc["@mozilla.org/updates/update-manager;1"].
- getService(Ci.nsIUpdateManager);
- var activeUpdate = um.activeUpdate;
- if (activeUpdate && activeUpdate.state != STATE_SUCCEEDED) {
- var status = this.downloadUpdate(activeUpdate, true);
- if (status == STATE_NONE)
- cleanupActiveUpdate();
- }
- },
/**
* Perform post-processing on updates lingering in the updates directory
@@ -1185,123 +941,103 @@ UpdateService.prototype = {
* notify the user of install success.
*/
_postUpdateProcessing: function AUS__postUpdateProcessing() {
- // Detect installation failures and notify
-
- // Bail out if we don't have appropriate permissions
- if (!this.canUpdate)
+ if (!this.canUpdate) {
+ LOG("UpdateService:_postUpdateProcessing - unable to update");
return;
+ }
var status = readStatusFile(getUpdatesDir());
+ /**
+ * STATE_NONE status means the update.status file is not present, because
+ * either:
+ * 1) no update was performed, and so there's no UI to show
+ * 2) an update was attempted but failed during checking, transfer or
+ * verification, and was cleaned up at that point, and UI notifying of
+ * that error was shown at that stage.
+ */
+ if (status == STATE_NONE) {
+ LOG("UpdateService:_postUpdateProcessing - no status, no update");
+ return;
+ }
- // Make sure to cleanup after an update that failed for an unknown reason
- if (status == "null")
- status = null;
-
- var updRootKey = null;
-//@line 1222 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+ var um = Cc["@mozilla.org/updates/update-manager;1"].
+ getService(Ci.nsIUpdateManager);
+ var update = um.activeUpdate;
if (status == STATE_DOWNLOADING) {
- LOG("UpdateService", "_postUpdateProcessing - patch found in " +
- "downloading state");
- }
- else if (status != null) {
- // null status means the update.status file is not present, because either:
- // 1) no update was performed, and so there's no UI to show
- // 2) an update was attempted but failed during checking, transfer or
- // verification, and was cleaned up at that point, and UI notifying of
- // that error was shown at that stage.
- var um = Cc["@mozilla.org/updates/update-manager;1"].
- getService(Ci.nsIUpdateManager);
- var prompter = Cc["@mozilla.org/updates/update-prompt;1"].
- createInstance(Ci.nsIUpdatePrompt);
-
- var update = um.activeUpdate;
- if (!update) {
- update = new Update(null);
- }
- update.state = status;
- var sbs = Cc["@mozilla.org/intl/stringbundle;1"].
- getService(Ci.nsIStringBundleService);
- var bundle = sbs.createBundle(URI_UPDATES_PROPERTIES);
- if (status == STATE_SUCCEEDED) {
- update.statusText = bundle.GetStringFromName("installSuccess");
-
- // Update the patch's metadata.
- um.activeUpdate = update;
-
- prompter.showUpdateInstalled();
-//@line 1257 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
- // Perform platform-specific post-update processing.
- if (POST_UPDATE_CONTRACTID in Cc) {
- Cc[POST_UPDATE_CONTRACTID].createInstance(Ci.nsIRunnable).run();
- }
-//@line 1262 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
- // Done with this update. Clean it up.
- cleanupActiveUpdate(updRootKey);
+ LOG("UpdateService:_postUpdateProcessing - patch found in downloading " +
+ "state");
+ if (update && update.state != STATE_SUCCEEDED) {
+ // Resume download
+ var status = this.downloadUpdate(update, true);
+ if (status == STATE_NONE)
+ cleanupActiveUpdate();
}
- else {
- // If we hit an error, then the error code will be included in the
- // status string following a colon. If we had an I/O error, then we
- // assume that the patch is not invalid, and we restage the patch so
- // that it can be attempted again the next time we restart.
- var ary = status.split(": ");
- update.state = ary[0];
- if (update.state == STATE_FAILED && ary[1]) {
- update.errorCode = ary[1];
- if (update.errorCode == WRITE_ERROR) {
- prompter.showUpdateError(update);
- writeStatusFile(getUpdatesDir(), update.state = STATE_PENDING);
- writeVersionFile(getUpdatesDir(), update.extensionVersion);
- return;
- }
- }
+ return;
+ }
- // Something went wrong with the patch application process.
- cleanupActiveUpdate();
+ if (!update)
+ update = new Update(null);
+
+ var prompter = Cc["@mozilla.org/updates/update-prompt;1"].
+ createInstance(Ci.nsIUpdatePrompt);
- update.statusText = bundle.GetStringFromName("patchApplyFailure");
- var oldType = update.selectedPatch ? update.selectedPatch.type
- : "complete";
- if (update.selectedPatch && oldType == "partial") {
- // Partial patch application failed, try downloading the complete
- // update in the background instead.
- LOG("UpdateService", "_postUpdateProcessing - install of partial " +
- "patch failed, downloading complete patch");
- var status = this.downloadUpdate(update, true);
- if (status == STATE_NONE)
- cleanupActiveUpdate();
+ update.state = status;
+ if (status == STATE_SUCCEEDED) {
+ update.statusText = gUpdateBundle.GetStringFromName("installSuccess");
+
+ // Update the patch's metadata.
+ um.activeUpdate = update;
+
+ prompter.showUpdateInstalled();
+
+ // Done with this update. Clean it up.
+ cleanupActiveUpdate();
+ }
+ else {
+ // If we hit an error, then the error code will be included in the
+ // status string following a colon. If we had an I/O error, then we
+ // assume that the patch is not invalid, and we restage the patch so
+ // that it can be attempted again the next time we restart.
+ var ary = status.split(": ");
+ update.state = ary[0];
+ if (update.state == STATE_FAILED && ary[1]) {
+ update.errorCode = ary[1];
+ if (update.errorCode == WRITE_ERROR) {
+ prompter.showUpdateError(update);
+ writeStatusFile(getUpdatesDir(), update.state = STATE_PENDING);
+ writeVersionFile(getUpdatesDir(), update.extensionVersion);
+ return;
}
- else {
- LOG("UpdateService", "_postUpdateProcessing - install of complete or " +
- "only one patch offered failed... showing error.");
+ else if (update.errorCode == ELEVATION_CANCELED) {
+ writeStatusFile(getUpdatesDir(), update.state = STATE_PENDING);
+ writeVersionFile(getUpdatesDir(), update.extensionVersion);
+ return;
}
- update.QueryInterface(Ci.nsIWritablePropertyBag);
- update.setProperty("patchingFailed", oldType);
- prompter.showUpdateError(update);
}
- }
- else {
- LOG("UpdateService", "_postUpdateProcessing - no status, no update");
- }
- },
- /**
- * Initialize Logging preferences, formatted like so:
- * app.update.log.<moduleName> = <true|false>
- */
- _initLoggingPrefs: function AUS__initLoggingPrefs() {
- try {
- var ps = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefService);
- var logBranch = ps.getBranch(PREF_APP_UPDATE_LOG_BRANCH);
- var modules = logBranch.getChildList("", { value: 0 });
-
- for (var i = 0; i < modules.length; ++i) {
- if (logBranch.prefHasUserValue(modules[i]))
- gLogEnabled[modules[i]] = logBranch.getBoolPref(modules[i]);
+ // Something went wrong with the patch application process.
+ cleanupActiveUpdate();
+
+ update.statusText = gUpdateBundle.GetStringFromName("patchApplyFailure");
+ var oldType = update.selectedPatch ? update.selectedPatch.type
+ : "complete";
+ if (update.selectedPatch && oldType == "partial") {
+ // Partial patch application failed, try downloading the complete
+ // update in the background instead.
+ LOG("UpdateService:_postUpdateProcessing - install of partial patch " +
+ "failed, downloading complete patch");
+ var status = this.downloadUpdate(update, true);
+ if (status == STATE_NONE)
+ cleanupActiveUpdate();
}
- }
- catch (e) {
+ else {
+ LOG("UpdateService:_postUpdateProcessing - install of complete or " +
+ "only one patch offered failed... showing error.");
+ }
+ update.QueryInterface(Ci.nsIWritablePropertyBag);
+ update.setProperty("patchingFailed", oldType);
+ prompter.showUpdateError(update);
}
},
@@ -1335,8 +1071,8 @@ UpdateService.prototype = {
* See nsIUpdateService.idl
*/
onError: function AUS_notify_onError(request, update) {
- LOG("UpdateService", "notify:listener - error during background " +
- "update: " + update.statusText);
+ LOG("UpdateService:notify:listener - error during background update: " +
+ update.statusText);
},
}
this.backgroundChecker.checkForUpdates(listener, false);
@@ -1406,37 +1142,52 @@ UpdateService.prototype = {
var updateEnabled = getPref("getBoolPref", PREF_APP_UPDATE_ENABLED, true);
if (!updateEnabled) {
- LOG("Checker", "_selectAndInstallUpdate - not prompting because update " +
- "is disabled");
+ LOG("Checker:_selectAndInstallUpdate - not prompting because update is " +
+ "disabled");
return;
}
/**
-//@line 1450 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+//@line 1323 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
*/
// Encode version since it could be a non-ascii string (bug 359093)
var neverPrefName = PREF_UPDATE_NEVER_BRANCH +
encodeURIComponent(update.version);
+
+ if (!gCanApplyUpdates) {
+ if (getPref("getBoolPref", neverPrefName, false)) {
+ LOG("Checker:_selectAndInstallUpdate - the user is unable to apply " +
+ "updates. Not prompting because the preference " + neverPrefName +
+ " is true");
+ }
+ else {
+ LOG("Checker:_selectAndInstallUpdate - the user is unable to apply " +
+ "updates... prompting");
+ this._showPrompt(update);
+ }
+ return;
+ }
+
if (update.type == "major" &&
getPref("getBoolPref", neverPrefName, false)) {
- LOG("Checker", "_selectAndInstallUpdate - not prompting because this " +
- "is a major update and the preference " + neverPrefName + " is true");
+ LOG("Checker:_selectAndInstallUpdate - not prompting because this is a " +
+ "major update and the preference " + neverPrefName + " is true");
return;
}
/**
-//@line 1479 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+//@line 1367 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
*/
if (update.type == "major") {
- LOG("Checker", "_selectAndInstallUpdate - prompting because it is a " +
- "major update");
+ LOG("Checker:_selectAndInstallUpdate - prompting because it is a major " +
+ "update");
this._showPrompt(update);
return;
}
if (!getPref("getBoolPref", PREF_APP_UPDATE_AUTO, true)) {
- LOG("Checker", "_selectAndInstallUpdate - prompting because silent " +
+ LOG("Checker:_selectAndInstallUpdate - prompting because silent " +
"install is disabled");
this._showPrompt(update);
return;
@@ -1444,8 +1195,8 @@ UpdateService.prototype = {
if (getPref("getIntPref", PREF_APP_UPDATE_MODE, 1) == 0) {
// Do not prompt regardless of add-on incompatibilities
- LOG("UpdateService", "_selectAndInstallUpdate - no need to show " +
- "prompt, just download the update");
+ LOG("UpdateService:_selectAndInstallUpdate - no need to show prompt, " +
+ "just download the update");
var status = this.downloadUpdate(update, true);
if (status == STATE_NONE)
cleanupActiveUpdate();
@@ -1462,8 +1213,8 @@ UpdateService.prototype = {
this._checkAddonCompatibility();
}
else {
- LOG("UpdateService", "_selectAndInstallUpdate - no need to show " +
- "prompt, just download the update");
+ LOG("UpdateService:_selectAndInstallUpdate - no need to show prompt, " +
+ "just download the update");
var status = this.downloadUpdate(update, true);
if (status == STATE_NONE)
cleanupActiveUpdate();
@@ -1481,14 +1232,14 @@ UpdateService.prototype = {
getService(Ci.nsIExtensionManager);
// Get the add-ons that are incompatible with the update's application
// version and toolkit version.
- var currentAddons = em.getIncompatibleItemList("", this._update.extensionVersion,
+ var currentAddons = em.getIncompatibleItemList(this._update.extensionVersion,
this._update.platformVersion,
Ci.nsIUpdateItem.TYPE_ANY,
false, { });
if (currentAddons.length > 0) {
// Get the add-ons that are incompatible with the current application
// version and toolkit version.
- var previousAddons = em.getIncompatibleItemList("", null, null,
+ var previousAddons = em.getIncompatibleItemList(null, null,
Ci.nsIUpdateItem.TYPE_ANY,
false, { });
// Don't include add-ons that are already incompatible with the current
@@ -1505,20 +1256,21 @@ UpdateService.prototype = {
if (currentAddons.length > 0) {
/**
-//@line 1575 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
+//@line 1463 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
*/
this._incompatAddonsCount = currentAddons.length;
- LOG("UpdateService", "_checkAddonCompatibility - checking for " +
+ LOG("UpdateService:_checkAddonCompatibility - checking for " +
"incompatible add-ons");
var updateIncompatMode = getPref("getIntPref", PREF_APP_UPDATE_INCOMPATIBLE_MODE, 0);
var mode = (updateIncompatMode == 1) ? Ci.nsIExtensionManager.UPDATE_CHECK_COMPATIBILITY :
Ci.nsIExtensionManager.UPDATE_NOTIFY_NEWVERSION;
em.update(currentAddons, currentAddons.length, mode, this,
+ Ci.nsIExtensionManager.UPDATE_WHEN_NEW_APP_DETECTED,
this._update.extensionVersion, this._update.platformVersion);
}
else {
- LOG("UpdateService", "_checkAddonCompatibility - no need to show " +
- "prompt, just download the update");
+ LOG("UpdateService:_checkAddonCompatibility - no need to show prompt, " +
+ "just download the update");
var status = this.downloadUpdate(this._update, true);
if (status == STATE_NONE)
cleanupActiveUpdate();
@@ -1536,13 +1288,13 @@ UpdateService.prototype = {
* See nsIExtensionManager.idl
*/
onUpdateEnded: function AUS_onUpdateEnded() {
- if (this._incompatAddonsCount > 0) {
- LOG("Checker", "onUpdateEnded - prompting because there are " +
- "incompatible add-ons");
+ if (this._incompatAddonsCount > 0 || !gCanApplyUpdates) {
+ LOG("Checker:onUpdateEnded - prompting because there are incompatible " +
+ "add-ons");
this._showPrompt(this._update);
}
else {
- LOG("UpdateService", "onUpdateEnded - no need to show prompt, just " +
+ LOG("UpdateService:onUpdateEnded - no need to show prompt, just " +
"download the update");
var status = this.downloadUpdate(this._update, true);
if (status == STATE_NONE)
@@ -1565,7 +1317,7 @@ UpdateService.prototype = {
status != Ci.nsIAddonUpdateCheckListener.STATUS_VERSIONINFO)
return;
- LOG("UpdateService", "onAddonUpdateEnded - found update for add-on ID: " +
+ LOG("UpdateService:onAddonUpdateEnded - found update for add-on ID: " +
addon.id);
--this._incompatAddonsCount;
},
@@ -1588,54 +1340,21 @@ UpdateService.prototype = {
* See nsIUpdateService.idl
*/
get canUpdate() {
- if (gCanUpdate !== null)
- return gCanUpdate;
-
- try {
- var appDirFile = getUpdateFile([FILE_PERMS_TEST]);
- LOG("UpdateService", "canUpdate - testing " + appDirFile.path);
- if (!appDirFile.exists()) {
- appDirFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- appDirFile.remove(false);
- }
- var updateDir = getUpdatesDir();
- var upDirFile = updateDir.clone();
- upDirFile.append(FILE_PERMS_TEST);
- LOG("UpdateService", "canUpdate - testing " + upDirFile.path);
- if (!upDirFile.exists()) {
- upDirFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- upDirFile.remove(false);
- }
-//@line 1751 "/builds/moz2_slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateService.js.in"
- }
- catch (e) {
- LOG("UpdateService", "canUpdate - unable to update. Exception: " + e);
- // No write privileges to install directory
- return gCanUpdate = false;
- }
- // If the administrator has locked the app update functionality
- // OFF - this is not just a user setting, so disable the manual
- // UI too.
- var enabled = getPref("getBoolPref", PREF_APP_UPDATE_ENABLED, true);
- if (!enabled && gPref.prefIsLocked(PREF_APP_UPDATE_ENABLED)) {
- LOG("UpdateService", "canUpdate - unable to update, disabled by pref");
- return gCanUpdate = false;
- }
-
- // If we don't know the binary platform we're updating, we can't update.
- if (!gABI) {
- LOG("UpdateService", "canUpdate - unable tp update, unknown ABI");
- return gCanUpdate = false;
- }
+ return gCanCheckForUpdates && gCanApplyUpdates;
+ },
- // If we don't know the OS version we're updating, we can't update.
- if (!gOSVersion) {
- LOG("UpdateService", "canUpdate unable to update, unknown OS version");
- return gCanUpdate = false;
- }
+ /**
+ * See nsIUpdateService.idl
+ */
+ get canCheckForUpdates() {
+ return gCanCheckForUpdates;
+ },
- LOG("UpdateService", "canUpdate - able to update");
- return gCanUpdate = true;
+ /**
+ * See nsIUpdateService.idl
+ */
+ get canApplyUpdates() {
+ return gCanApplyUpdates;
},
/**
@@ -1643,7 +1362,7 @@ UpdateService.prototype = {
*/
addDownloadListener: function AUS_addDownloadListener(listener) {
if (!this._downloader) {
- LOG("UpdateService", "addDownloadListener - no downloader!");
+ LOG("UpdateService:addDownloadListener - no downloader!");
return;
}
this._downloader.addDownloadListener(listener);
@@ -1654,7 +1373,7 @@ UpdateService.prototype = {
*/
removeDownloadListener: function AUS_removeDownloadListener(listener) {
if (!this._downloader) {
- LOG("UpdateService", "removeDownloadListener - no downloader!");
+ LOG("UpdateService:removeDownloadListener - no downloader!");
return;
}
this._downloader.removeDownloadListener(listener);
@@ -1673,8 +1392,9 @@ UpdateService.prototype = {
getService(Ci.nsIVersionComparator);
// Don't download the update if the update's version is less than the
// current application's version.
- if (update.extensionVersion && vc.compare(update.extensionVersion, ai.version) < 0) {
- LOG("UpdateService", "downloadUpdate - removing update for previous " +
+ if (update.extensionVersion &&
+ vc.compare(update.extensionVersion, ai.version) < 0) {
+ LOG("UpdateService:downloadUpdate - removing update for previous " +
"application version " + update.extensionVersion);
cleanupActiveUpdate();
return STATE_NONE;
@@ -1683,8 +1403,8 @@ UpdateService.prototype = {
if (this.isDownloading) {
if (update.isCompleteUpdate == this._downloader.isCompleteUpdate &&
background == this._downloader.background) {
- LOG("UpdateService", "downloadUpdate - no support for downloading " +
- "more than one update at a time");
+ LOG("UpdateService:downloadUpdate - no support for downloading more " +
+ "than one update at a time");
return readStatusFile(getUpdatesDir());
}
this._downloader.cancel();
@@ -1713,7 +1433,9 @@ UpdateService.prototype = {
implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
getHelperForLanguage: function(language) null,
getInterfaces: function AUS_getInterfaces(count) {
- var interfaces = [Ci.nsIApplicationUpdateService, Ci.nsITimerCallback,
+ var interfaces = [Ci.nsIApplicationUpdateService,
+ Ci.nsIApplicationUpdateService2,
+ Ci.nsITimerCallback,
Ci.nsIObserver];
count.value = interfaces.length;
return interfaces;
@@ -1722,9 +1444,13 @@ UpdateService.prototype = {
classDescription: "Update Service",
contractID: "@mozilla.org/updates/update-service;1",
classID: Components.ID("{B3C290A6-3943-4B89-8BBE-C01EB7B3B311}"),
- _xpcom_categories: [{ category: "app-startup", service: true }],
+ _xpcom_categories: [{ category: CATEGORY_UPDATE_TIMER,
+ value: "@mozilla.org/updates/update-service;1," +
+ "getService,background-update-timer," +
+ PREF_APP_UPDATE_INTERVAL + ",86400" }],
_xpcom_factory: UpdateServiceFactory,
QueryInterface: XPCOMUtils.generateQI([Ci.nsIApplicationUpdateService,
+ Ci.nsIApplicationUpdateService2,
Ci.nsIAddonUpdateCheckListener,
Ci.nsITimerCallback,
Ci.nsIObserver])
@@ -1736,7 +1462,8 @@ UpdateService.prototype = {
*/
function UpdateManager() {
// Ensure the Active Update file is loaded
- var updates = this._loadXMLFileIntoArray(getUpdateFile([FILE_UPDATE_ACTIVE]));
+ var updates = this._loadXMLFileIntoArray(getUpdateFile(
+ [FILE_UPDATE_ACTIVE]));
if (updates.length > 0)
this._activeUpdate = updates[0];
}
@@ -1760,14 +1487,14 @@ UpdateManager.prototype = {
*/
_loadXMLFileIntoArray: function UM__loadXMLFileIntoArray(file) {
if (!file.exists()) {
- LOG("UpdateManager", "_loadXMLFileIntoArray: XML file does not exist");
+ LOG("UpdateManager:_loadXMLFileIntoArray: XML file does not exist");
return [];
}
var result = [];
var fileStream = Cc["@mozilla.org/network/file-input-stream;1"].
createInstance(Ci.nsIFileInputStream);
- fileStream.init(file, MODE_RDONLY, PERMS_FILE, 0);
+ fileStream.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
try {
var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
createInstance(Ci.nsIDOMParser);
@@ -1786,15 +1513,15 @@ UpdateManager.prototype = {
try {
var update = new Update(updateElement);
} catch (e) {
- LOG("UpdateManager", "_loadXMLFileIntoArray - invalid update");
+ LOG("UpdateManager:_loadXMLFileIntoArray - invalid update");
continue;
}
result.push(update);
}
}
catch (e) {
- LOG("UpdateManager", "_loadXMLFileIntoArray - error constructing " +
- "update list. Exception: " + e);
+ LOG("UpdateManager:_loadXMLFileIntoArray - error constructing update " +
+ "list. Exception: " + e);
}
fileStream.close();
return result;
@@ -1807,7 +1534,6 @@ UpdateManager.prototype = {
if (!this._updates) {
this._updates = this._loadXMLFileIntoArray(getUpdateFile(
[FILE_UPDATES_DB]));
-
var activeUpdates = this._loadXMLFileIntoArray(getUpdateFile(
[FILE_UPDATE_ACTIVE]));
if (activeUpdates.length > 0)
@@ -1840,6 +1566,7 @@ UpdateManager.prototype = {
// User switched channels, clear out any old active updates and remove
// partial downloads
this._activeUpdate = null;
+ this.saveUpdates();
// Destroy the updates directory, since we're done with it.
cleanUpUpdatesDir();
@@ -1896,10 +1623,11 @@ UpdateManager.prototype = {
_writeUpdatesToXMLFile: function UM__writeUpdatesToXMLFile(updates, file) {
var fos = Cc["@mozilla.org/network/safe-file-output-stream;1"].
createInstance(Ci.nsIFileOutputStream);
- var modeFlags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
+ var modeFlags = FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE |
+ FileUtils.MODE_TRUNCATE;
if (!file.exists())
- file.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, PERMS_FILE);
- fos.init(file, modeFlags, PERMS_FILE, 0);
+ file.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);
+ fos.init(file, modeFlags, FileUtils.PERMS_FILE, 0);
try {
var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
@@ -1919,7 +1647,7 @@ UpdateManager.prototype = {
catch (e) {
}
- closeSafeOutputStream(fos);
+ FileUtils.closeSafeFileOutputStream(fos);
},
/**
@@ -1931,6 +1659,7 @@ UpdateManager.prototype = {
if (this._activeUpdate)
this._addUpdate(this._activeUpdate);
+ this._ensureUpdates();
// Don't write updates that have a temporary state to the updates.xml file.
if (this._updates) {
let updates = this._updates.slice();
@@ -1953,7 +1682,6 @@ UpdateManager.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdateManager])
};
-
/**
* Checker
* Checks for new Updates
@@ -1991,7 +1719,7 @@ Checker.prototype = {
}
if (!url || url == "") {
- LOG("Checker", "getUpdateURL - update URL not defined");
+ LOG("Checker:getUpdateURL - update URL not defined");
return null;
}
@@ -2013,7 +1741,7 @@ Checker.prototype = {
if (force)
url += (url.indexOf("?") != -1 ? "&" : "?") + "force=1";
- LOG("Checker", "getUpdateURL - update URL: " + url);
+ LOG("Checker:getUpdateURL - update URL: " + url);
return url;
},
@@ -2031,7 +1759,7 @@ Checker.prototype = {
this._request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
createInstance(Ci.nsIXMLHttpRequest);
this._request.open("GET", url, true);
- this._request.channel.notificationCallbacks = new BadCertHandler();
+ this._request.channel.notificationCallbacks = new gCertUtils.BadCertHandler();
this._request.overrideMimeType("text/xml");
this._request.setRequestHeader("Cache-Control", "no-cache");
@@ -2040,7 +1768,7 @@ Checker.prototype = {
this._request.onload = function(event) { self.onLoad(event); };
this._request.onprogress = function(event) { self.onProgress(event); };
- LOG("Checker", "checkForUpdates - sending request to: " + url);
+ LOG("Checker:checkForUpdates - sending request to: " + url);
this._request.send(null);
this._callback = listener;
@@ -2052,7 +1780,7 @@ Checker.prototype = {
* The nsIDOMLSProgressEvent for the load.
*/
onProgress: function UC_onProgress(event) {
- LOG("Checker", "onProgress - " + event.position + "/" + event.totalSize);
+ LOG("Checker:onProgress - " + event.position + "/" + event.totalSize);
this._callback.onProgress(event.target, event.position, event.totalSize);
},
@@ -2062,12 +1790,12 @@ Checker.prototype = {
get _updates() {
var updatesElement = this._request.responseXML.documentElement;
if (!updatesElement) {
- LOG("Checker", "get_updates - empty updates document?!");
+ LOG("Checker:_updates get - empty updates document?!");
return [];
}
if (updatesElement.nodeName != "updates") {
- LOG("Checker", "get_updates - unexpected node name!");
+ LOG("Checker:updates get - unexpected node name!");
throw "";
}
@@ -2083,7 +1811,7 @@ Checker.prototype = {
try {
var update = new Update(updateElement);
} catch (e) {
- LOG("Checker", "get_updates - invalid <update/>, ignoring...");
+ LOG("Checker:updates get - invalid <update/>, ignoring...");
continue;
}
update.serviceURL = this.getUpdateURL(this._forced);
@@ -2116,25 +1844,25 @@ Checker.prototype = {
* The nsIDOMEvent for the load
*/
onLoad: function UC_onLoad(event) {
- LOG("Checker", "onLoad - request completed downloading document");
+ LOG("Checker:onLoad - request completed downloading document");
try {
- checkCert(this._request.channel);
+ gCertUtils.checkCert(this._request.channel);
// Analyze the resulting DOM and determine the set of updates to install
var updates = this._updates;
- LOG("Checker", "onLoad - number of updates available: " + updates.length);
+ LOG("Checker:onLoad - number of updates available: " + updates.length);
// ... and tell the Update Service about what we discovered.
this._callback.onCheckComplete(event.target, updates, updates.length);
}
catch (e) {
- LOG("Checker", "onLoad - there was a problem with the update service " +
- "URL specified, either the XML file was malformed or it does not " +
- "exist at the location specified. Exception: " + e);
+ LOG("Checker:onLoad - there was a problem with the update service URL " +
+ "specified, either the XML file was malformed or it does not exist " +
+ "at the location specified. Exception: " + e);
var request = event.target;
var status = this._getChannelStatus(request);
- LOG("Checker", "onLoad - request.status: " + status);
+ LOG("Checker:onLoad - request.status: " + status);
var update = new Update(null);
update.statusText = getStatusTextFromCode(status, 404);
this._callback.onError(request, update);
@@ -2151,7 +1879,7 @@ Checker.prototype = {
onError: function UC_onError(event) {
var request = event.target;
var status = this._getChannelStatus(request);
- LOG("Checker", "onError - request.status: " + status);
+ LOG("Checker:onError - request.status: " + status);
// If we can't find an error string specific to this status code,
// just use the 200 message from above, which means everything
@@ -2168,11 +1896,8 @@ Checker.prototype = {
*/
_enabled: true,
get enabled() {
- var aus = Cc["@mozilla.org/updates/update-service;1"].
- getService(Ci.nsIApplicationUpdateService);
- var enabled = getPref("getBoolPref", PREF_APP_UPDATE_ENABLED, true) &&
- aus.canUpdate && this._enabled;
- return enabled;
+ return getPref("getBoolPref", PREF_APP_UPDATE_ENABLED, true) &&
+ gCanCheckForUpdates && this._enabled;
},
/**
@@ -2266,7 +1991,7 @@ Downloader.prototype = {
var fileStream = Cc["@mozilla.org/network/file-input-stream;1"].
createInstance(Ci.nsIFileInputStream);
- fileStream.init(destination, MODE_RDONLY, PERMS_FILE, 0);
+ fileStream.init(destination, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
try {
var hash = Cc["@mozilla.org/security/hash;1"].
@@ -2282,7 +2007,7 @@ Downloader.prototype = {
// we choose to compute these hashes.
digest = binaryToHex(hash.finish(false));
} catch (e) {
- LOG("Downloader", "_verifyDownload - failed to compute hash of " +
+ LOG("Downloader:_verifyDownload - failed to compute hash of the " +
"downloaded update archive");
digest = "";
}
@@ -2331,13 +2056,14 @@ Downloader.prototype = {
// that we do not know about, then remove it and use our default logic.
var useComplete = false;
if (selectedPatch) {
- LOG("Downloader", "_selectPatch - found existing patch with state: " + state);
+ LOG("Downloader:_selectPatch - found existing patch with state: " +
+ state);
switch (state) {
case STATE_DOWNLOADING:
- LOG("Downloader", "_selectPatch - resuming download");
+ LOG("Downloader:_selectPatch - resuming download");
return selectedPatch;
case STATE_PENDING:
- LOG("Downloader", "_selectPatch - already downloaded and staged");
+ LOG("Downloader:_selectPatch - already downloaded and staged");
return null;
default:
// Something went wrong when we tried to apply the previous patch.
@@ -2346,7 +2072,7 @@ Downloader.prototype = {
useComplete = true;
} else {
// This is a pretty fatal error. Just bail.
- LOG("Downloader", "_selectPatch - failed to apply complete patch!");
+ LOG("Downloader:_selectPatch - failed to apply complete patch!");
writeStatusFile(updateDir, STATE_NONE);
writeVersionFile(getUpdatesDir(), null);
return null;
@@ -2411,7 +2137,7 @@ Downloader.prototype = {
// to download.
this._patch = this._selectPatch(update, updateDir);
if (!this._patch) {
- LOG("Downloader", "downloadUpdate - no patch to download");
+ LOG("Downloader:downloadUpdate - no patch to download");
return readStatusFile(updateDir);
}
this.isCompleteUpdate = this._patch.type == "complete";
@@ -2426,10 +2152,11 @@ Downloader.prototype = {
this._request = Cc["@mozilla.org/network/incremental-download;1"].
createInstance(Ci.nsIIncrementalDownload);
- LOG("Downloader", "downloadUpdate - downloading from " + uri.spec + " to " +
+ LOG("Downloader:downloadUpdate - downloading from " + uri.spec + " to " +
patchFile.path);
-
- var interval = this.background ? DOWNLOAD_BACKGROUND_INTERVAL
+ var interval = this.background ? getPref("getIntPref",
+ PREF_APP_UPDATE_BACKGROUND_INTERVAL,
+ DOWNLOAD_BACKGROUND_INTERVAL)
: DOWNLOAD_FOREGROUND_INTERVAL;
this._request.init(uri, patchFile, DOWNLOAD_CHUNK_SIZE, interval);
this._request.start(this, null);
@@ -2486,7 +2213,7 @@ Downloader.prototype = {
*/
onStartRequest: function Downloader_onStartRequest(request, context) {
if (request instanceof Ci.nsIIncrementalDownload)
- LOG("Downloader", "onStartRequest - spec: " + request.URI.spec);
+ LOG("Downloader:onStartRequest - spec: " + request.URI.spec);
var listenerCount = this._listeners.length;
for (var i = 0; i < listenerCount; ++i)
@@ -2506,7 +2233,7 @@ Downloader.prototype = {
*/
onProgress: function Downloader_onProgress(request, context, progress,
maxProgress) {
- LOG("Downloader.onProgress", "onProgress - progress: " + progress + "/" +
+ LOG("Downloader.onProgress:onProgress - progress: " + progress + "/" +
maxProgress);
var listenerCount = this._listeners.length;
@@ -2529,7 +2256,7 @@ Downloader.prototype = {
* Human readable version of |status|
*/
onStatus: function Downloader_onStatus(request, context, status, statusText) {
- LOG("Downloader", "onStatus - status: " + status + ", statusText: " +
+ LOG("Downloader:onStatus - status: " + status + ", statusText: " +
statusText);
var listenerCount = this._listeners.length;
@@ -2551,7 +2278,7 @@ Downloader.prototype = {
*/
onStopRequest: function Downloader_onStopRequest(request, context, status) {
if (request instanceof Ci.nsIIncrementalDownload)
- LOG("Downloader", "onStopRequest - spec: " + request.URI.spec +
+ LOG("Downloader:onStopRequest - spec: " + request.URI.spec +
", status: " + status);
var state = this._patch.state;
@@ -2560,9 +2287,6 @@ Downloader.prototype = {
const NS_BINDING_ABORTED = 0x804b0002;
const NS_ERROR_ABORT = 0x80004004;
if (Components.isSuccessCode(status)) {
- var sbs = Cc["@mozilla.org/intl/stringbundle;1"].
- getService(Ci.nsIStringBundleService);
- var updateStrings = sbs.createBundle(URI_UPDATES_PROPERTIES);
if (this._verifyDownload()) {
state = STATE_PENDING;
@@ -2576,10 +2300,10 @@ Downloader.prototype = {
writeStatusFile(getUpdatesDir(), state);
writeVersionFile(getUpdatesDir(), this._update.extensionVersion);
this._update.installDate = (new Date()).getTime();
- this._update.statusText = updateStrings.GetStringFromName("installPending");
+ this._update.statusText = gUpdateBundle.GetStringFromName("installPending");
}
else {
- LOG("Downloader", "onStopRequest - download verification failed");
+ LOG("Downloader:onStopRequest - download verification failed");
state = STATE_DOWNLOAD_FAILED;
// TODO: use more informative error code here
@@ -2599,7 +2323,7 @@ Downloader.prototype = {
}
else if (status != NS_BINDING_ABORTED &&
status != NS_ERROR_ABORT) {
- LOG("Downloader", "onStopRequest - non-verification failure");
+ LOG("Downloader:onStopRequest - non-verification failure");
// Some sort of other failure, log this in the |statusText| property
state = STATE_DOWNLOAD_FAILED;
@@ -2615,7 +2339,7 @@ Downloader.prototype = {
deleteActiveUpdate = true;
}
- LOG("Downloader", "onStopRequest - setting state to: " + state);
+ LOG("Downloader:onStopRequest - setting state to: " + state);
this._patch.state = state;
var um = Cc["@mozilla.org/updates/update-manager;1"].
getService(Ci.nsIUpdateManager);
@@ -2641,7 +2365,7 @@ Downloader.prototype = {
// If we were downloading a patch and the patch verification phase
// failed, log this and then commence downloading the complete update.
- LOG("Downloader", "onStopRequest - verification of patch failed, " +
+ LOG("Downloader:onStopRequest - verification of patch failed, " +
"downloading complete update");
this._update.isCompleteUpdate = true;
var status = this.downloadUpdate(this._update);
@@ -2720,100 +2444,6 @@ Downloader.prototype = {
};
/**
- * A manager for update check timers. Manages timers that fire over long
- * periods of time (e.g. days, weeks).
- * @constructor
- */
-function TimerManager() {
- getObserverService().addObserver(this, "xpcom-shutdown", false);
-
- this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
- var timerInterval = getPref("getIntPref", PREF_APP_UPDATE_TIMER, 600000);
- this._timer.initWithCallback(this, timerInterval,
- Ci.nsITimer.TYPE_REPEATING_SLACK);
-}
-TimerManager.prototype = {
- /**
- * See nsIObserver.idl
- */
- observe: function TM_observe(subject, topic, data) {
- if (topic == "xpcom-shutdown") {
- getObserverService().removeObserver(this, "xpcom-shutdown");
-
- // Release everything we hold onto.
- for (var timerID in this._timers)
- delete this._timers[timerID];
- this._timer = null;
- this._timers = null;
- }
- },
-
- /**
- * The Checker Timer
- */
- _timer: null,
-
- /**
- * The set of registered timers.
- */
- _timers: { },
-
- /**
- * Called when the checking timer fires.
- * @param timer
- * The checking timer that fired.
- */
- notify: function TM_notify(timer) {
- for (var timerID in this._timers) {
- var timerData = this._timers[timerID];
- var lastUpdateTime = timerData.lastUpdateTime;
- var now = Math.round(Date.now() / 1000);
-
- // Fudge the lastUpdateTime by some random increment of the update
- // check interval (e.g. some random slice of 10 minutes) so that when
- // the time comes to check, we offset each client request by a random
- // amount so they don't all hit at once. app.update.timer is in milliseconds,
- // whereas app.update.lastUpdateTime is in seconds
- var timerInterval = getPref("getIntPref", PREF_APP_UPDATE_TIMER, 600000);
- lastUpdateTime += Math.round(Math.random() * timerInterval / 1000);
-
- if ((now - lastUpdateTime) > timerData.interval &&
- timerData.callback instanceof Ci.nsITimerCallback) {
- timerData.callback.notify(timer);
- timerData.lastUpdateTime = now;
- var preference = PREF_APP_UPDATE_LASTUPDATETIME_FMT.replace(/%ID%/, timerID);
- gPref.setIntPref(preference, now);
- }
- }
- },
-
- /**
- * See nsIUpdateService.idl
- */
- registerTimer: function TM_registerTimer(id, callback, interval) {
- var preference = PREF_APP_UPDATE_LASTUPDATETIME_FMT.replace(/%ID%/, id);
- var now = Math.round(Date.now() / 1000);
- var lastUpdateTime = null;
- if (gPref.prefHasUserValue(preference)) {
- lastUpdateTime = gPref.getIntPref(preference);
- } else {
- gPref.setIntPref(preference, now);
- lastUpdateTime = now;
- }
- this._timers[id] = { callback : callback,
- interval : interval,
- lastUpdateTime : lastUpdateTime };
- },
-
- classDescription: "Timer Manager",
- contractID: "@mozilla.org/updates/timer-manager;1",
- classID: Components.ID("{B322A5C0-A419-484E-96BA-D7182163899F}"),
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdateTimerManager,
- Ci.nsITimerCallback,
- Ci.nsIObserver])
-};
-
-/**
* UpdatePrompt
* An object which can prompt the user with information about updates, request
* action, etc. Embedding clients can override this component with one that
@@ -2838,11 +2468,10 @@ UpdatePrompt.prototype = {
if (!this._enabled || this._getUpdateWindow())
return;
- var bundle = this._updateBundle;
var stringsPrefix = "updateAvailable_" + update.type + ".";
- var title = bundle.formatStringFromName(stringsPrefix + "title",
- [update.name], 1);
- var text = bundle.GetStringFromName(stringsPrefix + "text");
+ var title = gUpdateBundle.formatStringFromName(stringsPrefix + "title",
+ [update.name], 1);
+ var text = gUpdateBundle.GetStringFromName(stringsPrefix + "text");
var imageUrl = "";
this._showUnobtrusiveUI(null, URI_UPDATE_PROMPT_DIALOG, null,
UPDATE_WINDOW_NAME, "updatesavailable", update,
@@ -2857,11 +2486,10 @@ UpdatePrompt.prototype = {
if (!this._enabled)
return;
- var bundle = this._updateBundle;
var stringsPrefix = "updateDownloaded_" + update.type + ".";
- var title = bundle.formatStringFromName(stringsPrefix + "title",
- [update.name], 1);
- var text = bundle.GetStringFromName(stringsPrefix + "text");
+ var title = gUpdateBundle.formatStringFromName(stringsPrefix + "title",
+ [update.name], 1);
+ var text = gUpdateBundle.GetStringFromName(stringsPrefix + "text");
var imageUrl = "";
this._showUnobtrusiveUI(null, URI_UPDATE_PROMPT_DIALOG, null,
UPDATE_WINDOW_NAME, "finishedBackground", update,
@@ -2877,7 +2505,7 @@ UpdatePrompt.prototype = {
*/
showUpdateInstalled: function UP_showUpdateInstalled() {
if (!this._enabled || this._getUpdateWindow() ||
- !getPref("getBoolPref", PREF_APP_UPDATE_SHOW_INSTALLED_UI, true))
+ !getPref("getBoolPref", PREF_APP_UPDATE_SHOW_INSTALLED_UI, false))
return;
var page = "installed";
@@ -2907,10 +2535,9 @@ UpdatePrompt.prototype = {
// In some cases, we want to just show a simple alert dialog:
if (update.state == STATE_FAILED && update.errorCode == WRITE_ERROR) {
- var updateBundle = this._updateBundle;
- var title = updateBundle.GetStringFromName("updaterIOErrorTitle");
- var text = updateBundle.formatStringFromName("updaterIOErrorMsg",
- [gApp.name, gApp.name], 2);
+ var title = gUpdateBundle.GetStringFromName("updaterIOErrorTitle");
+ var text = gUpdateBundle.formatStringFromName("updaterIOErrorMsg",
+ [gApp.name, gApp.name], 2);
var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
getService(Ci.nsIWindowWatcher);
ww.getNewPrompter(null).alert(title, text);
@@ -2935,12 +2562,6 @@ UpdatePrompt.prototype = {
return !getPref("getBoolPref", PREF_APP_UPDATE_SILENT, false);
},
- get _updateBundle() {
- return Cc["@mozilla.org/intl/stringbundle;1"].
- getService(Ci.nsIStringBundleService).
- createBundle(URI_UPDATES_PROPERTIES);
- },
-
/**
* Returns the update window if present.
*/
@@ -2998,6 +2619,20 @@ UpdatePrompt.prototype = {
}
};
+ // bug 534090 - show the UI for update available notifications when the
+ // the system has been idle for at least IDLE_TIME without displaying an
+ // alert notification.
+ if (page == "updatesavailable") {
+ var idleService = Cc["@mozilla.org/widget/idleservice;1"].
+ getService(Ci.nsIIdleService);
+
+ const IDLE_TIME = getPref("getIntPref", PREF_APP_UPDATE_IDLETIME, 60);
+ if (idleService.idleTime / 1000 >= IDLE_TIME) {
+ this._showUI(parent, uri, features, name, page, update);
+ return;
+ }
+ }
+
try {
var notifier = Cc["@mozilla.org/alerts-service;1"].
getService(Ci.nsIAlertsService);
@@ -3013,6 +2648,12 @@ UpdatePrompt.prototype = {
getService(Ci.nsIObserverService);
observer.service.addObserver(observer, "quit-application", false);
+ // bug 534090 - show the UI when idle for update available notifications.
+ if (page == "updatesavailable") {
+ this._showUIWhenIdle(parent, uri, features, name, page, update);
+ return;
+ }
+
// Give the user x seconds to react before showing the big UI
var promptWaitTime = getPref("getIntPref", PREF_APP_UPDATE_PROMPTWAITTIME, 43200);
observer.timer = Cc["@mozilla.org/timer;1"].
@@ -3114,5 +2755,5 @@ UpdatePrompt.prototype = {
};
function NSGetModule(compMgr, fileSpec)
- XPCOMUtils.generateModule([UpdateService, Checker, UpdatePrompt, TimerManager, UpdateManager]);
+ XPCOMUtils.generateModule([UpdateService, Checker, UpdatePrompt, UpdateManager]);
diff --git a/tools/xo_bundle/components/nsUpdateServiceStub.js b/tools/xo_bundle/components/nsUpdateServiceStub.js
new file mode 100644
index 0000000..067b113
--- /dev/null
+++ b/tools/xo_bundle/components/nsUpdateServiceStub.js
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+//@line 38 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateServiceStub.js"
+*/
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/FileUtils.jsm");
+
+const Ci = Components.interfaces;
+
+const DIR_UPDATES = "updates";
+const FILE_UPDATE_STATUS = "update.status";
+
+const KEY_APPDIR = "XCurProcD";
+//@line 53 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateServiceStub.js"
+
+/**
+//@line 61 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateServiceStub.js"
+ */
+function getUpdateDirNoCreate(pathArray) {
+//@line 72 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateServiceStub.js"
+ return FileUtils.getDir(KEY_APPDIR, pathArray, false);
+}
+
+function UpdateServiceStub() {
+ let statusFile = getUpdateDirNoCreate([DIR_UPDATES, "0"]);
+ statusFile.append(FILE_UPDATE_STATUS);
+ // If the update.status file exists then initiate post update processing.
+ if (statusFile.exists()) {
+ let aus = Components.classes["@mozilla.org/updates/update-service;1"].
+ getService(Ci.nsIApplicationUpdateService).
+ QueryInterface(Ci.nsIObserver);
+ aus.observe(null, "post-update-processing", "");
+ }
+}
+UpdateServiceStub.prototype = {
+ classDescription: "Update Service Stub",
+ contractID: "@mozilla.org/updates/update-service-stub;1",
+ classID: Components.ID("{e43b0010-04ba-4da6-b523-1f92580bc150}"),
+ _xpcom_categories: [{ category: "profile-after-change" }],
+ QueryInterface: XPCOMUtils.generateQI([])
+};
+
+function NSGetModule(compMgr, fileSpec)
+ XPCOMUtils.generateModule([UpdateServiceStub]);
diff --git a/tools/xo_bundle/components/nsUpdateTimerManager.js b/tools/xo_bundle/components/nsUpdateTimerManager.js
new file mode 100644
index 0000000..524e626
--- /dev/null
+++ b/tools/xo_bundle/components/nsUpdateTimerManager.js
@@ -0,0 +1,216 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+//@line 39 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+*/
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+const PREF_APP_UPDATE_LASTUPDATETIME_FMT = "app.update.lastUpdateTime.%ID%";
+const PREF_APP_UPDATE_TIMER = "app.update.timer";
+const PREF_APP_UPDATE_LOG = "app.update.log";
+
+const CATEGORY_UPDATE_TIMER = "update-timer";
+
+XPCOMUtils.defineLazyServiceGetter(this, "gPref",
+ "@mozilla.org/preferences-service;1",
+ "nsIPrefBranch2");
+
+XPCOMUtils.defineLazyServiceGetter(this, "gConsole",
+ "@mozilla.org/consoleservice;1",
+ "nsIConsoleService");
+
+XPCOMUtils.defineLazyGetter(this, "gLogEnabled", function tm_gLogEnabled() {
+ return getPref("getBoolPref", PREF_APP_UPDATE_LOG, false);
+});
+
+function getObserverService() {
+ return Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
+}
+
+/**
+//@line 78 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+ */
+function getPref(func, preference, defaultValue) {
+ try {
+ return gPref[func](preference);
+ }
+ catch (e) {
+ }
+ return defaultValue;
+}
+
+/**
+//@line 92 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+ */
+function LOG(string) {
+ if (gLogEnabled) {
+ dump("*** UTM:SVC " + string + "\n");
+ gConsole.logStringMessage("UTM:SVC " + string);
+ }
+}
+
+/**
+//@line 104 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+ */
+function TimerManager() {
+ getObserverService().addObserver(this, "xpcom-shutdown", false);
+}
+TimerManager.prototype = {
+ /**
+ * The Checker Timer
+ */
+ _timer: null,
+
+ /**
+//@line 117 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+ */
+ _timerInterval: null,
+
+ /**
+ * The set of registered timers.
+ */
+ _timers: { },
+
+ /**
+//@line 132 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+ */
+ get _fudge() {
+ return Math.round(Math.random() * this._timerInterval / 1000);
+ },
+
+ /**
+ * See nsIObserver.idl
+ */
+ observe: function TM_observe(aSubject, aTopic, aData) {
+ switch (aTopic) {
+ case "profile-after-change":
+ this._start();
+ break;
+ case "xpcom-shutdown":
+ let os = getObserverService();
+ os.removeObserver(this, "xpcom-shutdown");
+
+ // Release everything we hold onto.
+ if (this._timer) {
+ this._timer.cancel();
+ this._timer = null;
+ }
+ for (var timerID in this._timers)
+ delete this._timers[timerID];
+ this._timers = null;
+ break;
+ }
+ },
+
+ _start: function TM__start() {
+ this._timerInterval = getPref("getIntPref", "app.update.timer", 600000);
+ this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timer.initWithCallback(this, this._timerInterval,
+ Ci.nsITimer.TYPE_REPEATING_SLACK);
+ },
+ /**
+//@line 171 "/builds/slave/linux_build/build/toolkit/mozapps/update/src/nsUpdateTimerManager.js"
+ */
+ notify: function TM_notify(timer) {
+ var prefLastUpdate;
+ var lastUpdateTime;
+ var now = Math.round(Date.now() / 1000);
+ var catMan = Cc["@mozilla.org/categorymanager;1"].
+ getService(Ci.nsICategoryManager);
+ var entries = catMan.enumerateCategory(CATEGORY_UPDATE_TIMER);
+ while (entries.hasMoreElements()) {
+ let entry = entries.getNext().QueryInterface(Ci.nsISupportsCString).data;
+ let value = catMan.getCategoryEntry(CATEGORY_UPDATE_TIMER, entry);
+ let [cid, method, timerID, prefInterval, defaultInterval] = value.split(",");
+ defaultInterval = parseInt(defaultInterval);
+ // cid and method are validated below when calling notify.
+ if (!timerID || !defaultInterval || isNaN(defaultInterval)) {
+ LOG("TimerManager:notify - update-timer category registered" +
+ (cid ? " for " + cid : "") + " without required parameters - " +
+ "skipping");
+ continue;
+ }
+
+ let interval = getPref("getIntPref", prefInterval, defaultInterval);
+ prefLastUpdate = PREF_APP_UPDATE_LASTUPDATETIME_FMT.replace(/%ID%/,
+ timerID);
+ if (gPref.prefHasUserValue(prefLastUpdate)) {
+ lastUpdateTime = gPref.getIntPref(prefLastUpdate);
+ }
+ else {
+ lastUpdateTime = now + this._fudge;
+ gPref.setIntPref(prefLastUpdate, lastUpdateTime);
+ continue;
+ }
+
+ if ((now - lastUpdateTime) > interval) {
+ try {
+ Components.classes[cid][method](Ci.nsITimerCallback).notify(timer);
+ LOG("TimerManager:notify - notified " + cid);
+ }
+ catch (e) {
+ LOG("TimerManager:notify - error notifying component id: " +
+ cid + " ,error: " + e);
+ }
+ lastUpdateTime = now + this._fudge;
+ gPref.setIntPref(prefLastUpdate, lastUpdateTime);
+ }
+ }
+
+ for (var timerID in this._timers) {
+ var timerData = this._timers[timerID];
+
+ if ((now - timerData.lastUpdateTime) > timerData.interval) {
+ if (timerData.callback instanceof Ci.nsITimerCallback) {
+ try {
+ timerData.callback.notify(timer);
+ LOG("TimerManager:notify - notified timerID: " + timerID);
+ }
+ catch (e) {
+ LOG("TimerManager:notify - error notifying timerID: " + timerID +
+ ", error: " + e);
+ }
+ }
+ else {
+ LOG("TimerManager:notify - timerID: " + timerID + " doesn't " +
+ "implement nsITimerCallback - skipping");
+ }
+ lastUpdateTime = now + this._fudge;
+ timerData.lastUpdateTime = lastUpdateTime;
+ prefLastUpdate = PREF_APP_UPDATE_LASTUPDATETIME_FMT.replace(/%ID%/, timerID);
+ gPref.setIntPref(prefLastUpdate, lastUpdateTime);
+ }
+ }
+ },
+
+ /**
+ * See nsIUpdateTimerManager.idl
+ */
+ registerTimer: function TM_registerTimer(id, callback, interval) {
+ LOG("TimerManager:registerTimer - id: " + id);
+ var prefLastUpdate = PREF_APP_UPDATE_LASTUPDATETIME_FMT.replace(/%ID%/, id);
+ var lastUpdateTime;
+ if (gPref.prefHasUserValue(prefLastUpdate)) {
+ lastUpdateTime = gPref.getIntPref(prefLastUpdate);
+ } else {
+ lastUpdateTime = Math.round(Date.now() / 1000) + this._fudge;
+ gPref.setIntPref(prefLastUpdate, lastUpdateTime);
+ }
+ this._timers[id] = { callback : callback,
+ interval : interval,
+ lastUpdateTime : lastUpdateTime };
+ },
+
+ classDescription: "Timer Manager",
+ contractID: "@mozilla.org/updates/timer-manager;1",
+ classID: Components.ID("{B322A5C0-A419-484E-96BA-D7182163899F}"),
+ _xpcom_categories: [{ category: "profile-after-change" }],
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdateTimerManager,
+ Ci.nsITimerCallback,
+ Ci.nsIObserver])
+};
+
+function NSGetModule(compMgr, fileSpec)
+ XPCOMUtils.generateModule([TimerManager]);
diff --git a/tools/xo_bundle/components/nsUrlClassifierLib.js b/tools/xo_bundle/components/nsUrlClassifierLib.js
index ff8bad6..f42fa5b 100755
--- a/tools/xo_bundle/components/nsUrlClassifierLib.js
+++ b/tools/xo_bundle/components/nsUrlClassifierLib.js
@@ -1,4 +1,4 @@
-//@line 37 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierLib.js"
+//@line 37 "/builds/slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierLib.js"
// We wastefully reload the same JS files across components. This puts all
// the common JS files used by safebrowsing and url-classifier into a
@@ -8,7 +8,7 @@ const Cc = Components.classes;
const Ci = Components.interfaces;
const G_GDEBUG = false;
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/lang.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/lang.js"
/**
@@ -88,7 +88,7 @@ Function.prototype.inherits = function(parentCtor) {
this.superClass_ = parentCtor.prototype;
this.prototype = new tempCtor();
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/preferences.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/preferences.js"
// Class for manipulating preferences. Aside from wrapping the pref
@@ -317,9 +317,9 @@ G_PreferenceObserver.prototype.QueryInterface = function(iid) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
-//@line 38 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/debug.js"
+//@line 38 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/debug.js"
-//@line 868 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/debug.js"
+//@line 868 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/debug.js"
// Stubs for the debugging aids scattered through this component.
// They will be expanded if you compile yourself a debug build.
@@ -329,7 +329,7 @@ function G_Assert(who, condition, msg) { }
function G_Error(who, msg) { }
var G_debugService = { __noSuchMethod__: function() { } };
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/alarm.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/alarm.js"
// An Alarm fires a callback after a certain amount of time, or at
@@ -475,7 +475,7 @@ G_ConditionalAlarm.prototype.notify = function(timer) {
this.cancel();
}
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/cryptohasher.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/cryptohasher.js"
// A very thin wrapper around nsICryptoHash. It's not strictly
@@ -617,7 +617,7 @@ G_CryptoHasher.prototype.toHex_ = function(str) {
return hexrep.join('');
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/observer.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/observer.js"
// A couple of classes to simplify creating observers.
@@ -717,7 +717,7 @@ G_ObserverServiceObserver.prototype.observe_ = function(subject, topic, data) {
this.unregister();
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/moz/protocol4.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/moz/protocol4.js"
// A helper class that knows how to parse from and serialize to
@@ -793,7 +793,7 @@ G_Protocol4Parser.prototype.serialize = function(map) {
return text;
}
-//@line 53 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierLib.js"
+//@line 53 "/builds/slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierLib.js"
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
@@ -942,7 +942,7 @@ RequestBackoff.prototype.isErrorStatus = function(status) {
HTTP_TEMPORARY_REDIRECT == status);
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/url-crypto-key-manager.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/url-crypto-key-manager.js"
// This file implements the tricky business of managing the keys for our
@@ -1337,7 +1337,7 @@ PROT_UrlCryptoKeyManager.prototype.shutdown = function() {
}
-//@line 36 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/xml-fetcher.js"
+//@line 36 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/xml-fetcher.js"
// A simple class that encapsulates a request. You'll notice the
// style here is different from the rest of the extension; that's
@@ -1537,7 +1537,7 @@ PROT_CookieStripper.prototype.QueryInterface = function(iid) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
-//@line 57 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierLib.js"
+//@line 57 "/builds/slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierLib.js"
// Expose this whole component.
var lib = this;
diff --git a/tools/xo_bundle/components/nsUrlClassifierListManager.js b/tools/xo_bundle/components/nsUrlClassifierListManager.js
index 76eb350..6020c1a 100755
--- a/tools/xo_bundle/components/nsUrlClassifierListManager.js
+++ b/tools/xo_bundle/components/nsUrlClassifierListManager.js
@@ -1,9 +1,9 @@
-//@line 37 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierListManager.js"
+//@line 37 "/builds/slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierListManager.js"
const Cc = Components.classes;
const Ci = Components.interfaces;
-//@line 37 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/content/listmanager.js"
+//@line 37 "/builds/slave/linux_build/build/toolkit/components/url-classifier/content/listmanager.js"
// A class that manages lists, namely white and black lists for
@@ -15,9 +15,6 @@ const Ci = Components.interfaces;
// TODO more comprehensive update tests, for example add unittest check
// that the listmanagers tables are properly written on updates
-// How frequently we check for updates (30 minutes)
-const kUpdateInterval = 30 * 60 * 1000;
-
function QueryAdapter(callback) {
this.callback_ = callback;
};
@@ -38,6 +35,7 @@ function PROT_ListManager() {
this.currentUpdateChecker_ = null; // set when we toggle updates
this.prefs_ = new G_Preferences();
+ this.updateInterval = this.prefs_.getPref("urlclassifier.updateinterval", 30 * 60) * 1000;
this.updateserverURL_ = null;
this.gethashURL_ = null;
@@ -271,16 +269,15 @@ PROT_ListManager.prototype.maybeToggleUpdateChecking = function() {
/**
* Start periodic checks for updates. Idempotent.
* We want to distribute update checks evenly across the update period (an
- * hour). To do this, we pick a random number of time between 0 and 30
- * minutes. The client first checks at 15 + rand, then every 30 minutes after
- * that.
+ * hour). The first update is scheduled for a random time between 0.5 and 1.5
+ * times the update interval.
*/
PROT_ListManager.prototype.startUpdateChecker = function() {
this.stopUpdateChecker();
// Schedule the first check for between 15 and 45 minutes.
- var repeatingUpdateDelay = kUpdateInterval / 2;
- repeatingUpdateDelay += Math.floor(Math.random() * kUpdateInterval);
+ var repeatingUpdateDelay = this.updateInterval / 2;
+ repeatingUpdateDelay += Math.floor(Math.random() * this.updateInterval);
this.updateChecker_ = new G_Alarm(BindToObject(this.initialUpdateCheck_,
this),
repeatingUpdateDelay);
@@ -289,12 +286,12 @@ PROT_ListManager.prototype.startUpdateChecker = function() {
/**
* Callback for the first update check.
* We go ahead and check for table updates, then start a regular timer (once
- * every 30 minutes).
+ * every update interval).
*/
PROT_ListManager.prototype.initialUpdateCheck_ = function() {
this.checkForUpdates();
this.updateChecker_ = new G_Alarm(BindToObject(this.checkForUpdates, this),
- kUpdateInterval, true /* repeat */);
+ this.updateInterval, true /* repeat */);
}
/**
@@ -538,10 +535,9 @@ PROT_ListManager.prototype.QueryInterface = function(iid) {
iid.equals(Ci.nsITimerCallback))
return this;
- Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
- return null;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
}
-//@line 42 "/builds/moz2_slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierListManager.js"
+//@line 42 "/builds/slave/linux_build/build/toolkit/components/url-classifier/src/nsUrlClassifierListManager.js"
var modScope = this;
function Init() {
diff --git a/tools/xo_bundle/components/storage-mozStorage.js b/tools/xo_bundle/components/storage-mozStorage.js
index f9e528c..d5ae47e 100755
--- a/tools/xo_bundle/components/storage-mozStorage.js
+++ b/tools/xo_bundle/components/storage-mozStorage.js
@@ -1146,8 +1146,10 @@ LoginManagerStorage_mozStorage.prototype = {
this._base64checked = true;
// Ignore failures, will try again next session...
+ this.log("Reencrypting Base64 logins");
+ this._dbConnection.beginTransaction();
try {
- let [logins, ids] = this._searchLogins({ encType: 0 });
+ let [logins, ids] = this._searchLogins({ encType: ENCTYPE_BASE64 });
if (!logins.length)
return;
@@ -1157,10 +1159,37 @@ LoginManagerStorage_mozStorage.prototype = {
if (userCanceled)
return;
- for each (let login in logins)
- this.modifyLogin(login, login);
+ let encUsername, encPassword, stmt;
+ for each (let login in logins) {
+ [encUsername, encPassword, userCanceled] = this._encryptLogin(login);
+ if (userCanceled)
+ throw "User canceled master password entry, login not modified.";
+ let query =
+ "UPDATE moz_logins " +
+ "SET encryptedUsername = :encryptedUsername, " +
+ "encryptedPassword = :encryptedPassword, " +
+ "encType = :encType " +
+ "WHERE guid = :guid";
+ let params = {
+ encryptedUsername: encUsername,
+ encryptedPassword: encPassword,
+ encType: ENCTYPE_SDR,
+ guid: login.guid
+ };
+ try {
+ stmt = this._dbCreateStatement(query, params);
+ stmt.execute();
+ } catch (e) {
+ // Ignore singular errors, continue trying to update others.
+ this.log("_reencryptBase64Logins caught error: " + e);
+ } finally {
+ stmt.reset();
+ }
+ }
} catch (e) {
- this.log("_reencryptBase64Logins caught error: " + e);
+ this.log("_reencryptBase64Logins failed: " + e);
+ } finally {
+ this._dbConnection.commitTransaction();
}
},
@@ -1260,11 +1289,7 @@ LoginManagerStorage_mozStorage.prototype = {
// Memoize the statements
if (!wrappedStmt) {
this.log("Creating new statement for query: " + query);
- let stmt = this._dbConnection.createStatement(query);
-
- wrappedStmt = Cc["@mozilla.org/storage/statement-wrapper;1"].
- createInstance(Ci.mozIStorageStatementWrapper);
- wrappedStmt.initialize(stmt);
+ wrappedStmt = this._dbConnection.createStatement(query);
this._dbStmts[query] = wrappedStmt;
}
// Replace parameters, must be done 1 at a time
@@ -1571,8 +1596,8 @@ LoginManagerStorage_mozStorage.prototype = {
}
// Finalize all statements to free memory, avoid errors later
- for (let i = 0; i < this._dbStmts.length; i++)
- this._dbStmts[i].statement.finalize();
+ for each (let stmt in this._dbStmts)
+ stmt.finalize();
this._dbStmts = [];
// Close the connection, ignore 'already closed' error
diff --git a/tools/xo_bundle/components/xpti.dat b/tools/xo_bundle/components/xpti.dat
index 55abd5c..e4d654b 100755
--- a/tools/xo_bundle/components/xpti.dat
+++ b/tools/xo_bundle/components/xpti.dat
@@ -2,245 +2,242 @@
[Header,2]
0,Version,2,0
-1,AppDir,/home/olpc/Activities/Firefox.activity
+1,AppDir,/home/hitman/Software/firefox-3.6-EPaath
-[Directories,4]
-0,/home/olpc/Activities/Firefox.activity/components
-1,/home/olpc/.mozilla/plugins
-2,/home/olpc/Activities/Firefox.activity/plugins
-3,/usr/lib/mozilla/plugins
+[Directories,1]
+0,/home/hitman/Software/firefox-3.6-EPaath/components
[Files,1]
-0,browser.xpt,0,361500,1253014816000
+0,browser.xpt,0,365568,1263595306000
[ArchiveItems,0]
-[Interfaces,1431]
+[Interfaces,1423]
0,nsIDOMStyleSheet,{a6cf9080-15b3-11d2-932e-00805f8add32},0,-1,1
-1,nsIAddonSearchResultsCallback,{a6f70917-dd30-4eb6-8b3d-453204f96f33},0,-1,1
-2,txIXPathObject,{67706346-dece-4c9b-9fc2-57cf19071014},0,-1,1
-3,nsIContentSniffer,{a5772d1b-fc63-495e-a169-96e8d3311af0},0,-1,1
-4,extIPreferenceBranch,{ce697d40-aa5a-11db-abbd-0800200c9a66},0,-1,1
-5,nsIDOMMediaList,{9b0c2ed7-111c-4824-adf9-ef0da6dad371},0,-1,1
-6,nsISHContainer,{65281ba2-988a-11d3-bdc7-0050040a9b44},0,-1,1
-7,nsITimer,{193fc37a-8aa4-4d29-aa57-1acd87c26b66},0,-1,1
-8,nsIBrowserSearchService,{8307b8f2-08ea-45b8-96bf-b1dc7688fe3b},0,-1,1
-9,nsIDOMHTMLAudioElement,{5ecd8913-a738-41be-8597-7f3a4ffba017},0,-1,1
-10,nsIDOMNSXBLFormControl,{1c28ed66-1dd2-11b2-95af-e2cf10931adb},0,-1,1
-11,nsIThreadPool,{d628159b-1a03-4985-aa77-43122eb23bfc},0,-1,1
-12,nsIScrollBoxObject,{56e2ada8-4631-11d4-ba11-001083023c1e},0,-1,1
-13,nsICachingChannel,{830d4bcb-3e46-4011-9bda-51a5d1af891f},0,-1,1
-14,nsIClipboardDragDropHooks,{e03e6c5e-0d84-4c0b-8739-e6b8d51922de},0,-1,1
-15,nsIDragDropHandler,{4f418f58-f834-4736-a755-e0395bedca9d},0,-1,1
-16,nsIDOMSVGAnimatedInteger,{7b196db6-955e-4a9f-8f42-645ebc2ce938},0,-1,1
-17,nsIJARURI,{b0922a89-f87b-4cb5-8612-305a285fcca7},0,-1,1
-18,nsITableEditor,{4805e684-49b9-11d3-9ce4-ed60bd6cb5bc},0,-1,1
-19,nsIClassicPluginFactory,{07bfa284-1dd2-11b2-90f8-fef5608e8a56},0,-1,0
-20,nsISignatureVerifier,{dea87f65-e91e-4119-aa13-aaa2be80cac2},0,-1,0
-21,nsIPropertyBag2,{625cfd1e-da1e-4417-9ee9-dbc8e0b3fd79},0,-1,1
-22,nsILocalFile,{aa610f20-a889-11d3-8c81-000064657374},0,-1,1
-23,nsIURIFixup,{773081ac-9f81-4bdb-9e7a-5e87b4361f09},0,-1,1
-24,nsIDOMStorageItem,{0cc37c78-4c5f-48e1-adfc-7480b8fe9dc4},0,-1,1
-25,nsIDOMCSSRuleList,{a6cf90c0-15b3-11d2-932e-00805f8add32},0,-1,1
-26,nsIStorageStream,{604ad9d0-753e-11d3-90ca-34278643278f},0,-1,1
-27,nsIDOMSVGFEFuncBElement,{8b139fe7-5d21-4af3-beda-414aa089b3fb},0,-1,1
-28,nsITreeSelection,{ab6fe746-300b-4ab4-abb9-1c0e3977874c},0,-1,1
-29,nsINonBlockingAlertService,{e800ef97-ae37-46b7-a46c-31fbe79657ea},0,-1,1
-30,nsIDownloadObserver,{44b3153e-a54e-4077-a527-b0325e40924e},0,-1,1
-31,nsIUnicharStreamLoaderObserver,{6bb3e55b-69c0-4fc9-87e5-bed780d997ce},0,-1,1
-32,nsIFile,{c8c0a080-0868-11d3-915f-d9d889d48e3c},0,-1,1
-33,nsIDocumentLoader,{bbe961ee-59e9-42bb-be50-0331979bb79f},0,-1,1
-34,nsIDOMHTMLTableCellElement,{a6cf90b7-15b3-11d2-932e-00805f8add32},0,-1,1
-35,nsIException,{f3a8d3b4-c424-4edc-8bf6-8974c983ba78},0,-1,1
-36,nsIContentPrefObserver,{746c7a02-f6c1-4869-b434-7c8b86e60e61},0,-1,1
-37,nsICommandParams,{83f892cf-7ed3-490e-967a-62640f3158e1},0,-1,1
-38,nsIUrlClassifierDBService,{7aae3f3a-527d-488b-a448-45dca6db0e80},0,-1,1
-39,nsIRDFDataSource,{0f78da58-8321-11d2-8eac-00805f29f370},0,-1,1
-40,nsIContentPrefService,{5047e359-dfda-4858-abec-d145c7463250},0,-1,1
-41,nsIDOMNotifyPaintEvent,{dec5582e-5cea-412f-bf98-6b27480fb46a},0,-1,1
-42,nsIDOMSVGFEMergeElement,{b860512c-2547-4d1f-bb43-b57b54d39014},0,-1,1
-43,nsIDOMCRMFObject,{16da46c0-208d-11d4-8a7c-006008c844c3},0,-1,1
-44,nsIInterfaceInfoManager,{8b161900-be2b-11d2-9831-006008962422},0,-1,0
-45,nsITextServicesFilter,{5bec321f-59ac-413a-a4ad-8a8d7c50a0d0},0,-1,1
-46,nsIJAR,{04501db2-0409-11d3-bcf8-00805f0e1353},0,-1,0
-47,nsIClientAuthUserDecision,{95c4373e-bdd4-4a63-b431-f5b000367721},0,-1,1
-48,nsILoginManagerPrompter,{68b3cb59-51b8-4c57-bd7f-b2ce955a593d},0,-1,1
-49,nsILoginMetaInfo,{867407d5-10e0-43a0-bc81-a324740534ca},0,-1,1
-50,nsIDirectoryServiceProvider,{bbf8cab0-d43a-11d3-8cc2-00609792278c},0,-1,1
-51,nsIX509Cert,{f0980f60-ee3d-11d4-998b-00b0d02354a0},0,-1,1
-52,jsdIContextEnumerator,{912e342a-1dd2-11b2-b09f-cf3af38c15f0},0,-1,1
-53,nsIRDFNode,{0f78da50-8321-11d2-8eac-00805f29f370},0,-1,1
-54,nsIDOMSVGDescElement,{56f539b7-0b3d-4bac-b60d-9efe220216ea},0,-1,1
-55,nsIDOMCSSRule,{a6cf90c1-15b3-11d2-932e-00805f8add32},0,-1,1
-56,nsIProxyInfo,{3fe9308b-1608-4fa0-933c-c5ec2c6175fd},0,-1,1
-57,nsIDOMHTMLLinkElement,{a6cf9088-15b3-11d2-932e-00805f8add32},0,-1,1
-58,nsISupportsPRUint32,{e01dc470-4a1c-11d3-9890-006008962422},0,-1,1
-59,nsIDOMXMLDocument,{8816d003-e7c8-4065-8827-829b8d07b6e0},0,-1,1
-60,nsIDOMSVGImageElement,{43ae4efe-2610-4cce-8242-279e556a78fa},0,-1,1
-61,nsIUrlClassifierDBServiceWorker,{2af84c09-269e-4fc2-b28f-af56717db118},0,-1,1
-62,nsIXSLTProcessorObsolete,{3fbff728-2d20-11d3-aef3-00108300ff91},0,-1,1
-63,nsIWebBrowserSetup,{f15398a0-8018-11d3-af70-00a024ffc08c},0,-1,1
-64,nsIDOMHTMLParagraphElement,{a6cf90a1-15b3-11d2-932e-00805f8add32},0,-1,1
-65,nsIAssociatedContentSecurity,{8db92dde-799f-4d33-80f7-459cac800dc9},0,-1,1
-66,nsIRunnable,{4a2abaf0-6886-11d3-9382-00104ba0fd40},0,-1,1
-67,nsIDirectoryService,{57a66a60-d43a-11d3-8cc2-00609792278c},0,-1,1
-68,extIExtension,{10cee02c-f6e0-4d61-ab27-c16572b18c46},0,-1,1
-69,nsIDNSListener,{41466a9f-f027-487d-a96c-af39e629b8d2},0,-1,1
-70,nsIPK11TokenDB,{4ee28c82-1dd2-11b2-aabf-bb4017abe395},0,-1,1
-71,nsIAccessibleText,{0f4633b1-550c-4b50-8c04-0eb1005eef2f},0,-1,1
-72,nsICommandLineValidator,{5ecaa593-7660-4a3a-957a-92d5770671c7},0,-1,1
-73,nsICookieManager,{aaab6710-0f2c-11d5-a53b-0010a401eb10},0,-1,1
-74,nsPIDNSService,{a26c5b45-7707-4412-bbc1-2462b890848d},0,-1,1
-75,nsIMIMEHeaderParam,{ddbbdfb8-a1c0-4dd5-a31b-5d2a7a3bb6ec},0,-1,1
-76,xpcIJSWeakReference,{5b776cd4-952b-45a2-b363-84e99e8fe608},0,-1,1
-77,mozIPersonalDictionary,{7ef52eaf-b7e1-462b-87e2-5d1dbaca9048},0,-1,1
-78,nsIInstallLocation,{32a74707-ec7c-af19-f4d8-d0cd8cb6a948},0,-1,1
-79,nsISerializable,{91cca981-c26d-44a8-bebe-d9ed4891503a},0,-1,1
-80,imgIContainerObserver,{53102f15-0f53-4939-957e-aea353ad2700},0,-1,1
-81,nsIStringEnumerator,{50d3ef6c-9380-4f06-9fb2-95488f7d141c},0,-1,1
-82,nsICipherInfoService,{766d47cb-6d8c-4e71-b6b7-336917629a69},0,-1,1
-83,nsIDOMSerializer,{9fd4ba15-e67c-4c98-b52c-7715f62c9196},0,-1,1
-84,nsICacheMetaDataVisitor,{22f9a49c-3cf8-4c23-8006-54efb11ac562},0,-1,1
-85,nsIDownloadManagerUI,{ca7663d5-69e3-4c4a-b754-f462bd36b05f},0,-1,1
-86,nsIPKCS11Slot,{c2d4f296-ee60-11d4-998b-00b0d02354a0},0,-1,1
-87,nsIGeneratingKeypairInfoDialogs,{11bf5cdc-1dd2-11b2-ba6a-c76afb326fa1},0,-1,1
-88,jsdIEphemeral,{46f1e23e-1dd2-11b2-9ceb-8285f2e95e69},0,-1,1
-89,nsIWorker,{daf945c3-8d29-4724-8939-dd383f7d27a7},0,-1,1
-90,nsIPrompt,{a63f70c0-148b-11d3-9333-00104ba0fd40},0,-1,1
-91,nsIAuthPromptAdapterFactory,{60e46383-bb9a-4860-8962-80d9c5c05ddc},0,-1,1
-92,nsIAlertsService,{e177399e-2e31-4019-aed3-cba63ce9fa99},0,-1,1
-93,nsIUrlClassifierCallback,{4ca27b6b-a674-4b3d-ab30-d21e2da2dffb},0,-1,1
-94,nsIApplicationCacheChannel,{9acfd21c-9c07-459f-8dae-ed2ffba23ddc},0,-1,1
-95,nsISessionStore_MOZILLA_1_9_1,{7f750b1a-35b7-11de-b025-b7deb5eac8bf},0,-1,1
-96,nsIXULBuilderListener,{ac46be8f-c863-4c23-84a2-d0fcc8dfa9f4},0,-1,1
-97,nsIDownloader,{fafe41a9-a531-4d6d-89bc-588a6522fb4e},0,-1,1
-98,fuelIApplication,{fe74cf80-aa2d-11db-abbd-0800200c9a66},0,-1,1
-99,nsIPrefLocalizedString,{ae419e24-1dd1-11b2-b39a-d3e5e7073802},0,-1,1
-100,nsIOutputStream,{0d0acd2a-61b4-11d4-9877-00c04fa0cf4a},0,-1,1
-101,nsIDOMCounter,{31adb439-0055-402d-9b1d-d5ca94f3f55b},0,-1,1
-102,nsIHTTPHeaderListener,{ea51e0b8-871c-4b85-92da-6f400394c5ec},0,-1,1
-103,nsIUnicodeNormalizer,{b43a461f-1bcf-4329-820b-66e48c979e14},0,-1,1
-104,nsIDOMSVGTransformList,{cee0a9d4-8554-4bf6-bf9b-7d0cebb4269d},0,-1,1
-105,nsISecureBrowserUI,{081e31e0-a144-11d3-8c7c-00609792278c},0,-1,1
-106,nsIAuthenticationInfo,{078a1b99-6be2-4a57-a749-378f4a506097},0,-1,0
-107,nsICertPickDialogs,{51d59b08-1dd2-11b2-ad4a-a51b92f8a184},0,-1,1
-108,nsIToolkit,{18032bd0-b265-11d1-aa2a-000000000000},0,-1,0
-109,nsISupportsFloat,{abeaa390-4ac0-11d3-baea-00805f8a5dd7},0,-1,1
-110,nsIDOMHTMLSelectElement,{a6cf9090-15b3-11d2-932e-00805f8add32},0,-1,1
-111,nsIObjectOutputStream,{92c898ac-5fde-4b99-87b3-5d486422094b},0,-1,1
-112,nsIContextMenuInfo,{2f977d56-5485-11d4-87e2-0010a4e75ef2},0,-1,1
-113,nsIMultiPartChannel,{ba78db7b-b88c-4b76-baf9-3c2296a585ae},0,-1,1
-114,nsIUnicharLineInputStream,{67f42475-ba80-40f8-ac0b-649c89230184},0,-1,1
-115,nsIDOMSVGTransformable,{b81f6e37-1842-4534-a546-1ab86e59a3c6},0,-1,1
-116,nsIDOMSVGAnimatedNumberList,{93ebb030-f82d-4f8e-b133-d1b5abb73cf3},0,-1,1
-117,nsITokenDialogs,{a1cbc159-468c-495d-8068-61dd538cbcca},0,-1,1
-118,nsILoginManager,{9c78bfc1-422b-4f4f-ba09-f7eb3c4e72b2},0,-1,1
-119,nsIDOMDocumentCSS,{39f76c23-45b2-428a-9240-a981e5abf148},0,-1,1
-120,nsIAccessibleTreeCache,{1dde5c3b-bede-43d1-aabf-dabc461113bd},0,-1,0
-121,nsITransportSecurityInfo,{0d0a6b62-d4a9-402e-a197-6bc6e358fec9},0,-1,1
-122,nsIIdleService,{cc52f19a-63ae-4a1c-9cc3-e79eace0b471},0,-1,1
-123,nsITextToSubURI,{8b042e24-6f87-11d3-b3c8-00805f8a6670},0,-1,1
-124,nsIDOMHTMLFrameElement,{a6cf90b9-15b3-11d2-932e-00805f8add32},0,-1,1
-125,nsITokenPasswordDialogs,{be26b580-1dd1-11b2-9946-c598d0d07727},0,-1,1
-126,nsIDataSignatureVerifier,{0a84b3d5-6ba9-432d-89da-4fbd0b0f2aec},0,-1,1
-127,jsdIExecutionHook,{9a7b6ad0-1dd1-11b2-a789-fcfae96356a2},0,-1,1
-128,nsINavBookmarkObserver,{f9828ba8-9c70-4d95-b926-60d9e4378d7d},0,-1,1
-129,nsIDOMPopupBlockedEvent,{05be571f-c3ea-4959-a340-c57b1591ae4b},0,-1,1
-130,nsIFeedWriter,{67003393-018c-4e96-af10-c6c51a049fad},0,-1,1
-131,nsIDOMSVGFECompositeElement,{6ff3c539-1a3b-4a3f-8acd-354d349eb7fc},0,-1,1
-132,nsIXPIProgressDialog,{ce8f744e-d5a5-41b3-911f-0fee3008b64e},0,-1,1
-133,nsIDOMStorageWindow_1_9_1,{b5e1b190-5e0d-4a77-a3df-fd7762110e23},0,-1,1
-134,nsISupportsChar,{e2b05e40-4a1c-11d3-9890-006008962422},0,-1,1
-135,nsISelectionPrivate,{b416c692-eeb8-4186-addd-c444e81b68e5},0,-1,1
-136,nsIXPCConstructor,{c814ca20-e0dc-11d3-8f5f-0010a4e73d9a},0,-1,1
-137,nsIDOMSVGZoomEvent,{339a8c7a-552e-4cbc-8d96-8370a3939358},0,-1,1
-138,nsICancelable,{d94ac0a0-bb18-46b8-844e-84159064b0bd},0,-1,1
-139,nsIDOMHTMLCanvasElement,{d87394af-d31a-484e-8b7c-75381045384d},0,-1,1
-140,nsIJARChannel,{6e6cc56d-51eb-4299-a795-dcfd1229ab3d},0,-1,1
-141,nsIFeedProgressListener,{ebfd5de5-713c-40c0-ad7c-f095117fa580},0,-1,1
-142,nsIDOMLSSerializerFilter,{b9b6ec85-f69f-4a5a-a96a-8a7a8f07e2b4},0,-1,1
-143,nsIBinaryOutputStream,{204ee610-8765-11d3-90cf-0040056a906e},0,-1,1
-144,nsIDOMDOMStringList,{0bbae65c-1dde-11d9-8c46-000a95dc234c},0,-1,1
-145,nsIImageLoadingContent,{7744c6d3-5c60-4b7b-a526-4fe9d5ac7e97},0,-1,1
-146,nsIExceptionService,{35a88f54-f267-4414-92a7-191f6454ab52},0,-1,1
-147,nsIDOMNSDataTransfer_MOZILLA_1_9_1,{a3d50078-13cf-4bef-b673-c3f25a41b9ca},0,-1,1
-148,nsIStreamBufferAccess,{ac923b72-ac87-4892-ac7a-ca385d429435},0,-1,0
-149,nsIThreadInternal,{f89b5063-b06d-42f8-bf23-4dfcf2d80d6a},0,-1,1
-150,nsIDOMCSSMediaRule,{a6cf90bc-15b3-11d2-932e-00805f8add32},0,-1,1
-151,imgIDecoder,{9eebf43a-1dd1-11b2-953e-f1782f4cbad3},0,-1,1
-152,nsIRDFInMemoryDataSource,{17c4e0aa-1dd2-11b2-8029-bf6f668de500},0,-1,1
-153,nsIFeed,{3b8aae33-80e2-4efa-99c8-a6c5b99f76ea},0,-1,1
-154,nsIAccessibleProvider,{3f7f9194-c625-4a85-8148-6d92d34897fa},0,-1,1
-155,nsIDOMHTMLPreElement,{a6cf90a4-15b3-11d2-932e-00805f8add32},0,-1,1
-156,nsIDOMMouseScrollEvent,{f172af88-48c3-4989-b814-60449823fc7d},0,-1,1
-157,nsIRDFXMLSink,{eb1a5d31-ab33-11d2-8ec6-00805f29f370},0,-1,1
-158,nsIPluginStreamInfo,{ed7d4ca0-b005-11d2-adaa-00805f6dec49},0,-1,0
-159,gfxIImageFrame,{9c37930b-cadd-453c-89e1-9ed456715b9c},0,-1,1
+1,nsIUpdateChecker,{877ace25-8bc5-452a-8586-9c1cf2871994},0,-1,1
+2,inIDOMView,{fbb67442-27a3-483c-8eb2-29c3eed7514c},0,-1,1
+3,txIXPathObject,{67706346-dece-4c9b-9fc2-57cf19071014},0,-1,1
+4,nsIUnicharStreamListener,{4a7e9b62-fef8-400d-9865-d6820f630b4c},0,-1,1
+5,nsIContentSniffer,{a5772d1b-fc63-495e-a169-96e8d3311af0},0,-1,1
+6,extIPreferenceBranch,{ce697d40-aa5a-11db-abbd-0800200c9a66},0,-1,1
+7,nsIDOMMediaList,{9b0c2ed7-111c-4824-adf9-ef0da6dad371},0,-1,1
+8,nsISHContainer,{65281ba2-988a-11d3-bdc7-0050040a9b44},0,-1,1
+9,nsITimer,{193fc37a-8aa4-4d29-aa57-1acd87c26b66},0,-1,1
+10,nsIBrowserSearchService,{8307b8f2-08ea-45b8-96bf-b1dc7688fe3b},0,-1,1
+11,nsIDOMHTMLAudioElement,{5ecd8913-a738-41be-8597-7f3a4ffba017},0,-1,1
+12,nsIUpdateCheckListener,{8cbceb6e-8e27-46f2-8808-444c6499f836},0,-1,1
+13,nsIThreadPool,{d628159b-1a03-4985-aa77-43122eb23bfc},0,-1,1
+14,nsIScrollBoxObject,{56e2ada8-4631-11d4-ba11-001083023c1e},0,-1,1
+15,nsICachingChannel,{830d4bcb-3e46-4011-9bda-51a5d1af891f},0,-1,1
+16,nsIDNSService,{c1a56a45-8fa3-44e6-9f01-38c91c858cf9},0,-1,1
+17,nsIDragDropHandler,{4f418f58-f834-4736-a755-e0395bedca9d},0,-1,1
+18,nsIDOMSVGAnimatedInteger,{7b196db6-955e-4a9f-8f42-645ebc2ce938},0,-1,1
+19,nsIJARURI,{b0922a89-f87b-4cb5-8612-305a285fcca7},0,-1,1
+20,nsITableEditor,{4805e684-49b9-11d3-9ce4-ed60bd6cb5bc},0,-1,1
+21,nsIZipReader,{5cce7f53-23b3-47f8-be05-122c0ba703fd},0,-1,1
+22,nsIDOMStorageManager,{c8e54beb-48f3-4538-a0ce-d6229f4d8f45},0,-1,1
+23,nsIPropertyBag2,{625cfd1e-da1e-4417-9ee9-dbc8e0b3fd79},0,-1,1
+24,nsILocalFile,{aa610f20-a889-11d3-8c81-000064657374},0,-1,1
+25,nsIURIFixup,{773081ac-9f81-4bdb-9e7a-5e87b4361f09},0,-1,1
+26,nsIDOMStorageItem,{0cc37c78-4c5f-48e1-adfc-7480b8fe9dc4},0,-1,1
+27,nsISupportsPRInt16,{e30d94b0-4a1c-11d3-9890-006008962422},0,-1,1
+28,nsIStorageStream,{604ad9d0-753e-11d3-90ca-34278643278f},0,-1,1
+29,nsIMemory,{59e7e77a-38e4-11d4-8cf5-0060b0fc14a3},0,-1,1
+30,nsITreeSelection,{ab6fe746-300b-4ab4-abb9-1c0e3977874c},0,-1,1
+31,nsIDownloadObserver,{44b3153e-a54e-4077-a527-b0325e40924e},0,-1,1
+32,nsIUnicharStreamLoaderObserver,{6bb3e55b-69c0-4fc9-87e5-bed780d997ce},0,-1,1
+33,nsIFile,{c8c0a080-0868-11d3-915f-d9d889d48e3c},0,-1,1
+34,nsIDocumentLoader,{bbe961ee-59e9-42bb-be50-0331979bb79f},0,-1,1
+35,nsIDOMHTMLTableCellElement,{a6cf90b7-15b3-11d2-932e-00805f8add32},0,-1,1
+36,nsIException,{f3a8d3b4-c424-4edc-8bf6-8974c983ba78},0,-1,1
+37,nsIContentPrefObserver,{746c7a02-f6c1-4869-b434-7c8b86e60e61},0,-1,1
+38,nsICommandParams,{83f892cf-7ed3-490e-967a-62640f3158e1},0,-1,1
+39,nsIUrlClassifierDBService,{7aae3f3a-527d-488b-a448-45dca6db0e80},0,-1,1
+40,nsIRDFDataSource,{0f78da58-8321-11d2-8eac-00805f29f370},0,-1,1
+41,nsIPrefLocalizedString,{ae419e24-1dd1-11b2-b39a-d3e5e7073802},0,-1,1
+42,nsIDOMNotifyPaintEvent,{792e5779-7c39-4817-91a7-fdb3fba6428f},0,-1,1
+43,nsIDOMSVGFEMergeElement,{b860512c-2547-4d1f-bb43-b57b54d39014},0,-1,1
+44,nsIDOMCRMFObject,{16da46c0-208d-11d4-8a7c-006008c844c3},0,-1,1
+45,nsIInterfaceInfoManager,{8b161900-be2b-11d2-9831-006008962422},0,-1,0
+46,nsITextServicesFilter,{5bec321f-59ac-413a-a4ad-8a8d7c50a0d0},0,-1,1
+47,nsIJAR,{04501db2-0409-11d3-bcf8-00805f0e1353},0,-1,1
+48,nsIClientAuthUserDecision,{95c4373e-bdd4-4a63-b431-f5b000367721},0,-1,1
+49,nsILoginManagerPrompter,{68b3cb59-51b8-4c57-bd7f-b2ce955a593d},0,-1,1
+50,nsISearchContext,{31aba0f0-2d93-11d3-8069-00600811a9c3},0,-1,1
+51,nsIDirectoryServiceProvider,{bbf8cab0-d43a-11d3-8cc2-00609792278c},0,-1,1
+52,nsIX509Cert,{f0980f60-ee3d-11d4-998b-00b0d02354a0},0,-1,1
+53,nsISecurityEventSink,{a71aee68-dd38-4736-bd79-035fea1a1ec6},0,-1,1
+54,nsIRDFNode,{0f78da50-8321-11d2-8eac-00805f29f370},0,-1,1
+55,nsIDOMSVGDescElement,{56f539b7-0b3d-4bac-b60d-9efe220216ea},0,-1,1
+56,nsIDOMSVGFEFuncBElement,{8b139fe7-5d21-4af3-beda-414aa089b3fb},0,-1,1
+57,nsIProxyInfo,{3fe9308b-1608-4fa0-933c-c5ec2c6175fd},0,-1,1
+58,nsIDOMHTMLLinkElement,{a6cf9088-15b3-11d2-932e-00805f8add32},0,-1,1
+59,nsISupportsPRUint32,{e01dc470-4a1c-11d3-9890-006008962422},0,-1,1
+60,nsIDOMXMLDocument,{8816d003-e7c8-4065-8827-829b8d07b6e0},0,-1,1
+61,nsIDOMSVGImageElement,{43ae4efe-2610-4cce-8242-279e556a78fa},0,-1,1
+62,nsIUrlClassifierDBServiceWorker,{2af84c09-269e-4fc2-b28f-af56717db118},0,-1,1
+63,nsIXSLTProcessorObsolete,{3fbff728-2d20-11d3-aef3-00108300ff91},0,-1,1
+64,nsIApplicationUpdateService2,{e22e4bf1-b18c-40cd-a2be-2d565723d056},0,-1,1
+65,nsIDOMHTMLParagraphElement,{a6cf90a1-15b3-11d2-932e-00805f8add32},0,-1,1
+66,nsIAssociatedContentSecurity,{8db92dde-799f-4d33-80f7-459cac800dc9},0,-1,1
+67,nsIRunnable,{4a2abaf0-6886-11d3-9382-00104ba0fd40},0,-1,1
+68,nsIDirectoryService,{57a66a60-d43a-11d3-8cc2-00609792278c},0,-1,1
+69,extIExtension,{10cee02c-f6e0-4d61-ab27-c16572b18c46},0,-1,1
+70,nsIDNSListener,{41466a9f-f027-487d-a96c-af39e629b8d2},0,-1,1
+71,nsIPK11TokenDB,{4ee28c82-1dd2-11b2-aabf-bb4017abe395},0,-1,1
+72,nsIAccessibleText,{0f4633b1-550c-4b50-8c04-0eb1005eef2f},0,-1,1
+73,nsICommandLineValidator,{5ecaa593-7660-4a3a-957a-92d5770671c7},0,-1,1
+74,nsICommandLineHandler,{d4b123df-51ee-48b1-a663-002180e60d3b},0,-1,1
+75,nsICookieManager,{aaab6710-0f2c-11d5-a53b-0010a401eb10},0,-1,1
+76,mozIStorageService,{fe8e95cb-b377-4c8d-bccb-d9198c67542b},0,-1,1
+77,nsPIDNSService,{a26c5b45-7707-4412-bbc1-2462b890848d},0,-1,1
+78,nsILiveTitleNotificationSubject,{f9e577a8-19d9-4ca0-a140-b9e43f014470},0,-1,1
+79,nsIMIMEHeaderParam,{ddbbdfb8-a1c0-4dd5-a31b-5d2a7a3bb6ec},0,-1,1
+80,xpcIJSWeakReference,{5b776cd4-952b-45a2-b363-84e99e8fe608},0,-1,1
+81,mozIPersonalDictionary,{7ef52eaf-b7e1-462b-87e2-5d1dbaca9048},0,-1,1
+82,nsIInstallLocation,{32a74707-ec7c-af19-f4d8-d0cd8cb6a948},0,-1,1
+83,nsISerializable,{91cca981-c26d-44a8-bebe-d9ed4891503a},0,-1,1
+84,nsICurrentCharsetListener,{cf9428c1-df50-11d3-9d0c-0050040007b2},0,-1,1
+85,nsIStringEnumerator,{50d3ef6c-9380-4f06-9fb2-95488f7d141c},0,-1,1
+86,nsICipherInfoService,{766d47cb-6d8c-4e71-b6b7-336917629a69},0,-1,1
+87,nsIDOMSerializer,{9fd4ba15-e67c-4c98-b52c-7715f62c9196},0,-1,1
+88,nsICacheMetaDataVisitor,{22f9a49c-3cf8-4c23-8006-54efb11ac562},0,-1,1
+89,nsIDownloadManagerUI,{ca7663d5-69e3-4c4a-b754-f462bd36b05f},0,-1,1
+90,nsIPKCS11Slot,{c2d4f296-ee60-11d4-998b-00b0d02354a0},0,-1,1
+91,nsIGeneratingKeypairInfoDialogs,{11bf5cdc-1dd2-11b2-ba6a-c76afb326fa1},0,-1,1
+92,jsdIEphemeral,{46f1e23e-1dd2-11b2-9ceb-8285f2e95e69},0,-1,1
+93,nsIWorker,{daf945c3-8d29-4724-8939-dd383f7d27a7},0,-1,1
+94,nsIPrompt,{a63f70c0-148b-11d3-9333-00104ba0fd40},0,-1,1
+95,nsIAuthPromptAdapterFactory,{60e46383-bb9a-4860-8962-80d9c5c05ddc},0,-1,1
+96,nsIDOMNSHTMLScriptElement,{5b2065d7-7888-4529-8a29-e58390a40bd2},0,-1,1
+97,nsIUrlClassifierCallback,{4ca27b6b-a674-4b3d-ab30-d21e2da2dffb},0,-1,1
+98,nsIApplicationCacheChannel,{9acfd21c-9c07-459f-8dae-ed2ffba23ddc},0,-1,1
+99,nsIXULBuilderListener,{ac46be8f-c863-4c23-84a2-d0fcc8dfa9f4},0,-1,1
+100,nsIDownloader,{fafe41a9-a531-4d6d-89bc-588a6522fb4e},0,-1,1
+101,nsICacheVisitor,{f8c08c4b-d778-49d1-a59b-866fdc500d95},0,-1,1
+102,nsIOutputStream,{0d0acd2a-61b4-11d4-9877-00c04fa0cf4a},0,-1,1
+103,nsIDOMCounter,{31adb439-0055-402d-9b1d-d5ca94f3f55b},0,-1,1
+104,nsIHTTPHeaderListener,{ea51e0b8-871c-4b85-92da-6f400394c5ec},0,-1,1
+105,jsdIObject,{a735a94c-9d41-4997-8fcb-cfa8b649a5b7},0,-1,1
+106,nsIDOMSVGTransformList,{cee0a9d4-8554-4bf6-bf9b-7d0cebb4269d},0,-1,1
+107,nsISecureBrowserUI,{081e31e0-a144-11d3-8c7c-00609792278c},0,-1,1
+108,nsIAppStartup2,{3012668f-44b6-49b1-89fb-761a912a78c1},0,-1,1
+109,nsICertPickDialogs,{51d59b08-1dd2-11b2-ad4a-a51b92f8a184},0,-1,1
+110,nsIToolkit,{18032bd0-b265-11d1-aa2a-000000000000},0,-1,0
+111,nsISupportsFloat,{abeaa390-4ac0-11d3-baea-00805f8a5dd7},0,-1,1
+112,nsIDOMHTMLSelectElement,{a6cf9090-15b3-11d2-932e-00805f8add32},0,-1,1
+113,nsIAutoCompleteInput,{f5eddd39-f8e0-43b7-bc3d-03623f595e52},0,-1,1
+114,nsIContextMenuInfo,{2f977d56-5485-11d4-87e2-0010a4e75ef2},0,-1,1
+115,nsIMultiPartChannel,{ba78db7b-b88c-4b76-baf9-3c2296a585ae},0,-1,1
+116,nsIUnicharLineInputStream,{67f42475-ba80-40f8-ac0b-649c89230184},0,-1,1
+117,nsIDOMGeoPositionAddress,{0df49c5c-9845-42f9-a76c-62e09c110986},0,-1,1
+118,nsIDOMSVGAnimatedNumberList,{93ebb030-f82d-4f8e-b133-d1b5abb73cf3},0,-1,1
+119,nsITokenDialogs,{a1cbc159-468c-495d-8068-61dd538cbcca},0,-1,1
+120,nsILoginManager,{30534ff7-fb95-45c5-8336-5448638f2aa1},0,-1,1
+121,nsIDOMDocumentCSS,{39f76c23-45b2-428a-9240-a981e5abf148},0,-1,1
+122,nsIScriptableRegion,{4d179656-a5bd-42a6-a937-c81f820dcf2f},0,-1,1
+123,nsITransportSecurityInfo,{0d0a6b62-d4a9-402e-a197-6bc6e358fec9},0,-1,1
+124,nsPIPromptService,{c60a1955-6cb3-4827-8ef8-4f5c668af0b3},0,-1,0
+125,nsITextToSubURI,{8b042e24-6f87-11d3-b3c8-00805f8a6670},0,-1,1
+126,nsIAccessibleTableCell,{654e296d-fae6-452b-987d-746b20b9514b},0,-1,1
+127,nsITokenPasswordDialogs,{be26b580-1dd1-11b2-9946-c598d0d07727},0,-1,1
+128,nsIDataSignatureVerifier,{0a84b3d5-6ba9-432d-89da-4fbd0b0f2aec},0,-1,1
+129,jsdIExecutionHook,{3a722496-9d78-4f0a-a797-293d9e8cb8d2},0,-1,1
+130,nsINavBookmarkObserver,{1f7e9032-b2c0-4561-b35b-94ba3f8344e2},0,-1,1
+131,nsIDOMPopupBlockedEvent,{05be571f-c3ea-4959-a340-c57b1591ae4b},0,-1,1
+132,nsIFeedWriter,{67003393-018c-4e96-af10-c6c51a049fad},0,-1,1
+133,nsIDOMSVGFECompositeElement,{6ff3c539-1a3b-4a3f-8acd-354d349eb7fc},0,-1,1
+134,nsIXPIProgressDialog,{ce8f744e-d5a5-41b3-911f-0fee3008b64e},0,-1,1
+135,nsISupportsChar,{e2b05e40-4a1c-11d3-9890-006008962422},0,-1,1
+136,nsISelectionPrivate,{98552206-ad7a-4d2d-8ce3-b6fa2389298b},0,-1,1
+137,nsIXPCConstructor,{c814ca20-e0dc-11d3-8f5f-0010a4e73d9a},0,-1,1
+138,nsIDOMSVGZoomEvent,{339a8c7a-552e-4cbc-8d96-8370a3939358},0,-1,1
+139,nsICancelable,{d94ac0a0-bb18-46b8-844e-84159064b0bd},0,-1,1
+140,nsIDOMHTMLCanvasElement,{d87394af-d31a-484e-8b7c-75381045384d},0,-1,1
+141,nsIJARChannel,{6e6cc56d-51eb-4299-a795-dcfd1229ab3d},0,-1,1
+142,nsIFeedProgressListener,{ebfd5de5-713c-40c0-ad7c-f095117fa580},0,-1,1
+143,nsIDOMLSSerializerFilter,{b9b6ec85-f69f-4a5a-a96a-8a7a8f07e2b4},0,-1,1
+144,nsIBinaryOutputStream,{204ee610-8765-11d3-90cf-0040056a906e},0,-1,1
+145,nsIDOMDOMStringList,{0bbae65c-1dde-11d9-8c46-000a95dc234c},0,-1,1
+146,nsIAccessibleHyperText,{d56bd454-8ff3-4edc-b266-baeada00267b},0,-1,1
+147,nsIExceptionService,{35a88f54-f267-4414-92a7-191f6454ab52},0,-1,1
+148,nsIDOMSVGPathSegLinetoVerticalAbs,{fd5ffb7b-7279-4c09-abfd-b733dc872e80},0,-1,1
+149,nsIFileOutputStream,{e6f68040-c7ec-11d3-8cda-0060b0fc14a3},0,-1,1
+150,nsIStreamBufferAccess,{ac923b72-ac87-4892-ac7a-ca385d429435},0,-1,0
+151,nsIThreadInternal,{f89b5063-b06d-42f8-bf23-4dfcf2d80d6a},0,-1,1
+152,nsIDOMCSSMediaRule,{a6cf90bc-15b3-11d2-932e-00805f8add32},0,-1,1
+153,imgIDecoder,{9eebf43a-1dd1-11b2-953e-f1782f4cbad3},0,-1,1
+154,nsIRDFInMemoryDataSource,{17c4e0aa-1dd2-11b2-8029-bf6f668de500},0,-1,1
+155,nsIFeed,{3b8aae33-80e2-4efa-99c8-a6c5b99f76ea},0,-1,1
+156,nsIAccessibleProvider,{3f7f9194-c625-4a85-8148-6d92d34897fa},0,-1,1
+157,nsIDOMHTMLPreElement,{a6cf90a4-15b3-11d2-932e-00805f8add32},0,-1,1
+158,nsIDOMMouseScrollEvent,{ba8d1a7e-b475-4542-8d32-01e7ea7b8091},0,-1,1
+159,nsIDOMSVGUseElement,{d49a3ac7-e779-46c8-ae92-214420aa1b71},0,-1,1
160,nsIAccessibleSelectable,{34d268d6-1dd2-11b2-9d63-83a5e0ada290},0,-1,1
161,nsPICommandUpdater,{b135f602-0bfe-11d5-a73c-f0e420e8293c},0,-1,1
162,nsIDOMDocumentType,{a6cf9077-15b3-11d2-932e-00805f8add32},0,-1,1
163,nsIExternalProtocolService,{70f93b7a-3ec6-4bcb-b093-92d9984c9f83},0,-1,1
164,nsIPrivateBrowsingService,{49d6f133-80c0-48c7-876d-0b70bbfd0289},0,-1,1
-165,nsIPluginInstancePeer2_1_9_1_BRANCH,{79a2d210-55e4-4687-bd87-64b10c2466cc},0,-1,0
-166,nsIUTF8ConverterService,{249f52a3-2599-4b00-ba40-0481364831a2},0,-1,1
-167,nsIPluginInstancePeer,{4b7cea20-019b-11d2-815b-006008119d7a},0,-1,0
-168,nsIDOMDOMException,{a6cf910a-15b3-11d2-932e-00805f8add32},0,-1,1
-169,inIDOMView,{fbb67442-27a3-483c-8eb2-29c3eed7514c},0,-1,1
-170,nsIStreamConverter,{0b6e2c69-5cf5-48b0-9dfd-c95950e2cc7b},0,-1,1
-171,nsIContentViewerContainer,{ea2ce7a0-5c3d-11d4-90c2-0050041caf44},0,-1,1
-172,nsIAppStartup,{6799abed-4721-4f51-9304-d1a2ea1df5d5},0,-1,1
-173,nsICookie2,{8587f4e0-870c-11dd-ad8b-0800200c9a66},0,-1,1
-174,nsIPKCS11ModuleDB,{ff9fbcd7-9517-4334-b97a-ceed78909974},0,-1,1
-175,nsIBrowserInstance,{8af0fa40-598d-11d3-806a-00600811a9c3},0,-1,1
-176,nsIOCSPResponder,{96b2f5ae-4334-11d5-ba27-00108303b117},0,-1,1
-177,nsIAddonUpdateCheckListener,{c946119f-9e7c-41aa-a794-803148045350},0,-1,1
-178,nsIRandomGenerator,{2362d97a-747a-4576-8863-697667309209},0,-1,1
-179,nsIDocShell_MOZILLA_1_9_1,{460ba822-e664-4c38-9b08-98d2736473d7},0,-1,1
-180,nsIDOMCDATASection,{a6cf9071-15b3-11d2-932e-00805f8add32},0,-1,1
-181,nsIXPCScriptable,{5d309b93-e9b4-4374-bcd5-44245c83408f},0,-1,0
-182,nsIJVMConfigManager,{ca29fff1-a677-493c-9d80-3dc60432212b},0,-1,1
-183,nsIDOMXULContainerItemElement,{4650e55f-4777-4271-8b62-9603a7dd4614},0,-1,1
-184,nsISSLSocketControl,{a092097c-8386-4f1b-97b1-90eb70008c2d},0,-1,1
-185,nsISSLErrorListener,{99f8d972-bae4-414c-b39b-47587d3ded68},0,-1,1
-186,nsIContentHandler,{49439df2-b3d2-441c-bf62-866bdaf56fd2},0,-1,1
-187,nsIPKIParamBlock,{b6fe3d78-1dd1-11b2-9058-ced9016984c8},0,-1,1
-188,nsIMutableArray,{af059da0-c85b-40ec-af07-ae4bfdc192cc},0,-1,1
-189,nsIBufEntropyCollector,{485b87a8-5dd7-4b8d-8ea8-dee53201f899},0,-1,0
-190,nsIDOMFile,{4a17d83b-424f-43f3-8a7c-430f406921be},0,-1,1
-191,nsIHTMLEditor,{afc36593-5787-4420-93d9-b2c0ccbf0cad},0,-1,1
-192,nsIDOMSVGPathSegLinetoRel,{7933a81a-72c5-4489-ba64-5635f4c23063},0,-1,1
-193,nsIDownloadProgressListener,{7acb07ea-cac2-4c15-a3ad-23aaa789ed51},0,-1,1
-194,nsIDOMNamedNodeMap,{a6cf907b-15b3-11d2-932e-00805f8add32},0,-1,1
-195,nsISHistoryInternal,{7ca0fd71-437c-48ad-985d-11ce9e2429b4},0,-1,1
-196,nsIGnomeVFSService,{dea20bf0-4e4d-48c5-b932-dc3e116dc64b},0,-1,1
-197,nsITreeContentView,{5ef62896-0c0a-41f1-bb3c-44a60f5dfdab},0,-1,1
-198,nsIDOMSVGPathSegLinetoHorizontalRel,{8693268c-5180-43fd-acc3-5b9c09f43386},0,-1,1
-199,nsIXPIDialogService,{8cdd8baa-1dd2-11b2-909a-f0178da5c5ff},0,-1,1
-200,nsIDOMGeoPositionCallback,{527e8b53-6f29-4b6a-8d04-5c1666a4c4c1},0,-1,1
-201,nsIAutoCompleteSimpleResult,{f9841787-ad26-49e6-a2dd-ba9020ee1c64},0,-1,1
+165,nsIUTF8ConverterService,{249f52a3-2599-4b00-ba40-0481364831a2},0,-1,1
+166,nsIDOMXULLabelElement,{c987629e-6370-45f5-86ec-aa765fa861cd},0,-1,1
+167,nsIDOMDOMException,{a6cf910a-15b3-11d2-932e-00805f8add32},0,-1,1
+168,mozIStoragePendingStatement,{00da7d20-3768-4398-bedc-e310c324b3f0},0,-1,1
+169,nsIStreamConverter,{0b6e2c69-5cf5-48b0-9dfd-c95950e2cc7b},0,-1,1
+170,nsIContentViewerContainer,{ea2ce7a0-5c3d-11d4-90c2-0050041caf44},0,-1,1
+171,nsIAppStartup,{6799abed-4721-4f51-9304-d1a2ea1df5d5},0,-1,1
+172,nsICookie2,{05c420e5-03d0-4c7b-a605-df7ebe5ca326},0,-1,1
+173,nsIPKCS11ModuleDB,{ff9fbcd7-9517-4334-b97a-ceed78909974},0,-1,1
+174,nsIBrowserInstance,{8af0fa40-598d-11d3-806a-00600811a9c3},0,-1,1
+175,nsIOCSPResponder,{96b2f5ae-4334-11d5-ba27-00108303b117},0,-1,1
+176,nsIAddonUpdateCheckListener,{c946119f-9e7c-41aa-a794-803148045350},0,-1,1
+177,nsIRandomGenerator,{2362d97a-747a-4576-8863-697667309209},0,-1,1
+178,nsIAccessibleTextChangeEvent,{50a1e151-8e5f-4bcc-aaaf-a4bed1190e93},0,-1,1
+179,nsIDOMCDATASection,{a6cf9071-15b3-11d2-932e-00805f8add32},0,-1,1
+180,nsIXPCScriptable,{5d309b93-e9b4-4374-bcd5-44245c83408f},0,-1,0
+181,nsIProtocolProxyFilter,{f424abd3-32b4-456c-9f45-b7e3376cb0d1},0,-1,1
+182,nsIDOMXULContainerItemElement,{4650e55f-4777-4271-8b62-9603a7dd4614},0,-1,1
+183,nsISSLSocketControl,{a092097c-8386-4f1b-97b1-90eb70008c2d},0,-1,1
+184,nsISSLErrorListener,{99f8d972-bae4-414c-b39b-47587d3ded68},0,-1,1
+185,nsIContentHandler,{49439df2-b3d2-441c-bf62-866bdaf56fd2},0,-1,1
+186,nsIPKIParamBlock,{b6fe3d78-1dd1-11b2-9058-ced9016984c8},0,-1,1
+187,nsICache,{ec1c0063-197d-44bb-84ba-7525d50fc937},0,-1,1
+188,nsIBufEntropyCollector,{485b87a8-5dd7-4b8d-8ea8-dee53201f899},0,-1,0
+189,nsIDOMFile,{0845e8ae-56bd-4f0e-962a-3b3e92638a0b},0,-1,1
+190,nsIHTMLEditor,{afc36593-5787-4420-93d9-b2c0ccbf0cad},0,-1,1
+191,nsIDOMSVGPathSegLinetoRel,{7933a81a-72c5-4489-ba64-5635f4c23063},0,-1,1
+192,jsdIStackFrame,{0633ca73-105e-4e8e-bcc5-13405d61754a},0,-1,1
+193,nsISHEntry,{09fecea6-5453-43ba-bf91-3ff32618f037},0,-1,1
+194,nsISHistoryInternal,{7ca0fd71-437c-48ad-985d-11ce9e2429b4},0,-1,1
+195,nsIGnomeVFSService,{dea20bf0-4e4d-48c5-b932-dc3e116dc64b},0,-1,1
+196,nsITreeContentView,{5ef62896-0c0a-41f1-bb3c-44a60f5dfdab},0,-1,1
+197,nsIDOMSVGPathSegLinetoHorizontalRel,{8693268c-5180-43fd-acc3-5b9c09f43386},0,-1,1
+198,nsIXPIDialogService,{8cdd8baa-1dd2-11b2-909a-f0178da5c5ff},0,-1,1
+199,nsIDOMGeoPositionCallback,{527e8b53-6f29-4b6a-8d04-5c1666a4c4c1},0,-1,1
+200,nsIAutoCompleteSimpleResult,{f9841787-ad26-49e6-a2dd-ba9020ee1c64},0,-1,1
+201,nsIFocusManager,{cd6040a8-243f-412a-8a16-0bf2aa1083b9},0,-1,1
202,nsIAccessibleEditableText,{52837507-202d-4e72-a482-5f068a1fd720},0,-1,1
203,nsIWorkerMessagePort,{ab3725b8-3fca-40cc-a42c-92fb154ef01d},0,-1,1
204,nsIAboutModule,{9575693c-60d9-4332-b6b8-6c29289339cb},0,-1,1
205,nsIDOMNotation,{a6cf907e-15b3-11d2-932e-00805f8add32},0,-1,1
206,nsIProxyObjectManager,{ee8ce1e3-0319-4bd9-8f70-7258b21c7733},0,-1,1
-207,nsIFileUtilities,{89a31ce0-019a-11d2-815b-006008119d7a},0,-1,0
-208,nsIAuthInformation,{0d73639c-2a92-4518-9f92-28f71fea5f20},0,-1,1
-209,nsIProfileLock,{50e07b0a-f338-4da3-bcdb-f4bb0db94dbe},0,-1,1
-210,nsIAutoCompleteSimpleResultListener,{004efdc5-1989-4874-8a7a-345bf2fa33af},0,-1,1
-211,nsINavHistoryObserver,{eacb76eb-3eeb-419b-a963-9b3a9d65f356},0,-1,1
-212,nsIFileOutputStream,{e6f68040-c7ec-11d3-8cda-0060b0fc14a3},0,-1,1
+207,fuelIApplication,{fe74cf80-aa2d-11db-abbd-0800200c9a66},0,-1,1
+208,nsIObserver,{db242e01-e4d9-11d2-9dde-000064657374},0,-1,1
+209,nsIAuthInformation,{0d73639c-2a92-4518-9f92-28f71fea5f20},0,-1,1
+210,nsIProfileLock,{50e07b0a-f338-4da3-bcdb-f4bb0db94dbe},0,-1,1
+211,nsIAutoCompleteSimpleResultListener,{004efdc5-1989-4874-8a7a-345bf2fa33af},0,-1,1
+212,nsINavHistoryObserver,{14065711-8a91-4d96-ba32-59512f5401b6},0,-1,1
213,nsIFind,{75125d55-37ee-4575-b9b5-f33bfa68c2a1},0,-1,1
214,nsIXTFPrivate,{13ef3d54-1dd1-4a5c-a8d5-a04a327fb9b6},0,-1,1
215,nsIPlaintextEditor,{1480e196-0d5c-40cf-8563-ed8a33eabcf2},0,-1,1
216,nsIDOMNSHTMLSelectElement,{a6cf9105-15b3-11d2-932e-00805f8add32},0,-1,1
217,nsIDOMHTMLModElement,{a6cf90a9-15b3-11d2-932e-00805f8add32},0,-1,1
-218,nsIDOMSVGPathSegLinetoVerticalAbs,{fd5ffb7b-7279-4c09-abfd-b733dc872e80},0,-1,1
+218,nsIDOMFileInternal,{047ca6c4-52b3-46f1-8976-e198b724f72f},0,-1,1
219,nsIPluginInputStream,{af160530-542a-11d2-8164-006008119d7a},0,-1,0
220,nsICRLInfo,{c185d920-4a3e-11d5-ba27-00108303b117},0,-1,1
221,nsIDOMCSSMozDocumentRule,{4eb9adac-afaf-4b8a-8640-7340863c1587},0,-1,1
222,nsIAccessibleRelation,{f42a1589-70ab-4704-877f-4a9162bbe188},0,-1,1
223,nsIDOMSVGEllipseElement,{5d1cd1e6-4a14-4056-acc0-2f78c1672898},0,-1,1
-224,jsdIContext,{a2dd25a4-1dd1-11b2-bda6-ed525acd4c35},0,-1,1
+224,jsdIContext,{3e5c934d-6863-4d81-96f5-76a3b962fc2b},0,-1,1
225,nsIDOMDocumentTraversal,{13f236c0-47f8-11d5-b6a3-009027446e84},0,-1,1
226,nsIFeedProcessor,{8a0b2908-21b0-45d7-b14d-30df0f92afc7},0,-1,1
227,nsIXTFAttributeHandler,{72152f7f-7e8d-43fd-8477-3f29ae8d240d},0,-1,1
@@ -266,142 +263,142 @@
247,nsIHTMLObjectResizer,{8b396020-69d3-451f-80c1-1a96a7da25a9},0,-1,1
248,nsIXMLContentBuilder,{e9c4cd4f-cd41-43d0-bf3b-48abb9cde90f},0,-1,1
249,nsIInputStreamCallback,{d1f28e94-3a6e-4050-a5f5-2e81b1fc2a43},0,-1,1
-250,nsIUpdateCheckListener,{8cbceb6e-8e27-46f2-8808-444c6499f836},0,-1,1
+250,nsISupportsPRUint64,{e13567c0-4a1c-11d3-9890-006008962422},0,-1,1
251,nsIClipboard,{38984945-8674-4d04-b786-5c0ca9434457},0,-1,1
-252,nsIEditorMailSupport,{fdf23301-4a94-11d3-9ce4-9960496c41bc},0,-1,1
+252,nsPIPlacesHistoryListenersNotifier,{b96adaff-e02c-48da-a379-8af5d10e09af},0,-1,1
253,inIDOMUtils,{78fd16c2-bdfb-4b1d-8738-d536d0a8f430},0,-1,1
254,nsIToolkitProfileService,{9b434f48-438c-4f85-89de-b7f321a45341},0,-1,1
255,nsIRandomAccessIterator,{9bd6fdb0-1dd1-11b2-9101-d15375968230},0,-1,1
256,nsITransactionListener,{58e330c4-7b48-11d2-98b9-00805f297d89},0,-1,1
257,nsICookiePermission,{4b1a775d-f6d3-4389-be2e-9dfbaf2ab47b},0,-1,1
-258,nsICache,{ec1c0063-197d-44bb-84ba-7525d50fc937},0,-1,1
-259,nsIContentPolicy,{344f9cb0-9a17-44c5-ab96-ee707884266c},0,-1,1
-260,nsIWyciwygChannel,{89b0674a-9e2f-4124-9b59-481444be841d},0,-1,1
-261,nsIHelperAppLauncher,{d9a19faf-497b-408c-b995-777d956b72c0},0,-1,1
+258,nsIContentPolicy,{344f9cb0-9a17-44c5-ab96-ee707884266c},0,-1,1
+259,nsIWyciwygChannel,{89b0674a-9e2f-4124-9b59-481444be841d},0,-1,1
+260,nsIHelperAppLauncher,{d9a19faf-497b-408c-b995-777d956b72c0},0,-1,1
+261,nsIDOMCharacterData,{a6cf9072-15b3-11d2-932e-00805f8add32},0,-1,1
262,nsITransaction,{58e330c1-7b48-11d2-98b9-00805f297d89},0,-1,1
263,nsIRDFContainerUtils,{d4214e91-fb94-11d2-bdd8-00104bde6048},0,-1,1
264,nsIRelativeFilePref,{2f977d4e-5485-11d4-87e2-0010a4e75ef2},0,-1,1
-265,nsIDOMClientRect,{b2f824c4-d9d3-499b-8d3b-45c8245497c6},0,-1,1
-266,nsINavHistoryQueryResultNode,{ea17745a-1852-4155-a98f-d1dd1763b3df},0,-1,1
-267,nsIDOMDocumentStyle,{3d9f4973-dd2e-48f5-b5f7-2634e09eadd9},0,-1,1
-268,nsIURIContentListener,{94928ab3-8b63-11d3-989d-001083010e9b},0,-1,1
-269,nsIRDFObserver,{3cc75360-484a-11d2-bc16-00805f912fe7},0,-1,1
-270,nsIDOMNSDocument,{533a8131-8d0c-4ebf-990b-7fad7cd514ee},0,-1,1
-271,nsIWebBrowser,{69e5df00-7b8b-11d3-af61-00a024ffc08c},0,-1,1
-272,nsIRDFXMLSource,{4da56f10-99fe-11d2-8ebb-00805f29f370},0,-1,1
-273,nsIDOMElement,{a6cf9078-15b3-11d2-932e-00805f8add32},0,-1,1
-274,nsIGeolocationRequest,{f2aefde1-8e38-48b3-bbb8-bd6c4ae1ac8a},0,-1,1
-275,nsIDOMSVGTextElement,{6d43b1b4-efb6-426d-9e65-4420c3e24688},0,-1,1
-276,jsdIFilter,{05593438-1b83-4517-864f-3cea3d37a266},0,-1,1
-277,nsIDOMCSSStyleRule,{a6cf90bf-15b3-11d2-932e-00805f8add32},0,-1,1
-278,nsIDOMClientInformation,{f8bbf8c3-c47b-465a-a221-22824449f689},0,-1,1
-279,nsIContentViewer,{05b290ac-d880-4900-bb1f-2211b5f8accc},0,-1,1
-280,nsIDOMJSWindow,{14efb76c-5bd6-449e-b36f-0cbd22981f20},0,-1,1
-281,nsIDOMSVGAnimatedLengthList,{bfa6e42b-bc9d-404d-8688-729fdbfff801},0,-1,1
-282,nsIStreamConverterService,{f2b1ab53-f0bd-4adb-9365-e59b1701a258},0,-1,1
-283,nsIFastLoadReadControl,{652ecec6-d40b-45b6-afef-641d6c63a35b},0,-1,1
-284,nsIWebBrowserChrome2,{2585a7b1-7b47-43c4-bf17-c6bf84e09b7b},0,-1,1
-285,nsIBidiKeyboard,{0d8f8f10-c92d-4a6a-b2bb-e1921f3f4dda},0,-1,1
-286,nsIXPConnectWrappedJS,{bed52030-bca6-11d2-ba79-00805f8a5dd7},0,-1,0
-287,nsIHTMLInlineTableEditor,{eda2e65c-a758-451f-9b05-77cb8de74ed2},0,-1,1
-288,nsIAutoCompleteController,{6f08d134-8536-4b28-b456-d150fbaa66a9},0,-1,1
-289,nsIDOMSVGAnimatedPreserveAspectRatio,{afcd7cd4-d74d-492f-b3b1-d71bfa36874f},0,-1,1
-290,nsIPrefBranch,{56c35506-f14b-11d3-99d3-ddbfac2ccf65},0,-1,1
-291,nsIDOMPlugin,{f6134681-f28b-11d2-8360-c90899049c3c},0,-1,1
-292,nsISelectionListener,{a6cf90e2-15b3-11d2-932e-00805f8add32},0,-1,1
-293,nsIWebHandlerApp,{7521a093-c498-45ce-b462-df7ba0d882f6},0,-1,1
-294,nsICacheService,{98dd0187-aad4-4cab-82c5-1adddef3629d},0,-1,1
-295,jsdIScriptHook,{ae89a7e2-1dd1-11b2-8c2f-af82086291a5},0,-1,1
-296,nsIWindowDataSource,{3722a5b9-5323-4ed0-bb1a-8299f27a4e89},0,-1,1
-297,nsIDOMHTMLByteRanges,{992c540c-4d81-42df-80a6-f71ede2b59d8},0,-1,1
-298,nsIStreamLoaderObserver,{359f7990-d4e9-11d3-a1a5-0050041caf44},0,-1,1
-299,nsIDOMHTMLElement,{a6cf9085-15b3-11d2-932e-00805f8add32},0,-1,1
-300,nsIXTFElementFactory,{27c10dca-2efc-416b-ae36-9794380a661e},0,-1,1
-301,nsIXPCScriptNotify,{b804504d-0025-4d6b-8ced-d94e41102a7f},0,-1,0
-302,nsIDOMHTMLMediaElement,{23fb201a-556d-4054-9885-6437e8910296},0,-1,1
-303,nsICharsetConverterManager,{f5323a76-c8f7-4c65-8d0c-1250e969c7d5},0,-1,1
-304,fuelIBookmarkFolder,{9f42fe20-52de-4a55-8632-a459c7716aa0},0,-1,1
-305,nsIXPointerResult,{d3992637-f474-4b65-83ed-323fe69c60d2},0,-1,1
-306,nsIGeolocationPrompt,{2300c895-1bee-4297-912c-a57082f3e936},0,-1,1
-307,nsIInputStreamTee,{44e8b2c8-1ecb-4a63-8b23-3e3500c34f32},0,-1,1
-308,nsIDOMNodeSelector,{7cebc153-168a-416c-ba5a-56a8c2ddb2ec},0,-1,1
-309,nsIJVMManager,{a1e5ed50-aa4a-11d1-85b2-00805f0e4dfe},0,-1,1
-310,nsIWritableVariant,{5586a590-8c82-11d5-90f3-0010a4e73d9a},0,-1,1
-311,nsIFontEnumerator,{924d98d9-3518-4cb4-8708-c74fe8e3ec3c},0,-1,1
-312,nsISound,{b01adad7-d937-4738-8508-3bd5946bf9c8},0,-1,1
-313,nsIDOMNode,{a6cf907c-15b3-11d2-932e-00805f8add32},0,-1,1
-314,nsIDOMSVGPathSegCurvetoCubicSmoothAbs,{5fa8fea8-bdd1-4315-ac44-a39b3ff347b5},0,-1,1
-315,nsIDOMDOMConfiguration,{cfb5b821-9016-4a79-9d98-87b57c3ea0c7},0,-1,1
-316,nsIPKCS11Module,{8a44bdf9-d1a5-4734-bd5a-34ed7fe564c2},0,-1,1
-317,nsIFormatConverter,{948a0023-e3a7-11d2-96cf-0060b0fb9956},0,-1,1
-318,nsIChannel,{c63a055a-a676-4e71-bf3c-6cfa11082018},0,-1,1
-319,nsIDOMDocumentFragment,{a6cf9076-15b3-11d2-932e-00805f8add32},0,-1,1
-320,nsIProtocolProxyService2,{dbd9565d-29b1-437a-bff5-2fc339e2c5df},0,-1,1
-321,nsIDOMParser,{5677f36e-1842-4c6f-a39c-2e5576ab8b40},0,-1,1
-322,imgILoader,{d2f50c69-1064-4ce3-a92d-01dc5f5b4842},0,-1,1
-323,nsIDOMCSSPageRule,{a6cf90bd-15b3-11d2-932e-00805f8add32},0,-1,1
-324,nsIDOMSVGAnimatedTransformList,{fd54c8c4-2eb4-4849-8df6-79985c2491da},0,-1,1
-325,nsISliderListener,{e5b3074e-ee18-4538-83b9-2487d90a2a34},0,-1,1
-326,nsIWindowCreator2,{f673ec81-a4b0-11d6-964b-eb5a2bf216fc},0,-1,1
-327,nsIBrowserGlue,{781df699-17dc-4237-b3d7-876ddb7085e3},0,-1,1
-328,nsIExternalProtocolHandler,{0e61f3b2-34d7-4c79-bfdc-4860bc7341b7},0,-1,1
-329,nsIXTFElement,{4f144387-796d-4baf-8641-5db45dba1808},0,-1,1
-330,nsIFilePicker,{d24ef0aa-d555-4117-84af-9cbbb7406909},0,-1,1
-331,nsIPropertyElement,{283ee646-1aef-11d4-98b3-00c04fa0ce9a},0,-1,1
-332,nsIDOMGeoPositionErrorCallback,{7d9b09d9-4843-43eb-a7a7-67f7dda6b3c4},0,-1,1
-333,nsIStandardURL,{babd6cca-ebe7-4329-967c-d6b9e33caa81},0,-1,1
-334,nsIRDFPurgeableDataSource,{951700f0-fed0-11d2-bdd9-00104bde6048},0,-1,1
-335,nsIExtendedExpatSink,{0c2dc80f-7aa4-467a-9454-b89dba0e0779},0,-1,1
-336,nsIWorkerMessageEvent,{508f2d49-e9a0-4fe8-bd33-321820173b4a},0,-1,1
-337,nsISeekableStream,{8429d350-1040-4661-8b71-f2a6ba455980},0,-1,1
-338,nsIHandlerService,{53f0ad17-ec62-46a1-adbc-efccc06babcd},0,-1,1
-339,nsIScriptSecurityManager,{f8e350b9-9f31-451a-8c8f-d10fea26b780},0,-1,1
-340,nsIWindowMediator,{0659cb81-faad-11d2-8e19-b206620a657c},0,-1,1
-341,nsIMicrosummary,{6867dc21-077f-4462-937d-cd8b7c680e0c},0,-1,1
-342,nsIDocumentLoaderFactory,{5e7d2967-5a07-444f-95d5-25b533252d38},0,-1,1
-343,nsIProxiedChannel,{6238f134-8c3f-4354-958f-dfd9d54a4446},0,-1,1
-344,nsIStreamListenerTee,{fb683e76-d42b-41a4-8ae6-65a6c2b146e5},0,-1,1
-345,nsIDOMNSCSS2Properties,{e7245a21-3f46-4e67-82bf-a9b326fe74ee},0,-1,1
-346,nsIProcess2,{7d362c71-308e-4724-b1eb-8451fe133026},0,-1,1
-347,nsIFeedGenerator,{0fecd56b-bd92-481b-a486-b8d489cdd385},0,-1,1
-348,nsISyncStreamListener,{7e1aa658-6e3f-4521-9946-9685a169f764},0,-1,1
-349,nsIDOMLSParserFilter,{10e8893d-ddf5-45d1-8872-615d72065fb4},0,-1,1
-350,nsISearchContext,{31aba0f0-2d93-11d3-8069-00600811a9c3},0,-1,1
-351,nsIScriptError,{b0196fc7-1913-441a-882a-453c0d8b89b8},0,-1,1
-352,nsIXPConnectJSObjectHolder,{8916a320-d118-11d3-8f3a-0010a4e73d9a},0,-1,0
-353,nsIXULWindow,{c175a596-ee13-420a-aa74-13ad3a14deb1},0,-1,1
-354,nsIEventTarget,{4e8febe4-6631-49dc-8ac9-308c1cb9b09c},0,-1,1
-355,nsIURLParser,{7281076d-cf37-464a-815e-698235802604},0,-1,1
-356,nsIGeolocationUpdate,{b89d7227-9f04-4236-a582-25a3f2779d72},0,-1,1
-357,nsIX509CertValidity,{e701dfd8-1dd1-11b2-a172-ffa6cc6156ad},0,-1,1
-358,extIExtensions,{de281930-aa5a-11db-abbd-0800200c9a66},0,-1,1
-359,nsIModule,{7392d032-5371-11d3-994e-00805fd26fee},0,-1,1
-360,nsINativeAppSupport,{5fdf8480-1f98-11d4-8077-00600811a9c3},0,-1,1
-361,nsIDOMSVGMetadataElement,{94558064-140c-41a1-9cc9-4e9cdbf5c124},0,-1,1
-362,nsINavHistoryQueryOptions,{a46c132e-35f3-4e1e-bb3d-4e3043657248},0,-1,1
-363,nsIRDFDate,{e13a24e1-c77a-11d2-80be-006097b76b8e},0,-1,1
-364,nsIDOMSVGFEDisplacementMapElement,{80e1ea9c-eff3-490a-8c98-918963d2e7e9},0,-1,1
-365,nsIDocCharset,{9c18bb4e-1dd1-11b2-bf91-9cc82c275823},0,-1,1
-366,nsISocketTransport,{ef3f4993-cfbc-4e5a-9509-16deafe16549},0,-1,1
-367,nsIASN1Object,{ba8bf582-1dd1-11b2-898c-f40246bc9a63},0,-1,1
-368,nsIPrintProgress,{7e46bc35-fb7d-4b45-ab35-82fd61015380},0,-1,1
-369,nsIDOMXULElement,{30a4a815-b42a-4f0b-9c10-1e7f727cd135},0,-1,1
-370,nsIXPCWrappedJSObjectGetter,{254bb2e0-6439-11d4-8fe0-0010a4e73d9a},0,-1,1
-371,nsIDOMMimeType,{f6134682-f28b-11d2-8360-c90899049c3c},0,-1,1
-372,nsIDOMMouseEvent,{ff751edc-8b02-aae7-0010-8301838a3123},0,-1,1
-373,nsIAccessibleEvent,{ba448f0e-a761-48c8-a0f5-1f25e23d4fe4},0,-1,1
-374,nsIDOMXULLabelElement,{c987629e-6370-45f5-86ec-aa765fa861cd},0,-1,1
-375,nsIDOMNSRGBAColor,{742dc816-5134-4214-adfa-cad9dd3377cd},0,-1,1
-376,nsIApplicationUpdateService,{9849c4bf-5197-4d22-baa8-e3b44a1703d2},0,-1,1
-377,nsIInterfaceRequestor,{033a1470-8b2a-11d3-af88-00a024ffc08c},0,-1,1
-378,nsINestedURI,{6de2c874-796c-46bf-b57f-0d7bd7d6cab0},0,-1,1
-379,nsIServiceManager,{8bb35ed9-e332-462d-9155-4a002ab5c958},0,-1,1
-380,nsIDOMHTMLOptGroupElement,{a6cf9091-15b3-11d2-932e-00805f8add32},0,-1,1
-381,nsICommandManager,{080d2001-f91e-11d4-a73c-f9242928207c},0,-1,1
-382,nsIIDNService,{a592a60e-3621-4f19-a318-2bf233cfad3e},0,-1,1
-383,nsIDOMSVGFEOffsetElement,{c080f191-b22c-4fc0-85d5-a79dc3fa7ec8},0,-1,1
-384,nsIDOMHTMLTitleElement,{a6cf9089-15b3-11d2-932e-00805f8add32},0,-1,1
-385,nsINavHistoryObserver_MOZILLA_1_9_1_ADDITIONS,{c1945447-a94f-4134-80c5-7fe48ef00178},0,-1,1
+265,mozIStorageConnection,{ac3c486c-69a1-4cbe-8f25-2ad20880eab3},0,-1,1
+266,nsIDOMClientRect,{b2f824c4-d9d3-499b-8d3b-45c8245497c6},0,-1,1
+267,nsINavHistoryQueryResultNode,{ea17745a-1852-4155-a98f-d1dd1763b3df},0,-1,1
+268,nsIDOMDocumentStyle,{3d9f4973-dd2e-48f5-b5f7-2634e09eadd9},0,-1,1
+269,nsIURIContentListener,{94928ab3-8b63-11d3-989d-001083010e9b},0,-1,1
+270,nsIRDFObserver,{3cc75360-484a-11d2-bc16-00805f912fe7},0,-1,1
+271,nsITransportEventSink,{eda4f520-67f7-484b-a691-8c3226a5b0a6},0,-1,1
+272,nsIDOMPlugin,{ff69a292-c74d-4ef5-9d0f-86112fff2d5b},0,-1,1
+273,nsIWebBrowser,{69e5df00-7b8b-11d3-af61-00a024ffc08c},0,-1,1
+274,nsIRDFXMLSource,{4da56f10-99fe-11d2-8ebb-00805f29f370},0,-1,1
+275,nsIDOMElement,{a6cf9078-15b3-11d2-932e-00805f8add32},0,-1,1
+276,nsICookieManager2,{d1e9e50f-b78b-4e3b-a474-f3cbca59b013},0,-1,1
+277,nsIDOMSVGTextElement,{6d43b1b4-efb6-426d-9e65-4420c3e24688},0,-1,1
+278,jsdIFilter,{0c9189d9-4287-47a4-bca6-6ed65aaf737f},0,-1,1
+279,nsIDOMCSSStyleRule,{a6cf90bf-15b3-11d2-932e-00805f8add32},0,-1,1
+280,nsIDOMClientInformation,{f8bbf8c3-c47b-465a-a221-22824449f689},0,-1,1
+281,nsIContentViewer,{08665a60-b398-11de-8a39-0800200c9a66},0,-1,1
+282,nsIDOMJSWindow,{14efb76c-5bd6-449e-b36f-0cbd22981f20},0,-1,1
+283,nsIDOMSVGAnimatedLengthList,{bfa6e42b-bc9d-404d-8688-729fdbfff801},0,-1,1
+284,nsIStreamConverterService,{f2b1ab53-f0bd-4adb-9365-e59b1701a258},0,-1,1
+285,nsIFastLoadReadControl,{652ecec6-d40b-45b6-afef-641d6c63a35b},0,-1,1
+286,nsIWebBrowserChrome2,{2585a7b1-7b47-43c4-bf17-c6bf84e09b7b},0,-1,1
+287,nsIBidiKeyboard,{0d8f8f10-c92d-4a6a-b2bb-e1921f3f4dda},0,-1,1
+288,nsIXPConnectWrappedJS,{bed52030-bca6-11d2-ba79-00805f8a5dd7},0,-1,0
+289,nsIHTMLInlineTableEditor,{eda2e65c-a758-451f-9b05-77cb8de74ed2},0,-1,1
+290,nsIAutoCompleteController,{46a86173-0ab5-44b2-ab51-722cb3db1b60},0,-1,1
+291,nsIDOMSVGAnimatedPreserveAspectRatio,{afcd7cd4-d74d-492f-b3b1-d71bfa36874f},0,-1,1
+292,nsIPrefBranch,{56c35506-f14b-11d3-99d3-ddbfac2ccf65},0,-1,1
+293,nsIBrowserHistory,{b333c6dd-3dbe-4c0b-8062-92ed92b7e7c9},0,-1,1
+294,nsISelectionListener,{a6cf90e2-15b3-11d2-932e-00805f8add32},0,-1,1
+295,nsIWebHandlerApp,{7521a093-c498-45ce-b462-df7ba0d882f6},0,-1,1
+296,nsIMIMEInputStream,{dcbce63c-1dd1-11b2-b94d-91f6d49a3161},0,-1,1
+297,jsdIScriptHook,{cf7ecc3f-361b-44af-84a7-4b0d6cdca204},0,-1,1
+298,nsIWindowDataSource,{3722a5b9-5323-4ed0-bb1a-8299f27a4e89},0,-1,1
+299,nsIDOMHTMLByteRanges,{992c540c-4d81-42df-80a6-f71ede2b59d8},0,-1,1
+300,nsIStreamLoaderObserver,{359f7990-d4e9-11d3-a1a5-0050041caf44},0,-1,1
+301,nsIDOMHTMLElement,{a6cf9085-15b3-11d2-932e-00805f8add32},0,-1,1
+302,nsIXTFElementFactory,{27c10dca-2efc-416b-ae36-9794380a661e},0,-1,1
+303,nsIXPInstallManager,{83fdd52f-2d34-4e22-981d-cf3c4ae76faa},0,-1,1
+304,nsIDOMHTMLMediaElement,{505b523e-4a27-4151-b0eb-750b7258760e},0,-1,1
+305,nsIDOMFileReader,{5db0ce80-de44-40c0-a346-e28aac4aa978},0,-1,1
+306,fuelIBookmarkFolder,{9f42fe20-52de-4a55-8632-a459c7716aa0},0,-1,1
+307,nsIBrowserHandler,{8d3f5a9d-118d-4548-a137-cf7718679069},0,-1,1
+308,nsIGeolocationPrompt,{2300c895-1bee-4297-912c-a57082f3e936},0,-1,1
+309,nsIInputStreamTee,{44e8b2c8-1ecb-4a63-8b23-3e3500c34f32},0,-1,1
+310,nsIDOMNodeSelector,{7cebc153-168a-416c-ba5a-56a8c2ddb2ec},0,-1,1
+311,nsIAbstractWorker,{b90b7561-b5e2-4545-84b0-280dbaaa94ea},0,-1,1
+312,nsIWritableVariant,{5586a590-8c82-11d5-90f3-0010a4e73d9a},0,-1,1
+313,nsIFontEnumerator,{924d98d9-3518-4cb4-8708-c74fe8e3ec3c},0,-1,1
+314,nsIDOMNode,{a6cf907c-15b3-11d2-932e-00805f8add32},0,-1,1
+315,nsIDOMSVGPathSegCurvetoCubicSmoothAbs,{5fa8fea8-bdd1-4315-ac44-a39b3ff347b5},0,-1,1
+316,nsIDOMDOMConfiguration,{cfb5b821-9016-4a79-9d98-87b57c3ea0c7},0,-1,1
+317,nsIPKCS11Module,{8a44bdf9-d1a5-4734-bd5a-34ed7fe564c2},0,-1,1
+318,nsIFormatConverter,{948a0023-e3a7-11d2-96cf-0060b0fb9956},0,-1,1
+319,nsIChannel,{c63a055a-a676-4e71-bf3c-6cfa11082018},0,-1,1
+320,nsIDOMDocumentFragment,{a6cf9076-15b3-11d2-932e-00805f8add32},0,-1,1
+321,nsIStreamListenerTee_1_9_2,{18b1e3d7-8083-4b19-a077-82ceea6fd296},0,-1,1
+322,nsIDOMParser,{5677f36e-1842-4c6f-a39c-2e5576ab8b40},0,-1,1
+323,imgILoader,{d2f50c69-1064-4ce3-a92d-01dc5f5b4842},0,-1,1
+324,nsIDOMCSSPageRule,{a6cf90bd-15b3-11d2-932e-00805f8add32},0,-1,1
+325,nsIDOMSVGAnimatedTransformList,{fd54c8c4-2eb4-4849-8df6-79985c2491da},0,-1,1
+326,nsISliderListener,{e5b3074e-ee18-4538-83b9-2487d90a2a34},0,-1,1
+327,nsIJSID,{baedc96a-9cee-4b6b-9160-90d257b3c8ef},0,-1,1
+328,nsIBrowserGlue,{781df699-17dc-4237-b3d7-876ddb7085e3},0,-1,1
+329,nsIExternalProtocolHandler,{0e61f3b2-34d7-4c79-bfdc-4860bc7341b7},0,-1,1
+330,nsIXTFElement,{4f144387-796d-4baf-8641-5db45dba1808},0,-1,1
+331,nsIFilePicker,{d24ef0aa-d555-4117-84af-9cbbb7406909},0,-1,1
+332,nsIPropertyElement,{283ee646-1aef-11d4-98b3-00c04fa0ce9a},0,-1,1
+333,nsIDOMGeoPositionErrorCallback,{7d9b09d9-4843-43eb-a7a7-67f7dda6b3c4},0,-1,1
+334,nsIStandardURL,{babd6cca-ebe7-4329-967c-d6b9e33caa81},0,-1,1
+335,nsIRDFPurgeableDataSource,{951700f0-fed0-11d2-bdd9-00104bde6048},0,-1,1
+336,nsIExtendedExpatSink,{0c2dc80f-7aa4-467a-9454-b89dba0e0779},0,-1,1
+337,nsIWorkerMessageEvent,{508f2d49-e9a0-4fe8-bd33-321820173b4a},0,-1,1
+338,nsISeekableStream,{8429d350-1040-4661-8b71-f2a6ba455980},0,-1,1
+339,nsIHandlerService,{53f0ad17-ec62-46a1-adbc-efccc06babcd},0,-1,1
+340,nsIScriptSecurityManager,{f8e350b9-9f31-451a-8c8f-d10fea26b780},0,-1,1
+341,nsIWindowMediator,{0659cb81-faad-11d2-8e19-b206620a657c},0,-1,1
+342,nsIMicrosummary,{6867dc21-077f-4462-937d-cd8b7c680e0c},0,-1,1
+343,nsIDocumentLoaderFactory,{5e7d2967-5a07-444f-95d5-25b533252d38},0,-1,1
+344,nsIProxiedChannel,{6238f134-8c3f-4354-958f-dfd9d54a4446},0,-1,1
+345,nsIUnicodeNormalizer,{b43a461f-1bcf-4329-820b-66e48c979e14},0,-1,1
+346,nsIStreamListenerTee,{fb683e76-d42b-41a4-8ae6-65a6c2b146e5},0,-1,1
+347,nsIDOM3Text,{bcca052e-46f4-4b8e-8859-a86776c2f1d7},0,-1,1
+348,nsIFeedGenerator,{0fecd56b-bd92-481b-a486-b8d489cdd385},0,-1,1
+349,nsISyncStreamListener,{7e1aa658-6e3f-4521-9946-9685a169f764},0,-1,1
+350,nsIDOMLSParserFilter,{10e8893d-ddf5-45d1-8872-615d72065fb4},0,-1,1
+351,nsIDOMNSDocument,{09a439ad-4079-46d5-a050-4d7015d1a108},0,-1,1
+352,nsIScriptError,{b0196fc7-1913-441a-882a-453c0d8b89b8},0,-1,1
+353,nsIXPConnectJSObjectHolder,{8916a320-d118-11d3-8f3a-0010a4e73d9a},0,-1,0
+354,nsIEditorMailSupport,{fdf23301-4a94-11d3-9ce4-9960496c41bc},0,-1,1
+355,nsIXULWindow,{c175a596-ee13-420a-aa74-13ad3a14deb1},0,-1,1
+356,nsIEventTarget,{4e8febe4-6631-49dc-8ac9-308c1cb9b09c},0,-1,1
+357,nsIURLParser,{7281076d-cf37-464a-815e-698235802604},0,-1,1
+358,nsIGeolocationUpdate,{b89d7227-9f04-4236-a582-25a3f2779d72},0,-1,1
+359,nsIX509CertValidity,{e701dfd8-1dd1-11b2-a172-ffa6cc6156ad},0,-1,1
+360,extIExtensions,{de281930-aa5a-11db-abbd-0800200c9a66},0,-1,1
+361,nsIModule,{7392d032-5371-11d3-994e-00805fd26fee},0,-1,1
+362,nsINativeAppSupport,{5fdf8480-1f98-11d4-8077-00600811a9c3},0,-1,1
+363,nsIDOMSVGMetadataElement,{94558064-140c-41a1-9cc9-4e9cdbf5c124},0,-1,1
+364,nsINavHistoryQueryOptions,{b3d5de06-f8ef-4433-84c2-b8b237403b2a},0,-1,1
+365,nsIRDFDate,{e13a24e1-c77a-11d2-80be-006097b76b8e},0,-1,1
+366,nsIDOMSVGFEDisplacementMapElement,{80e1ea9c-eff3-490a-8c98-918963d2e7e9},0,-1,1
+367,nsIDocCharset,{9c18bb4e-1dd1-11b2-bf91-9cc82c275823},0,-1,1
+368,nsISignatureVerifier,{dea87f65-e91e-4119-aa13-aaa2be80cac2},0,-1,0
+369,nsISocketTransport,{ef3f4993-cfbc-4e5a-9509-16deafe16549},0,-1,1
+370,nsIASN1Object,{ba8bf582-1dd1-11b2-898c-f40246bc9a63},0,-1,1
+371,nsIPrintProgress,{7e46bc35-fb7d-4b45-ab35-82fd61015380},0,-1,1
+372,nsIDOMXULElement,{30a4a815-b42a-4f0b-9c10-1e7f727cd135},0,-1,1
+373,nsIXPCWrappedJSObjectGetter,{254bb2e0-6439-11d4-8fe0-0010a4e73d9a},0,-1,1
+374,nsIDOMMimeType,{f6134682-f28b-11d2-8360-c90899049c3c},0,-1,1
+375,nsIDOMMouseEvent,{ff751edc-8b02-aae7-0010-8301838a3123},0,-1,1
+376,nsIAccessibleEvent,{ba448f0e-a761-48c8-a0f5-1f25e23d4fe4},0,-1,1
+377,nsIDOMNSRGBAColor,{742dc816-5134-4214-adfa-cad9dd3377cd},0,-1,1
+378,nsIApplicationUpdateService,{9849c4bf-5197-4d22-baa8-e3b44a1703d2},0,-1,1
+379,nsIInterfaceRequestor,{033a1470-8b2a-11d3-af88-00a024ffc08c},0,-1,1
+380,nsINestedURI,{6de2c874-796c-46bf-b57f-0d7bd7d6cab0},0,-1,1
+381,nsIServiceManager,{8bb35ed9-e332-462d-9155-4a002ab5c958},0,-1,1
+382,nsIDOMHTMLOptGroupElement,{a6cf9091-15b3-11d2-932e-00805f8add32},0,-1,1
+383,nsICommandManager,{080d2001-f91e-11d4-a73c-f9242928207c},0,-1,1
+384,nsIIDNService,{a592a60e-3621-4f19-a318-2bf233cfad3e},0,-1,1
+385,nsIDOMHTMLTitleElement,{a6cf9089-15b3-11d2-932e-00805f8add32},0,-1,1
386,nsIMemoryReporter,{d298b942-3e66-4cd3-9ff5-46abc69147a7},0,-1,1
387,nsITraceRefcnt,{273dc92f-0fe6-4545-96a9-21be77828039},0,-1,0
388,nsITimelineService,{93276790-3daf-11d5-b67d-000064657374},0,-1,1
@@ -411,1039 +408,1031 @@
392,nsIChromeRegistry,{249fb5ad-ae29-4e2c-a728-ba5cf464d188},0,-1,1
393,nsIJSON,{45464c36-efde-4cb5-8e00-07480533ff35},0,-1,1
394,nsINavHistoryVisitResultNode,{8e2c5a86-b33d-4fa6-944b-559af7e95fcd},0,-1,1
-395,nsIDOMSVGGradientElement,{988b2de4-137b-4bb8-a15e-fe94038e9cf3},0,-1,1
-396,nsIDOMSVGFEImageElement,{3250f5c9-9c76-4e77-96d8-5f0cc85f41c4},0,-1,1
-397,nsIInputStreamPump,{400f5468-97e7-4d2b-9c65-a82aecc7ae82},0,-1,1
-398,nsIDOMLSParser,{2a31a3a0-be68-40af-9f64-914192f0fba2},0,-1,1
-399,nsIDOMCSSStyleDeclaration,{a6cf90be-15b3-11d2-932e-00805f8add32},0,-1,1
-400,nsIOfflineCacheUpdateService,{6fd2030f-7b00-4102-a0e3-d73078821eb1},0,-1,1
-401,nsIRequest,{ef6bfbd2-fd46-48d8-96b7-9f8f0fd387fe},0,-1,1
-402,nsIJSIID,{e76ec564-a080-4705-8609-384c755ec91e},0,-1,1
-403,nsIProcess,{d573f1f3-fcdd-4dbe-980b-4ba79e6718dc},0,-1,1
+395,nsIDOMCryptoDialogs,{1f8fe77e-1dd2-11b2-8dd2-e55f8d3465b8},0,-1,1
+396,nsIDOMSVGGradientElement,{988b2de4-137b-4bb8-a15e-fe94038e9cf3},0,-1,1
+397,nsIDOMSVGFEImageElement,{3250f5c9-9c76-4e77-96d8-5f0cc85f41c4},0,-1,1
+398,nsIInputStreamPump,{400f5468-97e7-4d2b-9c65-a82aecc7ae82},0,-1,1
+399,nsIDOMLSParser,{2a31a3a0-be68-40af-9f64-914192f0fba2},0,-1,1
+400,nsIDOMCSSStyleDeclaration,{a6cf90be-15b3-11d2-932e-00805f8add32},0,-1,1
+401,nsIOfflineCacheUpdateService,{6fd2030f-7b00-4102-a0e3-d73078821eb1},0,-1,1
+402,nsIRequest,{ef6bfbd2-fd46-48d8-96b7-9f8f0fd387fe},0,-1,1
+403,nsIJSIID,{e76ec564-a080-4705-8609-384c755ec91e},0,-1,1
404,nsIDOMHTMLTableSectionElement,{a6cf90b5-15b3-11d2-932e-00805f8add32},0,-1,1
405,nsIDirectoryEnumerator,{31f7f4ae-6916-4f2d-a81e-926a4e3022ee},0,-1,1
406,imgICache,{f1b74aae-5661-4753-a21c-66dd644afebc},0,-1,1
407,nsIDOMSVGZoomAndPan,{18967370-921a-4245-8158-a279b190abca},0,-1,1
408,nsIContainerBoxObject,{35d4c04b-3bd3-4375-92e2-a818b4b4acb6},0,-1,1
-409,nsILoginManager_MOZILLA_1_9_1,{44ec4942-3678-11de-b4e6-47765a06a143},0,-1,1
-410,nsISupportsPRUint8,{dec2e4e0-4a1c-11d3-9890-006008962422},0,-1,1
-411,nsIDOMSVGStyleElement,{9af0d129-b366-4aa8-b7d8-8dce93148d91},0,-1,1
-412,nsIURILoader,{2f7e8051-f1c9-4bcc-8584-9cfd5849e343},0,-1,1
-413,nsIWindowCreator,{30465632-a777-44cc-90f9-8145475ef999},0,-1,1
-414,nsIEditorLogging,{4805e681-49b9-11d3-9ce4-ed60bd6cb5bc},0,-1,1
-415,nsIIdentityInfo,{e9da87b8-b87c-4bd1-a6bc-5a9a2c7f6d8d},0,-1,1
-416,nsITransferable,{8b5314bc-db01-11d2-96ce-0060b0fb9956},0,-1,1
-417,nsIDOMNSEventTarget,{37ca0054-c715-42df-83c7-35c69e24a632},0,-1,1
-418,nsIEditingSession,{274cd32e-3675-47e1-9d8a-fc6504ded9ce},0,-1,1
-419,nsIAccessibilityService,{8160457f-7b1a-4779-a0ca-cea07d17194d},0,-1,0
+409,nsIProtocolProxyService,{e38ab577-786e-4a7f-936b-7ae4c7d877b2},0,-1,1
+410,nsIEventListenerInfo,{cbc2ea6e-4043-4435-ba8f-64cbf6638622},0,-1,1
+411,nsISupportsPRUint8,{dec2e4e0-4a1c-11d3-9890-006008962422},0,-1,1
+412,nsIDOMSVGStyleElement,{9af0d129-b366-4aa8-b7d8-8dce93148d91},0,-1,1
+413,nsIURILoader,{2f7e8051-f1c9-4bcc-8584-9cfd5849e343},0,-1,1
+414,nsIMIMEInfo,{1c21acef-c7a1-40c6-9d40-a20480ee53a1},0,-1,1
+415,nsIEditorLogging,{4805e681-49b9-11d3-9ce4-ed60bd6cb5bc},0,-1,1
+416,nsIIdentityInfo,{e9da87b8-b87c-4bd1-a6bc-5a9a2c7f6d8d},0,-1,1
+417,nsITransferable,{8b5314bc-db01-11d2-96ce-0060b0fb9956},0,-1,1
+418,nsIDOMNSEventTarget,{37ca0054-c715-42df-83c7-35c69e24a632},0,-1,1
+419,nsIEditingSession,{274cd32e-3675-47e1-9d8a-fc6504ded9ce},0,-1,1
420,nsIDOMHTMLDocument,{a6cf9084-15b3-11d2-932e-00805f8add32},0,-1,1
421,nsIStyleSheetService,{1f42a6a2-ab0a-45d4-8a96-396f58ea6c6d},0,-1,1
422,nsIUrlClassifierUtils,{e4f0e59c-b922-48b0-a7b6-1735c1f96fed},0,-1,1
-423,jsdIValue,{b7964304-1dd1-11b2-ba20-cf4205772e9d},0,-1,1
-424,nsIDOMSVGFESpecularLightingElement,{49c38287-a7c2-4895-a630-86d2b45df23c},0,-1,1
-425,nsIUrlListManager,{9c5598ec-9986-40cf-af40-b5e0d817a3a0},0,-1,1
-426,nsIDOMStorageWindow,{b4f572fb-9ba5-480b-9361-c230863323e4},0,-1,1
-427,nsIPluginInstancePeer2,{e7d48c00-e1f1-11d2-8360-fbc8abc4ae7c},0,-1,0
-428,imgIRequest,{a297d3fa-5e0c-4e59-9f30-a01c9d4f3f8b},0,-1,1
-429,nsILocaleService,{c2edc848-4219-4440-abbf-98119882c83f},0,-1,1
-430,nsIPluginDocument,{e4be1d0a-9f24-4d69-bec5-245726ab85fb},0,-1,0
-431,nsIRDFCompositeDataSource,{96343820-307c-11d2-bc15-00805f912fe7},0,-1,1
-432,nsIRequestObserver,{fd91e2e0-1481-11d3-9333-00104ba0fd40},0,-1,1
-433,nsIDOMSVGFEComponentTransferElement,{4de6b44a-f909-4948-bc43-5ee2ca6de55b},0,-1,1
-434,nsIRecyclingAllocator,{d064a04c-9cee-4319-be31-64d565bccba9},0,-1,1
-435,nsISelectionController,{b5c3ffc4-f48a-4f25-86e1-4cf79db1bcbb},0,-1,1
-436,nsIDocShell_MOZILLA_1_9_1_SessionStorage,{b0534fdd-8a6c-4489-8c9e-471d7b2b2596},0,-1,1
-437,nsIDOMHTMLIFrameElement,{a6cf90ba-15b3-11d2-932e-00805f8add32},0,-1,1
-438,nsIHttpAuthManager,{7ce8e9d1-8b4b-4883-a307-66fe12a50153},0,-1,1
-439,nsIXULBrowserWindow,{67a601df-f091-4894-a2e2-2e6cfebb35ea},0,-1,1
-440,nsIDOMSVGPointList,{4c12af24-0fc2-4fe7-b71d-5d6b41d463c1},0,-1,1
-441,nsIUserInfo,{6c1034f0-1dd2-11b2-aa14-e6657ed7bb0b},0,-1,1
-442,nsIDOMHTMLVideoElement,{4e3f05a5-ca9b-4576-af7f-b1d4038e6eb3},0,-1,1
-443,nsICacheEntryDescriptor,{49c1a11d-f5d2-4f09-8262-551e64908ada},0,-1,1
-444,nsIHTMLAbsPosEditor,{91375f52-20e6-4757-9835-eb04fabe5498},0,-1,1
-445,nsIAutoCompleteObserver,{18c36504-9a4c-4ac3-8494-bd05e00ae27f},0,-1,1
-446,nsIFormHistory2,{5d7d84d1-9798-4016-bf61-a32acf09b29d},0,-1,1
-447,nsIAccessibleTextChangeEvent,{50a1e151-8e5f-4bcc-aaaf-a4bed1190e93},0,-1,1
-448,nsISecurityWarningDialogs,{1c399d06-1dd2-11b2-bc58-c87cbcacdb78},0,-1,1
-449,nsIImageDocument,{7b80eebc-c98e-4461-8bdb-6e3b6e828890},0,-1,1
-450,jsdIDebuggerService,{a074fcb4-73d7-4825-a4cd-7cbb1d6800b1},0,-1,1
-451,nsITransport,{d8786c64-eb49-4a0b-b42c-0936a745fbe8},0,-1,1
-452,nsIMutable,{321578d0-03c1-4d95-8821-021ac612d18d},0,-1,1
-453,jsdICallHook,{f102caf6-1dd1-11b2-bd43-c1dbacb95a98},0,-1,1
-454,nsIListBoxObject,{aa9def4e-2e59-412d-a6df-b76f52167795},0,-1,1
-455,nsIAccessibleScrollType,{05cd38b1-94b3-4cdf-8371-3935a9611405},0,-1,1
-456,nsICategoryManager,{3275b2cd-af6d-429a-80d7-f0c5120342ac},0,-1,1
-457,nsIBidirectionalIterator,{948defaa-1dd1-11b2-89f6-8ce81f5ebda9},0,-1,1
-458,nsIErrorService,{e72f94b2-5f85-11d4-9877-00c04fa0cf4a},0,-1,1
-459,nsIURIClassifier,{2de5c563-1203-43dd-a212-f5d56d530b6f},0,-1,1
-460,nsIWindowMediatorListener,{2f276982-0d60-4377-a595-d350ba516395},0,-1,1
-461,nsISHistoryListener,{3b07f591-e8e1-11d4-9882-00c04fa02f40},0,-1,1
-462,nsIEditor,{96b60ba0-634a-41e4-928e-78ab0b3c4b46},0,-1,1
-463,nsIAccessibleTableChangeEvent,{a9485c7b-5861-4695-8441-fab0235b205d},0,-1,1
-464,nsIDOMHistory,{896d1d20-b4c4-11d2-bd93-00805f8ae3f4},0,-1,1
-465,nsIZipEntry,{e1c028bc-c478-11da-95a8-00e08161165f},0,-1,1
-466,nsIWebContentHandlerRegistrar,{e6a75410-c93e-42bf-84ca-a5c3ec34a2f1},0,-1,1
-467,mozIStorageStatementWrapper,{eee6f7c9-5586-4eaf-b35c-dca987c4ffd1},0,-1,1
-468,nsIDOMNodeList,{a6cf907d-15b3-11d2-932e-00805f8add32},0,-1,1
-469,nsIUnicharInputStream,{d5e3bd80-6723-4b92-b0c9-22f6162fd94f},0,-1,1
-470,rdfITripleVisitor,{aafea151-c271-4505-9978-a100d292800c},0,-1,1
-471,nsIDOMDOMImplementationLS,{e2c8b03c-a49a-4923-81b0-ba9a86da0e21},0,-1,1
-472,nsIDOMAbstractView,{f51ebade-8b1a-11d3-aae7-0010830123b4},0,-1,1
-473,nsIPopupBoxObject,{a41af368-9f73-4d73-a058-49dd7e41f9ea},0,-1,1
-474,nsIWorkerErrorEvent,{73d82c1d-05de-49c9-a23b-7121ff09a67a},0,-1,1
-475,nsINavBookmarkObserver_MOZILLA_1_9_1_ADDITIONS,{76440c39-1085-4f2b-9535-5ba4658fcdad},0,-1,1
-476,nsIRDFLiteral,{e0c493d2-9542-11d2-8eb8-00805f29f370},0,-1,1
-477,nsIAccessible,{670fc322-14ec-4f3b-8279-9d62ab8895c0},0,-1,1
-478,nsIDOMCanvasPattern,{21dea65c-5c08-4eb1-ac82-81fe95be77b8},0,-1,1
-479,nsISupportsVoid,{464484f0-568d-11d3-baf8-00805f8a5dd7},0,-1,1
-480,nsIDOMCSSImportRule,{a6cf90cf-15b3-11d2-932e-00805f8add32},0,-1,1
-481,nsISecurityEventSink,{a71aee68-dd38-4736-bd79-035fea1a1ec6},0,-1,1
-482,nsIConsoleMessage,{41bd8784-1dd2-11b2-9553-8606958fffe1},0,-1,1
-483,imgILoad,{e6273acc-1dd1-11b2-a08b-824ad1b1628d},0,-1,1
-484,nsISAXLocator,{7a307c6c-6cc9-11da-be43-001422106990},0,-1,1
-485,nsIDOMHTMLSourceElement,{be281029-7dd9-4268-963e-96f5196acc19},0,-1,1
-486,nsIDOMSVGMaskElement,{fdd7039c-35b6-465a-b7a3-c98a815b583e},0,-1,1
-487,nsICookiePromptService,{72f8bb14-2810-4f38-8d0d-290c5401f54e},0,-1,1
-488,extIApplication,{e53d6610-7468-11dd-ad8b-0800200c9a66},0,-1,1
-489,nsIDOMHTMLCollection,{a6cf9083-15b3-11d2-932e-00805f8add32},0,-1,1
-490,nsIFeedPerson,{29cbd45f-f2d3-4b28-b557-3ab7a61ecde4},0,-1,1
-491,nsIDOMEvent,{a66b7b80-ff46-bd97-0080-5f8ae38add32},0,-1,1
-492,nsINavHistoryService,{437f539b-d541-4a0f-a200-6f9a6d45cce2},0,-1,1
-493,nsIMIMEInfo,{cd7083f8-5fe9-4248-bb09-0b0e2982fde8},0,-1,1
-494,nsIDOMHTMLBRElement,{a6cf90a5-15b3-11d2-932e-00805f8add32},0,-1,1
-495,nsIURIClassifierCallback,{8face46e-0c96-470f-af40-0037dcd797bd},0,-1,1
-496,nsICertificateDialogs,{a03ca940-09be-11d5-ac5d-000064657374},0,-1,1
-497,nsIInputIterator,{85585e12-1dd2-11b2-a930-f6929058269a},0,-1,1
-498,nsIGlobalHistory,{9491c383-e3c4-11d2-bdbe-0050040a9b44},0,-1,1
-499,mozIStorageStatementParams,{e65fe6e2-2643-463c-97e2-27665efe2386},0,-1,1
-500,fuelIWindow,{207edb28-eb5e-424e-a862-b0e97c8de866},0,-1,1
-501,nsIPref,{a22ad7b0-ca86-11d1-a9a4-00805f8a7ac4},0,-1,1
-502,nsIAsyncStreamCopier,{72e515de-a91e-4154-bb78-e5244cbaae74},0,-1,1
-503,nsIDOMSVGPathSegLinetoAbs,{5c7ba7b0-c7c5-4a7b-bc1c-2d784153be77},0,-1,1
-504,nsIDOMSVGAnimatedEnumeration,{73b101bd-797b-470f-9308-c24c64278bcd},0,-1,1
-505,nsIAutoCompleteSearch,{de8db85f-c1de-4d87-94ba-7844890f91fe},0,-1,1
-506,nsIDOMComment,{a6cf9073-15b3-11d2-932e-00805f8add32},0,-1,1
-507,nsISecretDecoderRingConfig,{01d8c0f0-0ccc-11d4-9fdd-000064657374},0,-1,1
-508,nsIXULTreeBuilderObserver,{a5480e0d-ac7c-42e5-aca5-d7f0bbffa207},0,-1,1
-509,nsIXPTLoader,{368a15d9-17a9-4c2b-ac3d-a35b3a22b876},0,-1,1
-510,nsIContentFilter,{c18c49a8-62f0-4045-9884-4aa91e388f14},0,-1,1
-511,nsIASN1Tree,{c727b2f2-1dd1-11b2-95df-f63c15b4cd35},0,-1,1
-512,extISessionStorage,{0787ac44-29b9-4889-b97f-13573aec6971},0,-1,1
-513,nsIComponentManagerObsolete,{8458a740-d5dc-11d2-92fb-00e09805570f},0,-1,1
-514,mozIStorageStatementRow,{02eeaf95-c3db-4182-9340-222c29f68f02},0,-1,1
-515,nsIInterfaceInfo,{215dbe04-94a7-11d2-ba58-00805f8a5dd7},0,-1,0
-516,nsIShellService,{bb477da4-dddf-4106-a562-f06c85c7f9a8},0,-1,1
-517,mozISpellCheckingEngine,{43987f7b-0faa-4019-811e-42becac73fc5},0,-1,1
-518,nsIApplicationCacheContainer,{bbb80700-1f7f-4258-aff4-1743cc5a7d23},0,-1,1
-519,mozIStorageDataSet,{57826606-3c8a-4243-9f2f-cb3fe6e91148},0,-1,1
-520,nsIJSContextStack,{c67d8270-3189-11d3-9885-006008962422},0,-1,0
-521,nsIDOMNSHTMLFrameElement,{d67bd267-f984-4993-b378-95851b71f0a3},0,-1,1
-522,nsIProfile,{02b0625a-e7f3-11d2-9f5a-006008a6efe9},0,-1,1
-523,nsIDOMSVGPathSegMovetoRel,{58ca7e86-661a-473a-96de-89682e7e24d6},0,-1,1
-524,nsISystemProxySettings,{a9f3ae38-b769-4e0b-9317-578388e326c9},0,-1,1
-525,nsIPromptService,{1630c61a-325e-49ca-8759-a31b16c47aa5},0,-1,1
-526,nsIJARProtocolHandler,{92c3b42c-98c4-11d3-8cd9-0060b0fc14a3},0,-1,1
-527,nsIRefreshURI,{cb0ad623-6b46-4c09-a473-c1d6ca63d3c7},0,-1,1
-528,nsIDOMAttr,{a6cf9070-15b3-11d2-932e-00805f8add32},0,-1,1
-529,nsIDOMXPathExpression,{75506f82-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
-530,nsIJVMPluginInstance,{a0c057d0-01c1-11d2-815b-006008119d7a},0,-1,1
-531,nsIVariant,{6c9eb060-8c6a-11d5-90f3-0010a4e73d9a},0,-1,1
-532,nsIDOMSVGAnimatedBoolean,{7e325385-cc82-4763-bd14-e2c92edd5462},0,-1,1
-533,nsITreeColumn,{ae835ecf-6b32-4660-9b43-8a270df56e02},0,-1,1
-534,nsIAutoCompletePopup,{1b9d7d8a-6dd0-11dc-8314-0800200c9a66},0,-1,1
-535,nsIFullScreen,{9854976e-1dd1-11b2-8350-e6d35099fbce},0,-1,1
-536,nsIAccessibleCaretMoveEvent,{b9076dce-4cd3-4e3d-a7f6-7f33a7f40c31},0,-1,1
-537,mozIStorageFunction,{9ff02465-21cb-49f3-b975-7d5b38ceec73},0,-1,1
-538,nsIDOMPkcs11,{9fd42950-25e7-11d4-8a7d-006008c844c3},0,-1,1
-539,nsIDocumentEncoderNodeFixup,{3c556e41-0f73-4e1d-b724-1474884fe2e3},0,-1,1
-540,nsIToolkitProfile,{7422b090-4a86-4407-972e-75468a625388},0,-1,1
-541,nsIWebBrowserPrint,{9a7ca4b0-fbba-11d4-a869-00105a183419},0,-1,1
-542,nsPIAccessible,{ed61e5cd-283a-42df-9599-765e0e27f4d9},0,-1,0
-543,nsIGlobalHistory2,{cf777d42-1270-4b34-be7b-2931c93feda5},0,-1,1
-544,rdfIDataSource,{ebce86bd-1568-4a34-a808-9ccf9cde8087},0,-1,1
-545,nsIWebBrowserFindInFrames,{e0f5d182-34bc-11d5-be5b-b760676c6ebc},0,-1,1
-546,nsIDynamicContainer,{7e85d97b-4109-4ea7-afd8-bc2cd3840d70},0,-1,1
-547,nsISAXXMLFilter,{77a22cf0-6cdf-11da-be43-001422106990},0,-1,1
-548,nsINavHistoryFullVisitResultNode,{c49fd9d5-56e2-43eb-932c-f933f28cba85},0,-1,1
-549,nsISearchableInputStream,{8c39ef62-f7c9-11d4-98f5-001083010e9b},0,-1,1
-550,nsIDirIndexListener,{fae4e9a8-1dd1-11b2-b53c-8f3aa1bbf8f5},0,-1,1
-551,nsISAXContentHandler,{2a99c757-dfee-4806-bff3-f721440412e0},0,-1,1
-552,nsIExternalHelperAppService,{9e456297-ba3e-42b1-92bd-b7db014268cb},0,-1,1
-553,nsIDOMSVGTitleElement,{524564b0-13a3-459b-bbec-ad66aea9f789},0,-1,1
-554,nsICurrentCharsetListener,{cf9428c1-df50-11d3-9d0c-0050040007b2},0,-1,1
-555,nsISocketProvider,{00b3df92-e830-11d8-d48e-0004e22243f8},0,-1,1
-556,nsIThreadObserver,{81d0b509-f198-4417-8020-08eb4271491f},0,-1,1
-557,nsIStringInputStream,{450cd2d4-f0fd-424d-b365-b1251f80fd53},0,-1,1
-558,nsIPhonetic,{bc6ea726-ab56-46b6-a21a-aa7b76d6818f},0,-1,1
-559,nsIDOMLoadStatus,{2cb53a8a-d2f4-4ddf-874f-3bc2d595c41a},0,-1,1
-560,nsIInterfaceInfoSuperManager,{0ee22850-bc6a-11d5-9134-0010a4e73d9a},0,-1,0
-561,nsIThread,{9c889946-a73a-4af3-ae9a-ea64f7d4e3ca},0,-1,1
-562,nsIDOMCSSValue,{009f7ea5-9e80-41be-b008-db62f10823f2},0,-1,1
-563,nsICookieAcceptDialog,{3f2f0d2c-bdea-4b5a-afc6-fcf18f66b97e},0,-1,1
-564,nsIDOMSVGFEBlendElement,{8f4daf4c-de2d-450f-a373-449ad62e3800},0,-1,1
-565,nsIMenuBoxObject,{f5099746-5049-4e81-a03e-945d5110fee2},0,-1,1
-566,nsIDOMSVGFEFuncRElement,{85719a5d-9688-4c5f-bad5-c21847515200},0,-1,1
-567,nsIDOMNSEvent,{e565d518-4510-407f-a3d9-3b4107549c6d},0,-1,1
-568,nsIAutoCompleteInput,{f5eddd39-f8e0-43b7-bc3d-03623f595e52},0,-1,1
-569,nsIDOMSVGPathSegClosePath,{4970505f-2cc0-4afa-92e6-0cf4bdbf5a53},0,-1,1
-570,nsIDOMLSException,{1cc8e4b3-1dbb-4adc-a913-1527bf67748c},0,-1,1
-571,nsIDOMHTMLTimeRanges,{5c9995a1-9fce-44e8-aa7f-de52ff4c3f46},0,-1,1
-572,nsIDOMSVGFEGaussianBlurElement,{43ff8d42-3380-4dbd-a916-7c2daa3ed7f4},0,-1,1
-573,nsIDOMHTMLFieldSetElement,{a6cf9097-15b3-11d2-932e-00805f8add32},0,-1,1
-574,nsIDOMSVGLinearGradientElement,{7e15fce5-b208-43e1-952a-c570ebad0619},0,-1,1
-575,nsIDOMStorage,{95cc1383-3b62-4b89-aaef-1004a513ef47},0,-1,1
-576,nsIStreamLoader,{8ea7e890-8211-11d9-8bde-f66bad1e3f3a},0,-1,1
-577,nsIDOMWindowCollection,{a6cf906f-15b3-11d2-932e-00805f8add32},0,-1,1
-578,nsIBinaryInputStream,{7b456cb0-8772-11d3-90cf-0040056a906e},0,-1,1
-579,nsIDOMSVGFEConvolveMatrixElement,{42109b58-a8c1-4078-b44c-ec1d5d6b9574},0,-1,1
-580,nsIDocShell_MOZILLA_1_9_1_dns,{6cf71a12-c7d6-404d-b0b5-15ceae321337},0,-1,1
-581,nsISSLStatus,{cfede939-def1-49be-81ed-d401b3a07d1c},0,-1,1
-582,nsITextScroll,{067b28a0-877f-11d3-af7e-00a024ffc08c},0,-1,1
-583,nsIDOMSVGRadialGradientElement,{d0262ae1-31a4-44be-b82e-85e4cfe280fd},0,-1,1
-584,nsIBidirectionalEnumerator,{75f158a0-cadd-11d2-8cca-0060b0fc14a3},0,-1,0
-585,nsIVersionComparator,{e6cd620a-edbb-41d2-9e42-9a2ffc8107f3},0,-1,1
-586,nsIUrlClassifierLookupCallback,{f1dc83c6-ad43-4f0f-a809-fd43de7de8a4},0,-1,0
-587,nsIControllerCommandTable,{d1a47834-6ad4-11d7-bfad-000393636592},0,-1,1
-588,nsIWindowWatcher,{002286a8-494b-43b3-8ddd-49e3fc50622b},0,-1,1
-589,nsIDOMXPathException,{75506f89-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
-590,nsIDOMXULCommandEvent,{f9fa8205-a988-4828-9228-f3332d5475ac},0,-1,1
-591,nsISHistory,{9883609f-cdd8-4d83-9b55-868ff08ad433},0,-1,1
-592,nsIAutoCompleteBaseResult,{e6396544-921d-4776-aa62-8bf2dc1ae058},0,-1,0
-593,nsIDOMCrypto,{12b6d899-2aed-4ea9-8c02-2223ab7ab592},0,-1,1
-594,nsIDOMSVGFEDiffuseLightingElement,{2e9eb422-2398-4be9-a9b8-b1cc7aa9dd6f},0,-1,1
-595,nsIDOMCryptoDialogs,{1f8fe77e-1dd2-11b2-8dd2-e55f8d3465b8},0,-1,1
-596,nsISimpleUnicharStreamFactory,{8238cd2e-e8e3-43e8-b556-56e21389c766},0,-1,1
-597,nsIDOMMutationEvent,{8e440d86-886a-4e76-9e59-c13b939c9a4b},0,-1,1
-598,nsIDOMSVGTextPositioningElement,{5d052835-8cb0-442c-9754-a8e616db1f89},0,-1,1
-599,nsIDOMNSHTMLAnchorElement,{a6cf911c-15b3-11d2-932e-00805f8add32},0,-1,1
-600,nsILocalHandlerApp,{9812be73-273c-478c-8170-c3e0db08ae7c},0,-1,1
-601,nsIComponentRegistrar,{2417cbfe-65ad-48a6-b4b6-eb84db174392},0,-1,1
-602,nsIFileChannel,{06169120-136d-45a5-b535-498f1f755ab7},0,-1,1
-603,nsIPluginHost,{2af1c32d-38dd-4f72-b0ab-24697d836e61},0,-1,1
-604,nsIDOMSVGPathElement,{2b19e692-3338-440f-a998-3cb1e8474999},0,-1,1
-605,nsIHttpAuthenticator,{0f331436-8bc8-4c68-a124-d0253a19d06f},0,-1,1
-606,nsIPrintSession,{2f977d52-5485-11d4-87e2-0010a4e75ef2},0,-1,0
-607,nsICacheListener,{638c3848-778b-4851-8ff3-9400f65b8773},0,-1,1
-608,mozIStorageResultSet,{18dd7953-076d-4598-8105-3e32ad26ab24},0,-1,1
-609,mozIStorageValueArray,{07b5b93e-113c-4150-863c-d247b003a55d},0,-1,1
-610,nsIStreamCipher,{1d507cd6-1630-4710-af1b-4012dbcc514c},0,-1,1
-611,nsIDOMSVGAnimatedRect,{ca45959e-f1da-46f6-af19-1ecdc322285a},0,-1,1
-612,nsIWindowlessPluginInstancePeer,{57b4e2f0-019b-11d2-815b-006008119d7a},0,-1,0
-613,nsIDOMDocumentEvent,{46b91d66-28e2-11d4-ab1e-0010830123b4},0,-1,1
-614,nsICMSMessageErrors,{f2aec680-60a0-49f0-afe5-6cf1d3f15e0d},0,-1,1
-615,nsICrashReporter,{d9a0f5b2-a7df-4aeb-9775-21b9e01b4c59},0,-1,1
-616,nsIXULAppInfo,{a61ede2a-ef09-11d9-a5ce-001124787b2e},0,-1,1
-617,nsIProxiedProtocolHandler,{0a24fed4-1dd2-11b2-a75c-9f8b9a8f9ba7},0,-1,1
-618,nsISupportsString,{d79dc970-4a1c-11d3-9890-006008962422},0,-1,1
-619,nsIDOMNSFeatureFactory,{dc5ba787-b648-4b01-a8e7-b293ffb044ef},0,-1,1
-620,nsISafeOutputStream,{5f914307-5c34-4e1f-8e32-ec749d25b27a},0,-1,1
-621,inIDeepTreeWalker,{91fca0e9-99d6-406b-9d78-4c96f11e9ee4},0,-1,1
-622,nsIComponentManager,{a88e5a60-205a-4bb1-94e1-2628daf51eae},0,-1,1
-623,nsIDocShellTreeItem,{09b54ec1-d98a-49a9-bc95-3219e8b55089},0,-1,1
-624,nsIDOMCSSFontFaceRule,{a6cf90bb-15b3-11d2-932e-00805f8add32},0,-1,1
-625,nsIPrincipal,{b8268b9a-2403-44ed-81e3-614075c92034},0,-1,1
-626,nsISupportsPRUint64,{e13567c0-4a1c-11d3-9890-006008962422},0,-1,1
-627,nsITaggingService,{e39cea60-7e6d-4c8b-80a3-997af1c2cbcb},0,-1,1
-628,nsIXMLHttpRequestEventTarget,{6ce0a193-b033-4c3d-b748-f851b09261f5},0,-1,1
-629,nsICMSMessage2,{a99a3203-39e3-45e1-909c-175b0e471c2b},0,-1,0
-630,nsIAutoCompleteMdbResult,{f7e7b341-2d5c-4d04-9f51-496cb2ce178c},0,-1,0
-631,nsIPrefBranch2,{74567534-eb94-4b1c-8f45-389643bfc555},0,-1,1
-632,inISearchObserver,{46226d9b-e398-4106-8d9b-225d4d0589f5},0,-1,1
-633,nsIDOMSVGAnimatedLength,{a52f0322-7f4d-418d-af6d-a7b14abd5cdf},0,-1,1
-634,nsIPasswordManager,{173562f0-2173-11d5-a54c-0010a401eb10},0,-1,1
-635,nsISupportsID,{d18290a0-4a1c-11d3-9890-006008962422},0,-1,1
-636,nsIRollupListener,{ee6efe03-77dc-4aac-a6a8-905731a1796e},0,-1,0
-637,nsIResProtocolHandler,{067ca872-e947-4bd6-8946-a479cb6ba5dd},0,-1,1
-638,nsIServerSocketListener,{836d98ec-fee2-4bde-b609-abd5e966eabd},0,-1,1
-639,nsIAccessNode,{71a3b4e7-e83d-45cf-a20e-9ce292bcf19f},0,-1,1
-640,nsIDOMSVGPathSegCurvetoQuadraticAbs,{b7aef0f0-2830-4145-b04f-fe05789ccf8a},0,-1,1
-641,nsIWebNavigation,{f5d9e7b0-d930-11d3-b057-00a024ffc08c},0,-1,1
-642,nsISupportsPRInt64,{e3cb0ff0-4a1c-11d3-9890-006008962422},0,-1,1
-643,nsIXPCComponents_ID,{7994a6e0-e028-11d3-8f5d-0010a4e73d9a},0,-1,1
-644,nsITooltipTextProvider,{b128a1e6-44f3-4331-8fbe-5af360ff21ee},0,-1,1
-645,nsIXPCComponents_Classes,{978ff520-d26c-11d2-9842-006008962422},0,-1,1
-646,nsIFastLoadService,{759e475e-0c23-4dbf-b1b8-78c9369e3072},0,-1,1
-647,jsdIProperty,{b8816e56-1dd1-11b2-81dc-8ba99a833d9e},0,-1,1
-648,nsIWorkerGlobalScope,{d7d7cf59-6c8a-4598-8753-630953ae7409},0,-1,1
-649,nsIDOMHTMLLegendElement,{a6cf9098-15b3-11d2-932e-00805f8add32},0,-1,1
-650,nsIAutoConfig,{80db54ae-13f2-11d5-be44-00108335a220},0,-1,0
-651,nsIDOMNSHTMLAreaElement2,{1859b16a-7c16-4ab7-bdb9-52792ba16cc1},0,-1,1
-652,nsIDOMSVGDefsElement,{a2e86036-f04c-4013-9f74-e7090a0aac0a},0,-1,1
-653,nsIBaseWindow,{046bc8a0-8015-11d3-af70-00a024ffc08c},0,-1,1
-654,nsIFastLoadFileControl,{8a1e2c63-af50-4147-af7e-26289dc180dd},0,-1,1
-655,nsIPrefService,{decb9cc7-c08f-4ea5-be91-a8fc637ce2d2},0,-1,1
-656,nsIDOMLSProgressEvent,{b9a2371f-70e9-4657-b0e8-28e15b40857e},0,-1,1
-657,nsIAccessibleHyperText,{d56bd454-8ff3-4edc-b266-baeada00267b},0,-1,1
-658,nsIMicrosummaryGenerator,{05b48344-d0a7-427e-934e-9a6e0d5ecced},0,-1,1
-659,mozIStorageRow,{62d1b6bd-cbfe-4f9b-aee1-0ead4af4e6dc},0,-1,1
-660,nsIContentURIGrouper,{4bb38cb4-c3cb-4d17-9799-1b3132b39723},0,-1,1
-661,nsIJVMAuthTools,{82274a32-a196-42ee-8e3b-fcb73e339518},0,-1,0
-662,nsIDOMSVGPathSeg,{b9022da7-e26d-4df3-8c94-b45c4aedda7c},0,-1,1
-663,fuelIBrowserTab,{3073ceff-777c-41ce-9ace-ab37268147c1},0,-1,1
-664,nsISSLCertErrorDialog,{0729ce8e-8935-4989-ba72-a2d6307f2365},0,-1,1
-665,nsIThreadJSContextStack,{a1339ae0-05c1-11d4-8f92-0010a4e73d9a},0,-1,0
-666,nsIScriptChannel,{33234b99-9588-4c7d-9da6-86b8b7cba565},0,-1,1
-667,nsIDOMBarProp,{9eb2c150-1d56-11d3-8221-0060083a0bcf},0,-1,1
-668,nsIPluginInstanceOwner,{2e6cc23b-7d4e-4b0a-ad45-f2281c937f5c},0,-1,0
-669,nsIHttpHeaderVisitor,{0cf40717-d7c1-4a94-8c1e-d6c9734101bb},0,-1,1
-670,fuelIAnnotations,{335c9292-91a1-4ca0-ad0b-07d5f63ed6cd},0,-1,1
-671,nsIWindowProvider,{5119ac7f-81dd-4061-96a7-71f2cf5efee4},0,-1,1
-672,nsIPrintSettingsService,{841387c8-72e6-484b-9296-bf6eea80d58a},0,-1,1
-673,nsIDOMSVGFEColorMatrixElement,{0e966878-ebf1-4455-86fd-f4c7b1f24777},0,-1,1
-674,nsIPKCS11,{5743f870-958e-4f02-aef2-c0afeef67f05},0,-1,1
-675,nsIDOMSVGFEFuncAElement,{fa48511c-283a-437f-9507-c309ac6f0f57},0,-1,1
-676,nsIObjectInputStream,{6c248606-4eae-46fa-9df0-ba58502368eb},0,-1,1
-677,nsIDOMSVGFETileElement,{ed042a81-39fc-4c89-9385-75758a2434b5},0,-1,1
-678,nsIDOMGetSVGDocument,{b5d3074c-4f63-4936-bf39-49034efa26a5},0,-1,1
-679,nsIDirIndex,{23bbabd0-1dd2-11b2-86b7-aad68ae7d7e0},0,-1,1
-680,nsIEditorBoxObject,{e3800a23-5b83-49aa-b18c-efa1ac5416e0},0,-1,1
-681,nsIPasswordManagerInternal,{a448531f-dc92-4dc1-9012-da841febcbe0},0,-1,1
-682,nsIDOMNSHTMLHRElement,{19b5879f-c125-447c-aaaf-719de3ef221a},0,-1,1
-683,nsIDOMSVGFEFloodElement,{2743af95-28c5-429d-9812-12b7b017887e},0,-1,1
-684,nsIFormFillController,{07f0a0dc-f6e9-4cdd-a55f-56d770523a4c},0,-1,1
-685,nsIMIMEInputStream,{dcbce63c-1dd1-11b2-b94d-91f6d49a3161},0,-1,1
-686,nsIRecentBadCertsService,{a5ae8b05-a76e-408f-b0ba-02a831265749},0,-1,1
-687,nsICommandHandler,{34a4fcf0-66fc-11d4-9528-0020183bf181},0,-1,1
-688,nsIDOMHTMLObjectElement,{a6cf90ac-15b3-11d2-932e-00805f8add32},0,-1,1
-689,nsIDOMLocation,{a6cf906d-15b3-11d2-932e-00805f8add32},0,-1,1
-690,nsIViewSourceChannel,{8b77d6e2-2ae9-11d5-be57-000064657374},0,-1,0
-691,nsISyncLoadDOMService,{8095998d-ae1c-4cfa-9b43-0973e5d77eb0},0,-1,1
-692,nsIDOMXULDescriptionElement,{c7b0b43c-1dd1-11b2-9e1c-ce5f6a660630},0,-1,1
-693,nsIURL,{d6116970-8034-11d3-9399-00104ba0fd40},0,-1,1
-694,nsIMultiplexInputStream,{a076fd12-1dd1-11b2-b19a-d53b5dffaade},0,-1,1
-695,nsIClipboardCommands,{b8100c90-73be-11d2-92a5-00105a1b0d64},0,-1,1
-696,nsIThreadEventFilter,{a0605c0b-17f5-4681-b8cd-a1cd75d42559},0,-1,1
-697,nsIXPCSecurityManager,{31431440-f1ce-11d2-985a-006008962422},0,-1,0
-698,nsIDOMXULMenuListElement,{3d49950e-04f9-4e35-a9a0-ffd51356a674},0,-1,1
-699,nsIDocShellTreeNode,{37f1ab73-f224-44b1-82f0-d2834ab1cec0},0,-1,1
-700,nsIWebBrowserChrome,{ba434c60-9d52-11d3-afb0-00a024ffc08c},0,-1,1
-701,nsIFastLoadWriteControl,{2ad6e9e6-1379-4e45-a899-a54b27ff915c},0,-1,1
-702,nsIPluginManager2,{d2962dc0-4eb6-11d2-8164-006008119d7a},0,-1,0
-703,nsIByteRangeRequest,{c1b1f426-7e83-4759-9f88-0e1b17f49366},0,-1,1
-704,nsIPrintStatusFeedback,{19855dff-3248-4902-b196-93ee4c477880},0,-1,1
-705,nsIPluginTagInfo2,{6a49c9a0-019b-11d2-815b-006008119d7a},0,-1,0
-706,nsIDOMRange,{a6cf90ce-15b3-11d2-932e-00805f8add32},0,-1,1
-707,nsIAccessibleStates,{7fe1ee90-edaa-43f1-9f3b-071099b51f08},0,-1,1
-708,nsIAtomService,{9c1f50b9-f9eb-42d4-a8cb-2c7600aeb241},0,-1,1
-709,nsIExceptionProvider,{0577744c-c1d2-47f2-8bcc-ce7a9e5a88fc},0,-1,1
-710,nsIDOMJSNavigator,{4b4f8316-1dd2-11b2-b265-9a857376d159},0,-1,1
-711,nsIScriptableDateFormat,{0c89efb0-1aae-11d3-9141-006008a6edf6},0,-1,1
-712,nsIDOM3EventTarget,{3e9c01a7-de97-4c3b-8294-b4bd9d7056d1},0,-1,1
-713,nsIJVMConfig,{3e333e20-b190-42d8-b993-d5fa435e46c4},0,-1,1
-714,nsIDOMXPathNSResolver,{75506f83-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
-715,nsIFTPChannel,{2315d831-8b40-446a-9138-fe09ebb1b720},0,-1,1
-716,nsIDOMCSSValueList,{8f09fa84-39b9-4dca-9b2f-db0eeb186286},0,-1,1
-717,nsIStackFrame,{91d82105-7c62-4f8b-9779-154277c0ee90},0,-1,1
-718,nsIDOMHTMLFontElement,{a6cf90a7-15b3-11d2-932e-00805f8add32},0,-1,1
-719,nsIEffectiveTLDService,{6852369e-baa9-4c9a-bbcd-5123fc54a297},0,-1,1
-720,imgIEncoder,{ba3a854b-fb8d-4881-8af9-5849df10e5e5},0,-1,1
-721,nsIToolkitChromeRegistry,{94490b3f-f094-418e-b1b9-73878d29bff3},0,-1,1
-722,nsIBrowserHistory,{96602bf3-de2a-42ed-812f-a83b130e6299},0,-1,1
-723,nsIPropertyBag,{bfcd37b0-a49f-11d5-910d-0010a4e73d9a},0,-1,1
-724,nsIFeedElementBase,{5215291e-fa0a-40c2-8ce7-e86cd1a1d3fa},0,-1,1
-725,nsIINIParserFactory,{ccae7ea5-1218-4b51-aecb-c2d8ecd46af9},0,-1,1
-726,nsIFormSigningDialog,{4fe04d6d-4b66-4023-a0bc-b43ce68b3e15},0,-1,1
-727,nsIDOMProgressEvent,{6af7022c-d7f8-414c-a11f-a7918f14052b},0,-1,1
-728,nsIAccessibleImage,{09086623-0f09-4310-ac56-c2cda7c29648},0,-1,1
-729,nsILiveTitleNotificationSubject,{f9e577a8-19d9-4ca0-a140-b9e43f014470},0,-1,1
-730,nsITypeAheadFind,{0749a445-19d3-4eb9-9d66-78eca8c6f604},0,-1,1
-731,nsIAddonSearchResult,{a549a714-2ada-4bb9-8a47-be26e73d49a5},0,-1,1
-732,nsICacheVisitor,{f8c08c4b-d778-49d1-a59b-866fdc500d95},0,-1,1
-733,nsISSLStatusProvider,{8de811f0-1dd2-11b2-8bf1-e9aa324984b2},0,-1,1
-734,nsIProxyAutoConfig,{a42619df-0a1c-46fb-8154-0e9b8f8f1ea8},0,-1,1
-735,nsIDOMStorageManager,{9efc2081-218f-4622-837b-40bdb870a1c8},0,-1,1
-736,nsIAuthPrompt2,{447fc780-1d28-412a-91a1-466d48129c65},0,-1,1
-737,nsIProfileChangeStatus,{2f977d43-5485-11d4-87e2-0010a4e75ef2},0,-1,1
-738,nsIDOMSVGComponentTransferFunctionElement,{cb615c0f-8d4a-4e30-9695-a3dd6f4216ee},0,-1,1
-739,nsISupportsArray,{791eafa0-b9e6-11d1-8031-006008159b5a},0,-1,1
-740,nsIThreadPoolListener,{ef194cab-3f86-4b61-b132-e5e96a79e5d1},0,-1,1
-741,nsIPromptFactory,{2532b748-75db-4732-9173-78d3bf34f694},0,-1,1
-742,nsIMemoryReporterManager,{63fc8fbd-509b-4fdb-93b4-2e6caeeddab1},0,-1,1
-743,nsIWebBrowserPersist,{dd4e0a6a-210f-419a-ad85-40e8543b9465},0,-1,1
-744,nsIDOMCSSStyleSheet,{a6cf90c2-15b3-11d2-932e-00805f8add32},0,-1,1
-745,nsIDOMXULSelectControlElement,{919d9808-8937-4cec-9390-91225eb8864b},0,-1,1
-746,nsIXULTemplateBuilder,{a583b676-5b02-4f9c-a0c9-cb850cb99818},0,-1,1
-747,nsIXPointerSchemeContext,{781f4aa1-ebb3-4667-b1c2-2b35e94c4281},0,-1,0
-748,nsISemanticUnitScanner,{9f620be4-e535-11d6-b254-00039310a47a},0,-1,1
-749,nsIDOMNSUIEvent,{a6cf90c4-15b3-11d2-932e-00805f8add32},0,-1,1
-750,nsIDOMSVGTextPathElement,{5c29a76c-3489-48fe-b9ea-ea0f5b196dff},0,-1,1
-751,nsIClientAuthDialogs,{fa4c7520-1433-11d5-ba24-00108303b117},0,-1,1
-752,nsIDOMBeforeUnloadEvent,{da19e9dc-dea2-4a1d-a958-9be375c9799c},0,-1,1
-753,nsIDOMNSHTMLElement,{7f142f9a-fba7-4949-93d6-cf08a974ac51},0,-1,1
-754,nsIDOMHTMLBodyElement,{a6cf908e-15b3-11d2-932e-00805f8add32},0,-1,1
-755,nsIEnumerator,{ad385286-cbc4-11d2-8cca-0060b0fc14a3},0,-1,1
-756,nsIBufferedInputStream,{616f5b48-da09-11d3-8cda-0060b0fc14a3},0,-1,1
-757,nsIX509CertList,{a539759b-e22d-462f-94ea-2915b11b33e8},0,-1,1
-758,mozIStoragePendingStatement,{fc3c5fdc-9a87-4757-b01f-4ace2670a3a0},0,-1,1
-759,nsICMSDecoder,{65244a06-a342-11d5-ba47-00108303b117},0,-1,0
-760,nsPIPromptService,{d16e906d-bab3-49e0-8688-7f49a6f4293a},0,-1,0
-761,nsPIAccessibleDocument,{fa9cafac-9562-49ad-afcf-911ab1e4e4fb},0,-1,0
-762,nsISMimeVerificationListener,{56310af6-dffc-48b4-abca-85eae4059064},0,-1,0
-763,nsIInputStreamChannel,{274c4d7a-2447-4ceb-a6de-80db1b83f5d2},0,-1,1
-764,nsISecurityInfoProvider,{b8cc9126-9319-4415-afd9-b82220d453ed},0,-1,1
-765,nsIDOMKeyEvent,{028e0e6e-8b01-11d3-aae7-0010838a3123},0,-1,1
-766,nsIGeolocationProvider,{5c819505-8804-496e-9cb2-53089b3dd4ef},0,-1,1
-767,nsIDOMSVGForeignObjectElement,{fd9c9871-23fd-48eb-a65b-3842e9b0acbd},0,-1,1
-768,nsIDOMCSSUnknownRule,{a6cf90d0-15b3-11d2-932e-00805f8add32},0,-1,1
-769,nsICommandController,{ebe55080-c8a9-11d5-a73c-dd620d6e04bc},0,-1,1
-770,nsIIOService2,{d44fe6d4-ee35-4789-886a-eb8f0554d04e},0,-1,1
-771,nsIPluginManager,{da58ad80-4eb6-11d2-8164-006008119d7a},0,-1,1
-772,nsIDOMSVGPolylineElement,{7b6e15cf-9793-41ee-adcc-cc1c206c80e6},0,-1,1
-773,nsIStreamTransportService,{8268d474-efbf-494f-a152-e8a8616f4e52},0,-1,1
-774,nsIDOMSVGFilterElement,{9e81d4ae-190c-4b9d-a076-ebc52a7bf231},0,-1,1
-775,nsIDownloadHistory,{202533cd-a8f1-4ee4-8d20-3a6a0d2c6c51},0,-1,1
-776,nsIDOMHTMLButtonElement,{a6cf9095-15b3-11d2-932e-00805f8add32},0,-1,1
-777,nsIDOMDataContainerEvent,{3600d66c-b9ac-4c22-b39a-d64cce619921},0,-1,1
-778,mozIStorageService,{fe8e95cb-b377-4c8d-bccb-d9198c67542b},0,-1,1
-779,nsIModuleLoader,{9b328e24-4d85-4a9c-9cb7-f25e66f430c3},0,-1,1
-780,nsIDOMNSHTMLInputElement,{df3dc133-d77a-482f-8364-8e40df978a33},0,-1,1
-781,nsIDOMSVGFEDistantLightElement,{02141672-7f2c-412a-a7d7-4caa194842e9},0,-1,1
-782,nsITransfer,{23c51569-e9a1-4a92-adeb-3723db82ef7c},0,-1,1
-783,nsIOfflineCacheUpdateObserver,{a28abeaf-a0b4-4440-b2fe-bc78249710ea},0,-1,1
-784,nsIDOMHTMLTableColElement,{a6cf90b4-15b3-11d2-932e-00805f8add32},0,-1,1
-785,nsIScriptEventManager,{b6427ace-dc77-495b-ab21-43baeb52bc27},0,-1,0
-786,mozIStorageProgressHandler,{a3a6fcd4-bf89-4208-a837-bf2a73afd30c},0,-1,1
-787,nsIDOMSVGPathSegCurvetoQuadraticRel,{c46eb661-9c05-4d46-9b2a-c2ae5b166060},0,-1,1
-788,nsIXMLHttpRequestUpload,{09ff3682-7759-4441-a765-f70e1a1fabcf},0,-1,1
-789,nsIDOMSVGTSpanElement,{4a23cb1f-cf1e-437e-9524-8756f7928b2e},0,-1,1
-790,nsIControllerContext,{47b82b60-a36f-4167-8072-6f421151ed50},0,-1,1
-791,nsIUrlClassifierStreamUpdater,{daf3038a-556c-47d3-a3d2-36caa9a762a0},0,-1,1
-792,nsIDOMSVGClipPathElement,{0c3f45a4-e6d0-44e7-a2f8-d128ecf1db9b},0,-1,1
-793,nsICertTree,{a8cd1c89-a901-4735-831b-7198b7b8b6b1},0,-1,1
-794,nsIUTF8StringEnumerator,{9bdf1010-3695-4907-95ed-83d0410ec307},0,-1,1
-795,nsIExpatSink,{f61c56b5-ea5b-42b4-ad3c-17416e72e238},0,-1,1
-796,nsIDocShell,{dc4daea1-b43d-406f-bd62-c2ee879192ad},0,-1,1
-797,extIEvents,{3a8ec9d0-ab19-11db-abbd-0800200c9a66},0,-1,1
-798,nsIINIParser,{7eb955f6-3e78-4d39-b72f-c1bf12a94bce},0,-1,1
-799,nsIXBLAccessible,{3716eb86-166b-445b-a94a-9b522fee96e6},0,-1,1
-800,nsIDOMEventListener,{df31c120-ded6-11d1-bd85-00805f8ae3f4},0,-1,1
-801,nsPICertNotification,{42cd7162-ea4a-4088-9888-63ea5095869e},0,-1,0
-802,nsIPermission,{28f16d80-157b-11d5-a542-0010a401eb10},0,-1,1
-803,nsIEditorObserver,{a6cf9125-15b3-11d2-932e-00805f8add32},0,-1,1
-804,nsIPrefSecurityCheck,{c73c9a05-92ce-46e1-8f69-90a2a3a36104},0,-1,0
-805,nsICertVerificationListener,{6684bce9-50db-48e1-81b7-98102bf81357},0,-1,1
-806,nsIDOMMessageEvent,{98150805-6a15-4667-815a-1a8c87cb4bbc},0,-1,1
-807,nsIIOService,{bddeda3f-9020-4d12-8c70-984ee9f7935e},0,-1,1
-808,nsIDOMCanvasGradient,{bbb20a59-524e-4662-981e-5e142814b20c},0,-1,1
-809,nsIDOMEventGroup,{33347bee-6620-4841-8152-36091ae80c7e},0,-1,1
-810,nsISidebarExternal,{4350fb73-9305-41df-a669-11d26222d420},0,-1,1
-811,nsITooltipListener,{44b78386-1dd2-11b2-9ad2-e4eee2ca1916},0,-1,1
-812,nsIDOMNSHTMLTextAreaElement,{ca066b44-9ddf-11d3-bccc-0060b0fc76bd},0,-1,1
-813,nsIDOMSVGNumberList,{59364ec4-faf1-460f-bf58-e6a6a2769a3a},0,-1,1
-814,nsIAccessibleTable,{dcc1e5c3-966e-45b2-b30a-839d35432b24},0,-1,1
-815,nsIAccessibleStateChangeEvent,{444db51a-05fd-4576-8a64-32dbb2a83884},0,-1,1
-816,nsIDOMSVGPathSegCurvetoQuadraticSmoothAbs,{ff5bbb58-b49a-450f-b91b-e50585c34b3d},0,-1,1
-817,nsISAXLexicalHandler,{23c26a56-adff-440c-8caf-95c2dc2e399b},0,-1,1
-818,nsISMimeCert,{66710f97-a4dd-49f1-a906-fe0ebc5924c0},0,-1,1
-819,nsIAppShellService,{361facd0-6e9a-4ff1-a0d4-450744cf0023},0,-1,1
-820,nsIDOMSVGPathSegArcRel,{49d0360d-bb66-4ab9-b9b0-f49b93398595},0,-1,1
-821,nsILoginInfo,{c41b7dff-6b9b-42fe-b78d-113051facb05},0,-1,1
-822,nsIDOMHTMLMetaElement,{a6cf908a-15b3-11d2-932e-00805f8add32},0,-1,1
-823,nsINavHistoryResultViewer,{e60f4429-3787-45c8-a8c0-18ef52621bbf},0,-1,1
-824,nsISaveAsCharset,{33b87f70-7a9c-11d3-915c-006008a6edf6},0,-1,1
-825,nsICMSSecureMessage,{14b4394a-1dd2-11b2-b4fd-ba4a194fe97e},0,-1,1
-826,nsIStringBundleService,{d85a17c0-aa7c-11d2-9b8c-00805f8a16d9},0,-1,1
-827,nsIXULOverlayProvider,{1d5b5b94-dc47-4050-93b7-ac092e383cad},0,-1,1
-828,nsIAuthModule,{6e35dbc0-49ef-4e2c-b1ea-b72ec64450a2},0,-1,0
-829,nsPIPlacesDatabase,{8e6d4f8a-4b8e-4026-9fca-517c4494ddb7},0,-1,1
-830,nsINavHistoryResult,{d1562f6f-8d5a-4042-8524-72f747a51b18},0,-1,1
-831,nsIDOMDOMImplementation,{a6cf9074-15b3-11d2-932e-00805f8add32},0,-1,1
-832,nsIFastLoadFileIO,{715577db-d9c5-464a-a32e-0a40c29b22d4},0,-1,1
-833,nsICollation,{b0132cc0-3786-4557-9874-910d7def5f93},0,-1,1
-834,nsIDOMLSOutput,{757e9971-8890-478d-a53a-07f9f6f6e0d3},0,-1,1
-835,nsIGConfService,{5009acae-6973-48c3-b6d6-52c692cc5d9d},0,-1,1
-836,nsIDOMSVGAnimatedNumber,{716e3b11-b03b-49f7-b82d-5383922b0ab3},0,-1,1
-837,nsIProfileStartup,{048e5ca1-0eb7-4bb1-a9a2-a36f7d4e0e3c},0,-1,1
-838,nsIUUIDGenerator,{138ad1b2-c694-41cc-b201-333ce936d8b8},0,-1,1
-839,nsIControllerCommandGroup,{9f82c404-1c7b-11d5-a73c-eca43ca836fc},0,-1,1
-840,nsIXSLTProcessor,{4a91aeb3-4100-43ee-a21e-9866268757c5},0,-1,1
-841,nsIDialogParamBlock,{f76c0901-437a-11d3-b7a0-e35db351b4bc},0,-1,1
-842,nsISessionStore,{91f6d650-898d-11dd-ad8b-0800200c9a66},0,-1,1
-843,nsIRDFBlob,{237f85a2-1dd2-11b2-94af-8122582fc45e},0,-1,1
-844,nsIDOMHTMLHeadElement,{a6cf9087-15b3-11d2-932e-00805f8add32},0,-1,1
-845,nsIXPCComponents_Exception,{5bf039c0-e028-11d3-8f5d-0010a4e73d9a},0,-1,1
-846,nsIASN1PrintableItem,{114e1142-1dd2-11b2-ac26-b6db19d9184a},0,-1,1
-847,nsIDOMNSHTMLButtonElement,{c914d7a4-63b3-4d40-943f-91a3c7ab0d4d},0,-1,1
-848,nsIDOMHTMLMapElement,{a6cf90af-15b3-11d2-932e-00805f8add32},0,-1,1
-849,nsISupportsDouble,{b32523a0-4ac0-11d3-baea-00805f8a5dd7},0,-1,1
-850,nsINSSErrorsService,{3a5c7a0f-f5da-4a8b-a748-d7c5a528f33b},0,-1,1
-851,nsIProtocolProxyCallback,{a9967200-f95e-45c2-beb3-9b060d874bfd},0,-1,1
-852,nsIApplicationCache,{663e2e2e-04a0-47b6-87b3-a122be46cb53},0,-1,1
-853,nsIXULSortService,{f29270c8-3be5-4046-9b57-945a84dff132},0,-1,1
-854,mozIStorageConnection,{ac3c486c-69a1-4cbe-8f25-2ad20880eab3},0,-1,1
-855,nsIDOMNSHTMLOptionCollection,{1181207b-2337-41a7-8ddf-fbe96461256f},0,-1,1
-856,nsIXULTreeBuilder,{06b31b15-ebf5-4e74-a0e2-6bc0a18a3969},0,-1,1
-857,nsIModifyableXPointerResult,{2dc3be2e-642d-4d7e-b3c5-f3dac51afbee},0,-1,0
-858,nsIHistoryEntry,{a41661d4-1417-11d5-9882-00c04fa02f40},0,-1,1
-859,nsIDOMStorage2,{a67ba00f-ccb8-4ffe-bada-f8913caafb20},0,-1,1
-860,nsIDOMXULImageElement,{f73f4d77-a6fb-4ab5-b41e-15045a0cc6ff},0,-1,1
-861,nsICommandLineHandler,{d4b123df-51ee-48b1-a663-002180e60d3b},0,-1,1
-862,nsIFileURL,{d26b2e2e-1dd1-11b2-88f3-8545a7ba7949},0,-1,1
-863,nsIFindService,{5060b801-340e-11d5-be5b-b3e063ec6a3c},0,-1,1
-864,nsIContentDispatchChooser,{456ca3b2-02be-4f97-89a2-08c08d3ad88f},0,-1,1
-865,nsIHandlerInfo,{325e56a7-3762-4312-aec7-f1fcf84b4145},0,-1,1
-866,nsIDOMHTMLOptionsCollection,{bce0213c-f70f-488f-b93f-688acca55d63},0,-1,1
-867,nsIDOMHTMLTableRowElement,{a6cf90b6-15b3-11d2-932e-00805f8add32},0,-1,1
-868,nsIClipboardHelper,{44073a98-1dd2-11b2-8600-d0ae854dbe93},0,-1,1
-869,nsIWebProgressListener,{570f39d1-efd0-11d3-b093-00a024ffc08c},0,-1,1
-870,nsIReadConfig,{ba5bc4c6-1dd1-11b2-bb89-b844c6ec0339},0,-1,0
-871,nsIUrlClassifierHashCompleter,{ade9b72b-3562-44f5-aba6-e63246be53ae},0,-1,1
-872,nsIDragService,{82b58ada-f490-4c3d-b737-1057c4f1d052},0,-1,1
-873,nsISupportsPRInt16,{e30d94b0-4a1c-11d3-9890-006008962422},0,-1,1
-874,nsIDOMSVGException,{64e6f0e1-af99-4bb9-ab25-7e56012f0021},0,-1,1
-875,nsIDOMSVGFEMorphologyElement,{16154319-fb5f-4473-b360-5065b6096d33},0,-1,1
-876,nsILocale,{21035ee0-4556-11d3-91cd-00105aa3f7dc},0,-1,1
-877,nsIUpdateItem,{f559f340-5160-420f-abc8-19b251708e7e},0,-1,1
-878,nsICiter,{a6cf9102-15b3-11d2-932e-00805f8add32},0,-1,1
-879,nsIUrlClassifierUpdateObserver,{bbb33c65-e783-476c-8db0-6ddb91826c07},0,-1,1
-880,nsIXSLTException,{e06dfaea-92d5-47f7-a800-c5f5404d8771},0,-1,1
-881,nsIFormHistoryImporter,{9e811188-6a5b-4d96-a92d-1bac66a41898},0,-1,1
-882,nsISAXDTDHandler,{4d01f225-6cc5-11da-be43-001422106990},0,-1,1
-883,nsILivemarkService,{2c08ab79-7f9b-40f3-8d04-540b5857b211},0,-1,1
-884,nsIDOMSVGDocument,{12d3b664-1dd2-11b2-a7cf-ceee7e90f396},0,-1,1
-885,nsIDOMHTMLLIElement,{a6cf909e-15b3-11d2-932e-00805f8add32},0,-1,1
-886,nsIDOMParserJS,{ba6bcd6c-63d8-49b3-bc8a-1e5e895645bc},0,-1,1
-887,nsIDOMSVGStylable,{ea8a6cb1-9176-45db-989d-d0e89f563d7e},0,-1,1
-888,nsIDOMHTMLUListElement,{a6cf9099-15b3-11d2-932e-00805f8add32},0,-1,1
-889,nsIDOMXULContainerElement,{bc07c626-4294-43ae-9b0a-e726de0adcad},0,-1,1
-890,nsIClipboardOwner,{5a31c7a1-e122-11d2-9a57-000064657374},0,-1,1
-891,nsIDOMSimpleGestureEvent,{cb68e879-f710-415d-a871-9a550860df01},0,-1,1
-892,nsIScriptableInterfaces,{01c78c65-31da-456b-90bf-da39d09fdcbf},0,-1,1
-893,nsIURI,{07a22cc0-0ce5-11d3-9331-00104ba0fd40},0,-1,1
-894,nsIBrowserHistory_MOZILLA_1_9_1_ADDITIONS,{130f2940-6a63-4790-ae8d-89d5a2683090},0,-1,1
-895,nsIChannelClassifier,{1481c5b5-9f6e-4995-8fe3-2aad5c06440d},0,-1,1
-896,nsIDOMHTMLTableElement,{a6cf90b2-15b3-11d2-932e-00805f8add32},0,-1,1
-897,nsIDOMSVGEvent,{13aed1cc-a505-45d5-bbc2-0052c6bf200f},0,-1,1
-898,nsIContextMenuListener2,{7fb719b3-d804-4964-9596-77cf924ee314},0,-1,1
-899,nsISimpleStreamListener,{a9b84f6a-0824-4278-bae6-bfca0570a26e},0,-1,1
-900,nsIDOMWindowUtils,{a2d8d4f8-6082-4653-b91d-f958518b6ada},0,-1,1
-901,nsIDOMXULPopupElement,{c32390a8-2bd8-4d1b-bf9f-1b1d0a944d19},0,-1,1
-902,nsIHandlerApp,{8d298761-0963-4c90-99e2-6ea498825e82},0,-1,1
-903,nsIOSChromeItem,{ddd6790a-1dd1-11b2-a804-b522643903b9},0,-1,1
-904,nsIFileView,{60b320d2-1dd2-11b2-bd73-dc3575f78ddd},0,-1,1
-905,nsIConsoleService,{883472a0-ea9b-11da-8ad9-0800200c9a66},0,-1,1
-906,nsIDocShellTreeOwner,{bc0eb30e-656e-491e-a7ae-7f460b660c8d},0,-1,1
-907,nsIDOMHTMLOListElement,{a6cf909a-15b3-11d2-932e-00805f8add32},0,-1,1
-908,nsIContextMenuListener,{3478b6b0-3875-11d4-94ef-0020183bf181},0,-1,1
-909,nsIExceptionManager,{efc9d00b-231c-4feb-852c-ac017266a415},0,-1,1
-910,nsIDOMSVGViewSpec,{ede34b03-57b6-45bf-a259-3550b5697286},0,-1,1
-911,nsINativeTreeView,{38e0b44d-fa08-458c-83fb-3e10b12aeb45},0,-1,0
-912,nsIPluginTagInfo,{5f1ec1d0-019b-11d2-815b-006008119d7a},0,-1,0
-913,nsIInlineSpellChecker,{074cd6ff-9118-4164-8da7-3c2d4b3ed38b},0,-1,1
-914,nsIAppStartup2,{3012668f-44b6-49b1-89fb-761a912a78c1},0,-1,1
-915,nsIJSRuntimeService,{e7d09265-4c23-4028-b1b0-c99e02aa78f8},0,-1,0
-916,nsIHelperAppLauncherDialog,{f3704fdc-8ae6-4eba-a3c3-f02958ac0649},0,-1,1
-917,xpcIJSModuleLoader,{89da3673-e699-4f26-9ed7-11a528011434},0,-1,1
-918,nsIPluginTag,{13a1b39e-72e5-442d-aa73-5905ffaf837b},0,-1,1
-919,nsIScriptablePlugin,{f1a12bba-1dd1-11b2-a95f-cdc118605e92},0,-1,0
-920,nsIRDFInferDataSource,{2b04860f-4017-40f6-8a57-784a1e35077a},0,-1,1
-921,nsIDOMSVGCircleElement,{0f89f2a4-b168-4602-90f5-1874418c0a6a},0,-1,1
-922,nsIJSContextStackIterator,{c7e6b7aa-fc12-4ca7-b140-98c38b698961},0,-1,0
-923,nsISHEntry,{c16fde76-3108-450e-8c8c-ae8286f286ed},0,-1,1
-924,nsIProperty,{6dcf9030-a49f-11d5-910d-0010a4e73d9a},0,-1,1
-925,nsIDOMStyleSheetList,{a6cf9081-15b3-11d2-932e-00805f8add32},0,-1,1
-926,nsIDNSRecord,{31c9c52e-1100-457d-abac-d2729e43f506},0,-1,1
-927,nsIDOMSVGPathSegCurvetoCubicSmoothRel,{dd5b4b00-edaa-493a-b477-bbc2576b4a98},0,-1,1
-928,nsIDOMCSSCharsetRule,{19fe78cc-65ff-4b1d-a5d7-9ea89692cec6},0,-1,1
-929,nsICookieStorage,{c8c05100-cfdb-11d2-bab8-b088e084e5bc},0,-1,0
-930,nsIProtocolProxyFilter,{f424abd3-32b4-456c-9f45-b7e3376cb0d1},0,-1,1
-931,nsIProtocolProxyService,{e38ab577-786e-4a7f-936b-7ae4c7d877b2},0,-1,1
-932,nsIPrefetchService,{cba513eb-c457-4b93-832c-1a979e66edd1},0,-1,1
-933,nsIDOMNameList,{faaf1b80-1ddd-11d9-8c46-000a95dc234c},0,-1,1
-934,nsIDOMNSDocumentStyle,{26311d10-7e24-4c7b-bb3d-17aad86f4d88},0,-1,1
-935,nsINetworkLinkService,{61618a52-ea91-4277-a4ab-ebe10d7b9a64},0,-1,1
-936,nsIEventHandler,{a447ddf0-1a99-11d2-815f-006008119d7a},0,-1,0
-937,nsIDOMHTMLLabelElement,{a6cf9096-15b3-11d2-932e-00805f8add32},0,-1,1
-938,nsIResumableChannel,{4ad136fa-83af-4a22-a76e-503642c0f4a8},0,-1,1
-939,nsIScriptLoaderObserver,{7b787204-76fb-4764-96f1-fb7a666db4f4},0,-1,1
-940,nsIHttpChannelInternal,{3ce040fb-3933-462a-8d62-80b78fbd0809},0,-1,1
-941,nsICollationFactory,{04971e14-d6b3-4ada-8cbb-c3a13842b349},0,-1,1
-942,nsIScriptableRegion,{82d8f400-5bde-11d3-b033-b27a62766bbc},0,-1,1
-943,nsITXTToHTMLConv,{933355f6-1dd2-11b2-a9b0-d335b9e35983},0,-1,1
-944,nsIPlugin,{df773070-0199-11d2-815b-006008119d7a},0,-1,0
-945,mozIStorageError,{1f350f96-7023-434a-8864-40a1c493aac1},0,-1,1
-946,nsIRequestObserverProxy,{7df8845f-938a-4437-9ea4-b11b850048f1},0,-1,1
-947,nsIWorkerNavigator,{74fb665a-e477-4ce2-b3c6-c58b1b28b6c3},0,-1,1
-948,nsISAXXMLReader,{5556997e-d816-4218-8b54-803d4261206e},0,-1,1
-949,nsIDOMLSResourceResolver,{9e61c7c8-8698-4477-9971-0923513919bd},0,-1,1
-950,nsIDOMCharacterData,{a6cf9072-15b3-11d2-932e-00805f8add32},0,-1,1
-951,nsIDownloadManager,{bacca1ac-1b01-4a6f-9e91-c2ead1f7d2c0},0,-1,1
-952,nsIDOM3Document,{2e0e9ea1-72ab-4d9e-bdeb-ca64e1abeba4},0,-1,1
-953,nsIDOMSVGPathSegCurvetoQuadraticSmoothRel,{ac0b2007-04e4-4e70-a0e0-294f374b29c4},0,-1,1
-954,nsIDOMPageTransitionEvent,{b712418b-376f-4f75-b156-5d9ad99fe51f},0,-1,1
-955,nsIArray,{114744d9-c369-456e-b55a-52fe52880d2d},0,-1,1
-956,nsIDOMDocumentView,{1acdb2ba-1dd2-11b2-95bc-9542495d2569},0,-1,1
-957,nsIOfflineCacheUpdate,{877261bb-b952-4d27-847e-859bdd47c0ec},0,-1,1
-958,nsIJRILiveConnectPluginInstancePeer,{25b63f40-f773-11d1-815b-006008119d7a},0,-1,0
-959,nsIAccessibleRetrieval,{244e4c67-a1d3-44f2-9cab-cdaa31b68046},0,-1,1
-960,nsIDOMMimeTypeArray,{f6134683-f28b-11d2-8360-c90899049c3c},0,-1,1
-961,nsISidebar,{67cf6231-c303-4f7e-b9b1-a0e87772ecfd},0,-1,1
-962,nsPIPluginHost,{673811fb-83d6-4b8f-b1a9-bb3a9033f256},0,-1,0
-963,nsIDOMCSS2Properties,{529b987a-cb21-4d58-99d7-9586e7662801},0,-1,1
-964,nsIHashable,{17e595fa-b57a-4933-bd0f-b1812e8ab188},0,-1,1
-965,nsIDOMHTMLDListElement,{a6cf909b-15b3-11d2-932e-00805f8add32},0,-1,1
-966,fuelIBookmark,{808585b6-7568-4b26-8c62-545221bf2b8c},0,-1,1
-967,nsIDOMSVGMarkerElement,{6a3b7b40-e65a-4e9c-9ee7-ca03ed0a18c7},0,-1,1
-968,nsIDOMDOMConstructor,{0ccbcf19-d1b4-489e-984c-cd8c43672bb9},0,-1,1
-969,nsIDOMUIEvent,{a6cf90c3-15b3-11d2-932e-00805f8add32},0,-1,1
-970,nsIRDFResource,{fb9686a7-719a-49dc-9107-10dea5739341},0,-1,1
-971,nsIDOMFileException,{b52356e1-45c5-4d61-b61a-fb9bd91690e1},0,-1,1
-972,nsIXULTemplateResult,{ebea0230-36fa-41b7-8e31-760806057965},0,-1,1
-973,nsIDOMSVGLength,{2596325c-aed0-487e-96a1-0a6d589b9c6b},0,-1,1
-974,nsIDOMSVGPreserveAspectRatio,{7ae42f27-4799-4e7c-86c6-e1dae6ad5157},0,-1,1
-975,nsIEditorDocShell,{3bdb8f01-f141-11d4-a73c-fba4aba8a3fc},0,-1,1
-976,nsIDocumentCharsetInfo,{2d40b291-01e1-11d4-9d0e-0050040007b2},0,-1,1
-977,nsIConsoleListener,{eaaf61d6-1dd1-11b2-bc6e-8fc96480f20d},0,-1,1
-978,nsIProgrammingLanguage,{ea604e90-40ba-11d5-90bb-0010a4e73d9a},0,-1,1
-979,nsIDOMNSHTMLImageElement,{a6cf90c7-15b3-11d2-932e-00805f8add32},0,-1,1
-980,nsIUnicharStreamLoader,{9037f476-7c08-4729-b690-3e425269802b},0,-1,1
-981,nsIFrameLoaderOwner,{641c2d90-4ada-4367-bdb1-80831614161d},0,-1,1
-982,nsIDOMHTMLAreaElement,{a6cf90b0-15b3-11d2-932e-00805f8add32},0,-1,1
-983,nsIKeyObject,{4b31f4ed-9424-4710-b946-79b7e33cf3a8},0,-1,1
-984,nsIMIMEService,{5b3675a1-02db-4f8f-a560-b34736635f47},0,-1,1
-985,nsIDOMSVGMatrix,{ec2da3ef-5a99-49ed-aaef-b5af916c14ac},0,-1,1
-986,nsIDOMWindow2,{73c5fa35-3add-4c87-a303-a850ccf4d65a},0,-1,1
-987,nsPISocketTransportService,{83123036-81c0-47cb-8d9c-bd85d29a1b3f},0,-1,1
-988,nsIDOMGeoPositionOptions,{453b72de-ea90-4f09-ae16-c2e7ee0dddc4},0,-1,1
-989,nsIURLFormatter,{4ab31d30-372d-11db-a98b-0800200c9a66},0,-1,1
-990,nsICacheEntryInfo,{fab51c92-95c3-4468-b317-7de4d7588254},0,-1,1
-991,imgIContainer,{186e80e1-476c-47f0-b340-424e6b7b6c9c},0,-1,1
-992,nsITransportEventSink,{eda4f520-67f7-484b-a691-8c3226a5b0a6},0,-1,1
-993,nsPIWindowWatcher,{8624594a-28d7-4bc3-8d12-b1c2b9eefd90},0,-1,0
-994,nsIFeedResult,{7a180b78-0f46-4569-8c22-f3d720ea1c57},0,-1,1
-995,nsIDOMSVGSVGElement,{83b04425-9509-49f5-af75-1ae1f8f3e871},0,-1,1
-996,nsIFormSubmitObserver,{0787d64a-44bf-4273-8438-61ff13ebec0c},0,-1,1
-997,nsIDOMUserDataHandler,{91afebdd-a201-4db0-b728-9d59580f0cfd},0,-1,1
-998,nsIDOMXULTreeElement,{1f8111b2-d44d-4d11-845a-a70ae06b7d04},0,-1,1
-999,nsIDOMSVGTextContentElement,{87ad94bc-07c9-412b-b2d8-de245a2e84a5},0,-1,1
-1000,nsIDOM3Node,{29fb2a18-1dd2-11b2-8dd9-a6fd5d5ad12f},0,-1,1
-1001,nsIDirectoryServiceProvider2,{2f977d4b-5485-11d4-87e2-0010a4e75ef2},0,-1,1
-1002,nsIWebPageDescriptor,{6f30b676-3710-4c2c-80b1-0395fb26516e},0,-1,1
-1003,nsINetUtil,{57322c6f-f4ec-4e46-8253-b74be220de16},0,-1,1
-1004,nsIDOMHTMLParamElement,{a6cf90ad-15b3-11d2-932e-00805f8add32},0,-1,1
-1005,nsIServerSocket,{a5b64be0-d563-46bb-ae95-132e46fcd42f},0,-1,1
-1006,nsIDOMSVGFESpotLightElement,{5515dd05-3d9d-4d6c-8460-a04aaf5afe15},0,-1,1
-1007,jsdIObject,{d500e8b8-1dd1-11b2-89a1-cdf55d91cbbd},0,-1,1
-1008,jsdIScript,{a38f65ca-1dd1-11b2-95d5-ff2947e9c920},0,-1,1
-1009,nsIDOMNSEditableElement,{b33eb56c-3120-418c-892b-774b00c7dde8},0,-1,1
-1010,nsIClassInfo,{986c11d0-f340-11d4-9075-0010a4e73d9a},0,-1,1
-1011,nsIRDFService,{bfd05261-834c-11d2-8eac-00805f29f370},0,-1,1
-1012,nsISOCKSSocketInfo,{8f755c44-1dd2-11b2-a613-91117453fa95},0,-1,1
-1013,nsISupportsPriority,{aa578b44-abd5-4c19-8b14-36d4de6fdc36},0,-1,1
-1014,nsIKeyObjectFactory,{264eb54d-e20d-49a0-890c-1a5986ea81c4},0,-1,1
-1015,nsIWifiListener,{bcd4bede-f4a5-4a62-9071-d7a60174e376},0,-1,1
-1016,nsIInputStream,{fa9c7f6c-61b3-11d4-9877-00c04fa0cf4a},0,-1,1
-1017,nsISecurityCheckedComponent,{0dad9e8c-a12d-4dcb-9a6f-7d09839356e1},0,-1,1
-1018,nsIDOMSVGAnimatedPoints,{ebf334b3-86ef-4bf3-8a92-d775c72defa4},0,-1,1
-1019,nsIDOMHTMLFormElement,{a6cf908f-15b3-11d2-932e-00805f8add32},0,-1,1
-1020,nsIAnnotationObserver,{63fe98e0-6889-4c2c-ac9f-703e4bc25027},0,-1,1
-1021,nsIScriptableInterfacesByID,{c99cffac-5aed-4267-ad2f-f4a4c9d4a081},0,-1,1
-1022,nsIConverterOutputStream,{4b71113a-cb0d-479f-8ed5-01daeba2e8d4},0,-1,1
-1023,nsIDOMViewCSS,{0b9341f3-95d4-4fa4-adcd-e119e0db2889},0,-1,1
-1024,nsIEnvironment,{101d5941-d820-4e85-a266-9a3469940807},0,-1,1
-1025,nsIUpdatePatch,{56863a67-bd69-42de-9f40-583e625b457d},0,-1,1
-1026,nsITreeColumns,{f8a8d6b4-6788-438d-9009-7142798767ab},0,-1,1
-1027,nsIDOMHTMLHtmlElement,{a6cf9086-15b3-11d2-932e-00805f8add32},0,-1,1
-1028,nsIHttpProtocolHandler,{122c91c0-2485-40ba-89c9-b895934921bc},0,-1,1
-1029,nsIDOMSVGUnitTypes,{154b572f-3d0b-49c0-8b5d-8864d05bd3d1},0,-1,1
-1030,nsIRDFXMLSerializer,{8ae1fbf8-1dd2-11b2-bd21-d728069cca92},0,-1,1
-1031,nsICookie,{e9fcb9a4-d376-458f-b720-e65e7df593bc},0,-1,1
-1032,nsICMSEncoder,{a15789aa-8903-462b-81e9-4aa2cff4d5cb},0,-1,0
-1033,nsISelectElement,{35bd8ed5-5f34-4126-8c4f-38ba01681836},0,-1,1
-1034,nsIAddonRepository,{c4d2ac29-6edc-43cd-8dc8-e4cf213aa1be},0,-1,1
-1035,extIEventListener,{2dfe3a50-ab2f-11db-abbd-0800200c9a66},0,-1,1
-1036,nsIRDFContainer,{d4214e90-fb94-11d2-bdd8-00104bde6048},0,-1,1
-1037,nsIXPIInstallInfo,{5a4a775c-e452-4cf2-8ff8-d327ae24aec6},0,-1,1
-1038,nsINavBookmarksService,{3b6ff5c5-0ab4-4aab-b1be-d569763a6ce0},0,-1,1
-1039,nsIThreadManager,{056216f5-8803-46b4-9199-d95bc1f0446f},0,-1,1
-1040,nsIDOMLinkStyle,{24d89a65-f598-481e-a297-23cc02599bbd},0,-1,1
-1041,nsIDOMSVGPoint,{45f18f8f-1315-4447-a7d5-8aeca77bdcaf},0,-1,1
-1042,nsIXMLHttpRequest,{ad78bf21-2227-447e-8ed5-824a017c265f},0,-1,1
-1043,nsISupportsCString,{d65ff270-4a1c-11d3-9890-006008962422},0,-1,1
-1044,nsIDebug,{3bf0c3d7-3bd9-4cf2-a971-33572c503e1e},0,-1,1
-1045,IDispatch,{00020400-0000-0000-c000-000000000046},0,-1,1
-1046,nsIXPInstallManager,{83fdd52f-2d34-4e22-981d-cf3c4ae76faa},0,-1,1
-1047,nsIFeedResultListener,{4d2ebe88-36eb-4e20-bcd1-997b3c1f24ce},0,-1,1
-1048,nsIDOMTreeWalker,{400af3ca-1dd2-11b2-a50a-887ecca2e63a},0,-1,1
-1049,inICSSValueSearch,{e0d39e48-1dd1-11b2-81bd-9a0c117f0736},0,-1,1
-1050,nsIClipboardDragDropHookList,{876a2015-6b66-11d7-8f18-0003938a9d96},0,-1,1
-1051,nsIDOMSVGAnimatedString,{36f18f12-61a9-4529-8fa9-30050bd6ac00},0,-1,1
-1052,nsITreeView,{637276b5-58c0-4eff-89ea-c7f3c5bf0b54},0,-1,1
-1053,nsIDOMDocumentXBL,{1a38762b-4da5-4f61-80fb-9317e198cb92},0,-1,1
-1054,nsIObserverService,{d07f5192-e3d1-11d2-8acd-00105a1b8860},0,-1,1
-1055,nsIApplicationCacheService,{611161c8-37d0-450f-a4fe-457c47bbaf64},0,-1,1
-1056,nsIDBusHandlerApp,{1ffc274b-4cbf-4bb5-a635-05ad2cbb6534},0,-1,1
-1057,nsIDOMHTMLFrameSetElement,{a6cf90b8-15b3-11d2-932e-00805f8add32},0,-1,1
-1058,nsICertOverrideService,{31738d2a-77d3-4359-84c9-4be2f38fb8c5},0,-1,1
-1059,nsIPipe,{f4211abc-61b3-11d4-9877-00c04fa0cf4a},0,-1,1
-1060,nsINavHistoryBatchCallback,{5143f2bb-be0a-4faf-9acb-b0ed3f82952c},0,-1,1
-1061,nsIFactory,{00000001-0000-0000-c000-000000000046},0,-1,1
-1062,nsILoadContext,{314d8a54-1caf-4721-94d7-f6c82d9b82ed},0,-1,1
-1063,nsIProtectedAuthThread,{4bb27cb7-8984-4cee-8ce7-9b014c3d091b},0,-1,1
-1064,nsIFIXptrEvaluator,{50d28211-8fb8-4323-b93d-08a6e80e559e},0,-1,0
-1065,nsISupportsPRTime,{e2563630-4a1c-11d3-9890-006008962422},0,-1,1
-1066,nsIDOM3Text,{bcca052e-46f4-4b8e-8859-a86776c2f1d7},0,-1,1
-1067,nsIDOMSVGStopElement,{93169940-7663-4eab-af23-94a8a08c2654},0,-1,1
-1068,nsIJRILiveConnectPlugin,{c94058e0-f772-11d1-815b-006008119d7a},0,-1,0
-1069,inISearchProcess,{d5fa765b-2448-4686-b7c1-5ff13acb0fc9},0,-1,1
-1070,nsIDOMSVGRect,{5b912111-c10e-498f-a44c-c713c1843007},0,-1,1
-1071,nsISecurityPref,{94afd973-8045-4c6c-89e6-75bdced4209e},0,-1,0
-1072,nsIFeedTextConstruct,{fc97a2a9-d649-4494-931e-db81a156c873},0,-1,1
-1073,nsIIncrementalDownload,{6687823f-56c4-461d-93a1-7f6cb7dfbfba},0,-1,1
-1074,nsIDocShellHistory,{89caa9f0-8b1c-47fb-b0d3-f0aef0bff749},0,-1,1
-1075,nsICacheSession,{ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e},0,-1,1
-1076,txIFunctionEvaluationContext,{0ecbb00c-6a78-11d9-9791-000a95dc234c},0,-1,1
-1077,nsIDOMHTMLEmbedElement,{123f90ab-15b3-11d2-456e-00805f8add32},0,-1,1
-1078,nsIDOMHTMLAnchorElement,{a6cf90aa-15b3-11d2-932e-00805f8add32},0,-1,1
-1079,nsIApplicationCacheNamespace,{96e4c264-2065-4ce9-93bb-43734c62c4eb},0,-1,1
-1080,nsIProfileMigrator,{24ce8b9d-b7ff-4279-aef4-26e158f03e34},0,-1,1
-1081,nsIRDFPropagatableDataSource,{5a9b4770-9fcb-4307-a12e-4b6708e78b97},0,-1,1
-1082,mozISpellI18NUtil,{b075d5dc-1df1-441a-bebf-680d8caaa19c},0,-1,1
-1083,nsIGlobalHistory3,{24306852-c60e-49c3-a455-90f6747118ba},0,-1,1
-1084,nsIScriptEventHandler,{375f787f-8d3a-4344-b540-293d5645c22c},0,-1,0
-1085,nsIDOMChromeWindow,{77a20f5a-68ad-41d3-97ac-6ff721512908},0,-1,1
-1086,nsISupports,{00000000-0000-0000-c000-000000000046},0,-1,1
-1087,nsIFileProtocolHandler,{255602ea-c31f-4d29-8f35-905ead3f76f4},0,-1,1
-1088,nsILoginManagerIEMigrationHelper,{8a59ea3d-b8d0-48af-a3e2-63e27a02cde7},0,-1,1
-1089,nsIMicrosummarySet,{7111e88d-fecd-4b17-b7a9-1fa74e23153f},0,-1,1
-1090,nsIFeedEntry,{31bfd5b4-8ff5-4bfd-a8cb-b3dfbd4f0a5b},0,-1,1
-1091,nsIDOMSVGAnimatedAngle,{c6ab8b9e-32db-464a-ae33-8691d44bc60a},0,-1,1
-1092,nsIDOMGeoPositionError,{1b493214-4e58-4a40-aa4c-1ab70c6ddbec},0,-1,1
-1093,nsIXPCComponents_Constructor,{88655640-e028-11d3-8f5d-0010a4e73d9a},0,-1,1
-1094,nsIXPCException,{b2a34010-3983-11d3-9888-006008962422},0,-1,1
-1095,nsIRDFXMLSinkObserver,{eb1a5d30-ab33-11d2-8ec6-00805f29f370},0,-1,1
-1096,nsIDOMLSSerializer,{96ea4792-d362-4c28-a8c2-0337790d648a},0,-1,1
-1097,nsIUpdateChecker,{877ace25-8bc5-452a-8586-9c1cf2871994},0,-1,1
-1098,nsIOutputIterator,{7330650e-1dd2-11b2-a0c2-9ff86ee97bed},0,-1,1
-1099,nsIDOM3Attr,{a2216ddc-1bcd-4ec2-a292-371e09a6c377},0,-1,1
-1100,nsIDOMHTMLQuoteElement,{a6cf90a3-15b3-11d2-932e-00805f8add32},0,-1,1
-1101,nsIPlacesTransactionsService,{32eee5da-2bc7-4d18-8a54-a8ff0dec4d2a},0,-1,1
-1102,nsIX509Cert2,{5b62c61c-f898-4dab-8ace-51109bb459b4},0,-1,1
-1103,nsIFeedResultService,{950a829e-c20e-4dc3-b447-f8b753ae54da},0,-1,1
-1104,nsIMarkupDocumentViewer,{40b2282a-a882-4483-a634-dec468d88377},0,-1,1
-1105,txINodeSet,{15d424c0-6b47-11d9-9791-000a95dc234c},0,-1,1
-1106,nsIDOMSVGFEMergeNodeElement,{540c3447-4b07-4bd3-84df-30f66b68df14},0,-1,1
-1107,nsIEntropyCollector,{6f883680-ab9d-11d4-9978-00b0d02354a0},0,-1,0
-1108,nsIDOMSVGPathSegMovetoAbs,{30cf7749-bf1f-4f9c-9558-8ee24da3a22c},0,-1,1
-1109,nsIScriptableInputStream,{a2a32f90-9b90-11d3-a189-0050041caf44},0,-1,1
-1110,nsIDOMLSInput,{165e7f61-5048-4c2c-b4bf-6b44bb617ee4},0,-1,1
-1111,nsIWritablePropertyBag,{96fc4671-eeb4-4823-9421-e50fb70ad353},0,-1,1
-1112,nsIAutoCompleteResult,{d2fcba9a-3f5c-40fc-a9fc-4adc87dc61ef},0,-1,1
-1113,nsIScriptableUnicodeConverter,{1ea19c6c-c59f-4fd7-9fc7-151e946baca0},0,-1,1
-1114,nsIEditorIMESupport,{57032dcb-e8c7-4eb6-8ec6-a0f8e300809d},0,-1,1
-1115,nsISelection2,{5d21d5fe-3691-4716-a334-4691eea54d29},0,-1,1
-1116,nsIDOMHTMLHeadingElement,{a6cf90a2-15b3-11d2-932e-00805f8add32},0,-1,1
-1117,nsIWebNavigationInfo,{62a93afb-93a1-465c-84c8-0432264229de},0,-1,1
-1118,nsIAccessibleDocument,{b7ae45bd-21e9-4ed5-a67e-86448b25d56b},0,-1,1
-1119,nsIDOMCanvasRenderingContext2D,{66e6d87c-759c-43a7-b3d3-3348180b35df},0,-1,1
-1120,nsIStreamListener,{1a637020-1482-11d3-9333-00104ba0fd40},0,-1,1
-1121,nsIOutputStreamCallback,{40dbcdff-9053-42c5-a57c-3ec910d0f148},0,-1,1
-1122,jsdIScriptEnumerator,{4c2f706e-1dd2-11b2-9ebc-85a06e948830},0,-1,1
-1123,nsPIPluginInstancePeer,{4a708562-8a37-400b-8c08-20037d1adad3},0,-1,0
-1124,nsIBoxObject,{ce572460-b0f2-4650-a9e7-c53a99d3b6ad},0,-1,1
-1125,nsIXULChromeRegistry,{2860e205-490e-4b06-90b6-87160d35a5a7},0,-1,1
-1126,nsIScreenManager,{e224bd44-252b-4b66-b869-99738250904a},0,-1,1
-1127,nsIUpdateTimerManager,{0765c92c-6145-4253-9db4-594d8023087e},0,-1,1
-1128,nsIJSCID,{26b2a374-6eaf-46d4-acaf-1c6be152d36b},0,-1,1
-1129,nsIDOMNSElement,{f0aef489-18c5-4de6-99d5-58b3758b098c},0,-1,1
-1130,nsIHttpChannel,{9277fe09-f0cc-4cd9-bbce-581dd94b0260},0,-1,1
-1131,txIEXSLTRegExFunctions,{c180e993-aced-4839-95a0-ecd5ff138be9},0,-1,1
-1132,nsIPrinterEnumerator,{5e738fff-404c-4c94-9189-e8f2cce93e94},0,-1,1
-1133,mozISpellI18NManager,{aeb8936f-219c-4d3c-8385-d9382daa551a},0,-1,1
-1134,nsIPluginInstance,{ebe00f40-0199-11d2-815b-006008119d7a},0,-1,0
-1135,nsIDownload,{c891111e-92a6-47b8-bc46-874ebb61ac9d},0,-1,1
-1136,nsIObjectLoadingContent,{90ab443e-3e99-405e-88c9-9c42adaa3217},0,-1,1
-1137,nsIBrowserDOMWindow,{f9691a49-7fb3-4b54-bb11-a4f2e0b6eddb},0,-1,1
-1138,nsIAuthPromptProvider,{bd9dc0fa-68ce-47d0-8859-6418c2ae8576},0,-1,1
-1139,nsISelection,{b2c7ed59-8634-4352-9e37-5484c8b6e4e1},0,-1,1
-1140,nsIAccessibleRole,{8c0f68f8-164a-4078-a9ee-36a7d180f0e4},0,-1,1
-1141,nsIRDFInt,{e13a24e3-c77a-11d2-80be-006097b76b8e},0,-1,1
-1142,nsIXPointerSchemeProcessor,{093d3559-b56b-44d0-8764-c25815715080},0,-1,0
-1143,nsIDOMSVGLengthList,{a8760fcd-3de5-446a-a009-5cf877e7a4df},0,-1,1
-1144,nsIRDFDelegateFactory,{a1b89470-a124-11d3-be59-0020a6361667},0,-1,1
-1145,nsIWebContentConverterService,{de7cc06e-e778-45cb-b7db-7a114e1e75b1},0,-1,1
-1146,nsIUrlClassifierHashCompleterCallback,{bbd6c954-7cb4-4447-bc55-8cefd1ceed89},0,-1,1
-1147,nsIX509CertDB2,{e0df4784-6560-45bf-b1b7-86076a0e8381},0,-1,1
-1148,nsIDOMTextMetrics,{2d01715c-ec7d-424a-ab85-e0fd70c8665c},0,-1,1
-1149,nsILoadGroup,{3de0a31c-feaf-400f-9f1e-4ef71f8b20cc},0,-1,1
-1150,nsIExtensionManager,{7fbb049a-00e6-4ce2-82fc-854c52788df9},0,-1,1
-1151,nsICharsetResolver,{d143a084-b626-4614-845f-41f3ca43a674},0,-1,1
-1152,nsIEditActionListener,{b22907b1-ee93-11d2-8d50-000064657374},0,-1,1
-1153,nsICookieManager2,{5047cab4-9cb2-4927-a4ab-77422bc3bc67},0,-1,1
-1154,nsIUserCertPicker,{06d018e0-d41b-4629-a4fc-daaa6029888e},0,-1,1
-1155,nsICommandHandlerInit,{731c6c50-67d6-11d4-9529-0020183bf181},0,-1,1
-1156,nsIDOMSVGAElement,{35d3365a-3e6f-4cdf-983d-fdaed1564478},0,-1,1
-1157,nsIDOMSVGTransform,{29cc2e14-6d18-4710-bda9-a88d9d3bc8dc},0,-1,1
-1158,nsICommandLineRunner,{c1f4cfbf-a41f-4628-aa6c-9fb914478af8},0,-1,0
-1159,nsIPromptService2,{cf86d196-dbee-4482-9dfa-3477aa128319},0,-1,1
-1160,nsIDOMDocument,{a6cf9075-15b3-11d2-932e-00805f8add32},0,-1,1
-1161,nsIPluginStreamListener,{df055770-5448-11d2-8164-006008119d7a},0,-1,0
-1162,mozIStorageAggregateFunction,{763217b7-3123-11da-918d-000347412e16},0,-1,1
-1163,nsPIExternalAppLauncher,{d0b5d7d3-9565-403d-9fb5-e5089c4567c6},0,-1,1
-1164,nsIDOMProcessingInstruction,{a6cf907f-15b3-11d2-932e-00805f8add32},0,-1,1
-1165,nsITreeBoxObject,{64ba5199-c4f4-4498-bbdc-f8e4c369086c},0,-1,1
-1166,nsIDOMNSRange,{59188642-23b4-41d6-bde1-302c3906d1f0},0,-1,1
-1167,nsIDOMSVGAngle,{58b6190e-37b3-412a-ba02-1d5ad6c6ea7c},0,-1,1
-1168,nsIDOMXPathEvaluator,{75506f8a-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
-1169,nsIXPointerEvaluator,{addd0fe5-8555-45b7-b763-97d5898ce268},0,-1,0
-1170,nsISecretDecoderRing,{0ec80360-075c-11d4-9fd4-00c04f1b83d8},0,-1,1
-1171,nsIAutoCompleteMdbResult2,{148c9dc5-0fbb-408b-80fe-544f6a85b433},0,-1,0
-1172,nsIPrintOptions,{92597c2b-109b-40bb-8f93-9b9acfa31de8},0,-1,1
-1173,nsIHttpActivityObserver,{412880c8-6c36-48d8-bf8f-84f91f892503},0,-1,1
-1174,nsITraceableChannel,{68167b0b-ef34-4d79-a09a-8045f7c5140e},0,-1,1
-1175,nsIBrowserBoxObject,{db436f2f-c656-4754-b0fa-99bc353bd63f},0,-1,1
-1176,nsIAddonInstallListener,{2333b04c-f371-4dea-a2f1-d8fdb0c82866},0,-1,1
-1177,nsIDOMGeoPositionCoords,{b31702d0-6dac-4fa0-b93b-f043e71c8f9a},0,-1,1
-1178,nsIDOMElementCSSInlineStyle,{99715845-95fc-4a56-aa53-214b65c26e22},0,-1,1
-1179,nsIDOMSVGNumber,{98575762-a936-4ecf-a226-b74c3a2981b4},0,-1,1
-1180,nsICommandLine,{bc3173bd-aa46-46a0-9d25-d9867a9659b6},0,-1,1
-1181,nsIDOMModalContentWindow,{51aebd45-b979-4ec6-9d11-3a3fd3d5d59e},0,-1,1
-1182,nsIRDFXMLParser,{1831dd2e-1dd2-11b2-bdb3-86b7b50b70b5},0,-1,1
-1183,nsICryptoHash,{1e5b7c43-4688-45ce-92e1-77ed931e3bbe},0,-1,1
-1184,nsIAnnotationService,{ba249b58-346f-42a9-a393-203ae34ec6c4},0,-1,1
-1185,nsIDOMHTMLStyleElement,{a6cf908d-15b3-11d2-932e-00805f8add32},0,-1,1
-1186,nsIDOMNSHTMLFormElement,{a6cf90c6-15b3-11d2-932e-00805f8add32},0,-1,1
-1187,nsIAuthPromptWrapper,{6228d644-17fe-11d4-8cee-0060b0fc14a3},0,-1,1
-1188,nsICollection,{83b6019c-cbc4-11d2-8cca-0060b0fc14a3},0,-1,1
-1189,nsIStringBundleOverride,{965eb278-5678-456b-82a7-20a0c86a803c},0,-1,1
-1190,nsIAuthPromptCallback,{bdc387d7-2d29-4cac-92f1-dd75d786631d},0,-1,1
-1191,nsIJSXMLHttpRequest,{423fdd3d-41c9-4149-8fe5-b14a1d3912a0},0,-1,1
-1192,nsIDOMSVGFEFuncGElement,{28555e78-c6c2-4a98-af53-bfc2c6944295},0,-1,1
-1193,nsIProgressEventSink,{d974c99e-4148-4df9-8d98-de834a2f6462},0,-1,1
-1194,nsIDOMSVGFETurbulenceElement,{77bc4d70-0d49-4c81-b7a7-7432f0fe3e04},0,-1,1
-1195,nsIDOMXULControlElement,{007b8358-1dd2-11b2-8924-d209efc3f124},0,-1,1
-1196,nsICacheDeviceInfo,{31d1c294-1dd2-11b2-be3a-c79230dca297},0,-1,1
-1197,imgITools,{c395d8f1-c616-4a1b-adfd-747b4b1b2cbe},0,-1,1
-1198,nsIContentViewerFile,{6317f32c-9bc7-11d3-bccc-0060b0fc76bd},0,-1,1
-1199,nsIDOMSVGPatternElement,{bc435244-b748-4e14-9e4c-219d5d3cb218},0,-1,1
-1200,nsIAccessibleCoordinateType,{c9fbdf10-619e-436f-bf4b-8566686f1577},0,-1,1
-1201,nsIConverterInputStream,{fc66ffb6-5404-4908-a4a3-27f92fa0579d},0,-1,1
-1202,nsIScreen,{f728830e-1dd1-11b2-9598-fb9f414f2465},0,-1,1
-1203,nsIDOMCSSPrimitiveValue,{e249031f-8df9-4e7a-b644-18946dce0019},0,-1,1
-1204,nsIDOMXULTextBoxElement,{71135b6c-294e-4634-a8e4-a72398f1e72a},0,-1,1
-1205,nsIDirIndexParser,{38e3066c-1dd2-11b2-9b59-8be515c1ee3f},0,-1,1
-1206,nsIDOMRGBColor,{6aff3102-320d-4986-9790-12316bb87cf9},0,-1,1
-1207,nsIDOMHTMLTableCaptionElement,{a6cf90b3-15b3-11d2-932e-00805f8add32},0,-1,1
-1208,nsIIFrameBoxObject,{30114c44-d398-44a5-9e01-b48b711291cd},0,-1,1
-1209,nsIFaviconService,{fafe10e0-194f-4e89-aab9-a5849e97287c},0,-1,1
-1210,nsIPopupWindowManager,{3210a6aa-b464-4f57-9335-b22815567cf1},0,-1,1
-1211,extIEventItem,{05281820-ab62-11db-abbd-0800200c9a66},0,-1,1
-1212,nsIDOM3TypeInfo,{2a1088c7-499a-49a7-9d3b-1970d21532ab},0,-1,1
-1213,nsIStringBundle,{d85a17c2-aa7c-11d2-9b8c-00805f8a16d9},0,-1,1
-1214,nsIDOMFileList,{3bfef9fa-8ad3-4e49-bd62-d6cd75b29298},0,-1,1
-1215,nsIZipReader,{5cce7f53-23b3-47f8-be05-122c0ba703fd},0,-1,1
-1216,nsIWebContentHandlerInfo,{eb361098-5158-4b21-8f98-50b445f1f0b2},0,-1,1
-1217,nsIDOMNSHTMLFormControlList,{a6cf911a-15b3-11d2-932e-00805f8add32},0,-1,1
-1218,nsINavHistoryResultTreeViewer,{fa77e4e9-9fc8-45d2-9507-0fe4f0602505},0,-1,1
-1219,nsIXPCComponents_ClassesByID,{336a9590-4d19-11d3-9893-006008962422},0,-1,1
-1220,nsILoginManagerStorage,{e66c97cd-3bcf-4eee-9937-38f650372d77},0,-1,1
-1221,nsIPrintingPromptService,{75d1553d-63bf-4b5d-a8f7-e4e4cac21ba4},0,-1,1
-1222,nsIDOMNSXPathExpression,{ce600ca8-e98a-4419-ad61-2f6d0cb0ecc8},0,-1,1
-1223,nsINavHistoryResultNode,{47cf89e3-4777-46bf-9677-21793870ce62},0,-1,1
-1224,nsIDragSession,{15860d52-fe2c-4ddd-ac50-9c23e24916c4},0,-1,1
-1225,nsITransactionList,{97f863f3-f886-11d4-9d39-0060b0f8baff},0,-1,1
-1226,nsIDOMSVGPathSegCurvetoCubicRel,{0e661233-0c4f-4e0d-94d3-fbc460ad1f88},0,-1,1
-1227,nsIScrollable,{919e792a-6490-40b8-bba5-f9e9ad5640c8},0,-1,1
-1228,gfxIFormats,{96d086e6-1dd1-11b2-b6b2-b77b59390247},0,-1,1
-1229,nsISupportsPRBool,{ddc3b490-4a1c-11d3-9890-006008962422},0,-1,1
-1230,nsIDOMNodeFilter,{e4723748-1dd1-11b2-8ee6-866a532a6237},0,-1,1
-1231,nsISocketTransportService,{185b3a5d-8729-436d-9693-7bdccb9c2216},0,-1,1
-1232,nsIDOMNavigatorGeolocation,{9f218d6a-42ec-4b8a-aee9-e29ca96a4eae},0,-1,1
-1233,nsISelectionDisplay,{0ddf9e1c-1dd2-11b2-a183-908a08aa75ae},0,-1,1
-1234,nsIObserver,{db242e01-e4d9-11d2-9dde-000064657374},0,-1,1
-1235,nsIJSID,{baedc96a-9cee-4b6b-9160-90d257b3c8ef},0,-1,1
-1236,nsIGnomeVFSMimeApp,{66009894-9877-405b-9321-bf30420e34e6},0,-1,1
-1237,nsIPrintProgressParams,{ca89b55b-6faf-4051-9645-1c03ef5108f8},0,-1,1
-1238,nsIDOMDragEvent,{18feefd7-a461-4865-bcf1-4dc8a2f30584},0,-1,1
-1239,nsIProtocolHandler,{15fd6940-8ea7-11d3-93ad-00104ba0fd40},0,-1,1
-1240,nsIHTMLObjectResizeListener,{27b00295-349c-429f-ad0c-87b859e77130},0,-1,1
-1241,nsIKeygenThread,{8712a243-5539-447c-9f47-8653f40c3a09},0,-1,1
-1242,nsIPersistentProperties,{1a180f60-93b2-11d2-9b8b-00805f8a16d9},0,-1,1
-1243,nsIXPCComponents_utils_Sandbox,{4f8ae0dc-d266-4a32-875b-6a9de71a8ce9},0,-1,1
-1244,nsIScriptableUnescapeHTML,{3ab244a9-f09d-44da-9e3f-ee4d67367f2d},0,-1,1
-1245,nsITransactionManager,{58e330c2-7b48-11d2-98b9-00805f297d89},0,-1,1
-1246,nsIURIRefObject,{2226927e-1dd2-11b2-b57f-faab47288563},0,-1,1
-1247,nsIDOMNSHTMLOptionElement,{e2dfc89c-7ae0-4651-8aee-7f5edc2aa626},0,-1,1
-1248,imgIDecoderObserver,{876f14ee-f27c-41cd-b6fb-9efda3ebc7b5},0,-1,1
-1249,nsICookieService,{2aaa897a-293c-4d2b-a657-8c9b7136996d},0,-1,1
-1250,nsIDOMEventTarget,{1c773b30-d1cf-11d2-bd95-00805f8ae3f4},0,-1,1
-1251,nsIWorkerScope,{d30a2f61-86e2-434e-837f-4f1985efa865},0,-1,1
-1252,nsIDOMSVGScriptElement,{bbe0d0ee-e9ed-4f84-a6e4-e58f66530caa},0,-1,1
-1253,nsIFTPEventSink,{455d4234-0330-43d2-bbfb-99afbecbfeb0},0,-1,1
-1254,nsIPermissionManager,{00708302-684c-42d6-a5a3-995d51b1d17c},0,-1,1
-1255,nsIXPCComponents,{155809f1-71f1-47c5-be97-d812ba560405},0,-1,1
-1256,nsIBlocklistService,{8439f9c0-da03-4260-8b21-dc635eed28fb},0,-1,1
-1257,nsIDOMEntity,{a6cf9079-15b3-11d2-932e-00805f8add32},0,-1,1
-1258,nsIWifiMonitor,{f289701e-d9af-4685-bc2f-e4226ff7c018},0,-1,1
-1259,nsIDOMHTMLBaseElement,{a6cf908b-15b3-11d2-932e-00805f8add32},0,-1,1
-1260,nsIController,{d5b61b82-1da4-11d3-bf87-00105a1b0627},0,-1,1
-1261,nsIFileInputStream,{e3d56a20-c7ec-11d3-8cda-0060b0fc14a3},0,-1,1
-1262,nsIDOMHTMLMenuElement,{a6cf909d-15b3-11d2-932e-00805f8add32},0,-1,1
-1263,nsIDOMHTMLDivElement,{a6cf90a0-15b3-11d2-932e-00805f8add32},0,-1,1
-1264,nsIUpdate,{9d6a388b-2e0c-4d0e-9a60-5c9739a7ada5},0,-1,1
-1265,nsIPlacesImportExportService,{21c00314-fa63-11db-8314-0800200c9a66},0,-1,1
-1266,nsIDOMXULLabeledControlElement,{a457ea70-1dd1-11b2-9089-8fd894122084},0,-1,1
-1267,nsIZipWriter,{6d4ef074-206c-4649-9884-57bc355864d6},0,-1,1
-1268,nsIDOMSVGLineElement,{4ea07ef3-ed66-4b41-8119-4afc6d0ed5af},0,-1,1
-1269,nsIWifiAccessPoint,{e28e614f-8f86-44ff-bcf5-5f18225834a0},0,-1,1
-1270,nsISAXMutableAttributes,{8b1de83d-cebb-49fa-8245-c0fe319eb7b6},0,-1,1
-1271,nsIDOMXULSelectControlItemElement,{6aaaa30d-54ab-434a-8ae8-6d29a566d870},0,-1,1
-1272,nsIPrefBranchInternal,{d1d412d9-15d6-4a6a-9533-b949dc175ff5},0,-1,1
-1273,nsIDOMSVGPathSegList,{94a6db98-3f34-4529-a35f-89ef49713795},0,-1,1
-1274,nsISupportsPRUint16,{dfacb090-4a1c-11d3-9890-006008962422},0,-1,1
-1275,mozIStorageStatement,{4a712295-d076-4007-9c78-8c0e15373b9f},0,-1,1
-1276,nsIProperties,{78650582-4e93-4b60-8e85-26ebd3eb14ca},0,-1,1
-1277,nsIDOMLSLoadEvent,{6c16a810-a37d-4859-b557-337341631aee},0,-1,1
-1278,nsIDOMNavigator,{777bd8a1-38c1-4b12-ba8f-ff6c2eb8c56b},0,-1,1
-1279,nsIDOMHTMLVoidCallback,{4a17c0e2-fdd5-4855-a71c-b4c509dffa13},0,-1,1
-1280,nsPIEditorTransaction,{4f18ada2-0ddc-11d5-9d3a-0060b0f8baff},0,-1,1
-1281,nsISearchSubmission,{58e4f602-a7c8-4cd1-9dca-716705e826ef},0,-1,1
-1282,nsIDOMWindowInternal,{3414ebc7-731f-4697-9f43-aca6f5050875},0,-1,1
-1283,nsIDOMSVGFilterPrimitiveStandardAttributes,{ab68567a-b830-4c46-9f2f-a28513a9e980},0,-1,1
-1284,nsIDOMOfflineResourceList,{f394a721-66e9-46fc-bb24-b980bb732dd0},0,-1,1
-1285,nsIPrintSettings,{5af07661-6477-4235-8814-4a45215855b8},0,-1,1
-1286,nsISupportsInterfacePointer,{995ea724-1dd1-11b2-9211-c21bdd3e7ed0},0,-1,1
-1287,nsIFlavorDataProvider,{7e225e5f-711c-11d7-9fae-000393636592},0,-1,1
-1288,nsIDOMSVGSymbolElement,{86092181-a5db-4a89-be03-07dcc14d426e},0,-1,1
-1289,nsIUnicharStreamListener,{4a7e9b62-fef8-400d-9865-d6820f630b4c},0,-1,1
-1290,jsdIStackFrame,{b6d50784-1dd1-11b2-a932-882246c6fe45},0,-1,1
-1291,nsIDOMNSDataTransfer,{53c854fc-33f9-4647-b045-46d7ab06a6f1},0,-1,1
-1292,nsIDOMXULDocument,{9816241b-2a20-44ff-903b-575f40c0ecc5},0,-1,1
-1293,nsIEditorSpellCheck,{90c93610-c116-44ab-9793-62dccb9f43ce},0,-1,1
-1294,nsIDOMHTMLScriptElement,{a6cf90b1-15b3-11d2-932e-00805f8add32},0,-1,1
-1295,nsIWebBrowserChromeFocus,{d2206418-1dd1-11b2-8e55-acddcd2bcfb8},0,-1,1
-1296,nsIEntityConverter,{d14c7111-55e0-11d3-91d9-00105aa3f7dc},0,-1,1
-1297,nsISimpleEnumerator,{d1899240-f9d2-11d2-bdd6-000064657374},0,-1,1
-1298,nsIEmbeddingSiteWindow2,{e932bf55-0a64-4beb-923a-1f32d3661044},0,-1,1
-1299,nsIBufferedOutputStream,{6476378a-da09-11d3-8cda-0060b0fc14a3},0,-1,1
-1300,nsIDocumentEncoder,{f85c5a20-258d-11db-a98b-0800200c9a66},0,-1,1
-1301,nsIChannelEventSink,{6757d790-2916-498e-aaca-6b668a956875},0,-1,1
-1302,nsIXPCComponents_Utils,{da2267f2-d4cc-448f-9d70-1c7fe134d2fe},0,-1,1
-1303,nsINavHistoryContainerResultNode,{f9c8e1c1-e701-44ad-893c-8504c3956929},0,-1,1
-1304,nsIPrintingPrompt,{44e314ca-75b1-4f3d-9553-9b3507912108},0,-1,1
-1305,nsIDOMHTMLOptionElement,{a6cf9092-15b3-11d2-932e-00805f8add32},0,-1,1
-1306,nsISupportsPRInt32,{e36c5250-4a1c-11d3-9890-006008962422},0,-1,1
-1307,nsIDOMSVGPathSegArcAbs,{c9e222e5-31fd-4083-ae1f-fcf013681340},0,-1,1
-1308,nsIFrameLoader,{d675c531-6bdc-417c-b176-635060105f07},0,-1,1
-1309,nsIDOMSVGPathSegLinetoVerticalRel,{d3ef2128-8de3-4aac-a6b4-13c7563119a6},0,-1,1
-1310,nsIDOMXULCommandDispatcher,{f3c50361-14fe-11d3-bf87-00105a1b0627},0,-1,1
-1311,nsIDOMGeoGeolocation,{37687daf-b85f-4e4d-8881-85a0ad24cf78},0,-1,1
-1312,nsIX509CertDB,{da48b3c0-1284-11d5-ac67-000064657374},0,-1,1
-1313,nsIDOMRangeException,{0f807301-39d2-11d6-a7f2-8f504ff870dc},0,-1,1
-1314,extIPreference,{2c7462e2-72c2-4473-9007-0e6ae71e23ca},0,-1,1
-1315,nsICryptoHMAC,{8feb4c7c-1641-4a7b-bc6d-1964e2099497},0,-1,1
-1316,nsILineInputStream,{c97b466c-1e6e-4773-a4ab-2b2b3190a7a6},0,-1,1
-1317,nsIWeakReference,{9188bc85-f92e-11d2-81ef-0060083a0bcf},0,-1,1
-1318,nsIAccessibleHyperLink,{38c60bfa-6040-4bfe-93f2-acd6a909bb60},0,-1,1
-1319,nsIWebProgress,{570f39d0-efd0-11d3-b093-00a024ffc08c},0,-1,1
-1320,nsIForwardIterator,{8da01646-1dd2-11b2-98a7-c7009045be7e},0,-1,1
-1321,inIFlasher,{7b4a099f-6f6e-4565-977b-fb622adbff49},0,-1,1
-1322,nsIBadCertListener2,{2c3d268c-ad82-49f3-99aa-e9ffddd7a0dc},0,-1,1
-1323,nsIDOMClientRectList,{917da19d-62f5-441d-b47e-9e35f05639c9},0,-1,1
-1324,nsIDOMSmartCardEvent,{52bdc7ca-a934-4a40-a2e2-ac83a70b4019},0,-1,1
-1325,nsIXULRuntime,{2848ab92-d912-11d9-89f7-001124787b2e},0,-1,1
-1326,nsIRemoteService,{a2240f6a-f1e4-4548-9e1a-6f3bc9b2426c},0,-1,1
-1327,nsIDOMXPathResult,{75506f84-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
-1328,nsIDOMSVGLocatable,{9cf4fc9c-90b2-4d66-88f5-35049b558aee},0,-1,1
-1329,nsIWebBrowserFind,{2f977d44-5485-11d4-87e2-0010a4e75ef2},0,-1,1
-1330,nsICryptoFIPSInfo,{99e81922-7318-4431-b3aa-78b3cb4119bb},0,-1,1
-1331,nsIDOMSVGUseElement,{d49a3ac7-e779-46c8-ae92-214420aa1b71},0,-1,1
-1332,nsICertVerificationResult,{2fd0a785-9f2d-4327-8871-8c3e0783891d},0,-1,1
-1333,nsIDOMXULMultiSelectControlElement,{82c72eca-9886-473e-94cd-9de5694b3f88},0,-1,1
-1334,nsIMicrosummaryService,{d58143a2-74fa-4b13-94ed-113af8936d80},0,-1,1
-1335,nsIControllers,{f36e3ec1-9197-4ad8-8d4c-d3b1927fd6df},0,-1,1
-1336,jsdIErrorHook,{b7dd3c1c-1dd1-11b2-83eb-8a857d199e0f},0,-1,1
-1337,nsIDOMHTMLInputElement,{a6cf9093-15b3-11d2-932e-00805f8add32},0,-1,1
-1338,mozIStorageStatementCallback,{29383d00-d8c4-4ddd-9f8b-c2feb0f2fcfa},0,-1,1
-1339,nsIDOMSVGGElement,{0bd57cbd-a090-44aa-a61b-2fb876841194},0,-1,1
-1340,nsPIAccessibleTreeItem,{b71532f9-53b2-4647-a5b2-1c5f57e9aed6},0,-1,0
-1341,nsICipherInfo,{028e2b2a-1f0b-43a4-a1a7-365d2d7f35d0},0,-1,1
-1342,nsIDOMGeoPosition,{76888eb0-5eab-4be6-bfe0-489ec4095358},0,-1,1
-1343,nsIDOMHTMLBaseFontElement,{a6cf90a6-15b3-11d2-932e-00805f8add32},0,-1,1
-1344,nsIDOMXULCheckboxElement,{5afaba88-1dd2-11b2-9249-dd65a129d0e4},0,-1,1
-1345,nsIDOMHTMLMediaError,{7bd8c29f-8a76-453f-9373-79f820f2dc01},0,-1,1
-1346,nsIDOMWindow,{a6cf906b-15b3-11d2-932e-00805f8add32},0,-1,1
-1347,nsIDOMHTMLDirectoryElement,{a6cf909c-15b3-11d2-932e-00805f8add32},0,-1,1
-1348,nsIBrowserProfileMigrator,{f8365b4a-da55-4e47-be7a-230142360f62},0,-1,1
-1349,nsIDOMSVGSwitchElement,{7676f306-22c9-427e-bd71-2b1315851c93},0,-1,1
-1350,nsIBrowserHandler,{8d3f5a9d-118d-4548-a137-cf7718679069},0,-1,1
-1351,nsIURIChecker,{4660c1a1-be2d-4c78-9baf-c22984176c28},0,-1,1
-1352,nsIDOMNSHTMLAreaElement,{3dce9071-f3b9-4280-a6ee-776cdfe3dd9e},0,-1,1
-1353,nsIDOMDataTransfer,{b5947dd0-8e86-4b9c-aa65-c86303efcf94},0,-1,1
-1354,nsIDOMHTMLImageElement,{a6cf90ab-15b3-11d2-932e-00805f8add32},0,-1,1
-1355,nsILocalFileWin,{def38371-73b0-4dfd-85cd-0a7c91afbec6},0,-1,1
-1356,nsIDOMHTMLTextAreaElement,{a6cf9094-15b3-11d2-932e-00805f8add32},0,-1,1
-1357,nsIDOMCommandEvent,{37fb1798-0f76-4870-af6f-0135b4d973c8},0,-1,1
-1358,nsIFeedContainer,{577a1b4c-b3d4-4c76-9cf8-753e6606114f},0,-1,1
-1359,nsIDOMXULButtonElement,{6852d9a6-1dd2-11b2-a29d-cd7977a91b1b},0,-1,1
-1360,nsIXULTemplateQueryProcessor,{970f1c36-5d2e-4cbc-a1cf-e3327b50df71},0,-1,1
-1361,nsIEmbeddingSiteWindow,{3e5432cd-9568-4bd1-8cbe-d50aba110743},0,-1,1
-1362,nsIDOMSVGFEPointLightElement,{557f128a-026b-4fa8-a44c-605df7bfd62e},0,-1,1
-1363,nsIDOMSVGFitToViewBox,{089410f3-9777-44f1-a882-ab4225696434},0,-1,1
-1364,jsdIFilterEnumerator,{54382875-ed12-4f90-9a63-1f0498d0a3f2},0,-1,1
-1365,nsINavHistoryQuery,{53b51afe-9de8-40ad-9c81-f2cc1701f1ff},0,-1,1
-1366,nsIXPConnectWrappedNative,{7021d99d-6344-4cc0-96e7-943ed58792b8},0,-1,0
-1367,nsIDNSService,{c1a56a45-8fa3-44e6-9f01-38c91c858cf9},0,-1,1
-1368,nsIPK11Token,{51191434-1dd2-11b2-a17c-e49c4e99a4e3},0,-1,1
-1369,nsIControllerCommand,{0eae9a46-1dd2-11b2-aca0-9176f05fe9db},0,-1,1
-1370,nsIXSLTProcessorPrivate,{b8d727f7-67f4-4dc1-a318-ec0c87280816},0,-1,1
-1371,nsISessionStartup,{c0b185e7-0d21-46ac-8eee-7b5065ee7ecd},0,-1,1
-1372,nsIDOMNSHTMLAnchorElement2,{d7627eda-6ec0-4326-87c4-c3067fe6e324},0,-1,1
-1373,nsIWebBrowserStream,{86d02f0e-219b-4cfc-9c88-bd98d2cce0b8},0,-1,1
-1374,nsITimerCallback,{a796816d-7d47-4348-9ab8-c7aeb3216a7d},0,-1,1
-1375,nsINSSCertCache,{1b75bdae-1757-4322-9d1e-cfcaa18cb710},0,-1,1
-1376,nsISocketProviderService,{8f8a23d0-5472-11d3-bbc8-0000861d1237},0,-1,1
-1377,nsIZipReaderCache,{52c45d86-0cc3-11d4-986e-00c04fa0cf4a},0,-1,1
-1378,nsIWebProgressListener2,{dde39de0-e4e0-11da-8ad9-0800200c9a66},0,-1,1
-1379,nsIAuthPrompt,{358089f9-ee4b-4711-82fd-bcd07fc62061},0,-1,1
-1380,jsdINestCallback,{88bea60f-9b5d-4b39-b08b-1c3a278782c6},0,-1,1
-1381,nsIHTTPIndex,{6f2bdbd0-58c3-11d3-be36-00104bde6048},0,-1,1
-1382,nsIDOMDocumentRange,{7b9badc6-c9bc-447a-8670-dbd195aed24b},0,-1,1
-1383,nsICMSMessage,{a4557478-ae16-11d5-ba4b-00108303b117},0,-1,0
-1384,nsIProfileUnlocker,{08923af1-e7a3-4fae-ba02-128502193994},0,-1,1
-1385,nsIDOMNodeIterator,{5af83f50-c8d5-4824-be29-1aa9d640bacb},0,-1,1
-1386,nsIDOMSVGAnimatedPathData,{6ef2b400-dbf4-4c12-8787-fe15caac5648},0,-1,1
-1387,nsIEncodedChannel,{30d7ec3a-f376-4652-9276-3092ec57abb6},0,-1,1
-1388,nsIXPTLoaderSink,{6e48c500-8682-4730-add6-7db693b9e7ba},0,-1,1
-1389,nsIDOMNSHTMLDocument,{79beb289-3644-4b54-9432-9fb993945629},0,-1,1
-1390,nsIAccessibleValue,{42a1e1dc-58cf-419d-bff0-ed3314c70016},0,-1,1
-1391,nsIAtom,{3d1b15b0-93b4-11d1-895b-006008911b81},0,-1,1
-1392,nsIAsyncOutputStream,{beb632d3-d77a-4e90-9134-f9ece69e8200},0,-1,1
-1393,nsIDOMEntityReference,{a6cf907a-15b3-11d2-932e-00805f8add32},0,-1,1
-1394,nsIXTFElementWrapper,{0ad87068-c6fd-4122-a515-ffe8c4773b10},0,-1,1
-1395,nsIUpdatePrompt,{599fd3c6-ec68-4499-ada5-2997739c97a6},0,-1,1
-1396,nsIDOMSVGRectElement,{1695ca39-e40d-44dc-81db-a51b6fd234fa},0,-1,1
-1397,mozITXTToHTMLConv,{77c0e42a-1dd2-11b2-8ebf-edc6606f2f4b},0,-1,1
-1398,nsIMicrosummaryObserver,{560b0980-be95-47e9-81cc-4428c073127c},0,-1,1
-1399,mozIJSSubScriptLoader,{8792d77e-1dd2-11b2-ac7f-9bc9be4f2916},0,-1,1
-1400,nsIDocShellLoadInfo,{92a0a637-373e-4647-9476-ead11e005c75},0,-1,1
-1401,nsIXPCComponents_Results,{2fc229a0-5860-11d3-9899-006008962422},0,-1,1
-1402,nsIDOMLoadStatusEvent,{f14431b1-efb6-436c-a272-312f087b1459},0,-1,1
-1403,nsIMemory,{59e7e77a-38e4-11d4-8cf5-0060b0fc14a3},0,-1,1
-1404,nsIContentViewerEdit,{1691a02f-53b2-4cb8-8769-48e7efc908b8},0,-1,1
-1405,nsISupportsPrimitive,{d0d4b136-1dd1-11b2-9371-f0727ef827c0},0,-1,1
-1406,nsIEditorStyleSheets,{4805e682-49b9-11d3-9ce4-ed60bd6cb5bc},0,-1,1
-1407,rdfISerializer,{f0edfcdd-8bca-4d32-9226-7421001396a4},0,-1,1
-1408,nsIDOMSVGPolygonElement,{9de04775-77c5-48b5-9f4a-8996a936bfb2},0,-1,1
-1409,nsIDOMStorageList,{f2166929-91b6-4372-8d5f-c366f47a5f54},0,-1,1
-1410,nsIWritablePropertyBag2,{9cfd1587-360e-4957-a58f-4c2b1c5e7ed9},0,-1,1
-1411,nsIDocumentStateListener,{050cdc00-3b8e-11d3-9ce4-a458f454fcbc},0,-1,1
-1412,nsISHTransaction,{2edf705f-d252-4971-9f09-71dd0f760dc6},0,-1,1
-1413,nsIDOMHTMLIsIndexElement,{a6cf908c-15b3-11d2-932e-00805f8add32},0,-1,1
-1414,nsIASN1Sequence,{b6b957e6-1dd1-11b2-89d7-e30624f50b00},0,-1,1
-1415,nsIDOMHTMLAppletElement,{a6cf90ae-15b3-11d2-932e-00805f8add32},0,-1,1
-1416,nsIDOMToString,{2a72e20f-e337-4822-8994-2e35b5550d03},0,-1,1
-1417,nsIUpdateManager,{fede66a9-9f96-4507-a22a-775ee885577e},0,-1,1
-1418,nsIDOMScreen,{77947960-b4af-11d2-bd93-00805f8ae3f4},0,-1,1
-1419,nsICertTreeItem,{d0180863-606e-49e6-8324-cf45ed4dd891},0,-1,1
-1420,extIConsole,{ae8482e0-aa5a-11db-abbd-0800200c9a66},0,-1,1
-1421,nsISAXAttributes,{e347005e-6cd0-11da-be43-001422106990},0,-1,1
-1422,nsIXPConnect,{b2ddc328-194b-45d6-95c6-52e487438096},0,-1,0
-1423,nsIDOMSVGPathSegCurvetoCubicAbs,{380afecd-f884-4da7-a0d7-5ffc4531b70b},0,-1,1
-1424,nsIUploadChannel,{ddf633d8-e9a4-439d-ad88-de636fd9bb75},0,-1,1
-1425,nsIScreenManager_MOZILLA_1_9_1_BRANCH,{ee561ea4-7409-46f9-b79c-9f98f7f21aec},0,-1,1
-1426,nsIXPCFunctionThisTranslator,{039ef260-2a0d-11d5-90a7-0010a4e73d9a},0,-1,0
-1427,nsIAbstractWorker,{b90b7561-b5e2-4545-84b0-280dbaaa94ea},0,-1,1
-1428,nsIDOMSVGURIReference,{8092b5f3-dc8a-459c-94f1-92f8011f2438},0,-1,1
-1429,nsIDOMPluginArray,{f6134680-f28b-11d2-8360-c90899049c3c},0,-1,1
-1430,nsIDOMStorageEvent,{fc540c28-8edd-4b7a-9c30-8638289b7a7d},0,-1,1
+423,nsIDOMSVGFESpecularLightingElement,{49c38287-a7c2-4895-a630-86d2b45df23c},0,-1,1
+424,nsIUrlListManager,{9c5598ec-9986-40cf-af40-b5e0d817a3a0},0,-1,1
+425,nsIDOMStorageWindow,{a44581fe-dd9b-4fd7-9893-00c4ab43f12e},0,-1,1
+426,imgIRequest,{a297d3fa-5e0c-4e59-9f30-a01c9d4f3f8b},0,-1,1
+427,nsILocaleService,{c2edc848-4219-4440-abbf-98119882c83f},0,-1,1
+428,nsIPluginDocument,{e4be1d0a-9f24-4d69-bec5-245726ab85fb},0,-1,0
+429,nsIRDFCompositeDataSource,{96343820-307c-11d2-bc15-00805f912fe7},0,-1,1
+430,nsIRequestObserver,{fd91e2e0-1481-11d3-9333-00104ba0fd40},0,-1,1
+431,nsIDOMSVGFEComponentTransferElement,{4de6b44a-f909-4948-bc43-5ee2ca6de55b},0,-1,1
+432,nsIRecyclingAllocator,{d064a04c-9cee-4319-be31-64d565bccba9},0,-1,1
+433,nsISelectionController,{b5c3ffc4-f48a-4f25-86e1-4cf79db1bcbb},0,-1,1
+434,nsIDOMSVGStylable,{ea8a6cb1-9176-45db-989d-d0e89f563d7e},0,-1,1
+435,nsIDOMHTMLIFrameElement,{a6cf90ba-15b3-11d2-932e-00805f8add32},0,-1,1
+436,nsIHttpAuthManager,{7ce8e9d1-8b4b-4883-a307-66fe12a50153},0,-1,1
+437,nsIXULBrowserWindow,{67a601df-f091-4894-a2e2-2e6cfebb35ea},0,-1,1
+438,nsIDOMSVGPointList,{4c12af24-0fc2-4fe7-b71d-5d6b41d463c1},0,-1,1
+439,nsIUserInfo,{6c1034f0-1dd2-11b2-aa14-e6657ed7bb0b},0,-1,1
+440,nsIDOMHTMLVideoElement,{edf468dc-42eb-4494-920b-56a315172640},0,-1,1
+441,nsICacheEntryDescriptor,{49c1a11d-f5d2-4f09-8262-551e64908ada},0,-1,1
+442,nsIHTMLAbsPosEditor,{91375f52-20e6-4757-9835-eb04fabe5498},0,-1,1
+443,nsIAutoCompleteObserver,{18c36504-9a4c-4ac3-8494-bd05e00ae27f},0,-1,1
+444,nsIFormHistory2,{5d7d84d1-9798-4016-bf61-a32acf09b29d},0,-1,1
+445,nsISecurityWarningDialogs,{1c399d06-1dd2-11b2-bc58-c87cbcacdb78},0,-1,1
+446,nsIImageDocument,{7b80eebc-c98e-4461-8bdb-6e3b6e828890},0,-1,1
+447,jsdIDebuggerService,{dc0a24db-f8ac-4889-80d0-6016545a2dda},0,-1,1
+448,nsITransport,{d8786c64-eb49-4a0b-b42c-0936a745fbe8},0,-1,1
+449,nsIMutable,{321578d0-03c1-4d95-8821-021ac612d18d},0,-1,1
+450,jsdICallHook,{191d2738-22e8-4756-b366-6c878c87d73b},0,-1,1
+451,nsIListBoxObject,{aa9def4e-2e59-412d-a6df-b76f52167795},0,-1,1
+452,nsIAccessibleScrollType,{05cd38b1-94b3-4cdf-8371-3935a9611405},0,-1,1
+453,nsICategoryManager,{3275b2cd-af6d-429a-80d7-f0c5120342ac},0,-1,1
+454,nsIBidirectionalIterator,{948defaa-1dd1-11b2-89f6-8ce81f5ebda9},0,-1,1
+455,nsIDOMDOMTokenList,{c6f1e160-eeeb-404a-98b0-6f1246520b6e},0,-1,1
+456,nsIURIClassifier,{2de5c563-1203-43dd-a212-f5d56d530b6f},0,-1,1
+457,nsIWindowMediatorListener,{2f276982-0d60-4377-a595-d350ba516395},0,-1,1
+458,nsISHistoryListener,{3b07f591-e8e1-11d4-9882-00c04fa02f40},0,-1,1
+459,nsIEditor,{96b60ba0-634a-41e4-928e-78ab0b3c4b46},0,-1,1
+460,nsIDOMHistory,{896d1d20-b4c4-11d2-bd93-00805f8ae3f4},0,-1,1
+461,nsIZipEntry,{e1c028bc-c478-11da-95a8-00e08161165f},0,-1,1
+462,nsIWebContentHandlerRegistrar,{e6a75410-c93e-42bf-84ca-a5c3ec34a2f1},0,-1,1
+463,mozIStorageStatementWrapper,{eee6f7c9-5586-4eaf-b35c-dca987c4ffd1},0,-1,1
+464,nsIDOMNodeList,{a6cf907d-15b3-11d2-932e-00805f8add32},0,-1,1
+465,nsIUnicharInputStream,{d5e3bd80-6723-4b92-b0c9-22f6162fd94f},0,-1,1
+466,rdfITripleVisitor,{aafea151-c271-4505-9978-a100d292800c},0,-1,1
+467,nsIDOMDOMImplementationLS,{e2c8b03c-a49a-4923-81b0-ba9a86da0e21},0,-1,1
+468,nsIDOMAbstractView,{f51ebade-8b1a-11d3-aae7-0010830123b4},0,-1,1
+469,nsIPopupBoxObject,{a41af368-9f73-4d73-a058-49dd7e41f9ea},0,-1,1
+470,nsIWorkerErrorEvent,{73d82c1d-05de-49c9-a23b-7121ff09a67a},0,-1,1
+471,nsIDOMXULSelectControlElement,{919d9808-8937-4cec-9390-91225eb8864b},0,-1,1
+472,nsIRDFLiteral,{e0c493d2-9542-11d2-8eb8-00805f29f370},0,-1,1
+473,nsIAccessible,{c81d8f8c-8585-4094-bc7c-71dd01494906},0,-1,1
+474,nsIDOMCanvasPattern,{21dea65c-5c08-4eb1-ac82-81fe95be77b8},0,-1,1
+475,nsISupportsVoid,{464484f0-568d-11d3-baf8-00805f8a5dd7},0,-1,1
+476,nsIDOMCSSImportRule,{a6cf90cf-15b3-11d2-932e-00805f8add32},0,-1,1
+477,nsIDOMScrollAreaEvent,{b2f49035-4a2f-4e62-8fb0-deb68b0de4d9},0,-1,1
+478,jsdIContextEnumerator,{d96af02e-3379-4db5-885d-fee28d178701},0,-1,1
+479,nsIConsoleMessage,{41bd8784-1dd2-11b2-9553-8606958fffe1},0,-1,1
+480,imgILoad,{e6273acc-1dd1-11b2-a08b-824ad1b1628d},0,-1,1
+481,nsISAXLocator,{7a307c6c-6cc9-11da-be43-001422106990},0,-1,1
+482,nsIDOMHTMLSourceElement,{be281029-7dd9-4268-963e-96f5196acc19},0,-1,1
+483,nsIDOMSVGMaskElement,{fdd7039c-35b6-465a-b7a3-c98a815b583e},0,-1,1
+484,nsICookiePromptService,{72f8bb14-2810-4f38-8d0d-290c5401f54e},0,-1,1
+485,extIApplication,{e53d6610-7468-11dd-ad8b-0800200c9a66},0,-1,1
+486,nsIDOMHTMLCollection,{a6cf9083-15b3-11d2-932e-00805f8add32},0,-1,1
+487,nsIFeedPerson,{29cbd45f-f2d3-4b28-b557-3ab7a61ecde4},0,-1,1
+488,mozIStorageFunction,{9ff02465-21cb-49f3-b975-7d5b38ceec73},0,-1,1
+489,nsINavHistoryService,{437f539b-d541-4a0f-a200-6f9a6d45cce2},0,-1,1
+490,nsIDOMHTMLBRElement,{a6cf90a5-15b3-11d2-932e-00805f8add32},0,-1,1
+491,nsINonBlockingAlertService,{e800ef97-ae37-46b7-a46c-31fbe79657ea},0,-1,1
+492,nsICertificateDialogs,{a03ca940-09be-11d5-ac5d-000064657374},0,-1,1
+493,nsIInputIterator,{85585e12-1dd2-11b2-a930-f6929058269a},0,-1,1
+494,nsIGlobalHistory,{9491c383-e3c4-11d2-bdbe-0050040a9b44},0,-1,1
+495,mozIStorageStatementParams,{e65fe6e2-2643-463c-97e2-27665efe2386},0,-1,1
+496,fuelIWindow,{207edb28-eb5e-424e-a862-b0e97c8de866},0,-1,1
+497,nsIPref,{a22ad7b0-ca86-11d1-a9a4-00805f8a7ac4},0,-1,1
+498,nsIAsyncStreamCopier,{5a19ca27-e041-4aca-8287-eb248d4c50c0},0,-1,1
+499,nsIDOMSVGPathSegLinetoAbs,{5c7ba7b0-c7c5-4a7b-bc1c-2d784153be77},0,-1,1
+500,nsIDOMSVGAnimatedEnumeration,{73b101bd-797b-470f-9308-c24c64278bcd},0,-1,1
+501,nsIAutoCompleteSearch,{de8db85f-c1de-4d87-94ba-7844890f91fe},0,-1,1
+502,nsIDOMComment,{a6cf9073-15b3-11d2-932e-00805f8add32},0,-1,1
+503,nsISecretDecoderRingConfig,{01d8c0f0-0ccc-11d4-9fdd-000064657374},0,-1,1
+504,nsIXULTreeBuilderObserver,{57ced9a7-ec0b-4a0e-8aeb-5da32ebe951c},0,-1,1
+505,nsIXPTLoader,{368a15d9-17a9-4c2b-ac3d-a35b3a22b876},0,-1,1
+506,nsIContentFilter,{c18c49a8-62f0-4045-9884-4aa91e388f14},0,-1,1
+507,nsIASN1Tree,{c727b2f2-1dd1-11b2-95df-f63c15b4cd35},0,-1,1
+508,extISessionStorage,{0787ac44-29b9-4889-b97f-13573aec6971},0,-1,1
+509,nsIComponentManagerObsolete,{8458a740-d5dc-11d2-92fb-00e09805570f},0,-1,1
+510,mozIStorageStatementRow,{02eeaf95-c3db-4182-9340-222c29f68f02},0,-1,1
+511,nsIInterfaceInfo,{215dbe04-94a7-11d2-ba58-00805f8a5dd7},0,-1,0
+512,nsIShellService,{bb477da4-dddf-4106-a562-f06c85c7f9a8},0,-1,1
+513,mozISpellCheckingEngine,{43987f7b-0faa-4019-811e-42becac73fc5},0,-1,1
+514,nsIApplicationCacheContainer,{bbb80700-1f7f-4258-aff4-1743cc5a7d23},0,-1,1
+515,nsISound,{86b75b05-db60-4c3e-97a7-82b363a41a01},0,-1,1
+516,nsIJSContextStack,{c67d8270-3189-11d3-9885-006008962422},0,-1,0
+517,nsIWindowCreator2,{f673ec81-a4b0-11d6-964b-eb5a2bf216fc},0,-1,1
+518,nsIDOMNSHTMLFrameElement,{d67bd267-f984-4993-b378-95851b71f0a3},0,-1,1
+519,nsIProfile,{02b0625a-e7f3-11d2-9f5a-006008a6efe9},0,-1,1
+520,nsIDOMSVGPathSegMovetoRel,{58ca7e86-661a-473a-96de-89682e7e24d6},0,-1,1
+521,nsISystemProxySettings,{a9f3ae38-b769-4e0b-9317-578388e326c9},0,-1,1
+522,nsIPromptService,{1630c61a-325e-49ca-8759-a31b16c47aa5},0,-1,1
+523,nsIJARProtocolHandler,{92c3b42c-98c4-11d3-8cd9-0060b0fc14a3},0,-1,1
+524,nsIRefreshURI,{cb0ad623-6b46-4c09-a473-c1d6ca63d3c7},0,-1,1
+525,nsIDOMAttr,{a6cf9070-15b3-11d2-932e-00805f8add32},0,-1,1
+526,nsIDOMXPathExpression,{75506f82-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
+527,nsIVariant,{6c9eb060-8c6a-11d5-90f3-0010a4e73d9a},0,-1,1
+528,nsIDOMSVGAnimatedBoolean,{7e325385-cc82-4763-bd14-e2c92edd5462},0,-1,1
+529,jsdIFilterEnumerator,{e391ba85-9379-4762-b387-558e38db730f},0,-1,1
+530,nsITreeColumn,{ae835ecf-6b32-4660-9b43-8a270df56e02},0,-1,1
+531,nsIAutoCompletePopup,{1b9d7d8a-6dd0-11dc-8314-0800200c9a66},0,-1,1
+532,nsIAccessibleCaretMoveEvent,{b9076dce-4cd3-4e3d-a7f6-7f33a7f40c31},0,-1,1
+533,nsIContentPrefService,{ea7d29eb-7095-476e-b5d9-13263f3ae243},0,-1,1
+534,nsIDOMNSCSS2Properties,{8c31e4a6-8f3a-4bb9-b180-8385ac2a4080},0,-1,1
+535,nsIDOMPkcs11,{9fd42950-25e7-11d4-8a7d-006008c844c3},0,-1,1
+536,nsIDocumentEncoderNodeFixup,{c0da5b87-0ba7-4d7c-8cb3-fcb02af4253d},0,-1,1
+537,nsIToolkitProfile,{7422b090-4a86-4407-972e-75468a625388},0,-1,1
+538,nsIWebBrowserPrint,{9a7ca4b0-fbba-11d4-a869-00105a183419},0,-1,1
+539,nsIDOMNameList,{faaf1b80-1ddd-11d9-8c46-000a95dc234c},0,-1,1
+540,nsIGlobalHistory2,{cf777d42-1270-4b34-be7b-2931c93feda5},0,-1,1
+541,rdfIDataSource,{ebce86bd-1568-4a34-a808-9ccf9cde8087},0,-1,1
+542,nsIWebBrowserFindInFrames,{e0f5d182-34bc-11d5-be5b-b760676c6ebc},0,-1,1
+543,nsIDynamicContainer,{7e85d97b-4109-4ea7-afd8-bc2cd3840d70},0,-1,1
+544,nsISAXXMLFilter,{77a22cf0-6cdf-11da-be43-001422106990},0,-1,1
+545,nsINavHistoryFullVisitResultNode,{c49fd9d5-56e2-43eb-932c-f933f28cba85},0,-1,1
+546,nsIAddonSearchResult,{a549a714-2ada-4bb9-8a47-be26e73d49a5},0,-1,1
+547,nsIDirIndexListener,{fae4e9a8-1dd1-11b2-b53c-8f3aa1bbf8f5},0,-1,1
+548,nsISAXContentHandler,{2a99c757-dfee-4806-bff3-f721440412e0},0,-1,1
+549,nsIExternalHelperAppService,{9e456297-ba3e-42b1-92bd-b7db014268cb},0,-1,1
+550,nsIDOMSVGTitleElement,{524564b0-13a3-459b-bbec-ad66aea9f789},0,-1,1
+551,nsISocketProvider,{00b3df92-e830-11d8-d48e-0004e22243f8},0,-1,1
+552,nsIThreadObserver,{81d0b509-f198-4417-8020-08eb4271491f},0,-1,1
+553,nsIStringInputStream,{450cd2d4-f0fd-424d-b365-b1251f80fd53},0,-1,1
+554,nsIPhonetic,{bc6ea726-ab56-46b6-a21a-aa7b76d6818f},0,-1,1
+555,nsIDOMLoadStatus,{2cb53a8a-d2f4-4ddf-874f-3bc2d595c41a},0,-1,1
+556,nsIXPCScriptNotify,{b804504d-0025-4d6b-8ced-d94e41102a7f},0,-1,0
+557,nsIInterfaceInfoSuperManager,{0ee22850-bc6a-11d5-9134-0010a4e73d9a},0,-1,0
+558,nsIThread,{9c889946-a73a-4af3-ae9a-ea64f7d4e3ca},0,-1,1
+559,nsIDOMCSSValue,{009f7ea5-9e80-41be-b008-db62f10823f2},0,-1,1
+560,nsICookieAcceptDialog,{3f2f0d2c-bdea-4b5a-afc6-fcf18f66b97e},0,-1,1
+561,nsIDOMSVGFEBlendElement,{8f4daf4c-de2d-450f-a373-449ad62e3800},0,-1,1
+562,nsIMenuBoxObject,{f5099746-5049-4e81-a03e-945d5110fee2},0,-1,1
+563,nsIDOMSVGFEFuncRElement,{85719a5d-9688-4c5f-bad5-c21847515200},0,-1,1
+564,nsIDOMNSEvent,{9be8096b-f795-4045-9664-0c275f36fe5b},0,-1,1
+565,nsIDOMSVGPathSegClosePath,{4970505f-2cc0-4afa-92e6-0cf4bdbf5a53},0,-1,1
+566,nsIDOMLSException,{1cc8e4b3-1dbb-4adc-a913-1527bf67748c},0,-1,1
+567,nsIDOMHTMLTimeRanges,{5c9995a1-9fce-44e8-aa7f-de52ff4c3f46},0,-1,1
+568,nsIDOMSVGFEGaussianBlurElement,{43ff8d42-3380-4dbd-a916-7c2daa3ed7f4},0,-1,1
+569,nsIDOMHTMLFieldSetElement,{a6cf9097-15b3-11d2-932e-00805f8add32},0,-1,1
+570,nsIDOMSVGLinearGradientElement,{7e15fce5-b208-43e1-952a-c570ebad0619},0,-1,1
+571,nsIDOMStorage,{43e5edad-1e02-42c4-9d99-c3d9dee22a20},0,-1,1
+572,nsIStreamLoader,{8ea7e890-8211-11d9-8bde-f66bad1e3f3a},0,-1,1
+573,nsIDOMWindowCollection,{a6cf906f-15b3-11d2-932e-00805f8add32},0,-1,1
+574,nsIBinaryInputStream,{7b456cb0-8772-11d3-90cf-0040056a906e},0,-1,1
+575,nsIDOMSVGFEConvolveMatrixElement,{42109b58-a8c1-4078-b44c-ec1d5d6b9574},0,-1,1
+576,nsISSLStatus,{cfede939-def1-49be-81ed-d401b3a07d1c},0,-1,1
+577,nsITextScroll,{067b28a0-877f-11d3-af7e-00a024ffc08c},0,-1,1
+578,nsIDOMSVGRadialGradientElement,{d0262ae1-31a4-44be-b82e-85e4cfe280fd},0,-1,1
+579,nsIBidirectionalEnumerator,{75f158a0-cadd-11d2-8cca-0060b0fc14a3},0,-1,0
+580,nsIVersionComparator,{e6cd620a-edbb-41d2-9e42-9a2ffc8107f3},0,-1,1
+581,nsIUrlClassifierLookupCallback,{f1dc83c6-ad43-4f0f-a809-fd43de7de8a4},0,-1,0
+582,nsIControllerCommandTable,{d1a47834-6ad4-11d7-bfad-000393636592},0,-1,1
+583,nsIWindowWatcher,{002286a8-494b-43b3-8ddd-49e3fc50622b},0,-1,1
+584,nsIDOMXPathException,{75506f89-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
+585,nsIDOMXULCommandEvent,{f9fa8205-a988-4828-9228-f3332d5475ac},0,-1,1
+586,nsISHistory,{9883609f-cdd8-4d83-9b55-868ff08ad433},0,-1,1
+587,nsIAutoCompleteBaseResult,{e6396544-921d-4776-aa62-8bf2dc1ae058},0,-1,0
+588,nsIDOMCrypto,{12b6d899-2aed-4ea9-8c02-2223ab7ab592},0,-1,1
+589,nsIDOMSVGFEDiffuseLightingElement,{2e9eb422-2398-4be9-a9b8-b1cc7aa9dd6f},0,-1,1
+590,nsIWorkerLocation,{17a005c3-4f2f-4bb6-b169-c181fa6873de},0,-1,1
+591,nsISimpleUnicharStreamFactory,{8238cd2e-e8e3-43e8-b556-56e21389c766},0,-1,1
+592,nsIDOMMutationEvent,{8e440d86-886a-4e76-9e59-c13b939c9a4b},0,-1,1
+593,nsIDOMSVGTextPositioningElement,{5d052835-8cb0-442c-9754-a8e616db1f89},0,-1,1
+594,nsIDOMSVGPathSegArcAbs,{c9e222e5-31fd-4083-ae1f-fcf013681340},0,-1,1
+595,nsIDOMNSHTMLAnchorElement,{a6cf911c-15b3-11d2-932e-00805f8add32},0,-1,1
+596,nsILocalHandlerApp,{9812be73-273c-478c-8170-c3e0db08ae7c},0,-1,1
+597,nsIComponentRegistrar,{2417cbfe-65ad-48a6-b4b6-eb84db174392},0,-1,1
+598,nsIFileChannel,{06169120-136d-45a5-b535-498f1f755ab7},0,-1,1
+599,nsIPluginHost,{30c7c529-b05c-4950-b5b8-9af673e46521},0,-1,1
+600,nsIDOMSVGPathElement,{2b19e692-3338-440f-a998-3cb1e8474999},0,-1,1
+601,nsIHttpAuthenticator,{0f331436-8bc8-4c68-a124-d0253a19d06f},0,-1,1
+602,nsIPlugin,{0937fb08-16e8-4365-babf-88e09e4e33a4},0,-1,0
+603,nsICacheListener,{638c3848-778b-4851-8ff3-9400f65b8773},0,-1,1
+604,mozIStorageResultSet,{18dd7953-076d-4598-8105-3e32ad26ab24},0,-1,1
+605,mozIStorageValueArray,{07b5b93e-113c-4150-863c-d247b003a55d},0,-1,1
+606,nsIStreamCipher,{1d507cd6-1630-4710-af1b-4012dbcc514c},0,-1,1
+607,nsIProtocolProxyService2,{dbd9565d-29b1-437a-bff5-2fc339e2c5df},0,-1,1
+608,nsIDOMDocumentEvent,{46b91d66-28e2-11d4-ab1e-0010830123b4},0,-1,1
+609,nsICMSMessageErrors,{f2aec680-60a0-49f0-afe5-6cf1d3f15e0d},0,-1,1
+610,nsICrashReporter,{44650737-59f7-4c9b-adbe-2b6d4dfee86a},0,-1,1
+611,nsIXULAppInfo,{a61ede2a-ef09-11d9-a5ce-001124787b2e},0,-1,1
+612,nsIProxiedProtocolHandler,{0a24fed4-1dd2-11b2-a75c-9f8b9a8f9ba7},0,-1,1
+613,nsISupportsString,{d79dc970-4a1c-11d3-9890-006008962422},0,-1,1
+614,nsIDOMNSFeatureFactory,{dc5ba787-b648-4b01-a8e7-b293ffb044ef},0,-1,1
+615,nsISafeOutputStream,{5f914307-5c34-4e1f-8e32-ec749d25b27a},0,-1,1
+616,inIDeepTreeWalker,{91fca0e9-99d6-406b-9d78-4c96f11e9ee4},0,-1,1
+617,nsIComponentManager,{a88e5a60-205a-4bb1-94e1-2628daf51eae},0,-1,1
+618,nsIDocShellTreeItem,{09b54ec1-d98a-49a9-bc95-3219e8b55089},0,-1,1
+619,nsIDOMCSSFontFaceRule,{a6cf90bb-15b3-11d2-932e-00805f8add32},0,-1,1
+620,nsIPrincipal,{b8268b9a-2403-44ed-81e3-614075c92034},0,-1,1
+621,nsIAlertsService,{e177399e-2e31-4019-aed3-cba63ce9fa99},0,-1,1
+622,nsITaggingService,{e39cea60-7e6d-4c8b-80a3-997af1c2cbcb},0,-1,1
+623,nsIXMLHttpRequestEventTarget,{6ce0a193-b033-4c3d-b748-f851b09261f5},0,-1,1
+624,nsICMSMessage2,{a99a3203-39e3-45e1-909c-175b0e471c2b},0,-1,0
+625,nsIAutoCompleteMdbResult,{f7e7b341-2d5c-4d04-9f51-496cb2ce178c},0,-1,0
+626,nsIPrefBranch2,{74567534-eb94-4b1c-8f45-389643bfc555},0,-1,1
+627,nsIDOMDragEvent,{d52cf140-fb90-44df-8d69-4b2bab4d461f},0,-1,1
+628,inISearchObserver,{46226d9b-e398-4106-8d9b-225d4d0589f5},0,-1,1
+629,nsIDOMSVGAnimatedLength,{a52f0322-7f4d-418d-af6d-a7b14abd5cdf},0,-1,1
+630,nsIPasswordManager,{173562f0-2173-11d5-a54c-0010a401eb10},0,-1,1
+631,nsISupportsID,{d18290a0-4a1c-11d3-9890-006008962422},0,-1,1
+632,nsIRollupListener,{0ca103e5-80d4-4b81-a310-be0708f8eaa9},0,-1,0
+633,nsIResProtocolHandler,{067ca872-e947-4bd6-8946-a479cb6ba5dd},0,-1,1
+634,nsIServerSocketListener,{836d98ec-fee2-4bde-b609-abd5e966eabd},0,-1,1
+635,nsIAccessNode,{71a3b4e7-e83d-45cf-a20e-9ce292bcf19f},0,-1,1
+636,nsIDOMSVGPathSegCurvetoQuadraticAbs,{b7aef0f0-2830-4145-b04f-fe05789ccf8a},0,-1,1
+637,nsIWebNavigation,{f5d9e7b0-d930-11d3-b057-00a024ffc08c},0,-1,1
+638,nsISupportsPRInt64,{e3cb0ff0-4a1c-11d3-9890-006008962422},0,-1,1
+639,nsIXPCComponents_ID,{7994a6e0-e028-11d3-8f5d-0010a4e73d9a},0,-1,1
+640,nsITooltipTextProvider,{b128a1e6-44f3-4331-8fbe-5af360ff21ee},0,-1,1
+641,nsIXPCComponents_Classes,{978ff520-d26c-11d2-9842-006008962422},0,-1,1
+642,nsIFastLoadService,{759e475e-0c23-4dbf-b1b8-78c9369e3072},0,-1,1
+643,nsIObjectLoadingContent_MOZILLA_1_9_2_BRANCH,{f91247a2-fb8b-42d3-a9b6-8f1f49685c43},0,-1,1
+644,jsdIProperty,{4491ecd4-fb6b-43fb-bd6f-5d1473f1df24},0,-1,1
+645,nsIDOMHTMLDListElement,{a6cf909b-15b3-11d2-932e-00805f8add32},0,-1,1
+646,nsIWorkerGlobalScope,{c111e7d3-8044-4458-aa7b-637696ffb841},0,-1,1
+647,nsIDOMHTMLLegendElement,{a6cf9098-15b3-11d2-932e-00805f8add32},0,-1,1
+648,nsIAutoConfig,{80db54ae-13f2-11d5-be44-00108335a220},0,-1,0
+649,nsIDOMNSHTMLAreaElement2,{1859b16a-7c16-4ab7-bdb9-52792ba16cc1},0,-1,1
+650,nsIDOMSVGDefsElement,{a2e86036-f04c-4013-9f74-e7090a0aac0a},0,-1,1
+651,nsIBaseWindow,{046bc8a0-8015-11d3-af70-00a024ffc08c},0,-1,1
+652,nsIFastLoadFileControl,{8a1e2c63-af50-4147-af7e-26289dc180dd},0,-1,1
+653,nsIPrefService,{decb9cc7-c08f-4ea5-be91-a8fc637ce2d2},0,-1,1
+654,nsIDOMLSProgressEvent,{b9a2371f-70e9-4657-b0e8-28e15b40857e},0,-1,1
+655,nsIMicrosummaryGenerator,{05b48344-d0a7-427e-934e-9a6e0d5ecced},0,-1,1
+656,mozIStorageRow,{62d1b6bd-cbfe-4f9b-aee1-0ead4af4e6dc},0,-1,1
+657,nsIDOMGeoPosition,{23e5269f-4dd7-41c4-b52a-75918694c2de},0,-1,1
+658,nsIDOMSVGPathSeg,{b9022da7-e26d-4df3-8c94-b45c4aedda7c},0,-1,1
+659,fuelIBrowserTab,{3073ceff-777c-41ce-9ace-ab37268147c1},0,-1,1
+660,nsISSLCertErrorDialog,{0729ce8e-8935-4989-ba72-a2d6307f2365},0,-1,1
+661,nsIThreadJSContextStack,{a1339ae0-05c1-11d4-8f92-0010a4e73d9a},0,-1,0
+662,nsIScriptChannel,{33234b99-9588-4c7d-9da6-86b8b7cba565},0,-1,1
+663,nsIDOMBarProp,{9eb2c150-1d56-11d3-8221-0060083a0bcf},0,-1,1
+664,nsIPluginInstanceOwner,{c4ed03f3-498b-4045-97c7-0b05838f886c},0,-1,0
+665,nsIDOMStorageList,{a4e9b257-5ccf-4b17-8721-23ac45c83128},0,-1,1
+666,nsIHttpHeaderVisitor,{0cf40717-d7c1-4a94-8c1e-d6c9734101bb},0,-1,1
+667,fuelIAnnotations,{335c9292-91a1-4ca0-ad0b-07d5f63ed6cd},0,-1,1
+668,nsIWindowProvider,{5119ac7f-81dd-4061-96a7-71f2cf5efee4},0,-1,1
+669,nsIPrintSettingsService,{841387c8-72e6-484b-9296-bf6eea80d58a},0,-1,1
+670,nsIDOMSVGFEColorMatrixElement,{0e966878-ebf1-4455-86fd-f4c7b1f24777},0,-1,1
+671,nsIPKCS11,{5743f870-958e-4f02-aef2-c0afeef67f05},0,-1,1
+672,nsIDOMSVGFEFuncAElement,{fa48511c-283a-437f-9507-c309ac6f0f57},0,-1,1
+673,nsIObjectInputStream,{6c248606-4eae-46fa-9df0-ba58502368eb},0,-1,1
+674,nsIDOMSVGFETileElement,{ed042a81-39fc-4c89-9385-75758a2434b5},0,-1,1
+675,nsIDOMGetSVGDocument,{b5d3074c-4f63-4936-bf39-49034efa26a5},0,-1,1
+676,nsIDirIndex,{23bbabd0-1dd2-11b2-86b7-aad68ae7d7e0},0,-1,1
+677,nsIPasswordManagerInternal,{a448531f-dc92-4dc1-9012-da841febcbe0},0,-1,1
+678,nsIDOMNSHTMLHRElement,{19b5879f-c125-447c-aaaf-719de3ef221a},0,-1,1
+679,nsIDOMSVGFEFloodElement,{2743af95-28c5-429d-9812-12b7b017887e},0,-1,1
+680,nsIFormFillController,{07f0a0dc-f6e9-4cdd-a55f-56d770523a4c},0,-1,1
+681,nsIRecentBadCertsService,{a5ae8b05-a76e-408f-b0ba-02a831265749},0,-1,1
+682,nsICommandHandler,{34a4fcf0-66fc-11d4-9528-0020183bf181},0,-1,1
+683,nsIDOMHTMLObjectElement,{a6cf90ac-15b3-11d2-932e-00805f8add32},0,-1,1
+684,nsIDOMLocation,{a6cf906d-15b3-11d2-932e-00805f8add32},0,-1,1
+685,nsIViewSourceChannel,{8b77d6e2-2ae9-11d5-be57-000064657374},0,-1,0
+686,nsISyncLoadDOMService,{8095998d-ae1c-4cfa-9b43-0973e5d77eb0},0,-1,1
+687,nsIDOMXULDescriptionElement,{c7b0b43c-1dd1-11b2-9e1c-ce5f6a660630},0,-1,1
+688,nsIURL,{d6116970-8034-11d3-9399-00104ba0fd40},0,-1,1
+689,nsIMultiplexInputStream,{a076fd12-1dd1-11b2-b19a-d53b5dffaade},0,-1,1
+690,nsIClipboardCommands,{b8100c90-73be-11d2-92a5-00105a1b0d64},0,-1,1
+691,nsIThreadEventFilter,{a0605c0b-17f5-4681-b8cd-a1cd75d42559},0,-1,1
+692,nsIXPCSecurityManager,{31431440-f1ce-11d2-985a-006008962422},0,-1,0
+693,nsIDOMXULMenuListElement,{3d49950e-04f9-4e35-a9a0-ffd51356a674},0,-1,1
+694,nsIDocShellTreeNode,{37f1ab73-f224-44b1-82f0-d2834ab1cec0},0,-1,1
+695,nsIWebBrowserChrome,{ba434c60-9d52-11d3-afb0-00a024ffc08c},0,-1,1
+696,nsIFastLoadWriteControl,{2ad6e9e6-1379-4e45-a899-a54b27ff915c},0,-1,1
+697,nsITreeView,{c06dc4d3-63a2-4422-a0a3-5f2eddeca8c1},0,-1,1
+698,nsIHandlerApp,{8d298761-0963-4c90-99e2-6ea498825e82},0,-1,1
+699,nsIByteRangeRequest,{c1b1f426-7e83-4759-9f88-0e1b17f49366},0,-1,1
+700,nsIPrintStatusFeedback,{19855dff-3248-4902-b196-93ee4c477880},0,-1,1
+701,nsINetUtil,{a50d5516-5c0a-4f08-b427-703ca0c44ac3},0,-1,1
+702,nsPIPlacesDatabase,{8e6d4f8a-4b8e-4026-9fca-517c4494ddb7},0,-1,1
+703,nsIDOMRange,{a6cf90ce-15b3-11d2-932e-00805f8add32},0,-1,1
+704,nsIAccessibleStates,{7fe1ee90-edaa-43f1-9f3b-071099b51f08},0,-1,1
+705,nsIAtomService,{9c1f50b9-f9eb-42d4-a8cb-2c7600aeb241},0,-1,1
+706,nsIExceptionProvider,{0577744c-c1d2-47f2-8bcc-ce7a9e5a88fc},0,-1,1
+707,nsIDOMJSNavigator,{4b4f8316-1dd2-11b2-b265-9a857376d159},0,-1,1
+708,nsIScriptableDateFormat,{0c89efb0-1aae-11d3-9141-006008a6edf6},0,-1,1
+709,nsIDOM3EventTarget,{3e9c01a7-de97-4c3b-8294-b4bd9d7056d1},0,-1,1
+710,nsIDOMSVGAnimatedAngle,{c6ab8b9e-32db-464a-ae33-8691d44bc60a},0,-1,1
+711,nsIDOMXPathNSResolver,{75506f83-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
+712,nsIFTPChannel,{2315d831-8b40-446a-9138-fe09ebb1b720},0,-1,1
+713,nsIDOMCSSValueList,{8f09fa84-39b9-4dca-9b2f-db0eeb186286},0,-1,1
+714,nsIStackFrame,{91d82105-7c62-4f8b-9779-154277c0ee90},0,-1,1
+715,nsIDOMHTMLFontElement,{a6cf90a7-15b3-11d2-932e-00805f8add32},0,-1,1
+716,nsIEffectiveTLDService,{6852369e-baa9-4c9a-bbcd-5123fc54a297},0,-1,1
+717,imgIEncoder,{ba3a854b-fb8d-4881-8af9-5849df10e5e5},0,-1,1
+718,nsIToolkitChromeRegistry,{8727651c-9530-45a0-b81e-0e0690c30c50},0,-1,1
+719,nsIDOMSVGPathSegCurvetoQuadraticSmoothRel,{ac0b2007-04e4-4e70-a0e0-294f374b29c4},0,-1,1
+720,nsIPropertyBag,{bfcd37b0-a49f-11d5-910d-0010a4e73d9a},0,-1,1
+721,nsIFeedElementBase,{5215291e-fa0a-40c2-8ce7-e86cd1a1d3fa},0,-1,1
+722,nsIINIParserFactory,{ccae7ea5-1218-4b51-aecb-c2d8ecd46af9},0,-1,1
+723,nsIFormSigningDialog,{4fe04d6d-4b66-4023-a0bc-b43ce68b3e15},0,-1,1
+724,nsIDOMProgressEvent,{6af7022c-d7f8-414c-a11f-a7918f14052b},0,-1,1
+725,nsIAccessibleImage,{09086623-0f09-4310-ac56-c2cda7c29648},0,-1,1
+726,nsIWebBrowserSetup,{f15398a0-8018-11d3-af70-00a024ffc08c},0,-1,1
+727,nsITypeAheadFind,{0749a445-19d3-4eb9-9d66-78eca8c6f604},0,-1,1
+728,nsISSLStatusProvider,{8de811f0-1dd2-11b2-8bf1-e9aa324984b2},0,-1,1
+729,nsIProxyAutoConfig,{a42619df-0a1c-46fb-8154-0e9b8f8f1ea8},0,-1,1
+730,nsIMozIconURI,{1fb33f44-f522-4880-a225-4b75d09b04c6},0,-1,1
+731,nsIAuthPrompt2,{651395eb-8612-4876-8ac0-a88d4dce9e1e},0,-1,1
+732,nsIProfileChangeStatus,{2f977d43-5485-11d4-87e2-0010a4e75ef2},0,-1,1
+733,nsIDOMSVGComponentTransferFunctionElement,{cb615c0f-8d4a-4e30-9695-a3dd6f4216ee},0,-1,1
+734,nsISupportsArray,{791eafa0-b9e6-11d1-8031-006008159b5a},0,-1,1
+735,nsIThreadPoolListener,{ef194cab-3f86-4b61-b132-e5e96a79e5d1},0,-1,1
+736,nsIPromptFactory,{2532b748-75db-4732-9173-78d3bf34f694},0,-1,1
+737,nsIHttpActivityDistributor,{7c512cb8-582a-4625-b5b6-8639755271b5},0,-1,1
+738,nsIMemoryReporterManager,{7c62de18-1edd-40f8-9da2-a8c622763074},0,-1,1
+739,nsIWebBrowserPersist,{dd4e0a6a-210f-419a-ad85-40e8543b9465},0,-1,1
+740,nsIErrorService,{e72f94b2-5f85-11d4-9877-00c04fa0cf4a},0,-1,1
+741,nsIDOMCSSStyleSheet,{a6cf90c2-15b3-11d2-932e-00805f8add32},0,-1,1
+742,mozIPlacesAutoComplete,{a5ae8332-333c-412a-bb02-a35df8247714},0,-1,1
+743,nsIXULTemplateBuilder,{a583b676-5b02-4f9c-a0c9-cb850cb99818},0,-1,1
+744,nsIXPointerSchemeContext,{781f4aa1-ebb3-4667-b1c2-2b35e94c4281},0,-1,0
+745,nsISemanticUnitScanner,{9f620be4-e535-11d6-b254-00039310a47a},0,-1,1
+746,nsIAccessibleTableChangeEvent,{a9485c7b-5861-4695-8441-fab0235b205d},0,-1,1
+747,nsIDOMSVGTextPathElement,{5c29a76c-3489-48fe-b9ea-ea0f5b196dff},0,-1,1
+748,nsIDebug2,{9c9307ed-480a-4f2a-8f29-21378c03bcbc},0,-1,1
+749,nsIClientAuthDialogs,{fa4c7520-1433-11d5-ba24-00108303b117},0,-1,1
+750,nsIDOMBeforeUnloadEvent,{da19e9dc-dea2-4a1d-a958-9be375c9799c},0,-1,1
+751,nsIDOMNSHTMLElement,{7f142f9a-fba7-4949-93d6-cf08a974ac51},0,-1,1
+752,nsIDOMHTMLBodyElement,{a6cf908e-15b3-11d2-932e-00805f8add32},0,-1,1
+753,nsIEnumerator,{ad385286-cbc4-11d2-8cca-0060b0fc14a3},0,-1,1
+754,nsIBufferedInputStream,{616f5b48-da09-11d3-8cda-0060b0fc14a3},0,-1,1
+755,nsIX509CertList,{a539759b-e22d-462f-94ea-2915b11b33e8},0,-1,1
+756,nsICMSDecoder,{65244a06-a342-11d5-ba47-00108303b117},0,-1,0
+757,nsISMimeVerificationListener,{56310af6-dffc-48b4-abca-85eae4059064},0,-1,0
+758,nsIInputStreamChannel,{274c4d7a-2447-4ceb-a6de-80db1b83f5d2},0,-1,1
+759,nsISecurityInfoProvider,{b8cc9126-9319-4415-afd9-b82220d453ed},0,-1,1
+760,nsIDOMKeyEvent,{028e0e6e-8b01-11d3-aae7-0010838a3123},0,-1,1
+761,nsIGeolocationProvider,{701413ed-0f51-64f7-71c7-4369d8e07d6e},0,-1,1
+762,nsIDOMSVGForeignObjectElement,{fd9c9871-23fd-48eb-a65b-3842e9b0acbd},0,-1,1
+763,nsIDOMCSSUnknownRule,{a6cf90d0-15b3-11d2-932e-00805f8add32},0,-1,1
+764,nsICommandController,{ebe55080-c8a9-11d5-a73c-dd620d6e04bc},0,-1,1
+765,nsIIOService2,{d44fe6d4-ee35-4789-886a-eb8f0554d04e},0,-1,1
+766,nsIEditorBoxObject,{e3800a23-5b83-49aa-b18c-efa1ac5416e0},0,-1,1
+767,nsIPrintSession,{2f977d52-5485-11d4-87e2-0010a4e75ef2},0,-1,0
+768,nsIStreamTransportService,{8268d474-efbf-494f-a152-e8a8616f4e52},0,-1,1
+769,nsIDOMSVGFilterElement,{9e81d4ae-190c-4b9d-a076-ebc52a7bf231},0,-1,1
+770,nsIDownloadHistory,{202533cd-a8f1-4ee4-8d20-3a6a0d2c6c51},0,-1,1
+771,nsIDOMHTMLButtonElement,{a6cf9095-15b3-11d2-932e-00805f8add32},0,-1,1
+772,nsIDOMDataContainerEvent,{3600d66c-b9ac-4c22-b39a-d64cce619921},0,-1,1
+773,nsIDOMPaintRequestList,{01627136-fdd8-44b4-aac0-7d613608a3d4},0,-1,1
+774,nsIModuleLoader,{9b328e24-4d85-4a9c-9cb7-f25e66f430c3},0,-1,1
+775,nsIDOMNSHTMLInputElement,{2cb61f32-b21f-4b87-904c-8876d8bb5f33},0,-1,1
+776,nsIDOMSVGFEDistantLightElement,{02141672-7f2c-412a-a7d7-4caa194842e9},0,-1,1
+777,nsITransfer,{23c51569-e9a1-4a92-adeb-3723db82ef7c},0,-1,1
+778,nsIOfflineCacheUpdateObserver,{a28abeaf-a0b4-4440-b2fe-bc78249710ea},0,-1,1
+779,nsIDOMHTMLTableColElement,{a6cf90b4-15b3-11d2-932e-00805f8add32},0,-1,1
+780,nsIScriptEventManager,{b6427ace-dc77-495b-ab21-43baeb52bc27},0,-1,0
+781,mozIStorageProgressHandler,{a3a6fcd4-bf89-4208-a837-bf2a73afd30c},0,-1,1
+782,nsIDOMSVGPathSegCurvetoQuadraticRel,{c46eb661-9c05-4d46-9b2a-c2ae5b166060},0,-1,1
+783,nsIXMLHttpRequestUpload,{09ff3682-7759-4441-a765-f70e1a1fabcf},0,-1,1
+784,nsIDOMSVGTSpanElement,{4a23cb1f-cf1e-437e-9524-8756f7928b2e},0,-1,1
+785,nsIControllerContext,{47b82b60-a36f-4167-8072-6f421151ed50},0,-1,1
+786,nsIUrlClassifierStreamUpdater,{daf3038a-556c-47d3-a3d2-36caa9a762a0},0,-1,1
+787,nsIDOMSVGClipPathElement,{0c3f45a4-e6d0-44e7-a2f8-d128ecf1db9b},0,-1,1
+788,nsICertTree,{a8cd1c89-a901-4735-831b-7198b7b8b6b1},0,-1,1
+789,nsIUTF8StringEnumerator,{9bdf1010-3695-4907-95ed-83d0410ec307},0,-1,1
+790,nsIExpatSink,{f61c56b5-ea5b-42b4-ad3c-17416e72e238},0,-1,1
+791,nsIDocShell,{8adfb831-1053-4a19-884d-bcdad7277b4b},0,-1,1
+792,extIEvents,{3a8ec9d0-ab19-11db-abbd-0800200c9a66},0,-1,1
+793,nsIINIParser,{7eb955f6-3e78-4d39-b72f-c1bf12a94bce},0,-1,1
+794,nsIXBLAccessible,{3716eb86-166b-445b-a94a-9b522fee96e6},0,-1,1
+795,nsIDOMEventListener,{df31c120-ded6-11d1-bd85-00805f8ae3f4},0,-1,1
+796,nsPICertNotification,{42cd7162-ea4a-4088-9888-63ea5095869e},0,-1,0
+797,nsIPermission,{28f16d80-157b-11d5-a542-0010a401eb10},0,-1,1
+798,nsIDOMStorageObsolete,{18013cf9-b104-49cf-9484-c2a7a845457e},0,-1,1
+799,nsIEditorObserver,{a6cf9125-15b3-11d2-932e-00805f8add32},0,-1,1
+800,nsIPrefSecurityCheck,{c73c9a05-92ce-46e1-8f69-90a2a3a36104},0,-1,0
+801,nsICertVerificationListener,{6684bce9-50db-48e1-81b7-98102bf81357},0,-1,1
+802,nsIDOMMessageEvent,{98150805-6a15-4667-815a-1a8c87cb4bbc},0,-1,1
+803,nsIIOService,{bddeda3f-9020-4d12-8c70-984ee9f7935e},0,-1,1
+804,nsIDOMCanvasGradient,{bbb20a59-524e-4662-981e-5e142814b20c},0,-1,1
+805,nsIDOMEventGroup,{33347bee-6620-4841-8152-36091ae80c7e},0,-1,1
+806,nsISidebarExternal,{4350fb73-9305-41df-a669-11d26222d420},0,-1,1
+807,nsITooltipListener,{44b78386-1dd2-11b2-9ad2-e4eee2ca1916},0,-1,1
+808,nsIDOMNSHTMLTextAreaElement,{ca066b44-9ddf-11d3-bccc-0060b0fc76bd},0,-1,1
+809,nsIDOMSVGNumberList,{59364ec4-faf1-460f-bf58-e6a6a2769a3a},0,-1,1
+810,nsIAccessibleStateChangeEvent,{444db51a-05fd-4576-8a64-32dbb2a83884},0,-1,1
+811,nsIDOMSVGPathSegCurvetoQuadraticSmoothAbs,{ff5bbb58-b49a-450f-b91b-e50585c34b3d},0,-1,1
+812,nsISAXLexicalHandler,{23c26a56-adff-440c-8caf-95c2dc2e399b},0,-1,1
+813,nsISMimeCert,{66710f97-a4dd-49f1-a906-fe0ebc5924c0},0,-1,1
+814,nsIAppShellService,{361facd0-6e9a-4ff1-a0d4-450744cf0023},0,-1,1
+815,nsIDOMSVGPathSegArcRel,{49d0360d-bb66-4ab9-b9b0-f49b93398595},0,-1,1
+816,nsILoginInfo,{c41b7dff-6b9b-42fe-b78d-113051facb05},0,-1,1
+817,nsIDOMHTMLMetaElement,{a6cf908a-15b3-11d2-932e-00805f8add32},0,-1,1
+818,nsINavHistoryResultViewer,{af4ac418-a687-4775-8ffa-97c160196432},0,-1,1
+819,nsISaveAsCharset,{33b87f70-7a9c-11d3-915c-006008a6edf6},0,-1,1
+820,nsICMSSecureMessage,{14b4394a-1dd2-11b2-b4fd-ba4a194fe97e},0,-1,1
+821,nsIStringBundleService,{d85a17c0-aa7c-11d2-9b8c-00805f8a16d9},0,-1,1
+822,nsIXULOverlayProvider,{1d5b5b94-dc47-4050-93b7-ac092e383cad},0,-1,1
+823,nsIAuthModule,{6e35dbc0-49ef-4e2c-b1ea-b72ec64450a2},0,-1,0
+824,nsICommandHandlerInit,{731c6c50-67d6-11d4-9529-0020183bf181},0,-1,1
+825,nsINavHistoryResult,{d1562f6f-8d5a-4042-8524-72f747a51b18},0,-1,1
+826,nsIDOMDOMImplementation,{a6cf9074-15b3-11d2-932e-00805f8add32},0,-1,1
+827,nsIFastLoadFileIO,{715577db-d9c5-464a-a32e-0a40c29b22d4},0,-1,1
+828,nsICollation,{b0132cc0-3786-4557-9874-910d7def5f93},0,-1,1
+829,nsIDOMLSOutput,{757e9971-8890-478d-a53a-07f9f6f6e0d3},0,-1,1
+830,nsIGConfService,{5009acae-6973-48c3-b6d6-52c692cc5d9d},0,-1,1
+831,nsIDOMSVGAnimatedNumber,{716e3b11-b03b-49f7-b82d-5383922b0ab3},0,-1,1
+832,nsIProfileStartup,{048e5ca1-0eb7-4bb1-a9a2-a36f7d4e0e3c},0,-1,1
+833,nsIUUIDGenerator,{138ad1b2-c694-41cc-b201-333ce936d8b8},0,-1,1
+834,nsIControllerCommandGroup,{9f82c404-1c7b-11d5-a73c-eca43ca836fc},0,-1,1
+835,nsIXSLTProcessor,{4a91aeb3-4100-43ee-a21e-9866268757c5},0,-1,1
+836,nsIDialogParamBlock,{f76c0901-437a-11d3-b7a0-e35db351b4bc},0,-1,1
+837,nsISessionStore,{70592a0d-87d3-459c-8db7-dcb8d47af78e},0,-1,1
+838,nsIRDFBlob,{237f85a2-1dd2-11b2-94af-8122582fc45e},0,-1,1
+839,nsIDOMHTMLHeadElement,{a6cf9087-15b3-11d2-932e-00805f8add32},0,-1,1
+840,nsIXPCComponents_Exception,{5bf039c0-e028-11d3-8f5d-0010a4e73d9a},0,-1,1
+841,nsIASN1PrintableItem,{114e1142-1dd2-11b2-ac26-b6db19d9184a},0,-1,1
+842,nsIDOMNSHTMLButtonElement,{c914d7a4-63b3-4d40-943f-91a3c7ab0d4d},0,-1,1
+843,nsIDOMHTMLMapElement,{a6cf90af-15b3-11d2-932e-00805f8add32},0,-1,1
+844,nsISupportsDouble,{b32523a0-4ac0-11d3-baea-00805f8a5dd7},0,-1,1
+845,nsINSSErrorsService,{3a5c7a0f-f5da-4a8b-a748-d7c5a528f33b},0,-1,1
+846,nsIProtocolProxyCallback,{a9967200-f95e-45c2-beb3-9b060d874bfd},0,-1,1
+847,nsIApplicationCache,{663e2e2e-04a0-47b6-87b3-a122be46cb53},0,-1,1
+848,nsIXULSortService,{f29270c8-3be5-4046-9b57-945a84dff132},0,-1,1
+849,nsIUploadChannel2,{8821e259-7252-4464-b874-a55d8ef6b222},0,-1,1
+850,nsIDOMNSHTMLOptionCollection,{1181207b-2337-41a7-8ddf-fbe96461256f},0,-1,1
+851,nsIXULTreeBuilder,{06b31b15-ebf5-4e74-a0e2-6bc0a18a3969},0,-1,1
+852,nsIModifyableXPointerResult,{2dc3be2e-642d-4d7e-b3c5-f3dac51afbee},0,-1,0
+853,nsIHistoryEntry,{a41661d4-1417-11d5-9882-00c04fa02f40},0,-1,1
+854,nsIBrowserDOMWindow,{f9691a49-7fb3-4b54-bb11-a4f2e0b6eddb},0,-1,1
+855,nsIDOMXULImageElement,{f73f4d77-a6fb-4ab5-b41e-15045a0cc6ff},0,-1,1
+856,nsIAnnotationObserver,{63fe98e0-6889-4c2c-ac9f-703e4bc25027},0,-1,1
+857,nsIFileURL,{d26b2e2e-1dd1-11b2-88f3-8545a7ba7949},0,-1,1
+858,nsIFindService,{5060b801-340e-11d5-be5b-b3e063ec6a3c},0,-1,1
+859,nsIContentDispatchChooser,{456ca3b2-02be-4f97-89a2-08c08d3ad88f},0,-1,1
+860,nsIHandlerInfo,{325e56a7-3762-4312-aec7-f1fcf84b4145},0,-1,1
+861,nsIDOMHTMLOptionsCollection,{bce0213c-f70f-488f-b93f-688acca55d63},0,-1,1
+862,nsIDOMHTMLTableRowElement,{a6cf90b6-15b3-11d2-932e-00805f8add32},0,-1,1
+863,nsIClipboardHelper,{44073a98-1dd2-11b2-8600-d0ae854dbe93},0,-1,1
+864,nsIWebProgressListener,{570f39d1-efd0-11d3-b093-00a024ffc08c},0,-1,1
+865,nsIReadConfig,{ba5bc4c6-1dd1-11b2-bb89-b844c6ec0339},0,-1,0
+866,nsIUrlClassifierHashCompleter,{ade9b72b-3562-44f5-aba6-e63246be53ae},0,-1,1
+867,nsIDragService,{82b58ada-f490-4c3d-b737-1057c4f1d052},0,-1,1
+868,nsIDOMSVGException,{64e6f0e1-af99-4bb9-ab25-7e56012f0021},0,-1,1
+869,nsIDOMSVGTransformable,{b81f6e37-1842-4534-a546-1ab86e59a3c6},0,-1,1
+870,nsIDOMSVGFEMorphologyElement,{16154319-fb5f-4473-b360-5065b6096d33},0,-1,1
+871,nsILocale,{21035ee0-4556-11d3-91cd-00105aa3f7dc},0,-1,1
+872,nsIUpdateItem,{f559f340-5160-420f-abc8-19b251708e7e},0,-1,1
+873,nsICiter,{a6cf9102-15b3-11d2-932e-00805f8add32},0,-1,1
+874,nsIUrlClassifierUpdateObserver,{bbb33c65-e783-476c-8db0-6ddb91826c07},0,-1,1
+875,nsIXSLTException,{e06dfaea-92d5-47f7-a800-c5f5404d8771},0,-1,1
+876,nsIFormHistoryImporter,{9e811188-6a5b-4d96-a92d-1bac66a41898},0,-1,1
+877,nsISAXDTDHandler,{4d01f225-6cc5-11da-be43-001422106990},0,-1,1
+878,nsILivemarkService,{62a5fe00-d85c-4a63-aef7-176d8f1b189d},0,-1,1
+879,nsIDOMSVGDocument,{12d3b664-1dd2-11b2-a7cf-ceee7e90f396},0,-1,1
+880,nsIDOMHTMLLIElement,{a6cf909e-15b3-11d2-932e-00805f8add32},0,-1,1
+881,nsIDOMParserJS,{ba6bcd6c-63d8-49b3-bc8a-1e5e895645bc},0,-1,1
+882,nsIDOMHTMLUListElement,{a6cf9099-15b3-11d2-932e-00805f8add32},0,-1,1
+883,nsIDOMXULContainerElement,{bc07c626-4294-43ae-9b0a-e726de0adcad},0,-1,1
+884,nsIClipboardOwner,{5a31c7a1-e122-11d2-9a57-000064657374},0,-1,1
+885,nsIDOMSimpleGestureEvent,{cb68e879-f710-415d-a871-9a550860df01},0,-1,1
+886,nsIScriptableInterfaces,{01c78c65-31da-456b-90bf-da39d09fdcbf},0,-1,1
+887,nsIURI,{07a22cc0-0ce5-11d3-9331-00104ba0fd40},0,-1,1
+888,nsIDOMSVGMatrix,{ec2da3ef-5a99-49ed-aaef-b5af916c14ac},0,-1,1
+889,nsIChannelClassifier,{1481c5b5-9f6e-4995-8fe3-2aad5c06440d},0,-1,1
+890,nsIDOMHTMLTableElement,{a6cf90b2-15b3-11d2-932e-00805f8add32},0,-1,1
+891,nsIDOMSVGEvent,{13aed1cc-a505-45d5-bbc2-0052c6bf200f},0,-1,1
+892,nsIContextMenuListener2,{7fb719b3-d804-4964-9596-77cf924ee314},0,-1,1
+893,nsIIOUtil,{e8152f7f-4209-4c63-ad23-c3d2aa0c5a49},0,-1,1
+894,nsISimpleStreamListener,{a9b84f6a-0824-4278-bae6-bfca0570a26e},0,-1,1
+895,nsIDOMWindowUtils,{6a60fde5-a00a-4732-bbea-2787c174c04f},0,-1,1
+896,nsIDOMXULPopupElement,{c32390a8-2bd8-4d1b-bf9f-1b1d0a944d19},0,-1,1
+897,nsIDOMNSMouseEvent,{1b8e528d-7dca-44ee-8ee6-c44594ebcef1},0,-1,1
+898,mozIStorageBindingParamsArray,{e676e1a3-1dc6-4802-ac03-291fa9de7f93},0,-1,1
+899,nsICacheService,{de114eb4-29fc-4959-b2f7-2d03eb9bc771},0,-1,1
+900,nsIFileView,{60b320d2-1dd2-11b2-bd73-dc3575f78ddd},0,-1,1
+901,nsIConsoleService,{883472a0-ea9b-11da-8ad9-0800200c9a66},0,-1,1
+902,nsIDocShellTreeOwner,{bc0eb30e-656e-491e-a7ae-7f460b660c8d},0,-1,1
+903,nsIDOMHTMLOListElement,{a6cf909a-15b3-11d2-932e-00805f8add32},0,-1,1
+904,nsIContextMenuListener,{3478b6b0-3875-11d4-94ef-0020183bf181},0,-1,1
+905,nsIExceptionManager,{efc9d00b-231c-4feb-852c-ac017266a415},0,-1,1
+906,nsIDOMSVGViewSpec,{ede34b03-57b6-45bf-a259-3550b5697286},0,-1,1
+907,nsINativeTreeView,{38e0b44d-fa08-458c-83fb-3e10b12aeb45},0,-1,0
+908,nsIPluginTagInfo,{6d827df5-b5cd-416c-85cb-3cdd05c7aed1},0,-1,0
+909,nsIInlineSpellChecker,{07be036a-2355-4a92-b150-5c9b7e9fdf2f},0,-1,1
+910,nsIDOMSVGFEOffsetElement,{c080f191-b22c-4fc0-85d5-a79dc3fa7ec8},0,-1,1
+911,nsIJSRuntimeService,{e7d09265-4c23-4028-b1b0-c99e02aa78f8},0,-1,0
+912,nsIHelperAppLauncherDialog,{f3704fdc-8ae6-4eba-a3c3-f02958ac0649},0,-1,1
+913,xpcIJSModuleLoader,{89da3673-e699-4f26-9ed7-11a528011434},0,-1,1
+914,nsIPluginTag,{13a1b39e-72e5-442d-aa73-5905ffaf837b},0,-1,1
+915,nsIRDFInt,{e13a24e3-c77a-11d2-80be-006097b76b8e},0,-1,1
+916,nsIRDFInferDataSource,{2b04860f-4017-40f6-8a57-784a1e35077a},0,-1,1
+917,nsIDOMSVGCircleElement,{0f89f2a4-b168-4602-90f5-1874418c0a6a},0,-1,1
+918,nsIServerSocket,{a5b64be0-d563-46bb-ae95-132e46fcd42f},0,-1,1
+919,nsIProperty,{6dcf9030-a49f-11d5-910d-0010a4e73d9a},0,-1,1
+920,nsIDOMStyleSheetList,{a6cf9081-15b3-11d2-932e-00805f8add32},0,-1,1
+921,nsIDNSRecord,{31c9c52e-1100-457d-abac-d2729e43f506},0,-1,1
+922,nsIDOMSVGPathSegCurvetoCubicSmoothRel,{dd5b4b00-edaa-493a-b477-bbc2576b4a98},0,-1,1
+923,nsIDOMCSSCharsetRule,{19fe78cc-65ff-4b1d-a5d7-9ea89692cec6},0,-1,1
+924,nsILoginManagerStorage,{e66c97cd-3bcf-4eee-9937-38f650372d77},0,-1,1
+925,nsIPrefetchService,{cba513eb-c457-4b93-832c-1a979e66edd1},0,-1,1
+926,nsIDOMNSDocumentStyle,{26311d10-7e24-4c7b-bb3d-17aad86f4d88},0,-1,1
+927,nsIObjectOutputStream,{92c898ac-5fde-4b99-87b3-5d486422094b},0,-1,1
+928,nsIDOMSVGAnimatedRect,{ca45959e-f1da-46f6-af19-1ecdc322285a},0,-1,1
+929,nsIDOMHTMLLabelElement,{a6cf9096-15b3-11d2-932e-00805f8add32},0,-1,1
+930,nsIResumableChannel,{4ad136fa-83af-4a22-a76e-503642c0f4a8},0,-1,1
+931,nsIScriptLoaderObserver,{7b787204-76fb-4764-96f1-fb7a666db4f4},0,-1,1
+932,nsIHttpChannelInternal,{0eb66361-faaa-4e52-8c7e-6c25f11f8e3c},0,-1,1
+933,nsICollationFactory,{04971e14-d6b3-4ada-8cbb-c3a13842b349},0,-1,1
+934,nsIXPointerResult,{d3992637-f474-4b65-83ed-323fe69c60d2},0,-1,1
+935,nsITXTToHTMLConv,{933355f6-1dd2-11b2-a9b0-d335b9e35983},0,-1,1
+936,mozIStorageError,{1f350f96-7023-434a-8864-40a1c493aac1},0,-1,1
+937,nsIRequestObserverProxy,{7df8845f-938a-4437-9ea4-b11b850048f1},0,-1,1
+938,nsIWorkerNavigator,{74fb665a-e477-4ce2-b3c6-c58b1b28b6c3},0,-1,1
+939,nsISAXXMLReader,{5556997e-d816-4218-8b54-803d4261206e},0,-1,1
+940,nsIDOMLSResourceResolver,{9e61c7c8-8698-4477-9971-0923513919bd},0,-1,1
+941,nsIWritablePropertyBag,{96fc4671-eeb4-4823-9421-e50fb70ad353},0,-1,1
+942,nsIDownloadManager,{bacca1ac-1b01-4a6f-9e91-c2ead1f7d2c0},0,-1,1
+943,nsIDOM3Document,{2e0e9ea1-72ab-4d9e-bdeb-ca64e1abeba4},0,-1,1
+944,nsIDOMPageTransitionEvent,{b712418b-376f-4f75-b156-5d9ad99fe51f},0,-1,1
+945,nsIArray,{114744d9-c369-456e-b55a-52fe52880d2d},0,-1,1
+946,nsIDOMDocumentView,{1acdb2ba-1dd2-11b2-95bc-9542495d2569},0,-1,1
+947,nsIOfflineCacheUpdate,{877261bb-b952-4d27-847e-859bdd47c0ec},0,-1,1
+948,nsIAccessibleRetrieval,{244e4c67-a1d3-44f2-9cab-cdaa31b68046},0,-1,1
+949,nsIDOMMimeTypeArray,{f6134683-f28b-11d2-8360-c90899049c3c},0,-1,1
+950,nsISidebar,{67cf6231-c303-4f7e-b9b1-a0e87772ecfd},0,-1,1
+951,nsIEntityConverter,{d14c7111-55e0-11d3-91d9-00105aa3f7dc},0,-1,1
+952,nsIMutableArray,{af059da0-c85b-40ec-af07-ae4bfdc192cc},0,-1,1
+953,nsIDOMCSS2Properties,{529b987a-cb21-4d58-99d7-9586e7662801},0,-1,1
+954,nsIHashable,{17e595fa-b57a-4933-bd0f-b1812e8ab188},0,-1,1
+955,nsIDOMGeoPositionAddress_MOZILLA_1_9_2_BRANCH,{98808deb-c8e4-422c-ba97-08bf2031464c},0,-1,1
+956,nsIDOMNSUIEvent,{72c9f79c-98cd-4224-a467-86b59c0a38f7},0,-1,1
+957,fuelIBookmark,{808585b6-7568-4b26-8c62-545221bf2b8c},0,-1,1
+958,nsIDOMSVGMarkerElement,{6a3b7b40-e65a-4e9c-9ee7-ca03ed0a18c7},0,-1,1
+959,nsIDOMDOMConstructor,{0ccbcf19-d1b4-489e-984c-cd8c43672bb9},0,-1,1
+960,nsIDOMUIEvent,{a6cf90c3-15b3-11d2-932e-00805f8add32},0,-1,1
+961,nsIRDFResource,{fb9686a7-719a-49dc-9107-10dea5739341},0,-1,1
+962,nsIDOMFileException,{b52356e1-45c5-4d61-b61a-fb9bd91690e1},0,-1,1
+963,nsIXULTemplateResult,{ebea0230-36fa-41b7-8e31-760806057965},0,-1,1
+964,nsIDOMSVGLength,{2596325c-aed0-487e-96a1-0a6d589b9c6b},0,-1,1
+965,imgIContainerObserver,{e214c295-4b8e-4aa9-9907-45289e57295b},0,-1,1
+966,nsIDOMCSSRule,{a6cf90c1-15b3-11d2-932e-00805f8add32},0,-1,1
+967,nsIDOMSVGPreserveAspectRatio,{7ae42f27-4799-4e7c-86c6-e1dae6ad5157},0,-1,1
+968,nsIEditorDocShell,{3bdb8f01-f141-11d4-a73c-fba4aba8a3fc},0,-1,1
+969,nsIDocumentCharsetInfo,{2d40b291-01e1-11d4-9d0e-0050040007b2},0,-1,1
+970,nsIConsoleListener,{eaaf61d6-1dd1-11b2-bc6e-8fc96480f20d},0,-1,1
+971,nsIProgrammingLanguage,{ea604e90-40ba-11d5-90bb-0010a4e73d9a},0,-1,1
+972,nsIDOMNSHTMLImageElement,{a6cf90c7-15b3-11d2-932e-00805f8add32},0,-1,1
+973,nsIUnicharStreamLoader,{9037f476-7c08-4729-b690-3e425269802b},0,-1,1
+974,nsIFrameLoaderOwner,{641c2d90-4ada-4367-bdb1-80831614161d},0,-1,1
+975,nsIDOMHTMLAreaElement,{a6cf90b0-15b3-11d2-932e-00805f8add32},0,-1,1
+976,nsIKeyObject,{4b31f4ed-9424-4710-b946-79b7e33cf3a8},0,-1,1
+977,nsIMIMEService,{5b3675a1-02db-4f8f-a560-b34736635f47},0,-1,1
+978,nsIDOMWindow2,{73c5fa35-3add-4c87-a303-a850ccf4d65a},0,-1,1
+979,nsIDOMWindow,{a6cf906b-15b3-11d2-932e-00805f8add32},0,-1,1
+980,nsPISocketTransportService,{83123036-81c0-47cb-8d9c-bd85d29a1b3f},0,-1,1
+981,nsIDOMGeoPositionOptions,{453b72de-ea90-4f09-ae16-c2e7ee0dddc4},0,-1,1
+982,nsIURLFormatter,{4ab31d30-372d-11db-a98b-0800200c9a66},0,-1,1
+983,nsICacheEntryInfo,{fab51c92-95c3-4468-b317-7de4d7588254},0,-1,1
+984,imgIContainer,{1bcf7a25-1356-47a8-bf80-e284989ea38f},0,-1,1
+985,nsIDOMSVGPolylineElement,{7b6e15cf-9793-41ee-adcc-cc1c206c80e6},0,-1,1
+986,nsPIWindowWatcher,{8624594a-28d7-4bc3-8d12-b1c2b9eefd90},0,-1,0
+987,nsIFeedResult,{7a180b78-0f46-4569-8c22-f3d720ea1c57},0,-1,1
+988,nsIDOMPaintRequest,{4802360b-f1c0-4d84-bb9e-9d2ccb9de461},0,-1,1
+989,nsIDOMSVGSVGElement,{83b04425-9509-49f5-af75-1ae1f8f3e871},0,-1,1
+990,nsIFormSubmitObserver,{0787d64a-44bf-4273-8438-61ff13ebec0c},0,-1,1
+991,nsIDOMUserDataHandler,{91afebdd-a201-4db0-b728-9d59580f0cfd},0,-1,1
+992,nsIDOMXULTreeElement,{1f8111b2-d44d-4d11-845a-a70ae06b7d04},0,-1,1
+993,nsIDOMSVGTextContentElement,{87ad94bc-07c9-412b-b2d8-de245a2e84a5},0,-1,1
+994,nsIDOM3Node,{29fb2a18-1dd2-11b2-8dd9-a6fd5d5ad12f},0,-1,1
+995,nsIDirectoryServiceProvider2,{2f977d4b-5485-11d4-87e2-0010a4e75ef2},0,-1,1
+996,nsIWebPageDescriptor,{6f30b676-3710-4c2c-80b1-0395fb26516e},0,-1,1
+997,nsINetworkLinkService,{61618a52-ea91-4277-a4ab-ebe10d7b9a64},0,-1,1
+998,nsIDOMHTMLParamElement,{a6cf90ad-15b3-11d2-932e-00805f8add32},0,-1,1
+999,jsdIValue,{9cab158f-dc78-41dd-9d11-79e05cb3f2bd},0,-1,1
+1000,nsIDOMSVGFESpotLightElement,{5515dd05-3d9d-4d6c-8460-a04aaf5afe15},0,-1,1
+1001,jsdIScript,{18e09893-f461-4b4b-94d3-776fb0069c6f},0,-1,1
+1002,nsIFaviconService,{66f6b992-e2d3-43da-ba2a-d966e34a7654},0,-1,1
+1003,nsIClassInfo,{986c11d0-f340-11d4-9075-0010a4e73d9a},0,-1,1
+1004,nsIDOMFileError,{4bdafb64-15e2-49c1-a090-4315a7884a56},0,-1,1
+1005,nsISOCKSSocketInfo,{8f755c44-1dd2-11b2-a613-91117453fa95},0,-1,1
+1006,nsISupportsPriority,{aa578b44-abd5-4c19-8b14-36d4de6fdc36},0,-1,1
+1007,nsIKeyObjectFactory,{264eb54d-e20d-49a0-890c-1a5986ea81c4},0,-1,1
+1008,nsIWifiListener,{bcd4bede-f4a5-4a62-9071-d7a60174e376},0,-1,1
+1009,nsIInputStream,{fa9c7f6c-61b3-11d4-9877-00c04fa0cf4a},0,-1,1
+1010,nsISecurityCheckedComponent,{0dad9e8c-a12d-4dcb-9a6f-7d09839356e1},0,-1,1
+1011,nsIDOMSVGAnimatedPoints,{ebf334b3-86ef-4bf3-8a92-d775c72defa4},0,-1,1
+1012,nsIDOMHTMLFormElement,{a6cf908f-15b3-11d2-932e-00805f8add32},0,-1,1
+1013,nsIDOMCanvasRenderingContext2D,{3e7d5d06-8846-4cff-8739-44756cbf494f},0,-1,1
+1014,nsIScriptableInterfacesByID,{c99cffac-5aed-4267-ad2f-f4a4c9d4a081},0,-1,1
+1015,nsIConverterOutputStream,{4b71113a-cb0d-479f-8ed5-01daeba2e8d4},0,-1,1
+1016,nsIDOMViewCSS,{0b9341f3-95d4-4fa4-adcd-e119e0db2889},0,-1,1
+1017,nsIEnvironment,{101d5941-d820-4e85-a266-9a3469940807},0,-1,1
+1018,nsIUpdatePatch,{56863a67-bd69-42de-9f40-583e625b457d},0,-1,1
+1019,nsITreeColumns,{f8a8d6b4-6788-438d-9009-7142798767ab},0,-1,1
+1020,nsIDOMHTMLHtmlElement,{a6cf9086-15b3-11d2-932e-00805f8add32},0,-1,1
+1021,nsIHttpProtocolHandler,{415d4087-79d3-40fe-b194-0ada8471f895},0,-1,1
+1022,nsIDOMSVGUnitTypes,{154b572f-3d0b-49c0-8b5d-8864d05bd3d1},0,-1,1
+1023,nsIImageLoadingContent,{e036857e-3417-4812-a5f2-89668a616781},0,-1,1
+1024,nsIRDFXMLSerializer,{8ae1fbf8-1dd2-11b2-bd21-d728069cca92},0,-1,1
+1025,nsICookie,{e9fcb9a4-d376-458f-b720-e65e7df593bc},0,-1,1
+1026,nsICMSEncoder,{a15789aa-8903-462b-81e9-4aa2cff4d5cb},0,-1,0
+1027,nsISelectElement,{35bd8ed5-5f34-4126-8c4f-38ba01681836},0,-1,1
+1028,nsIAddonRepository,{c4d2ac29-6edc-43cd-8dc8-e4cf213aa1be},0,-1,1
+1029,extIEventListener,{2dfe3a50-ab2f-11db-abbd-0800200c9a66},0,-1,1
+1030,nsIRDFContainer,{d4214e90-fb94-11d2-bdd8-00104bde6048},0,-1,1
+1031,nsIXPIInstallInfo,{5a4a775c-e452-4cf2-8ff8-d327ae24aec6},0,-1,1
+1032,nsINavBookmarksService,{3b6ff5c5-0ab4-4aab-b1be-d569763a6ce0},0,-1,1
+1033,nsIThreadManager,{056216f5-8803-46b4-9199-d95bc1f0446f},0,-1,1
+1034,nsIDOMLinkStyle,{24d89a65-f598-481e-a297-23cc02599bbd},0,-1,1
+1035,nsIDOMSVGPoint,{45f18f8f-1315-4447-a7d5-8aeca77bdcaf},0,-1,1
+1036,nsIXMLHttpRequest,{ad78bf21-2227-447e-8ed5-824a017c265f},0,-1,1
+1037,nsISupportsCString,{d65ff270-4a1c-11d3-9890-006008962422},0,-1,1
+1038,nsIDebug,{3bf0c3d7-3bd9-4cf2-a971-33572c503e1e},0,-1,1
+1039,IDispatch,{00020400-0000-0000-c000-000000000046},0,-1,1
+1040,nsIEntropyCollector,{6f883680-ab9d-11d4-9978-00b0d02354a0},0,-1,0
+1041,nsIDOMEvent,{a66b7b80-ff46-bd97-0080-5f8ae38add32},0,-1,1
+1042,nsIFeedResultListener,{4d2ebe88-36eb-4e20-bcd1-997b3c1f24ce},0,-1,1
+1043,nsIDOMTreeWalker,{400af3ca-1dd2-11b2-a50a-887ecca2e63a},0,-1,1
+1044,inICSSValueSearch,{e0d39e48-1dd1-11b2-81bd-9a0c117f0736},0,-1,1
+1045,nsIProcess,{3c09efde-5f49-42b8-8520-57be02a5f84e},0,-1,1
+1046,nsIWindowCreator,{30465632-a777-44cc-90f9-8145475ef999},0,-1,1
+1047,nsIScriptSecurityManager_1_9_2,{8229dd23-47c5-4601-a80b-0166d595a21e},0,-1,1
+1048,nsIDOMDocumentXBL,{1a38762b-4da5-4f61-80fb-9317e198cb92},0,-1,1
+1049,nsIObserverService,{d07f5192-e3d1-11d2-8acd-00105a1b8860},0,-1,1
+1050,nsIApplicationCacheService,{611161c8-37d0-450f-a4fe-457c47bbaf64},0,-1,1
+1051,nsIDBusHandlerApp,{1ffc274b-4cbf-4bb5-a635-05ad2cbb6534},0,-1,1
+1052,nsIDOMHTMLFrameSetElement,{a6cf90b8-15b3-11d2-932e-00805f8add32},0,-1,1
+1053,nsICertOverrideService,{31738d2a-77d3-4359-84c9-4be2f38fb8c5},0,-1,1
+1054,nsIPipe,{f4211abc-61b3-11d4-9877-00c04fa0cf4a},0,-1,1
+1055,nsINavHistoryBatchCallback,{5143f2bb-be0a-4faf-9acb-b0ed3f82952c},0,-1,1
+1056,nsIFactory,{00000001-0000-0000-c000-000000000046},0,-1,1
+1057,nsILoadContext,{314d8a54-1caf-4721-94d7-f6c82d9b82ed},0,-1,1
+1058,nsIProtectedAuthThread,{4bb27cb7-8984-4cee-8ce7-9b014c3d091b},0,-1,1
+1059,nsIFIXptrEvaluator,{50d28211-8fb8-4323-b93d-08a6e80e559e},0,-1,0
+1060,nsISupportsPRTime,{e2563630-4a1c-11d3-9890-006008962422},0,-1,1
+1061,nsIDOMSVGStopElement,{93169940-7663-4eab-af23-94a8a08c2654},0,-1,1
+1062,inISearchProcess,{d5fa765b-2448-4686-b7c1-5ff13acb0fc9},0,-1,1
+1063,nsIDOMSVGRect,{5b912111-c10e-498f-a44c-c713c1843007},0,-1,1
+1064,nsISecurityPref,{94afd973-8045-4c6c-89e6-75bdced4209e},0,-1,0
+1065,nsIFeedTextConstruct,{fc97a2a9-d649-4494-931e-db81a156c873},0,-1,1
+1066,nsIIncrementalDownload,{6687823f-56c4-461d-93a1-7f6cb7dfbfba},0,-1,1
+1067,nsIDocShellHistory,{89caa9f0-8b1c-47fb-b0d3-f0aef0bff749},0,-1,1
+1068,nsICacheSession,{ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e},0,-1,1
+1069,txIFunctionEvaluationContext,{0ecbb00c-6a78-11d9-9791-000a95dc234c},0,-1,1
+1070,nsIDOMHTMLEmbedElement,{123f90ab-15b3-11d2-456e-00805f8add32},0,-1,1
+1071,nsIDOMHTMLAnchorElement,{a6cf90aa-15b3-11d2-932e-00805f8add32},0,-1,1
+1072,nsICharsetConverterManager,{f5323a76-c8f7-4c65-8d0c-1250e969c7d5},0,-1,1
+1073,nsIApplicationCacheNamespace,{96e4c264-2065-4ce9-93bb-43734c62c4eb},0,-1,1
+1074,nsIProfileMigrator,{24ce8b9d-b7ff-4279-aef4-26e158f03e34},0,-1,1
+1075,nsIRDFPropagatableDataSource,{5a9b4770-9fcb-4307-a12e-4b6708e78b97},0,-1,1
+1076,mozISpellI18NUtil,{b075d5dc-1df1-441a-bebf-680d8caaa19c},0,-1,1
+1077,nsIGlobalHistory3,{24306852-c60e-49c3-a455-90f6747118ba},0,-1,1
+1078,nsIScriptEventHandler,{375f787f-8d3a-4344-b540-293d5645c22c},0,-1,0
+1079,nsIDOMChromeWindow,{09b86cbd-9784-4fe4-9be6-70b9bbca3a9c},0,-1,1
+1080,nsISupports,{00000000-0000-0000-c000-000000000046},0,-1,1
+1081,nsIFileProtocolHandler,{1fb25bd5-4354-4dcd-8d97-621b7b3ed2e4},0,-1,1
+1082,nsILoginManagerIEMigrationHelper,{8a59ea3d-b8d0-48af-a3e2-63e27a02cde7},0,-1,1
+1083,nsIMicrosummarySet,{7111e88d-fecd-4b17-b7a9-1fa74e23153f},0,-1,1
+1084,nsIFeedEntry,{31bfd5b4-8ff5-4bfd-a8cb-b3dfbd4f0a5b},0,-1,1
+1085,nsIDragSession_1_9_2,{fde41f6a-c710-46f8-a0a8-1ff76ca4ff57},0,-1,1
+1086,nsIURIClassifierCallback,{8face46e-0c96-470f-af40-0037dcd797bd},0,-1,1
+1087,nsIXPCComponents_Constructor,{88655640-e028-11d3-8f5d-0010a4e73d9a},0,-1,1
+1088,nsIXPCException,{cac29630-7bf2-4e22-811b-46855a7d5af0},0,-1,1
+1089,nsIRDFXMLSinkObserver,{eb1a5d30-ab33-11d2-8ec6-00805f29f370},0,-1,1
+1090,nsIDOMLSSerializer,{96ea4792-d362-4c28-a8c2-0337790d648a},0,-1,1
+1091,nsIDownloadProgressListener,{7acb07ea-cac2-4c15-a3ad-23aaa789ed51},0,-1,1
+1092,nsIOutputIterator,{7330650e-1dd2-11b2-a0c2-9ff86ee97bed},0,-1,1
+1093,nsIPluginStreamInfo,{3a5fa31d-1ac1-4ea7-b7a6-dc9db0000b79},0,-1,0
+1094,nsIDOMHTMLQuoteElement,{a6cf90a3-15b3-11d2-932e-00805f8add32},0,-1,1
+1095,nsIPlacesTransactionsService,{32eee5da-2bc7-4d18-8a54-a8ff0dec4d2a},0,-1,1
+1096,nsIX509Cert2,{5b62c61c-f898-4dab-8ace-51109bb459b4},0,-1,1
+1097,nsIFeedResultService,{950a829e-c20e-4dc3-b447-f8b753ae54da},0,-1,1
+1098,nsIMarkupDocumentViewer,{40b2282a-a882-4483-a634-dec468d88377},0,-1,1
+1099,txINodeSet,{15d424c0-6b47-11d9-9791-000a95dc234c},0,-1,1
+1100,nsIDOMSVGFEMergeNodeElement,{540c3447-4b07-4bd3-84df-30f66b68df14},0,-1,1
+1101,nsIAccelerometer,{4b04e228-0b33-43fc-971f-af60cedb1c21},0,-1,1
+1102,nsIDOMSVGPathSegMovetoAbs,{30cf7749-bf1f-4f9c-9558-8ee24da3a22c},0,-1,1
+1103,nsIScriptableInputStream,{a2a32f90-9b90-11d3-a189-0050041caf44},0,-1,1
+1104,nsIDOMLSInput,{165e7f61-5048-4c2c-b4bf-6b44bb617ee4},0,-1,1
+1105,nsIContentURIGrouper,{4bb38cb4-c3cb-4d17-9799-1b3132b39723},0,-1,1
+1106,nsIAutoCompleteResult,{d2fcba9a-3f5c-40fc-a9fc-4adc87dc61ef},0,-1,1
+1107,nsIScriptableUnicodeConverter,{1ea19c6c-c59f-4fd7-9fc7-151e946baca0},0,-1,1
+1108,nsIEditorIMESupport,{57032dcb-e8c7-4eb6-8ec6-a0f8e300809d},0,-1,1
+1109,nsISelection2,{5d21d5fe-3691-4716-a334-4691eea54d29},0,-1,1
+1110,nsIDOMHTMLHeadingElement,{a6cf90a2-15b3-11d2-932e-00805f8add32},0,-1,1
+1111,nsIWebNavigationInfo,{62a93afb-93a1-465c-84c8-0432264229de},0,-1,1
+1112,nsIAccessibleDocument,{b7ae45bd-21e9-4ed5-a67e-86448b25d56b},0,-1,1
+1113,nsIStreamListener,{1a637020-1482-11d3-9333-00104ba0fd40},0,-1,1
+1114,nsIOutputStreamCallback,{40dbcdff-9053-42c5-a57c-3ec910d0f148},0,-1,1
+1115,jsdIScriptEnumerator,{5ba76b99-acb1-4ed8-a4e4-a716a7d9097e},0,-1,1
+1116,nsIWebProgress,{570f39d0-efd0-11d3-b093-00a024ffc08c},0,-1,1
+1117,nsIBoxObject,{ce572460-b0f2-4650-a9e7-c53a99d3b6ad},0,-1,1
+1118,nsIXULChromeRegistry,{2860e205-490e-4b06-90b6-87160d35a5a7},0,-1,1
+1119,nsIScreenManager,{b92319e6-9a84-4ca7-a2cc-eec22ea9854e},0,-1,1
+1120,nsIUpdateTimerManager,{0765c92c-6145-4253-9db4-594d8023087e},0,-1,1
+1121,nsIJSCID,{26b2a374-6eaf-46d4-acaf-1c6be152d36b},0,-1,1
+1122,nsIDOMNSElement,{c9da11bc-32d4-425e-a91f-7e0939c39251},0,-1,1
+1123,nsIHttpChannel,{9277fe09-f0cc-4cd9-bbce-581dd94b0260},0,-1,1
+1124,txIEXSLTRegExFunctions,{c180e993-aced-4839-95a0-ecd5ff138be9},0,-1,1
+1125,nsIPrinterEnumerator,{5e738fff-404c-4c94-9189-e8f2cce93e94},0,-1,1
+1126,mozISpellI18NManager,{aeb8936f-219c-4d3c-8385-d9382daa551a},0,-1,1
+1127,nsIPluginInstance,{67d606f4-1d6d-4fe2-a2d6-10bda65788e1},0,-1,0
+1128,nsIIdleService,{cc52f19a-63ae-4a1c-9cc3-e79eace0b471},0,-1,1
+1129,nsIDownload,{c891111e-92a6-47b8-bc46-874ebb61ac9d},0,-1,1
+1130,nsIObjectLoadingContent,{90ab443e-3e99-405e-88c9-9c42adaa3217},0,-1,1
+1131,nsIAuthPromptProvider,{bd9dc0fa-68ce-47d0-8859-6418c2ae8576},0,-1,1
+1132,nsIJSContextStackIterator,{c7e6b7aa-fc12-4ca7-b140-98c38b698961},0,-1,0
+1133,nsISelection,{b2c7ed59-8634-4352-9e37-5484c8b6e4e1},0,-1,1
+1134,nsIAccessibleRole,{6793ca5c-c7cb-41db-9fb9-c16c0525f962},0,-1,1
+1135,mozIStorageBindingParams,{a8d4827c-641c-45e3-a9ea-493570b4106b},0,-1,1
+1136,nsIXPointerSchemeProcessor,{093d3559-b56b-44d0-8764-c25815715080},0,-1,0
+1137,nsIDOMSVGLengthList,{a8760fcd-3de5-446a-a009-5cf877e7a4df},0,-1,1
+1138,nsIRDFDelegateFactory,{a1b89470-a124-11d3-be59-0020a6361667},0,-1,1
+1139,nsIWebContentConverterService,{de7cc06e-e778-45cb-b7db-7a114e1e75b1},0,-1,1
+1140,nsIUrlClassifierHashCompleterCallback,{bbd6c954-7cb4-4447-bc55-8cefd1ceed89},0,-1,1
+1141,nsIX509CertDB2,{e0df4784-6560-45bf-b1b7-86076a0e8381},0,-1,1
+1142,nsIDOMTextMetrics,{2d01715c-ec7d-424a-ab85-e0fd70c8665c},0,-1,1
+1143,nsILoadGroup,{3de0a31c-feaf-400f-9f1e-4ef71f8b20cc},0,-1,1
+1144,nsIExtensionManager,{494e8302-8689-4a8a-a08d-0da17c649c7d},0,-1,1
+1145,nsICharsetResolver,{d143a084-b626-4614-845f-41f3ca43a674},0,-1,1
+1146,nsIEditActionListener,{b22907b1-ee93-11d2-8d50-000064657374},0,-1,1
+1147,nsIProperties,{78650582-4e93-4b60-8e85-26ebd3eb14ca},0,-1,1
+1148,nsIUserCertPicker,{06d018e0-d41b-4629-a4fc-daaa6029888e},0,-1,1
+1149,nsIAccessibilityService,{6a58f7e8-587c-40dd-b684-dc3e54f1342a},0,-1,0
+1150,nsIDOMSVGAElement,{35d3365a-3e6f-4cdf-983d-fdaed1564478},0,-1,1
+1151,nsIDOMSVGTransform,{29cc2e14-6d18-4710-bda9-a88d9d3bc8dc},0,-1,1
+1152,nsICommandLineRunner,{c1f4cfbf-a41f-4628-aa6c-9fb914478af8},0,-1,0
+1153,nsIPromptService2,{cf86d196-dbee-4482-9dfa-3477aa128319},0,-1,1
+1154,nsIDOMDocument,{a6cf9075-15b3-11d2-932e-00805f8add32},0,-1,1
+1155,nsIPluginStreamListener,{df055770-5448-11d2-8164-006008119d7a},0,-1,0
+1156,mozIStorageAggregateFunction,{763217b7-3123-11da-918d-000347412e16},0,-1,1
+1157,nsPIExternalAppLauncher,{d0b5d7d3-9565-403d-9fb5-e5089c4567c6},0,-1,1
+1158,nsIDOMProcessingInstruction,{a6cf907f-15b3-11d2-932e-00805f8add32},0,-1,1
+1159,nsITreeBoxObject,{64ba5199-c4f4-4498-bbdc-f8e4c369086c},0,-1,1
+1160,nsIDOMNSRange,{59188642-23b4-41d6-bde1-302c3906d1f0},0,-1,1
+1161,nsIDOMSVGAngle,{58b6190e-37b3-412a-ba02-1d5ad6c6ea7c},0,-1,1
+1162,nsIDOMXPathEvaluator,{75506f8a-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
+1163,nsIXPointerEvaluator,{addd0fe5-8555-45b7-b763-97d5898ce268},0,-1,0
+1164,nsISecretDecoderRing,{0ec80360-075c-11d4-9fd4-00c04f1b83d8},0,-1,1
+1165,nsIAutoCompleteMdbResult2,{148c9dc5-0fbb-408b-80fe-544f6a85b433},0,-1,0
+1166,nsIPrintOptions,{92597c2b-109b-40bb-8f93-9b9acfa31de8},0,-1,1
+1167,nsIHttpActivityObserver,{412880c8-6c36-48d8-bf8f-84f91f892503},0,-1,1
+1168,nsITraceableChannel,{68167b0b-ef34-4d79-a09a-8045f7c5140e},0,-1,1
+1169,nsIBrowserBoxObject,{db436f2f-c656-4754-b0fa-99bc353bd63f},0,-1,1
+1170,nsIAddonInstallListener,{2333b04c-f371-4dea-a2f1-d8fdb0c82866},0,-1,1
+1171,nsIDOMGeoPositionCoords,{b31702d0-6dac-4fa0-b93b-f043e71c8f9a},0,-1,1
+1172,nsIDOMElementCSSInlineStyle,{99715845-95fc-4a56-aa53-214b65c26e22},0,-1,1
+1173,nsIDOMSVGNumber,{98575762-a936-4ecf-a226-b74c3a2981b4},0,-1,1
+1174,nsICommandLine,{bc3173bd-aa46-46a0-9d25-d9867a9659b6},0,-1,1
+1175,nsIDOMModalContentWindow,{51aebd45-b979-4ec6-9d11-3a3fd3d5d59e},0,-1,1
+1176,nsIAccessibleTable,{035c0c0e-41e3-4985-8ad9-d9f14cdc667a},0,-1,1
+1177,nsICryptoHash,{1e5b7c43-4688-45ce-92e1-77ed931e3bbe},0,-1,1
+1178,nsIAnnotationService,{ba249b58-346f-42a9-a393-203ae34ec6c4},0,-1,1
+1179,nsIDOMHTMLStyleElement,{a6cf908d-15b3-11d2-932e-00805f8add32},0,-1,1
+1180,nsIDOMNSHTMLFormElement,{a6cf90c6-15b3-11d2-932e-00805f8add32},0,-1,1
+1181,nsIAuthPromptWrapper,{6228d644-17fe-11d4-8cee-0060b0fc14a3},0,-1,1
+1182,nsICollection,{83b6019c-cbc4-11d2-8cca-0060b0fc14a3},0,-1,1
+1183,nsIStringBundleOverride,{965eb278-5678-456b-82a7-20a0c86a803c},0,-1,1
+1184,nsIAuthPromptCallback,{bdc387d7-2d29-4cac-92f1-dd75d786631d},0,-1,1
+1185,nsIJSXMLHttpRequest,{423fdd3d-41c9-4149-8fe5-b14a1d3912a0},0,-1,1
+1186,nsIDOMSVGFEFuncGElement,{28555e78-c6c2-4a98-af53-bfc2c6944295},0,-1,1
+1187,nsIProgressEventSink,{d974c99e-4148-4df9-8d98-de834a2f6462},0,-1,1
+1188,nsIDOMSVGFETurbulenceElement,{77bc4d70-0d49-4c81-b7a7-7432f0fe3e04},0,-1,1
+1189,nsIDOMXULControlElement,{007b8358-1dd2-11b2-8924-d209efc3f124},0,-1,1
+1190,nsICacheDeviceInfo,{31d1c294-1dd2-11b2-be3a-c79230dca297},0,-1,1
+1191,imgITools,{c395d8f1-c616-4a1b-adfd-747b4b1b2cbe},0,-1,1
+1192,nsIContentViewerFile,{6317f32c-9bc7-11d3-bccc-0060b0fc76bd},0,-1,1
+1193,nsIDOMSVGPatternElement,{bc435244-b748-4e14-9e4c-219d5d3cb218},0,-1,1
+1194,nsIAccessibleCoordinateType,{c9fbdf10-619e-436f-bf4b-8566686f1577},0,-1,1
+1195,nsIConverterInputStream,{fc66ffb6-5404-4908-a4a3-27f92fa0579d},0,-1,1
+1196,nsIScreen,{f728830e-1dd1-11b2-9598-fb9f414f2465},0,-1,1
+1197,nsIDOMCSSPrimitiveValue,{e249031f-8df9-4e7a-b644-18946dce0019},0,-1,1
+1198,nsIDOMXULTextBoxElement,{71135b6c-294e-4634-a8e4-a72398f1e72a},0,-1,1
+1199,nsIDirIndexParser,{38e3066c-1dd2-11b2-9b59-8be515c1ee3f},0,-1,1
+1200,nsIDOMRGBColor,{6aff3102-320d-4986-9790-12316bb87cf9},0,-1,1
+1201,nsIDOMHTMLTableCaptionElement,{a6cf90b3-15b3-11d2-932e-00805f8add32},0,-1,1
+1202,nsIIFrameBoxObject,{30114c44-d398-44a5-9e01-b48b711291cd},0,-1,1
+1203,nsIPopupWindowManager,{3210a6aa-b464-4f57-9335-b22815567cf1},0,-1,1
+1204,extIEventItem,{05281820-ab62-11db-abbd-0800200c9a66},0,-1,1
+1205,nsIDOM3TypeInfo,{2a1088c7-499a-49a7-9d3b-1970d21532ab},0,-1,1
+1206,nsIDOMFileList,{3bfef9fa-8ad3-4e49-bd62-d6cd75b29298},0,-1,1
+1207,nsIWebContentHandlerInfo,{eb361098-5158-4b21-8f98-50b445f1f0b2},0,-1,1
+1208,nsIDOMNSHTMLFormControlList,{a6cf911a-15b3-11d2-932e-00805f8add32},0,-1,1
+1209,nsINavHistoryResultTreeViewer,{fa77e4e9-9fc8-45d2-9507-0fe4f0602505},0,-1,1
+1210,nsIXPCComponents_ClassesByID,{336a9590-4d19-11d3-9893-006008962422},0,-1,1
+1211,nsIDOM3Attr,{a2216ddc-1bcd-4ec2-a292-371e09a6c377},0,-1,1
+1212,nsIPrintingPromptService,{75d1553d-63bf-4b5d-a8f7-e4e4cac21ba4},0,-1,1
+1213,nsIDOMNSXPathExpression,{ce600ca8-e98a-4419-ad61-2f6d0cb0ecc8},0,-1,1
+1214,nsINavHistoryResultNode,{464ae28f-3a9c-4483-afb2-bb0fb0ddb893},0,-1,1
+1215,nsIDragSession,{15860d52-fe2c-4ddd-ac50-9c23e24916c4},0,-1,1
+1216,nsITransactionList,{97f863f3-f886-11d4-9d39-0060b0f8baff},0,-1,1
+1217,nsIDOMSVGPathSegCurvetoCubicRel,{0e661233-0c4f-4e0d-94d3-fbc460ad1f88},0,-1,1
+1218,nsIClipboardDragDropHookList,{876a2015-6b66-11d7-8f18-0003938a9d96},0,-1,1
+1219,nsIScrollable,{919e792a-6490-40b8-bba5-f9e9ad5640c8},0,-1,1
+1220,gfxIFormats,{96d086e6-1dd1-11b2-b6b2-b77b59390247},0,-1,1
+1221,nsISupportsPRBool,{ddc3b490-4a1c-11d3-9890-006008962422},0,-1,1
+1222,nsIDOMNodeFilter,{e4723748-1dd1-11b2-8ee6-866a532a6237},0,-1,1
+1223,nsISocketTransportService,{185b3a5d-8729-436d-9693-7bdccb9c2216},0,-1,1
+1224,nsIDOMNavigatorGeolocation,{9f218d6a-42ec-4b8a-aee9-e29ca96a4eae},0,-1,1
+1225,nsISelectionDisplay,{0ddf9e1c-1dd2-11b2-a183-908a08aa75ae},0,-1,1
+1226,nsIEventListenerService,{551cac0f-31ed-45e0-8d67-bc0d6e117b31},0,-1,1
+1227,nsIDOMNSEditableElement,{b33eb56c-3120-418c-892b-774b00c7dde8},0,-1,1
+1228,nsIClipboardDragDropHooks,{e03e6c5e-0d84-4c0b-8739-e6b8d51922de},0,-1,1
+1229,nsIGnomeVFSMimeApp,{66009894-9877-405b-9321-bf30420e34e6},0,-1,1
+1230,nsIPrintProgressParams,{ca89b55b-6faf-4051-9645-1c03ef5108f8},0,-1,1
+1231,nsIDOMCSSRuleList,{a6cf90c0-15b3-11d2-932e-00805f8add32},0,-1,1
+1232,nsIProtocolHandler,{15fd6940-8ea7-11d3-93ad-00104ba0fd40},0,-1,1
+1233,nsIHTMLObjectResizeListener,{27b00295-349c-429f-ad0c-87b859e77130},0,-1,1
+1234,nsIKeygenThread,{8712a243-5539-447c-9f47-8653f40c3a09},0,-1,1
+1235,nsIPersistentProperties,{1a180f60-93b2-11d2-9b8b-00805f8a16d9},0,-1,1
+1236,nsIXPCComponents_utils_Sandbox,{4f8ae0dc-d266-4a32-875b-6a9de71a8ce9},0,-1,1
+1237,nsIScriptableUnescapeHTML,{3ab244a9-f09d-44da-9e3f-ee4d67367f2d},0,-1,1
+1238,nsITransactionManager,{58e330c2-7b48-11d2-98b9-00805f297d89},0,-1,1
+1239,nsIURIRefObject,{2226927e-1dd2-11b2-b57f-faab47288563},0,-1,1
+1240,nsIDOMNSHTMLOptionElement,{e2dfc89c-7ae0-4651-8aee-7f5edc2aa626},0,-1,1
+1241,imgIDecoderObserver,{1dfc9189-6421-4281-83b2-d9c1c9ba4d1b},0,-1,1
+1242,nsICookieService,{2aaa897a-293c-4d2b-a657-8c9b7136996d},0,-1,1
+1243,nsIDOMEventTarget,{1c773b30-d1cf-11d2-bd95-00805f8ae3f4},0,-1,1
+1244,nsIWorkerScope,{5c55ea4b-e4ac-4ceb-bfeb-46bd5e521b8a},0,-1,1
+1245,nsIDOMSVGScriptElement,{bbe0d0ee-e9ed-4f84-a6e4-e58f66530caa},0,-1,1
+1246,nsIFTPEventSink,{455d4234-0330-43d2-bbfb-99afbecbfeb0},0,-1,1
+1247,nsIPermissionManager,{00708302-684c-42d6-a5a3-995d51b1d17c},0,-1,1
+1248,nsIXPCComponents,{155809f1-71f1-47c5-be97-d812ba560405},0,-1,1
+1249,nsIBlocklistService,{8439f9c0-da03-4260-8b21-dc635eed28fb},0,-1,1
+1250,nsIDOMEntity,{a6cf9079-15b3-11d2-932e-00805f8add32},0,-1,1
+1251,nsIWifiMonitor,{f289701e-d9af-4685-bc2f-e4226ff7c018},0,-1,1
+1252,nsIDOMHTMLBaseElement,{a6cf908b-15b3-11d2-932e-00805f8add32},0,-1,1
+1253,nsIFileInputStream,{e3d56a20-c7ec-11d3-8cda-0060b0fc14a3},0,-1,1
+1254,nsIDOMHTMLMenuElement,{a6cf909d-15b3-11d2-932e-00805f8add32},0,-1,1
+1255,nsIDOMHTMLDivElement,{a6cf90a0-15b3-11d2-932e-00805f8add32},0,-1,1
+1256,nsIUpdate,{9d6a388b-2e0c-4d0e-9a60-5c9739a7ada5},0,-1,1
+1257,nsIPlacesImportExportService,{21c00314-fa63-11db-8314-0800200c9a66},0,-1,1
+1258,nsIRDFXMLSink,{eb1a5d31-ab33-11d2-8ec6-00805f29f370},0,-1,1
+1259,nsIDOMXULLabeledControlElement,{a457ea70-1dd1-11b2-9089-8fd894122084},0,-1,1
+1260,nsIZipWriter,{6d4ef074-206c-4649-9884-57bc355864d6},0,-1,1
+1261,nsIDOMSVGLineElement,{4ea07ef3-ed66-4b41-8119-4afc6d0ed5af},0,-1,1
+1262,nsIWifiAccessPoint,{e28e614f-8f86-44ff-bcf5-5f18225834a0},0,-1,1
+1263,nsISAXMutableAttributes,{8b1de83d-cebb-49fa-8245-c0fe319eb7b6},0,-1,1
+1264,nsIDOMXULSelectControlItemElement,{6aaaa30d-54ab-434a-8ae8-6d29a566d870},0,-1,1
+1265,nsIPrefBranchInternal,{d1d412d9-15d6-4a6a-9533-b949dc175ff5},0,-1,1
+1266,nsIDOMSVGPathSegList,{94a6db98-3f34-4529-a35f-89ef49713795},0,-1,1
+1267,nsISupportsPRUint16,{dfacb090-4a1c-11d3-9890-006008962422},0,-1,1
+1268,mozIStorageStatement,{20c45bdd-51d4-4f07-b70e-5feaa6302197},0,-1,1
+1269,nsIStringBundle,{d85a17c2-aa7c-11d2-9b8c-00805f8a16d9},0,-1,1
+1270,nsIDOMLSLoadEvent,{6c16a810-a37d-4859-b557-337341631aee},0,-1,1
+1271,nsIDOMNavigator,{777bd8a1-38c1-4b12-ba8f-ff6c2eb8c56b},0,-1,1
+1272,nsIDOMHTMLVoidCallback,{4a17c0e2-fdd5-4855-a71c-b4c509dffa13},0,-1,1
+1273,nsPIEditorTransaction,{4f18ada2-0ddc-11d5-9d3a-0060b0f8baff},0,-1,1
+1274,nsISearchSubmission,{58e4f602-a7c8-4cd1-9dca-716705e826ef},0,-1,1
+1275,nsIDOMWindowInternal,{c2f4433a-8b4c-4676-ab30-3bffd26fb29e},0,-1,1
+1276,nsIDOMSVGFilterPrimitiveStandardAttributes,{ab68567a-b830-4c46-9f2f-a28513a9e980},0,-1,1
+1277,nsIDOMSVGAnimatedString,{36f18f12-61a9-4529-8fa9-30050bd6ac00},0,-1,1
+1278,nsIDOMOfflineResourceList,{f394a721-66e9-46fc-bb24-b980bb732dd0},0,-1,1
+1279,nsISupportsInterfacePointer,{995ea724-1dd1-11b2-9211-c21bdd3e7ed0},0,-1,1
+1280,nsIFlavorDataProvider,{7e225e5f-711c-11d7-9fae-000393636592},0,-1,1
+1281,nsIDOMSVGSymbolElement,{86092181-a5db-4a89-be03-07dcc14d426e},0,-1,1
+1282,nsIRDFXMLParser,{1831dd2e-1dd2-11b2-bdb3-86b7b50b70b5},0,-1,1
+1283,nsIDOMNSDataTransfer,{990758e9-fd38-4444-a1e8-395195802bda},0,-1,1
+1284,nsIDOMXULDocument,{d55c39b4-b54a-4df5-9e68-09919e4538f9},0,-1,1
+1285,nsIEditorSpellCheck,{90c93610-c116-44ab-9793-62dccb9f43ce},0,-1,1
+1286,nsIDOMHTMLScriptElement,{a6cf90b1-15b3-11d2-932e-00805f8add32},0,-1,1
+1287,nsIWebBrowserChromeFocus,{d2206418-1dd1-11b2-8e55-acddcd2bcfb8},0,-1,1
+1288,nsIAddonSearchResultsCallback,{a6f70917-dd30-4eb6-8b3d-453204f96f33},0,-1,1
+1289,nsISimpleEnumerator,{d1899240-f9d2-11d2-bdd6-000064657374},0,-1,1
+1290,nsIEmbeddingSiteWindow2,{e932bf55-0a64-4beb-923a-1f32d3661044},0,-1,1
+1291,nsIBufferedOutputStream,{6476378a-da09-11d3-8cda-0060b0fc14a3},0,-1,1
+1292,nsIDocumentEncoder,{f85c5a20-258d-11db-a98b-0800200c9a66},0,-1,1
+1293,nsIChannelEventSink,{6757d790-2916-498e-aaca-6b668a956875},0,-1,1
+1294,nsIXPCComponents_Utils,{da2267f2-d4cc-448f-9d70-1c7fe134d2fe},0,-1,1
+1295,nsINavHistoryContainerResultNode,{f9c8e1c1-e701-44ad-893c-8504c3956929},0,-1,1
+1296,nsIPrintingPrompt,{44e314ca-75b1-4f3d-9553-9b3507912108},0,-1,1
+1297,nsIDOMHTMLOptionElement,{a6cf9092-15b3-11d2-932e-00805f8add32},0,-1,1
+1298,nsISupportsPRInt32,{e36c5250-4a1c-11d3-9890-006008962422},0,-1,1
+1299,nsIDOMWindowUtils_1_9_2,{b0f803f7-98c0-4152-812c-d6678ba23049},0,-1,1
+1300,nsIFrameLoader,{d675c531-6bdc-417c-b176-635060105f07},0,-1,1
+1301,nsIDOMSVGPathSegLinetoVerticalRel,{d3ef2128-8de3-4aac-a6b4-13c7563119a6},0,-1,1
+1302,nsIDOMXULCommandDispatcher,{f3c50361-14fe-11d3-bf87-00105a1b0627},0,-1,1
+1303,nsIDOMGeoGeolocation,{37687daf-b85f-4e4d-8881-85a0ad24cf78},0,-1,1
+1304,nsIX509CertDB,{da48b3c0-1284-11d5-ac67-000064657374},0,-1,1
+1305,nsIDOMRangeException,{0f807301-39d2-11d6-a7f2-8f504ff870dc},0,-1,1
+1306,extIPreference,{2c7462e2-72c2-4473-9007-0e6ae71e23ca},0,-1,1
+1307,nsICryptoHMAC,{8feb4c7c-1641-4a7b-bc6d-1964e2099497},0,-1,1
+1308,nsILineInputStream,{c97b466c-1e6e-4773-a4ab-2b2b3190a7a6},0,-1,1
+1309,nsIWeakReference,{9188bc85-f92e-11d2-81ef-0060083a0bcf},0,-1,1
+1310,nsIGeolocationRequest,{f2aefde1-8e38-48b3-bbb8-bd6c4ae1ac8a},0,-1,1
+1311,nsIAccessibleHyperLink,{38c60bfa-6040-4bfe-93f2-acd6a909bb60},0,-1,1
+1312,nsILoginMetaInfo,{867407d5-10e0-43a0-bc81-a324740534ca},0,-1,1
+1313,nsIForwardIterator,{8da01646-1dd2-11b2-98a7-c7009045be7e},0,-1,1
+1314,inIFlasher,{7b4a099f-6f6e-4565-977b-fb622adbff49},0,-1,1
+1315,nsIBadCertListener2,{2c3d268c-ad82-49f3-99aa-e9ffddd7a0dc},0,-1,1
+1316,nsIDOMClientRectList,{917da19d-62f5-441d-b47e-9e35f05639c9},0,-1,1
+1317,nsIDOMSmartCardEvent,{52bdc7ca-a934-4a40-a2e2-ac83a70b4019},0,-1,1
+1318,nsIXULRuntime,{17311145-97da-49eb-b984-965bdee8879c},0,-1,1
+1319,nsIRemoteService,{a2240f6a-f1e4-4548-9e1a-6f3bc9b2426c},0,-1,1
+1320,nsIDOMXPathResult,{75506f84-b504-11d5-a7f2-ca108ab8b6fc},0,-1,1
+1321,nsIDOMSVGLocatable,{9cf4fc9c-90b2-4d66-88f5-35049b558aee},0,-1,1
+1322,nsIWebBrowserFind,{2f977d44-5485-11d4-87e2-0010a4e75ef2},0,-1,1
+1323,nsICryptoFIPSInfo,{99e81922-7318-4431-b3aa-78b3cb4119bb},0,-1,1
+1324,nsIDOMGeoPositionError,{ad9fa4c8-ec71-4b2d-8294-9adf06ddec32},0,-1,1
+1325,nsICertVerificationResult,{2fd0a785-9f2d-4327-8871-8c3e0783891d},0,-1,1
+1326,nsIRDFService,{bfd05261-834c-11d2-8eac-00805f29f370},0,-1,1
+1327,nsIDOMXULMultiSelectControlElement,{82c72eca-9886-473e-94cd-9de5694b3f88},0,-1,1
+1328,nsIMicrosummaryService,{d58143a2-74fa-4b13-94ed-113af8936d80},0,-1,1
+1329,nsIControllers,{f36e3ec1-9197-4ad8-8d4c-d3b1927fd6df},0,-1,1
+1330,jsdIErrorHook,{cea9ab1a-4b5d-416f-a197-9ffa7046f2ce},0,-1,1
+1331,nsIDOMHTMLInputElement,{a6cf9093-15b3-11d2-932e-00805f8add32},0,-1,1
+1332,mozIStorageStatementCallback,{29383d00-d8c4-4ddd-9f8b-c2feb0f2fcfa},0,-1,1
+1333,nsIDOMSVGGElement,{0bd57cbd-a090-44aa-a61b-2fb876841194},0,-1,1
+1334,nsIDOMPluginArray,{f6134680-f28b-11d2-8360-c90899049c3c},0,-1,1
+1335,nsICipherInfo,{028e2b2a-1f0b-43a4-a1a7-365d2d7f35d0},0,-1,1
+1336,nsIDOMNamedNodeMap,{a6cf907b-15b3-11d2-932e-00805f8add32},0,-1,1
+1337,nsIDOMHTMLBaseFontElement,{a6cf90a6-15b3-11d2-932e-00805f8add32},0,-1,1
+1338,nsIDOMXULCheckboxElement,{5afaba88-1dd2-11b2-9249-dd65a129d0e4},0,-1,1
+1339,nsIDOMHTMLMediaError,{7bd8c29f-8a76-453f-9373-79f820f2dc01},0,-1,1
+1340,nsIFormAutoComplete,{997c0c05-5d1d-47e5-9cbc-765c0b8ec699},0,-1,1
+1341,nsIDOMHTMLDirectoryElement,{a6cf909c-15b3-11d2-932e-00805f8add32},0,-1,1
+1342,nsIBrowserProfileMigrator,{f8365b4a-da55-4e47-be7a-230142360f62},0,-1,1
+1343,nsIDOMSVGSwitchElement,{7676f306-22c9-427e-bd71-2b1315851c93},0,-1,1
+1344,nsIDOMOrientationEvent,{1618546a-c176-40a2-9086-2d973acceeb1},0,-1,1
+1345,nsIURIChecker,{4660c1a1-be2d-4c78-9baf-c22984176c28},0,-1,1
+1346,nsIDOMNSHTMLAreaElement,{3dce9071-f3b9-4280-a6ee-776cdfe3dd9e},0,-1,1
+1347,nsIDOMDataTransfer,{34042440-60a8-4992-ae5c-798e69148955},0,-1,1
+1348,nsIDOMHTMLImageElement,{a6cf90ab-15b3-11d2-932e-00805f8add32},0,-1,1
+1349,nsILocalFileWin,{def24611-88a1-2cac-74fd-4b0b12bcaed5},0,-1,1
+1350,nsIDOMHTMLTextAreaElement,{a6cf9094-15b3-11d2-932e-00805f8add32},0,-1,1
+1351,nsIDOMCommandEvent,{37fb1798-0f76-4870-af6f-0135b4d973c8},0,-1,1
+1352,nsIFeedContainer,{577a1b4c-b3d4-4c76-9cf8-753e6606114f},0,-1,1
+1353,nsIDOMXULButtonElement,{6852d9a6-1dd2-11b2-a29d-cd7977a91b1b},0,-1,1
+1354,nsIXULTemplateQueryProcessor,{970f1c36-5d2e-4cbc-a1cf-e3327b50df71},0,-1,1
+1355,nsIEmbeddingSiteWindow,{3e5432cd-9568-4bd1-8cbe-d50aba110743},0,-1,1
+1356,nsIDOMSVGFEPointLightElement,{557f128a-026b-4fa8-a44c-605df7bfd62e},0,-1,1
+1357,nsIDOMSVGFitToViewBox,{089410f3-9777-44f1-a882-ab4225696434},0,-1,1
+1358,nsISearchableInputStream,{8c39ef62-f7c9-11d4-98f5-001083010e9b},0,-1,1
+1359,nsINavHistoryQuery,{6f5668f0-da8e-4069-a0de-6680e5cd8570},0,-1,1
+1360,nsIXPConnectWrappedNative,{f819a95a-6ab5-4a02-bda6-32861e859581},0,-1,0
+1361,nsIAcceleration,{1b406e32-cf42-471e-a470-6fd600bf4c7b},0,-1,1
+1362,nsIPK11Token,{51191434-1dd2-11b2-a17c-e49c4e99a4e3},0,-1,1
+1363,nsIControllerCommand,{0eae9a46-1dd2-11b2-aca0-9176f05fe9db},0,-1,1
+1364,nsIXSLTProcessorPrivate,{b8d727f7-67f4-4dc1-a318-ec0c87280816},0,-1,1
+1365,nsISessionStartup,{c0b185e7-0d21-46ac-8eee-7b5065ee7ecd},0,-1,1
+1366,nsIDOMNSHTMLAnchorElement2,{d7627eda-6ec0-4326-87c4-c3067fe6e324},0,-1,1
+1367,nsIWebBrowserStream,{86d02f0e-219b-4cfc-9c88-bd98d2cce0b8},0,-1,1
+1368,nsITimerCallback,{a796816d-7d47-4348-9ab8-c7aeb3216a7d},0,-1,1
+1369,nsINSSCertCache,{1b75bdae-1757-4322-9d1e-cfcaa18cb710},0,-1,1
+1370,nsISocketProviderService,{8f8a23d0-5472-11d3-bbc8-0000861d1237},0,-1,1
+1371,nsIZipReaderCache,{52c45d86-0cc3-11d4-986e-00c04fa0cf4a},0,-1,1
+1372,nsIWebProgressListener2,{dde39de0-e4e0-11da-8ad9-0800200c9a66},0,-1,1
+1373,nsIDOMHTMLFrameElement,{a6cf90b9-15b3-11d2-932e-00805f8add32},0,-1,1
+1374,nsIAuthPrompt,{358089f9-ee4b-4711-82fd-bcd07fc62061},0,-1,1
+1375,jsdINestCallback,{88bea60f-9b5d-4b39-b08b-1c3a278782c6},0,-1,1
+1376,nsIHTTPIndex,{6f2bdbd0-58c3-11d3-be36-00104bde6048},0,-1,1
+1377,nsIDOMDocumentRange,{7b9badc6-c9bc-447a-8670-dbd195aed24b},0,-1,1
+1378,nsICMSMessage,{a4557478-ae16-11d5-ba4b-00108303b117},0,-1,0
+1379,nsIProfileUnlocker,{08923af1-e7a3-4fae-ba02-128502193994},0,-1,1
+1380,nsIDOMNodeIterator,{5af83f50-c8d5-4824-be29-1aa9d640bacb},0,-1,1
+1381,nsIDOMSVGAnimatedPathData,{6ef2b400-dbf4-4c12-8787-fe15caac5648},0,-1,1
+1382,nsIEncodedChannel,{30d7ec3a-f376-4652-9276-3092ec57abb6},0,-1,1
+1383,nsIXPTLoaderSink,{6e48c500-8682-4730-add6-7db693b9e7ba},0,-1,1
+1384,nsIDOMNSHTMLDocument,{79beb289-3644-4b54-9432-9fb993945629},0,-1,1
+1385,nsIAccessibleValue,{42a1e1dc-58cf-419d-bff0-ed3314c70016},0,-1,1
+1386,nsIAtom,{3d1b15b0-93b4-11d1-895b-006008911b81},0,-1,1
+1387,nsIAsyncOutputStream,{beb632d3-d77a-4e90-9134-f9ece69e8200},0,-1,1
+1388,nsIDOMEntityReference,{a6cf907a-15b3-11d2-932e-00805f8add32},0,-1,1
+1389,nsIXTFElementWrapper,{0ad87068-c6fd-4122-a515-ffe8c4773b10},0,-1,1
+1390,nsIUpdatePrompt,{599fd3c6-ec68-4499-ada5-2997739c97a6},0,-1,1
+1391,nsIDOMSVGRectElement,{1695ca39-e40d-44dc-81db-a51b6fd234fa},0,-1,1
+1392,mozITXTToHTMLConv,{77c0e42a-1dd2-11b2-8ebf-edc6606f2f4b},0,-1,1
+1393,nsIMicrosummaryObserver,{560b0980-be95-47e9-81cc-4428c073127c},0,-1,1
+1394,mozIJSSubScriptLoader,{8792d77e-1dd2-11b2-ac7f-9bc9be4f2916},0,-1,1
+1395,nsIDocShellLoadInfo,{92a0a637-373e-4647-9476-ead11e005c75},0,-1,1
+1396,nsIXPCComponents_Results,{2fc229a0-5860-11d3-9899-006008962422},0,-1,1
+1397,nsIPrintSettings,{343700dd-078b-42b6-a809-b9c1d7e951d0},0,-1,1
+1398,nsIContentViewerEdit,{1691a02f-53b2-4cb8-8769-48e7efc908b8},0,-1,1
+1399,nsISupportsPrimitive,{d0d4b136-1dd1-11b2-9371-f0727ef827c0},0,-1,1
+1400,nsIEditorStyleSheets,{4805e682-49b9-11d3-9ce4-ed60bd6cb5bc},0,-1,1
+1401,rdfISerializer,{f0edfcdd-8bca-4d32-9226-7421001396a4},0,-1,1
+1402,nsIDOMSVGPolygonElement,{9de04775-77c5-48b5-9f4a-8996a936bfb2},0,-1,1
+1403,nsIWritablePropertyBag2,{9cfd1587-360e-4957-a58f-4c2b1c5e7ed9},0,-1,1
+1404,nsIDocumentStateListener,{050cdc00-3b8e-11d3-9ce4-a458f454fcbc},0,-1,1
+1405,nsISHTransaction,{2edf705f-d252-4971-9f09-71dd0f760dc6},0,-1,1
+1406,nsIDOMHTMLIsIndexElement,{a6cf908c-15b3-11d2-932e-00805f8add32},0,-1,1
+1407,nsIASN1Sequence,{b6b957e6-1dd1-11b2-89d7-e30624f50b00},0,-1,1
+1408,nsIDOMHTMLAppletElement,{a6cf90ae-15b3-11d2-932e-00805f8add32},0,-1,1
+1409,nsIDOMToString,{2a72e20f-e337-4822-8994-2e35b5550d03},0,-1,1
+1410,nsIUpdateManager,{fede66a9-9f96-4507-a22a-775ee885577e},0,-1,1
+1411,nsIDOMScreen,{77947960-b4af-11d2-bd93-00805f8ae3f4},0,-1,1
+1412,nsICertTreeItem,{d0180863-606e-49e6-8324-cf45ed4dd891},0,-1,1
+1413,extIConsole,{ae8482e0-aa5a-11db-abbd-0800200c9a66},0,-1,1
+1414,nsISAXAttributes,{e347005e-6cd0-11da-be43-001422106990},0,-1,1
+1415,nsIXPConnect,{b76828b8-3ac5-469e-946d-3401c6a2104d},0,-1,0
+1416,nsIDOMSVGPathSegCurvetoCubicAbs,{380afecd-f884-4da7-a0d7-5ffc4531b70b},0,-1,1
+1417,nsIUploadChannel,{ddf633d8-e9a4-439d-ad88-de636fd9bb75},0,-1,1
+1418,nsIAccelerationListener,{3386bed8-7393-4704-8ffc-1eb2c35432ff},0,-1,1
+1419,nsIXPCFunctionThisTranslator,{039ef260-2a0d-11d5-90a7-0010a4e73d9a},0,-1,0
+1420,nsIController,{d5b61b82-1da4-11d3-bf87-00105a1b0627},0,-1,1
+1421,nsIDOMSVGURIReference,{8092b5f3-dc8a-459c-94f1-92f8011f2438},0,-1,1
+1422,nsIDOMStorageEvent,{fc540c28-8edd-4b7a-9c30-8638289b7a7d},0,-1,1
diff --git a/tools/xo_bundle/crashreporter b/tools/xo_bundle/crashreporter
index 5a437fa..fa4c97d 100755
--- a/tools/xo_bundle/crashreporter
+++ b/tools/xo_bundle/crashreporter
Binary files differ
diff --git a/tools/xo_bundle/crashreporter.ini b/tools/xo_bundle/crashreporter.ini
index dee34b5..64c3a3f 100755
--- a/tools/xo_bundle/crashreporter.ini
+++ b/tools/xo_bundle/crashreporter.ini
@@ -9,7 +9,7 @@ CrashReporterTitle=Crash Reporter
# LOCALIZATION NOTE (CrashReporterVendorTitle): %s is replaced with the vendor name. (i.e. "Mozilla")
CrashReporterVendorTitle=%s Crash Reporter
# LOCALIZATION NOTE (CrashReporterErrorText): %s is replaced with another string containing detailed information.
-CrashReporterErrorText=The application had problem and crashed.\n\nUnfortunately the crash reporter is unable to submit a report for this crash.\n\nDetails: %s
+CrashReporterErrorText=The application had a problem and crashed.\n\nUnfortunately the crash reporter is unable to submit a report for this crash.\n\nDetails: %s
# LOCALIZATION NOTE (CrashReporterProductErrorText2): The first %s is replaced with the product name (i.e. "Firefox"), the second is replaced with another string containing detailed information. These two substitutions can not be reordered!
CrashReporterProductErrorText2=%s had a problem and crashed.\n\nUnfortunately the crash reporter is unable to submit a crash report.\n\nDetails: %s
CrashReporterSorry=We're Sorry
diff --git a/tools/xo_bundle/defaults/autoconfig/prefcalls.js b/tools/xo_bundle/defaults/autoconfig/prefcalls.js
index ba65aeb..2fd76bc 100755
--- a/tools/xo_bundle/defaults/autoconfig/prefcalls.js
+++ b/tools/xo_bundle/defaults/autoconfig/prefcalls.js
@@ -169,10 +169,14 @@ function setLDAPVersion(version) {
function getLDAPAttributes(host, base, filter, attribs) {
try {
- var url = Components.classes[LDAPURLContractID].createInstance(nsILDAPURL);
-
- url.spec = "ldap://" + host + "/" + base + "?" + attribs
- + "?sub?" + filter;
+ var urlSpec = "ldap://" + host + "/" + base + "?" + attribs + "?sub?" +
+ filter;
+
+ var url = Components.classes["@mozilla.org/network/io-service;1"]
+ .getService(Components.interfaces.nsIIOService)
+ .newURI(urlSpec, null, null)
+ .QueryInterface(Components.interfaces.nsILDAPURL);
+
var ldapquery = Components.classes[LDAPSyncQueryContractID]
.createInstance(nsILDAPSyncQuery);
// default to LDAP v3
diff --git a/tools/xo_bundle/defaults/pref/channel-prefs.js b/tools/xo_bundle/defaults/pref/channel-prefs.js
index b20751c..095fc79 100755
--- a/tools/xo_bundle/defaults/pref/channel-prefs.js
+++ b/tools/xo_bundle/defaults/pref/channel-prefs.js
@@ -1,2 +1,2 @@
-//@line 2 "/builds/moz2_slave/linux_build/build/browser/app/profile/channel-prefs.js"
+//@line 2 "/builds/slave/linux_build/build/browser/app/profile/channel-prefs.js"
pref("app.update.channel", "release");
diff --git a/tools/xo_bundle/defaults/pref/firefox-branding.js b/tools/xo_bundle/defaults/pref/firefox-branding.js
index 2997435..ce2b781 100755
--- a/tools/xo_bundle/defaults/pref/firefox-branding.js
+++ b/tools/xo_bundle/defaults/pref/firefox-branding.js
@@ -1,17 +1,21 @@
-pref("startup.homepage_override_url","http://%LOCALE%.www.mozilla.com/%LOCALE%/%APP%/%VERSION%/whatsnew/");
-pref("startup.homepage_welcome_url","http://%LOCALE%.www.mozilla.com/%LOCALE%/%APP%/%VERSION%/firstrun/");
+pref("startup.homepage_override_url","http://www.mozilla.com/%LOCALE%/%APP%/%VERSION%/whatsnew/");
+pref("startup.homepage_welcome_url","http://www.mozilla.com/%LOCALE%/%APP%/%VERSION%/firstrun/");
// Interval: Time between checks for a new version (in seconds)
// nightly=6 hours, official=24 hours
pref("app.update.interval", 86400);
+// The time interval between the downloading of mar file chunks in the
+// background (in seconds)
+pref("app.update.download.backgroundInterval", 600);
// URL user can browse to manually if for some reason all update installation
// attempts fail.
-pref("app.update.url.manual", "http://%LOCALE%.www.mozilla.com/%LOCALE%/%APP%/");
+pref("app.update.url.manual", "http://www.firefox.com");
// A default value for the "More information about this update" link
// supplied in the "An update is available" page of the update wizard.
-pref("app.update.url.details", "http://%LOCALE%.www.mozilla.com/%LOCALE%/%APP%/releases/");
+pref("app.update.url.details", "http://www.mozilla.com/%LOCALE%/%APP%/releases/");
// Release notes URL
-pref("app.releaseNotesURL", "http://%LOCALE%.www.mozilla.com/%LOCALE%/%APP%/%VERSION%/releasenotes/");
+pref("app.releaseNotesURL", "http://www.mozilla.com/%LOCALE%/%APP%/%VERSION%/releasenotes/");
pref("browser.search.param.yahoo-fr", "moz35");
-pref("browser.search.param.yahoo-fr-cjkt", "moz35");
+pref("browser.search.param.yahoo-fr-cjkt", "moz35"); // now unused
+pref("browser.search.param.yahoo-fr-ja", "mozff");
diff --git a/tools/xo_bundle/defaults/pref/firefox-l10n.js b/tools/xo_bundle/defaults/pref/firefox-l10n.js
index 3ad1045..051b66f 100755
--- a/tools/xo_bundle/defaults/pref/firefox-l10n.js
+++ b/tools/xo_bundle/defaults/pref/firefox-l10n.js
@@ -1,5 +1,5 @@
-//@line 36 "/builds/moz2_slave/linux_build/build/browser/locales/en-US/firefox-l10n.js"
+//@line 36 "/builds/slave/linux_build/build/browser/locales/en-US/firefox-l10n.js"
-//@line 38 "/builds/moz2_slave/linux_build/build/browser/locales/en-US/firefox-l10n.js"
+//@line 38 "/builds/slave/linux_build/build/browser/locales/en-US/firefox-l10n.js"
pref("general.useragent.locale", "en-US");
diff --git a/tools/xo_bundle/defaults/pref/firefox.js b/tools/xo_bundle/defaults/pref/firefox.js
index 77d5b1f..cb58df5 100755
--- a/tools/xo_bundle/defaults/pref/firefox.js
+++ b/tools/xo_bundle/defaults/pref/firefox.js
@@ -1,12 +1,12 @@
-//@line 37 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 37 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// XXX Toolkit-specific preferences should be moved into toolkit.js
-//@line 41 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 41 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
-//@line 44 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 44 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
-//@line 50 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 50 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("general.startup.browser", true);
@@ -30,11 +30,11 @@ pref("extensions.hideInstallButton", true);
// Preferences for the Get Add-ons pane
pref("extensions.getAddons.showPane", true);
-pref("extensions.getAddons.browseAddons", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%");
+pref("extensions.getAddons.browseAddons", "https://addons.mozilla.org/%LOCALE%/%APP%");
pref("extensions.getAddons.maxResults", 5);
-pref("extensions.getAddons.recommended.browseURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/recommended");
+pref("extensions.getAddons.recommended.browseURL", "https://addons.mozilla.org/%LOCALE%/%APP%/recommended");
pref("extensions.getAddons.recommended.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/%API_VERSION%/list/featured/all/10/%OS%/%VERSION%");
-pref("extensions.getAddons.search.browseURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/search?q=%TERMS%");
+pref("extensions.getAddons.search.browseURL", "https://addons.mozilla.org/%LOCALE%/%APP%/search?q=%TERMS%");
pref("extensions.getAddons.search.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/%API_VERSION%/search/%TERMS%/all/10/%OS%/%VERSION%");
// Blocklist preferences
@@ -47,10 +47,18 @@ pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/3/%APP_ID
pref("extensions.blocklist.detailsURL", "https://www.mozilla.com/%LOCALE%/blocklist/");
// Dictionary download preference
-pref("browser.dictionaries.download.url", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/firefox/%VERSION%/dictionaries/");
+pref("browser.dictionaries.download.url", "https://addons.mozilla.org/%LOCALE%/%APP%/dictionaries/");
+
+// Update Timer Manager preferences
+// Interval: When all registered timers should be checked (in milliseconds)
+// default=10 minutes
+pref("app.update.timer", 600000);
// App-specific update preferences
+// The interval to check for updates (app.update.interval) is defined in
+// firefox-branding.js
+
// Whether or not app updates are enabled
pref("app.update.enabled", true);
@@ -87,9 +95,6 @@ pref("app.update.url", "https://aus2.mozilla.org/update/3/%PRODUCT%/%VERSION%/%B
// latest download (in seconds) default=1 day
pref("app.update.nagTimer.restart", 86400);
-// Interval: When all registered timers should be checked (in milliseconds)
-// default=10 minutes
-pref("app.update.timer", 600000);
// Give the user x seconds to react before showing the big UI. default=12 hours
pref("app.update.promptWaitTime", 43200);
// Show the Update Checking/Ready UI when the user was idle for x seconds
@@ -113,35 +118,37 @@ pref("app.update.incompatible.mode", 0);
// e.g.
// extensions.{GUID}.update.enabled
// extensions.{GUID}.update.url
-// extensions.{GUID}.update.interval
// .. etc ..
//
pref("extensions.update.enabled", true);
-pref("extensions.update.url", "https://versioncheck.addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%");
+pref("extensions.update.url", "https://versioncheck.addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%&currentAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%");
pref("extensions.update.interval", 86400); // Check for updates to Extensions and
// Themes every day
// Non-symmetric (not shared by extensions) extension-specific [update] preferences
-pref("extensions.getMoreExtensionsURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/%VERSION%/extensions/");
-pref("extensions.getMoreThemesURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/%VERSION%/themes/");
-pref("extensions.getMorePluginsURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/%VERSION%/plugins/");
+pref("extensions.getMoreThemesURL", "https://addons.mozilla.org/%LOCALE%/%APP%/getpersonas");
pref("extensions.dss.enabled", false); // Dynamic Skin Switching
pref("extensions.dss.switchPending", false); // Non-dynamic switch pending after next
// restart.
-pref("xpinstall.whitelist.add", "update.mozilla.org");
-pref("xpinstall.whitelist.add.103", "addons.mozilla.org");
+pref("extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.name", "chrome://browser/locale/browser.properties");
+pref("extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.description", "chrome://browser/locale/browser.properties");
+
+pref("xpinstall.whitelist.add", "addons.mozilla.org");
+pref("xpinstall.whitelist.add.36", "getpersonas.com");
+
+pref("lightweightThemes.update.enabled", true);
pref("keyword.enabled", true);
pref("keyword.URL", "chrome://browser-region/locale/region.properties");
pref("general.useragent.locale", "en-US");
pref("general.skins.selectedSkin", "classic/1.0");
-pref("general.useragent.extra.firefox", "Firefox/3.5.3");
+pref("general.useragent.extra.firefox", "Firefox/3.6");
pref("general.smoothScroll", false);
-//@line 183 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 190 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("general.autoScroll", false);
-//@line 187 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 194 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// Whether or not the application should check at startup each time if it
// is the default browser.
@@ -155,17 +162,16 @@ pref("browser.startup.homepage", "resource:/browserconfig.properties"
pref("browser.enable_automatic_image_resizing", true);
pref("browser.chrome.site_icons", true);
pref("browser.chrome.favicons", true);
-pref("browser.formfill.enable", true);
pref("browser.warnOnQuit", true);
pref("browser.warnOnRestart", true);
pref("browser.fullscreen.autohide", true);
pref("browser.fullscreen.animateUp", 1);
-//@line 207 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 213 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.urlbar.clickSelectsAll", false);
-//@line 212 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 218 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.urlbar.doubleClickSelectsAll", true);
-//@line 216 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 222 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.urlbar.autoFill", false);
// 0: Match anywhere (e.g., middle of words)
// 1: Match on word boundaries and then try matching anywhere
@@ -176,11 +182,10 @@ pref("browser.urlbar.filter.javascript", true);
// the maximum number of results to show in autocomplete when doing richResults
pref("browser.urlbar.maxRichResults", 12);
-// Size of "chunks" affects the number of places to process between each search
-// timeout (ms). Too big and the UI will be unresponsive; too small and we'll
-// be waiting on the timeout too often without many results.
-pref("browser.urlbar.search.chunkSize", 1000);
-pref("browser.urlbar.search.timeout", 100);
+// The amount of time (ms) to wait after the user has stopped typing
+// before starting to perform autocomplete. 50 is the default set in
+// autocomplete.xml.
+pref("browser.urlbar.delay", 50);
// The special characters below can be typed into the urlbar to either restrict
// the search to visited history, bookmarked, tagged pages; or force a match on
@@ -207,7 +212,10 @@ pref("browser.urlbar.default.behavior", 0);
pref("browser.download.saveLinkAsFilenameTimeout", 1000);
pref("browser.download.useDownloadDir", true);
+
+//@line 267 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.download.folderList", 1);
+//@line 269 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.download.manager.showAlertOnComplete", true);
pref("browser.download.manager.showAlertInterval", 2000);
pref("browser.download.manager.retention", 2);
@@ -221,7 +229,7 @@ pref("browser.download.manager.scanWhenDone", true);
pref("browser.download.manager.resumeOnWakeDelay", 10000);
// search engines URL
-pref("browser.search.searchEnginesURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/firefox/%VERSION%/search-engines/");
+pref("browser.search.searchEnginesURL", "https://addons.mozilla.org/%LOCALE%/%APP%/search-engines/");
// pointer to the default engine name
pref("browser.search.defaultenginename", "chrome://browser-region/locale/region.properties");
@@ -252,11 +260,12 @@ pref("browser.microsummary.updateGenerators", true);
// enable search suggestions by default
pref("browser.search.suggest.enabled", true);
-pref("browser.history.grouping", "day");
pref("browser.history.showSessions", false);
pref("browser.sessionhistory.max_entries", 50);
+//@line 316 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.history_expire_days", 180);
pref("browser.history_expire_days_min", 90);
+//@line 322 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.history_expire_sites", 40000);
// handle links targeting new windows
@@ -269,8 +278,11 @@ pref("browser.link.open_newwindow", 3);
pref("browser.link.open_newwindow.restriction", 2);
// Tabbed browser
+//@line 335 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.tabs.autoHide", false);
+//@line 339 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.tabs.closeWindowWithLastTab", true);
+pref("browser.tabs.insertRelatedAfterCurrent", true);
pref("browser.tabs.warnOnClose", true);
pref("browser.tabs.warnOnOpen", true);
pref("browser.tabs.maxOpenBeforeWarn", 15);
@@ -297,7 +309,8 @@ pref("browser.tabs.closeButtons", 1);
// false return to the adjacent tab (old default)
pref("browser.tabs.selectOwnerOnClose", true);
-pref("browser.ctrlTab.previews", true);
+pref("browser.allTabs.previews", false);
+pref("browser.ctrlTab.previews", false);
pref("browser.ctrlTab.recentlyUsedLimit", 7);
// Default bookmark sorting
@@ -317,9 +330,11 @@ pref("browser.bookmarks.max_backups", 5);
// Scripts & Windows prefs
pref("dom.disable_open_during_load", true);
-//@line 371 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 392 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("javascript.options.showInConsole", false);
-//@line 373 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 394 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
+
+//@line 399 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// Make the status bar reliably present and unaffected by pages
pref("dom.disable_window_open_feature.status", true);
@@ -386,7 +401,7 @@ pref("intl.charsetmenu.browser.more2", "chrome://global/locale/intl.properties"
pref("intl.charsetmenu.browser.more3", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more4", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more5", "chrome://global/locale/intl.properties");
-pref("intl.charsetmenu.browser.unicode", "chrome://global/locale/intl.properties");
+pref("intl.charsetmenu.browser.unicode", "UTF-8, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE");
pref("intl.charset.detector", "chrome://global/locale/intl.properties");
pref("intl.charset.default", "chrome://global-platform/locale/intl.properties");
pref("font.language.group", "chrome://global/locale/intl.properties");
@@ -398,10 +413,10 @@ pref("browser.gesture.swipe.left", "Browser:BackOrBackDuplicate");
pref("browser.gesture.swipe.right", "Browser:ForwardOrForwardDuplicate");
pref("browser.gesture.swipe.up", "cmd_scrollTop");
pref("browser.gesture.swipe.down", "cmd_scrollBottom");
-//@line 455 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 481 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.gesture.pinch.latched", false);
pref("browser.gesture.pinch.threshold", 25);
-//@line 458 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 484 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.gesture.pinch.out", "cmd_fullZoomEnlarge");
pref("browser.gesture.pinch.in", "cmd_fullZoomReduce");
pref("browser.gesture.pinch.out.shift", "cmd_fullZoomReset");
@@ -413,7 +428,7 @@ pref("browser.gesture.twist.left", "");
pref("browser.gesture.tap", "cmd_fullZoomReset");
// 0=lines, 1=pages, 2=history , 3=text size
-//@line 483 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 509 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("mousewheel.withshiftkey.action",2);
pref("mousewheel.withshiftkey.sysnumlines",false);
pref("mousewheel.withshiftkey.numlines",1);
@@ -423,7 +438,7 @@ pref("mousewheel.withaltkey.numlines",1);
pref("mousewheel.withmetakey.action",0);
pref("mousewheel.withmetakey.sysnumlines",true);
pref("mousewheel.withmetakey.numlines",1);
-//@line 493 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 519 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("mousewheel.withcontrolkey.action",3);
pref("mousewheel.withcontrolkey.sysnumlines",false);
pref("mousewheel.withcontrolkey.numlines",1);
@@ -480,14 +495,18 @@ pref("plugin.default_plugin_disabled", true);
// plugin finder service url
pref("pfs.datasource.url", "https://pfs.mozilla.org/plugins/PluginFinderService.php?mimetype=%PLUGIN_MIMETYPE%&appID=%APP_ID%&appVersion=%APP_VERSION%&clientOS=%CLIENT_OS%&chromeLocale=%CHROME_LOCALE%&appRelease=%APP_RELEASE%");
-// by default we show an infobar message when pages require plugins the user has not installed
+// by default we show an infobar message when pages require plugins the user has not installed, or are outdated
pref("plugins.hide_infobar_for_missing_plugin", false);
+pref("plugins.hide_infobar_for_outdated_plugin", false);
+
+pref("plugins.update.url", "https://www.mozilla.com/%LOCALE%/plugincheck/");
+pref("plugins.update.notifyUser", false);
-//@line 555 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 585 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.preferences.instantApply", true);
-//@line 560 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 590 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.preferences.animateFadeIn", false);
-//@line 562 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 592 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.download.show_plugins_in_list", true);
pref("browser.download.hide_plugins_without_extensions", true);
@@ -496,9 +515,9 @@ pref("browser.download.hide_plugins_without_extensions", true);
// 0 goes Back/Forward
// 1 act like PgUp/PgDown
// 2 and other values, nothing
-//@line 571 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 601 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.backspace_action", 2);
-//@line 575 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 605 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// this will automatically enable inline spellchecking (if it is available) for
// editable elements in HTML
@@ -587,7 +606,7 @@ pref("gecko.handlerService.schemes.ircs.3.uriTemplate", "chrome://browser-region
// By default, we don't want protocol/content handlers to be registered from a different host, see bug 402287
pref("gecko.handlerService.allowRegisterFromDifferentHost", false);
-//@line 664 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 694 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// Safe browsing does nothing unless this pref is set
pref("browser.safebrowsing.enabled", true);
@@ -614,8 +633,8 @@ pref("browser.safebrowsing.provider.0.reportMalwareURL", "http://{moz:locale}.ma
pref("browser.safebrowsing.provider.0.reportMalwareErrorURL", "http://{moz:locale}.malware-error.mozilla.com/?hl={moz:locale}");
// FAQ URLs
-pref("browser.safebrowsing.warning.infoURL", "http://%LOCALE%.www.mozilla.com/%LOCALE%/firefox/phishing-protection/");
-pref("browser.geolocation.warning.infoURL", "http://%LOCALE%.www.mozilla.com/%LOCALE%/firefox/geolocation/");
+pref("browser.safebrowsing.warning.infoURL", "http://www.mozilla.com/%LOCALE%/%APP%/phishing-protection/");
+pref("browser.geolocation.warning.infoURL", "http://www.mozilla.com/%LOCALE%/%APP%/geolocation/");
// Name of the about: page contributed by safebrowsing to handle display of error
// pages on phishing/malware hits. (bug 399233)
@@ -632,25 +651,27 @@ pref("urlclassifier.gethashtables", "goog-phish-shavar,goog-malware-shavar");
// the database.
pref("urlclassifier.confirm-age", 2700);
-//@line 714 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 744 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// Maximum size of the sqlite3 cache during an update, in bytes
-//@line 717 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 747 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("urlclassifier.updatecachemax", 104857600);
-//@line 721 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 751 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
// URL for checking the reason for a malware warning.
pref("browser.safebrowsing.malware.reportURL", "http://safebrowsing.clients.google.com/safebrowsing/diagnostic?client=%NAME%&hl=%LOCALE%&site=");
-//@line 726 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 756 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.EULA.version", 3);
pref("browser.rights.version", 3);
pref("browser.rights.3.shown", false);
-//@line 735 "/builds/moz2_slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 765 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
+//@line 769 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.sessionstore.resume_from_crash", true);
+//@line 771 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
pref("browser.sessionstore.resume_session_once", false);
// minimal interval between two save operations in milliseconds
@@ -677,18 +698,6 @@ pref("accessibility.blockautorefresh", false);
// when calculating frecency
pref("places.frecency.numVisits", 10);
-// Number of records to update frecency for when idle.
-pref("places.frecency.numCalcOnIdle", 50);
-
-// Number of records to update frecency for when migrating from
-// a pre-frecency build.
-pref("places.frecency.numCalcOnMigrate", 50);
-
-// Perform frecency recalculation after this amount of idle, repeating.
-// A value of zero disables updating of frecency on idle.
-// Default is 1 minute (60000ms).
-pref("places.frecency.updateIdleTime", 60000);
-
// buckets (in days) for frecency calculation
pref("places.frecency.firstBucketCutoff", 4);
pref("places.frecency.secondBucketCutoff", 14);
@@ -759,6 +768,17 @@ pref("browser.privatebrowsing.autostart", false);
// Whether we should skip prompting before starting the private browsing mode
pref("browser.privatebrowsing.dont_prompt_on_enter", false);
+// Don't try to alter this pref, it'll be reset the next time you use the
+// bookmarking dialog
+pref("browser.bookmarks.editDialog.firstEditField", "namePicker");
+
// base url for the wifi geolocation network provider
pref("geo.wifi.uri", "https://www.google.com/loc/json");
+//@line 904 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
+
+// Whether to use a panel that looks like an OS X sheet for customization
+//@line 909 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
+pref("toolbar.customization.usesheet", false);
+//@line 911 "/builds/slave/linux_build/build/browser/app/profile/firefox.js"
+
diff --git a/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png
new file mode 100644
index 0000000..b032749
--- /dev/null
+++ b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png
Binary files differ
diff --git a/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
index e83279f..93c87ea 100755
--- a/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
+++ b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
@@ -6,15 +6,15 @@
<Description about="urn:mozilla:install-manifest">
<em:id>{972ce4c6-7e08-4474-a285-3208198ce6fd}</em:id>
- <em:version>3.5.3</em:version>
+ <em:version>3.6</em:version>
<!-- Target Application this theme can install into,
with minimum and maximum supported versions. -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
- <em:minVersion>3.5.3</em:minVersion>
- <em:maxVersion>3.5.3</em:maxVersion>
+ <em:minVersion>3.6</em:minVersion>
+ <em:maxVersion>3.6</em:maxVersion>
</Description>
</em:targetApplication>
diff --git a/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/preview.png b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/preview.png
new file mode 100644
index 0000000..ec75f5c
--- /dev/null
+++ b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/preview.png
Binary files differ
diff --git a/tools/xo_bundle/firefox b/tools/xo_bundle/firefox
index 513dc48..e6dc6ac 100755
--- a/tools/xo_bundle/firefox
+++ b/tools/xo_bundle/firefox
@@ -50,7 +50,8 @@
#uncomment for debugging
#set -x
-moz_libdir=/usr/local/lib/firefox-3.5.3
+moz_libdir=/usr/lib/firefox
+
# Use run-mozilla.sh in the current dir if it exists
# If not, then start resolving symlinks until we find run-mozilla.sh
diff --git a/tools/xo_bundle/firefox-bin b/tools/xo_bundle/firefox-bin
index 58aaff5..fe71fb6 100755
--- a/tools/xo_bundle/firefox-bin
+++ b/tools/xo_bundle/firefox-bin
Binary files differ
diff --git a/tools/xo_bundle/firefox-old b/tools/xo_bundle/firefox-old
new file mode 100755
index 0000000..e6dc6ac
--- /dev/null
+++ b/tools/xo_bundle/firefox-old
@@ -0,0 +1,142 @@
+#!/bin/sh
+#
+# ***** 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.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# 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 *****
+
+##
+## Usage:
+##
+## $ mozilla [args]
+##
+## This script is meant to run the application binary from mozilla/dist/bin.
+##
+## The script will setup all the environment voodoo needed to make
+## the application binary to work.
+##
+
+#uncomment for debugging
+#set -x
+
+moz_libdir=/usr/lib/firefox
+
+
+# Use run-mozilla.sh in the current dir if it exists
+# If not, then start resolving symlinks until we find run-mozilla.sh
+found=0
+progname="$0"
+curdir=`dirname "$progname"`
+progbase=`basename "$progname"`
+run_moz="$curdir/run-mozilla.sh"
+if test -x "$run_moz"; then
+ dist_bin="$curdir"
+ found=1
+else
+ here=`/bin/pwd`
+ while [ -h "$progname" ]; do
+ bn=`basename "$progname"`
+ cd `dirname "$progname"`
+ progname=`/bin/ls -l "$bn" | sed -e 's/^.* -> //' `
+ progbase=`basename "$progname"`
+ if [ ! -x "$progname" ]; then
+ break
+ fi
+ curdir=`dirname "$progname"`
+ run_moz="$curdir/run-mozilla.sh"
+ if [ -x "$run_moz" ]; then
+ cd "$curdir"
+ dist_bin=`pwd`
+ run_moz="$dist_bin/run-mozilla.sh"
+ found=1
+ break
+ fi
+ done
+ cd "$here"
+fi
+if [ $found = 0 ]; then
+ # Check default compile-time libdir
+ if [ -x "$moz_libdir/run-mozilla.sh" ]; then
+ dist_bin="$moz_libdir"
+ run_moz="$moz_libdir/run-mozilla.sh"
+ else
+ echo "Cannot find Firefox runtime directory. Exiting."
+ exit 1
+ fi
+fi
+
+script_args=""
+debugging=0
+MOZILLA_BIN="${progbase}-bin"
+
+if [ "$OSTYPE" = "beos" ]; then
+ mimeset -F "$MOZILLA_BIN"
+fi
+
+pass_arg_count=0
+while [ $# -gt $pass_arg_count ]
+do
+ case "$1" in
+ -p | --pure | -pure)
+ MOZILLA_BIN="${MOZILLA_BIN}.pure"
+ shift
+ ;;
+ -g | --debug)
+ script_args="$script_args -g"
+ debugging=1
+ shift
+ ;;
+ -d | --debugger)
+ script_args="$script_args -d $2"
+ shift 2
+ ;;
+ *)
+ # Move the unrecognized argument to the end of the list.
+ arg="$1"
+ shift
+ set -- "$@" "$arg"
+ pass_arg_count=`expr $pass_arg_count + 1`
+ ;;
+ esac
+done
+
+if [ $debugging = 1 ]
+then
+ echo $dist_bin/run-mozilla.sh $script_args $dist_bin/$MOZILLA_BIN "$@"
+fi
+"$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@"
+exitcode=$?
+
+exit $exitcode
+# EOF.
diff --git a/tools/xo_bundle/firefox~ b/tools/xo_bundle/firefox~
new file mode 100755
index 0000000..d6c9277
--- /dev/null
+++ b/tools/xo_bundle/firefox~
@@ -0,0 +1,142 @@
+#!/bin/sh
+#
+# ***** 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.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# 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 *****
+
+##
+## Usage:
+##
+## $ mozilla [args]
+##
+## This script is meant to run the application binary from mozilla/dist/bin.
+##
+## The script will setup all the environment voodoo needed to make
+## the application binary to work.
+##
+
+#uncomment for debugging
+#set -x
+
+#moz_libdir=/usr/lib/firefox
+moz_libdir=.
+
+# Use run-mozilla.sh in the current dir if it exists
+# If not, then start resolving symlinks until we find run-mozilla.sh
+found=0
+progname="$0"
+curdir='.' #`dirname "$progname"`
+progbase=`basename "$progname"`
+run_moz="$curdir/run-mozilla.sh"
+if test -x "$run_moz"; then
+ dist_bin="$curdir"
+ found=1
+else
+ here=`/bin/pwd`
+ while [ -h "$progname" ]; do
+ bn=`basename "$progname"`
+ cd `dirname "$progname"`
+ progname=`/bin/ls -l "$bn" | sed -e 's/^.* -> //' `
+ progbase=`basename "$progname"`
+ if [ ! -x "$progname" ]; then
+ break
+ fi
+ curdir=`dirname "$progname"`
+ run_moz="$curdir/run-mozilla.sh"
+ if [ -x "$run_moz" ]; then
+ cd "$curdir"
+ dist_bin=`pwd`
+ run_moz="$dist_bin/run-mozilla.sh"
+ found=1
+ break
+ fi
+ done
+ cd "$here"
+fi
+if [ $found = 0 ]; then
+ # Check default compile-time libdir
+ if [ -x "$moz_libdir/run-mozilla.sh" ]; then
+ dist_bin="$moz_libdir"
+ run_moz="$moz_libdir/run-mozilla.sh"
+ else
+ echo "Cannot find Firefox runtime directory. Exiting."
+ exit 1
+ fi
+fi
+
+script_args=""
+debugging=0
+MOZILLA_BIN="${progbase}-bin"
+
+if [ "$OSTYPE" = "beos" ]; then
+ mimeset -F "$MOZILLA_BIN"
+fi
+
+pass_arg_count=0
+while [ $# -gt $pass_arg_count ]
+do
+ case "$1" in
+ -p | --pure | -pure)
+ MOZILLA_BIN="${MOZILLA_BIN}.pure"
+ shift
+ ;;
+ -g | --debug)
+ script_args="$script_args -g"
+ debugging=1
+ shift
+ ;;
+ -d | --debugger)
+ script_args="$script_args -d $2"
+ shift 2
+ ;;
+ *)
+ # Move the unrecognized argument to the end of the list.
+ arg="$1"
+ shift
+ set -- "$@" "$arg"
+ pass_arg_count=`expr $pass_arg_count + 1`
+ ;;
+ esac
+done
+
+if [ $debugging = 1 ]
+then
+ echo $dist_bin/run-mozilla.sh $script_args $dist_bin/$MOZILLA_BIN "$@"
+fi
+"$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@"
+exitcode=$?
+
+exit $exitcode
+# EOF.
diff --git a/tools/xo_bundle/foo.txt b/tools/xo_bundle/foo.txt
new file mode 100644
index 0000000..b33c560
--- /dev/null
+++ b/tools/xo_bundle/foo.txt
@@ -0,0 +1 @@
+test test
diff --git a/tools/xo_bundle/greprefs/all.js b/tools/xo_bundle/greprefs/all.js
index 745d6b0..a8d3920 100755
--- a/tools/xo_bundle/greprefs/all.js
+++ b/tools/xo_bundle/greprefs/all.js
@@ -59,7 +59,9 @@ pref("general.warnOnAboutConfig", true);
pref("browser.bookmarks.max_backups", 5);
pref("browser.cache.disk.enable", true);
+//@line 63 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("browser.cache.disk.capacity", 51200);
+//@line 67 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("browser.cache.memory.enable", true);
//pref("browser.cache.memory.capacity", -1);
// -1 = determine dynamically, 0 = none, n = memory capacity in kilobytes
@@ -68,6 +70,7 @@ pref("browser.cache.disk_cache_ssl", false);
pref("browser.cache.check_doc_frequency", 3);
pref("browser.cache.offline.enable", true);
+//@line 76 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// offline cache capacity in kilobytes
pref("browser.cache.offline.capacity", 512000);
@@ -78,11 +81,14 @@ pref("offline-apps.quota.max", 204800);
// the user should be warned if offline app disk usage exceeds this amount
// (in kilobytes)
pref("offline-apps.quota.warn", 51200);
+//@line 92 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Fastback caching - if this pref is negative, then we calculate the number
// of content viewers to cache based on the amount of available memory.
pref("browser.sessionhistory.max_total_viewers", -1);
+pref("ui.use_native_colors", true);
+pref("ui.use_native_popup_windows", false);
pref("browser.display.use_document_fonts", 1); // 0 = never, 1 = quick, 2 = always
pref("browser.display.use_document_colors", true);
pref("browser.display.use_system_colors", false);
@@ -102,6 +108,7 @@ pref("browser.visited_color", "#551A8B");
pref("browser.underline_anchors", true);
pref("browser.blink_allowed", true);
pref("browser.enable_automatic_image_resizing", false);
+pref("browser.enable_click_image_resizing", true);
// See http://whatwg.org/specs/web-apps/current-work/#ping
pref("browser.send_pings", false);
@@ -138,11 +145,11 @@ pref("media.enforce_same_site_origin", false);
// Media cache size in kilobytes
pref("media.cache_size", 51200);
-//@line 142 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 156 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("media.ogg.enabled", true);
-//@line 145 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 159 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("media.wave.enabled", true);
-//@line 147 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 161 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Whether to autostart a media element with an |autoplay| attribute
pref("media.autoplay.enabled", true);
@@ -158,7 +165,9 @@ pref("gfx.downloadable_fonts.enabled", true);
pref("accessibility.browsewithcaret", false);
pref("accessibility.warn_on_browsewithcaret", true);
-//@line 163 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+pref("accessibility.browsewithcaret_shortcut.enabled", true);
+
+//@line 179 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Tab focus model bit field:
// 1 focuses text controls, 2 focuses other form elements, 4 adds links.
// Most users will want 1, 3, or 7.
@@ -171,7 +180,7 @@ pref("accessibility.tabfocus_applies_to_xul", false);
// unless this preference was set manually
pref("ui.scrollToClick", 0);
-//@line 179 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 195 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("accessibility.usetexttospeech", "");
pref("accessibility.usebrailledisplay", "");
@@ -226,9 +235,6 @@ pref("nglayout.events.dispatchLeftClickOnly", true);
// whether or not to draw images while dragging
pref("nglayout.enable_drag_images", true);
-// whether or not to use xbl form controls
-pref("nglayout.debug.enable_xbl_forms", false);
-
// scrollbar snapping region
// 0 - off
// 1 and higher - slider thickness multiple
@@ -518,10 +524,9 @@ pref("dom.storage.enabled", true);
pref("dom.storage.default_quota", 5120);
// Parsing perf prefs. For now just mimic what the old code did.
-pref("content.sink.event_probe_rate", 3);
-//@line 527 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 539 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("content.sink.pending_event_mode", 0);
-//@line 529 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 541 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Disable popups from plugins by default
// 0 = openAllowed
@@ -532,14 +537,18 @@ pref("privacy.popups.disable_from_plugins", 2);
pref("dom.event.contextmenu.enabled", true);
pref("javascript.enabled", true);
-pref("javascript.allow.mailnews", false);
pref("javascript.options.strict", false);
pref("javascript.options.relimit", false);
pref("javascript.options.jit.content", true);
-pref("javascript.options.jit.chrome", false);
+pref("javascript.options.jit.chrome", true);
+// This preference limits the memory usage of javascript.
+// If you want to change these values for your device,
+// please find Bug 417052 comment 17 and Bug 456721
+// Comment 32.
+pref("javascript.options.mem.high_water_mark", 32);
+pref("javascript.options.mem.gc_frequency", 1600);
// advanced prefs
-pref("security.enable_java", true);
pref("advanced.mailftp", false);
pref("image.animation_mode", "normal");
@@ -566,7 +575,7 @@ pref("network.protocol-handler.external.data", false);
pref("network.protocol-handler.external.ms-help", false);
pref("network.protocol-handler.external.shell", false);
pref("network.protocol-handler.external.vnd.ms.radio", false);
-//@line 576 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 592 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("network.protocol-handler.external.disk", false);
pref("network.protocol-handler.external.disks", false);
pref("network.protocol-handler.external.afp", false);
@@ -609,7 +618,12 @@ pref("network.http.default-socket-type", "");
pref("network.http.keep-alive", true); // set it to false in case of problems
pref("network.http.proxy.keep-alive", true);
-pref("network.http.keep-alive.timeout", 300);
+// There is a problem with some IIS7 servers that don't close the connection
+// properly after it times out (bug #491541). Default timeout on IIS7 is
+// 120 seconds. We need to reuse or drop the connection within this time.
+// We set the timeout a little shorter to keep a reserve for cases when
+// the packet is lost or delayed on the route.
+pref("network.http.keep-alive.timeout", 115);
// limit the absolute number of http connections.
pref("network.http.max-connections", 30);
@@ -799,7 +813,16 @@ pref("network.negotiate-auth.gsslib", "");
// Specify if the gss lib comes standard with the OS
pref("network.negotiate-auth.using-native-gsslib", true);
-//@line 814 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 835 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
+
+// Controls which NTLM authentication implementation we default to. True forces
+// the use of our generic (internal) NTLM authentication implementation vs. any
+// native implementation provided by the os. This pref is for diagnosing issues
+// with native NTLM. (See bug 520607 for details.) Using generic NTLM authentication
+// can expose the user to reflection attack vulnerabilities. Do not change this
+// unless you know what you're doing!
+// This pref should be removed 6 months after the release of firefox 3.6.
+pref("network.auth.force-generic-ntlm", false);
// The following prefs are used to enable automatic use of the operating
// system's NTLM implementation to silently authenticate the user with their
@@ -818,9 +841,9 @@ pref("network.ntlm.send-lm-response", false);
pref("permissions.default.image", 1); // 1-Accept, 2-Deny, 3-dontAcceptForeign
-//@line 834 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 864 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("network.proxy.type", 5);
-//@line 841 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 871 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
pref("network.proxy.ftp", "");
pref("network.proxy.ftp_port", 0);
@@ -838,7 +861,6 @@ pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
pref("network.proxy.failover_timeout", 1800); // 30 minutes
pref("network.online", true); //online/offline
pref("network.cookie.cookieBehavior", 0); // 0-Accept, 1-dontAcceptForeign, 2-dontUse
-pref("network.cookie.disableCookieForMailNews", true); // disable all cookies for mail
pref("network.cookie.lifetimePolicy", 0); // accept normally, 1-askBeforeAccepting, 2-acceptForSession,3-acceptForNDays
pref("network.cookie.alwaysAcceptSessionCookies", false);
pref("network.cookie.prefsMigrated", false);
@@ -865,7 +887,7 @@ pref("intl.charsetmenu.browser.more2", "chrome://global/locale/intl.propert
pref("intl.charsetmenu.browser.more3", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more4", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more5", "chrome://global/locale/intl.properties");
-pref("intl.charsetmenu.browser.unicode", "chrome://global/locale/intl.properties");
+pref("intl.charsetmenu.browser.unicode", "UTF-8, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE");
pref("intl.charsetmenu.mailedit", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.cache", "");
pref("intl.charsetmenu.mailview.cache", "");
@@ -881,6 +903,11 @@ pref("intl.locale.matchOS", false);
pref("intl.fallbackCharsetList.ISO-8859-1", "windows-1252");
pref("font.language.group", "chrome://global/locale/intl.properties");
+// these locales have right-to-left UI
+pref("intl.uidirection.ar", "rtl");
+pref("intl.uidirection.he", "rtl");
+pref("intl.uidirection.fa", "rtl");
+
pref("font.mathfont-family", "STIXNonUnicode, STIXSize1, STIXGeneral, Standard Symbols L, DejaVu Sans, Cambria Math");
// Some CJK fonts have bad underline offset, their CJK character glyphs are overlapped (or adjoined) to its underline.
@@ -929,9 +956,28 @@ pref("mousewheel.transaction.ignoremovedelay", 100);
// Macbook touchpad two finger pixel scrolling
pref("mousewheel.enable_pixel_scrolling", true);
+// prefs for app level mouse wheel scrolling acceleration.
+// number of mousewheel clicks when acceleration starts
+// acceleration can be turned off if pref is set to -1
+pref("mousewheel.acceleration.start", -1);
+// factor to be multiplied for constant acceleration
+pref("mousewheel.acceleration.factor", 10);
+
+// Prefs for override the system mouse wheel scrolling speed on the root
+// content of the web pages. When
+// "mousewheel.system_scroll_override_on_root_content.enabled" is true and the system
+// scrolling speed isn't customized by the user, the root content scrolling
+// speed is multiplied by the following factors. The value will be used as
+// 1/100. E.g., 200 means 2.00.
+// NOTE: Even if "mousewheel.system_scroll_override_on_root_content.enabled" is
+// true, when Gecko detects the user customized the system scrolling speed
+// settings, the override isn't executed.
+pref("mousewheel.system_scroll_override_on_root_content.vertical.factor", 200);
+pref("mousewheel.system_scroll_override_on_root_content.horizontal.factor", 200);
+
// 0=lines, 1=pages, 2=history , 3=text size
pref("mousewheel.withnokey.action",0);
-pref("mousewheel.withnokey.numlines",1);
+pref("mousewheel.withnokey.numlines",6);
pref("mousewheel.withnokey.sysnumlines",true);
pref("mousewheel.withcontrolkey.action",0);
pref("mousewheel.withcontrolkey.numlines",1);
@@ -1077,7 +1123,7 @@ pref("layout.css.report_errors", true);
// Should the :visited selector ever match (otherwise :link matches instead)?
pref("layout.css.visited_links_enabled", true);
-// Override DPI. A value of -1 means use the maximum of 96 and the system DPI.
+// Override DPI. A value of -1 means use the maxium of 96 and the system DPI.
// A value of 0 means use the system DPI. A positive value is used as the DPI.
// This sets the physical size of a device pixel and thus controls the
// interpretation of physical units such as "pt".
@@ -1087,7 +1133,7 @@ pref("layout.css.dpi", -1);
// automatically based on the DPI. A positive value is used as-is. This effectively
// controls the size of a CSS "px". This is only used for pixel-based
// (screen) output devices.
-pref("layout.css.devPixelsPerPx", -1);
+pref("layout.css.devPixelsPerPx", "-1");
// pref for which side vertical scrollbars should be on
// 0 = end-side in UI direction
@@ -1145,11 +1191,11 @@ pref("gestures.enable_single_finger_input", true);
pref("editor.resizing.preserve_ratio", true);
pref("editor.positioning.offset", 0);
-// Disable slow script warnings for chrome by default - bug 492410
-pref("dom.max_chrome_script_run_time", 0);
+pref("dom.max_chrome_script_run_time", 20);
pref("dom.max_script_run_time", 10);
pref("svg.enabled", true);
+pref("svg.smil.enabled", false);
pref("font.minimum-size.ar", 0);
pref("font.minimum-size.x-armn", 0);
@@ -1183,15 +1229,15 @@ pref("font.minimum-size.x-western", 0);
pref("font.minimum-size.x-unicode", 0);
pref("font.minimum-size.x-user-def", 0);
-//@line 1582 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 1654 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 1999 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2078 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 2200 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2281 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 2294 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2377 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 2297 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2380 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Handled differently under Mac/Windows
pref("network.hosts.smtp_server", "localhost");
pref("network.hosts.pop_server", "pop");
@@ -1459,15 +1505,17 @@ pref("print.postscript.print_command", "lpr ${MOZ_PRINTER_NAME:+-P\"$MOZ_PRINTER
// So, we have no reasons we should use non-toplevel window for popup.
pref("ui.panel.default_level_parent", true);
-//@line 2567 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+pref("mousewheel.system_scroll_override_on_root_content.enabled", false);
-//@line 2635 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2652 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 2661 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2720 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 2681 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2746 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
-//@line 2689 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+//@line 2766 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
+
+//@line 2774 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Login Manager prefs
pref("signon.rememberSignons", true);
@@ -1478,6 +1526,16 @@ pref("signon.SignonFileName3", "signons3.txt"); // obsolete
pref("signon.autofillForms", true);
pref("signon.debug", false); // logs to Error Console
+// Satchel (Form Manager) prefs
+pref("browser.formfill.debug", false);
+pref("browser.formfill.enable", true);
+pref("browser.formfill.agedWeight", 2);
+pref("browser.formfill.bucketSize", 1);
+pref("browser.formfill.maxTimeGroupings", 25);
+pref("browser.formfill.timeGroupingSize", 604800);
+pref("browser.formfill.boundaryWeight", 25);
+pref("browser.formfill.prefixWeight", 5);
+
// Zoom prefs
pref("browser.zoom.full", false);
pref("zoom.minPercent", 30);
@@ -1491,7 +1549,15 @@ pref("image.cache.size", 5242880);
// Size is given a weight of 1000 - timeweight.
pref("image.cache.timeweight", 500);
-//@line 2718 "/builds/moz2_slave/linux_build/build/modules/libpref/src/init/all.js"
+// The default Accept header sent for images loaded over HTTP(S)
+pref("image.http.accept", "image/png,image/*;q=0.8,*/*;q=0.5");
+
+//@line 2816 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
+
+//@line 2821 "/builds/slave/linux_build/build/modules/libpref/src/init/all.js"
// Enable/Disable the geolocation API for content
pref("geo.enabled", true);
+
+// Enable/Disable HTML5 parser
+pref("html5.enable", false);
diff --git a/tools/xo_bundle/greprefs/security-prefs.js b/tools/xo_bundle/greprefs/security-prefs.js
index cc43f33..4175363 100755
--- a/tools/xo_bundle/greprefs/security-prefs.js
+++ b/tools/xo_bundle/greprefs/security-prefs.js
@@ -21,12 +21,15 @@ pref("security.ssl3.rsa_1024_rc4_56_sha", false);
pref("security.ssl3.rsa_1024_des_cbc_sha", false);
pref("security.ssl3.rsa_rc4_40_md5", false);
pref("security.ssl3.rsa_rc2_40_md5", false);
+// Camellia is broken on Windows CE for now, see bug 508113
+//@line 26 "/builds/slave/linux_build/build/netwerk/base/public/security-prefs.js"
pref("security.ssl3.dhe_rsa_camellia_256_sha", true);
pref("security.ssl3.dhe_dss_camellia_256_sha", true);
pref("security.ssl3.rsa_camellia_256_sha", true);
pref("security.ssl3.dhe_rsa_camellia_128_sha", true);
pref("security.ssl3.dhe_dss_camellia_128_sha", true);
pref("security.ssl3.rsa_camellia_128_sha", true);
+//@line 33 "/builds/slave/linux_build/build/netwerk/base/public/security-prefs.js"
pref("security.ssl3.dhe_rsa_aes_256_sha", true);
pref("security.ssl3.dhe_dss_aes_256_sha", true);
pref("security.ssl3.rsa_aes_256_sha", true);
@@ -59,6 +62,7 @@ pref("security.ssl3.dhe_rsa_des_sha", false);
pref("security.ssl3.dhe_dss_des_sha", false);
pref("security.ssl3.rsa_null_sha", false);
pref("security.ssl3.rsa_null_md5", false);
+pref("security.ssl3.rsa_seed_sha", true);
pref("security.default_personal_cert", "Ask Every Time");
pref("security.remember_cert_checkbox_default_setting", true);
diff --git a/tools/xo_bundle/libfreebl3.chk b/tools/xo_bundle/libfreebl3.chk
index 9f40adb..18925f4 100755
--- a/tools/xo_bundle/libfreebl3.chk
+++ b/tools/xo_bundle/libfreebl3.chk
Binary files differ
diff --git a/tools/xo_bundle/libfreebl3.so b/tools/xo_bundle/libfreebl3.so
index 243648e..9ee6240 100755
--- a/tools/xo_bundle/libfreebl3.so
+++ b/tools/xo_bundle/libfreebl3.so
Binary files differ
diff --git a/tools/xo_bundle/libmozjs.so b/tools/xo_bundle/libmozjs.so
index c4da441..f26734c 100755
--- a/tools/xo_bundle/libmozjs.so
+++ b/tools/xo_bundle/libmozjs.so
Binary files differ
diff --git a/tools/xo_bundle/libnspr4.so b/tools/xo_bundle/libnspr4.so
index 19064bc..80373ac 100755
--- a/tools/xo_bundle/libnspr4.so
+++ b/tools/xo_bundle/libnspr4.so
Binary files differ
diff --git a/tools/xo_bundle/libnss3.so b/tools/xo_bundle/libnss3.so
index 164bdd4..6520097 100755
--- a/tools/xo_bundle/libnss3.so
+++ b/tools/xo_bundle/libnss3.so
Binary files differ
diff --git a/tools/xo_bundle/libnssckbi.so b/tools/xo_bundle/libnssckbi.so
index 321857e..22a605d 100755
--- a/tools/xo_bundle/libnssckbi.so
+++ b/tools/xo_bundle/libnssckbi.so
Binary files differ
diff --git a/tools/xo_bundle/libnssdbm3.chk b/tools/xo_bundle/libnssdbm3.chk
new file mode 100644
index 0000000..8d1c009
--- /dev/null
+++ b/tools/xo_bundle/libnssdbm3.chk
Binary files differ
diff --git a/tools/xo_bundle/libnssdbm3.so b/tools/xo_bundle/libnssdbm3.so
index a7cabd8..92d3c7f 100755
--- a/tools/xo_bundle/libnssdbm3.so
+++ b/tools/xo_bundle/libnssdbm3.so
Binary files differ
diff --git a/tools/xo_bundle/libnssutil3.so b/tools/xo_bundle/libnssutil3.so
index 9352a79..4f49f39 100755
--- a/tools/xo_bundle/libnssutil3.so
+++ b/tools/xo_bundle/libnssutil3.so
Binary files differ
diff --git a/tools/xo_bundle/libplc4.so b/tools/xo_bundle/libplc4.so
index f805028..c34ac0e 100755
--- a/tools/xo_bundle/libplc4.so
+++ b/tools/xo_bundle/libplc4.so
Binary files differ
diff --git a/tools/xo_bundle/libplds4.so b/tools/xo_bundle/libplds4.so
index a833e67..7e565bf 100755
--- a/tools/xo_bundle/libplds4.so
+++ b/tools/xo_bundle/libplds4.so
Binary files differ
diff --git a/tools/xo_bundle/libsmime3.so b/tools/xo_bundle/libsmime3.so
index f211048..81174a4 100755
--- a/tools/xo_bundle/libsmime3.so
+++ b/tools/xo_bundle/libsmime3.so
Binary files differ
diff --git a/tools/xo_bundle/libsoftokn3.chk b/tools/xo_bundle/libsoftokn3.chk
index da6a98c..b682971 100755
--- a/tools/xo_bundle/libsoftokn3.chk
+++ b/tools/xo_bundle/libsoftokn3.chk
Binary files differ
diff --git a/tools/xo_bundle/libsoftokn3.so b/tools/xo_bundle/libsoftokn3.so
index b48b8dd..44748e2 100755
--- a/tools/xo_bundle/libsoftokn3.so
+++ b/tools/xo_bundle/libsoftokn3.so
Binary files differ
diff --git a/tools/xo_bundle/libsqlite3.so b/tools/xo_bundle/libsqlite3.so
index 294bffd..fed0cbc 100755
--- a/tools/xo_bundle/libsqlite3.so
+++ b/tools/xo_bundle/libsqlite3.so
Binary files differ
diff --git a/tools/xo_bundle/libssl3.so b/tools/xo_bundle/libssl3.so
index 09a30bf..99d0cf8 100755
--- a/tools/xo_bundle/libssl3.so
+++ b/tools/xo_bundle/libssl3.so
Binary files differ
diff --git a/tools/xo_bundle/libxpcom.so b/tools/xo_bundle/libxpcom.so
index a94ee6d..1565498 100755
--- a/tools/xo_bundle/libxpcom.so
+++ b/tools/xo_bundle/libxpcom.so
Binary files differ
diff --git a/tools/xo_bundle/libxul.so b/tools/xo_bundle/libxul.so
index cab8b59..1760045 100755
--- a/tools/xo_bundle/libxul.so
+++ b/tools/xo_bundle/libxul.so
Binary files differ
diff --git a/tools/xo_bundle/modules/CertUtils.jsm b/tools/xo_bundle/modules/CertUtils.jsm
new file mode 100644
index 0000000..371df96
--- /dev/null
+++ b/tools/xo_bundle/modules/CertUtils.jsm
@@ -0,0 +1,77 @@
+EXPORTED_SYMBOLS = [ "BadCertHandler", "checkCert" ];
+
+/**
+ * Only allow built-in certs for HTTPS connections. See bug 340198.
+ */
+function checkCert(channel) {
+ if (!channel.originalURI.schemeIs("https")) // bypass
+ return;
+
+ const Ci = Components.interfaces;
+ var cert =
+ channel.securityInfo.QueryInterface(Ci.nsISSLStatusProvider).
+ SSLStatus.QueryInterface(Ci.nsISSLStatus).serverCert;
+
+ var issuer = cert.issuer;
+ while (issuer && !cert.equals(issuer)) {
+ cert = issuer;
+ issuer = cert.issuer;
+ }
+
+ var errorstring = "cert issuer is not built-in";
+ if (!issuer)
+ throw errorstring;
+
+ issuer = issuer.QueryInterface(Ci.nsIX509Cert3);
+ var tokenNames = issuer.getAllTokenNames({});
+
+ if (!tokenNames.some(isBuiltinToken))
+ throw errorstring;
+}
+
+function isBuiltinToken(tokenName) {
+ return tokenName == "Builtin Object Token";
+}
+
+/**
+ * This class implements nsIBadCertListener. Its job is to prevent "bad cert"
+ * security dialogs from being shown to the user. It is better to simply fail
+ * if the certificate is bad. See bug 304286.
+ */
+function BadCertHandler() {
+}
+BadCertHandler.prototype = {
+
+ // nsIChannelEventSink
+ onChannelRedirect: function(oldChannel, newChannel, flags) {
+ // make sure the certificate of the old channel checks out before we follow
+ // a redirect from it. See bug 340198.
+ checkCert(oldChannel);
+ },
+
+ // Suppress any certificate errors
+ notifyCertProblem: function(socketInfo, status, targetSite) {
+ return true;
+ },
+
+ // Suppress any ssl errors
+ notifySSLError: function(socketInfo, error, targetSite) {
+ return true;
+ },
+
+ // nsIInterfaceRequestor
+ getInterface: function(iid) {
+ return this.QueryInterface(iid);
+ },
+
+ // nsISupports
+ QueryInterface: function(iid) {
+ if (!iid.equals(Components.interfaces.nsIChannelEventSink) &&
+ !iid.equals(Components.interfaces.nsIBadCertListener2) &&
+ !iid.equals(Components.interfaces.nsISSLErrorListener) &&
+ !iid.equals(Components.interfaces.nsIInterfaceRequestor) &&
+ !iid.equals(Components.interfaces.nsISupports))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ return this;
+ }
+};
diff --git a/tools/xo_bundle/modules/DownloadUtils.jsm b/tools/xo_bundle/modules/DownloadUtils.jsm
index d2c0fb2..b7505a8 100755
--- a/tools/xo_bundle/modules/DownloadUtils.jsm
+++ b/tools/xo_bundle/modules/DownloadUtils.jsm
@@ -66,7 +66,12 @@ var EXPORTED_SYMBOLS = [ "DownloadUtils" ];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
-Cu.import("resource://gre/modules/PluralForm.jsm");
+
+__defineGetter__("PluralForm", function() {
+ delete this.PluralForm;
+ Cu.import("resource://gre/modules/PluralForm.jsm");
+ return PluralForm;
+});
const kDownloadProperties =
"chrome://mozapps/locale/downloads/downloads.properties";
@@ -296,8 +301,9 @@ let DownloadUtils = {
let pair2 = replaceInsert(gStr.timePair, 1, time2);
pair2 = replaceInsert(pair2, 2, unit2);
- // Only show minutes for under 1 hour or the second pair is 0
- if (aSeconds < 3600 || time2 == 0) {
+ // Only show minutes for under 1 hour unless there's a few minutes left;
+ // or the second pair is 0.
+ if ((aSeconds < 3600 && time1 >= 4) || time2 == 0) {
timeLeft = replaceInsert(gStr.timeLeftSingle, 1, pair1);
} else {
// We've got 2 pairs of times to display
diff --git a/tools/xo_bundle/modules/FileUtils.jsm b/tools/xo_bundle/modules/FileUtils.jsm
new file mode 100644
index 0000000..947b76b
--- /dev/null
+++ b/tools/xo_bundle/modules/FileUtils.jsm
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+*/
+EXPORTED_SYMBOLS = [ "FileUtils" ];
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+
+XPCOMUtils.defineLazyServiceGetter(this, "gDirService",
+ "@mozilla.org/file/directory_service;1",
+ "nsIProperties");
+
+var FileUtils = {
+ MODE_RDONLY : 0x01,
+ MODE_WRONLY : 0x02,
+ MODE_CREATE : 0x08,
+ MODE_APPEND : 0x10,
+ MODE_TRUNCATE : 0x20,
+
+ PERMS_FILE : 0644,
+ PERMS_DIRECTORY : 0755,
+
+ /**
+ * Gets the file at the specified hierarchy under a Directory Service key.
+ * @param key
+ * The Directory Service Key to start from
+ * @param pathArray
+ * An array of path components to locate beneath the directory
+ * specified by |key|. The last item in this array must be the
+ * leaf name of a file.
+ * @return nsIFile object for the file specified. The file is NOT created
+ * if it does not exist, however all required directories along
+ * the way are.
+ */
+ getFile: function FileUtils_getFile(key, pathArray, followLinks) {
+ var file = this.getDir(key, pathArray.slice(0, -1), true, followLinks);
+ file.append(pathArray[pathArray.length - 1]);
+ return file;
+ },
+
+ /**
+ * Gets the specified directory at the specified hierarchy under a
+ * Directory Service key.
+ * @param key
+ * The Directory Service Key to start from
+ * @param pathArray
+ * An array of path components to locate beneath the directory
+ * specified by |key|
+ * @param shouldCreate
+ * true if the directory hierarchy specified in |pathArray|
+ * should be created if it does not exist, false otherwise.
+ * @param followLinks (optional)
+ * true if links should be followed, false otherwise.
+ * @return nsIFile object for the location specified. If the directory
+ * requested does not exist, it is created, along with any
+ * parent directories that need to be created.
+ */
+ getDir: function FileUtils_getDir(key, pathArray, shouldCreate, followLinks) {
+ var dir = gDirService.get(key, Ci.nsILocalFile);
+ for (var i = 0; i < pathArray.length; ++i) {
+ dir.append(pathArray[i]);
+ if (shouldCreate && !dir.exists())
+ dir.create(Ci.nsILocalFile.DIRECTORY_TYPE, this.PERMS_DIRECTORY);
+ }
+ if (!followLinks)
+ dir.followLinks = false;
+ return dir;
+ },
+
+ /**
+ * Opens a safe file output stream for writing.
+ * @param file
+ * The file to write to.
+ * @param modeFlags
+ * (optional) File open flags. Can be undefined.
+ * @returns nsIFileOutputStream to write to.
+ */
+ openSafeFileOutputStream: function FileUtils_openSafeFileOutputStream(file, modeFlags) {
+ var fos = Cc["@mozilla.org/network/safe-file-output-stream;1"].
+ createInstance(Ci.nsIFileOutputStream);
+ if (modeFlags === undefined)
+ modeFlags = this.MODE_WRONLY | this.MODE_CREATE | this.MODE_TRUNCATE;
+ fos.init(file, modeFlags, this.PERMS_FILE, 0);
+ return fos;
+ },
+
+ /**
+ * Closes a safe file output stream.
+ * @param stream
+ * The stream to close.
+ */
+ closeSafeFileOutputStream: function FileUtils_closeSafeFileOutputStream(stream) {
+ if (stream instanceof Ci.nsISafeOutputStream) {
+ try {
+ stream.finish();
+ return;
+ }
+ catch (e) {
+ }
+ }
+ stream.close();
+ }
+};
diff --git a/tools/xo_bundle/modules/LightweightThemeConsumer.jsm b/tools/xo_bundle/modules/LightweightThemeConsumer.jsm
new file mode 100644
index 0000000..69281c7
--- /dev/null
+++ b/tools/xo_bundle/modules/LightweightThemeConsumer.jsm
@@ -0,0 +1,111 @@
+/* ***** 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.org Code.
+ *
+ * The Initial Developer of the Original Code is
+ * Dao Gottwald <dao@mozilla.com>.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * 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 ***** */
+
+let EXPORTED_SYMBOLS = ["LightweightThemeConsumer"];
+
+function LightweightThemeConsumer(aDocument) {
+ this._doc = aDocument;
+ this._footerId = aDocument.documentElement.getAttribute("lightweightthemesfooter");
+
+ Components.classes["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService)
+ .addObserver(this, "lightweight-theme-styling-update", false);
+
+ var temp = {};
+ Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", temp);
+ this._update(temp.LightweightThemeManager.currentThemeForDisplay);
+}
+
+LightweightThemeConsumer.prototype = {
+ observe: function (aSubject, aTopic, aData) {
+ if (aTopic != "lightweight-theme-styling-update")
+ return;
+
+ this._update(JSON.parse(aData));
+ },
+
+ destroy: function () {
+ Components.classes["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService)
+ .removeObserver(this, "lightweight-theme-styling-update");
+
+ this._doc = null;
+ },
+
+ _update: function (aData) {
+ if (!aData)
+ aData = { headerURL: "", footerURL: "", textcolor: "", accentcolor: "" };
+
+ var root = this._doc.documentElement;
+ var active = !!aData.headerURL;
+
+ if (active) {
+ root.style.color = aData.textcolor || "black";
+ root.style.backgroundColor = aData.accentcolor || "white";
+ let [r, g, b] = _parseRGB(this._doc.defaultView.getComputedStyle(root, "").color);
+ let luminance = 0.2125 * r + 0.7154 * g + 0.0721 * b;
+ root.setAttribute("lwthemetextcolor", luminance <= 110 ? "dark" : "bright");
+ root.setAttribute("lwtheme", "true");
+ } else {
+ root.style.color = "";
+ root.style.backgroundColor = "";
+ root.removeAttribute("lwthemetextcolor");
+ root.removeAttribute("lwtheme");
+ }
+
+ _setImage(root, active, aData.headerURL);
+ if (this._footerId) {
+ let footer = this._doc.getElementById(this._footerId);
+ _setImage(footer, active, aData.footerURL);
+ if (active && aData.footerURL)
+ footer.setAttribute("lwthemefooter", "true");
+ else
+ footer.removeAttribute("lwthemefooter");
+ }
+
+ }
+}
+
+function _setImage(aElement, aActive, aURL) {
+ aElement.style.backgroundImage =
+ (aActive && aURL) ? 'url("' + aURL.replace('"', '\\"', "g") + '")' : "";
+}
+
+function _parseRGB(aColorString) {
+ var rgb = aColorString.match(/^rgba?\((\d+), (\d+), (\d+)/);
+ rgb.shift();
+ return rgb.map(function (x) parseInt(x));
+}
diff --git a/tools/xo_bundle/modules/LightweightThemeManager.jsm b/tools/xo_bundle/modules/LightweightThemeManager.jsm
new file mode 100644
index 0000000..10c47b1
--- /dev/null
+++ b/tools/xo_bundle/modules/LightweightThemeManager.jsm
@@ -0,0 +1,357 @@
+/* ***** 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.org Code.
+ *
+ * The Initial Developer of the Original Code is
+ * Dao Gottwald <dao@mozilla.com>.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * 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 ***** */
+
+var EXPORTED_SYMBOLS = ["LightweightThemeManager"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+const MAX_USED_THEMES_COUNT = 8;
+
+const MAX_PREVIEW_SECONDS = 30;
+
+const MANDATORY = ["id", "name", "headerURL"];
+const OPTIONAL = ["footerURL", "textcolor", "accentcolor", "iconURL",
+ "previewURL", "author", "description", "homepageURL",
+ "updateURL", "version"];
+
+const PERSIST_ENABLED = true;
+const PERSIST_BYPASS_CACHE = false;
+const PERSIST_FILES = {
+ headerURL: "lightweighttheme-header",
+ footerURL: "lightweighttheme-footer"
+};
+
+__defineGetter__("_prefs", function () {
+ delete this._prefs;
+ return this._prefs =
+ Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefService).getBranch("lightweightThemes.");
+});
+
+__defineGetter__("_observerService", function () {
+ delete this._observerService;
+ return this._observerService =
+ Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
+});
+
+__defineGetter__("_ioService", function () {
+ delete this._ioService;
+ return this._ioService =
+ Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
+});
+
+var LightweightThemeManager = {
+ get usedThemes () {
+ try {
+ return JSON.parse(_prefs.getCharPref("usedThemes"));
+ } catch (e) {
+ return [];
+ }
+ },
+
+ get currentTheme () {
+ try {
+ if (_prefs.getBoolPref("isThemeSelected"))
+ var data = this.usedThemes[0];
+ } catch (e) {}
+
+ return data || null;
+ },
+
+ get currentThemeForDisplay () {
+ var data = this.currentTheme;
+
+ if (data && PERSIST_ENABLED) {
+ for (let key in PERSIST_FILES) {
+ try {
+ if (data[key] && _prefs.getBoolPref("persisted." + key))
+ data[key] = _getLocalImageURI(PERSIST_FILES[key]).spec
+ + "?" + data.id + ";" + _version(data);
+ } catch (e) {}
+ }
+ }
+
+ return data;
+ },
+
+ set currentTheme (aData) {
+ let cancel = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
+ cancel.data = false;
+ _observerService.notifyObservers(cancel, "lightweight-theme-change-requested",
+ JSON.stringify(aData));
+
+ if (aData) {
+ let usedThemes = _usedThemesExceptId(aData.id);
+ if (cancel.data && _prefs.getBoolPref("isThemeSelected"))
+ usedThemes.splice(1, 0, aData);
+ else
+ usedThemes.unshift(aData);
+ _updateUsedThemes(usedThemes);
+ }
+
+ if (cancel.data)
+ return null;
+
+ if (_previewTimer) {
+ _previewTimer.cancel();
+ _previewTimer = null;
+ }
+
+ _prefs.setBoolPref("isThemeSelected", aData != null);
+ _notifyWindows(aData);
+ _observerService.notifyObservers(null, "lightweight-theme-changed", null);
+
+ if (PERSIST_ENABLED && aData)
+ _persistImages(aData);
+
+ return aData;
+ },
+
+ getUsedTheme: function (aId) {
+ var usedThemes = this.usedThemes;
+ for (let i = 0; i < usedThemes.length; i++) {
+ if (usedThemes[i].id == aId)
+ return usedThemes[i];
+ }
+ return null;
+ },
+
+ forgetUsedTheme: function (aId) {
+ var currentTheme = this.currentTheme;
+ if (currentTheme && currentTheme.id == aId)
+ this.currentTheme = null;
+
+ _updateUsedThemes(_usedThemesExceptId(aId));
+ },
+
+ previewTheme: function (aData) {
+ if (!aData)
+ return;
+
+ let cancel = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
+ cancel.data = false;
+ _observerService.notifyObservers(cancel, "lightweight-theme-preview-requested",
+ JSON.stringify(aData));
+ if (cancel.data)
+ return;
+
+ if (_previewTimer)
+ _previewTimer.cancel();
+ else
+ _previewTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ _previewTimer.initWithCallback(_previewTimerCallback,
+ MAX_PREVIEW_SECONDS * 1000,
+ _previewTimer.TYPE_ONE_SHOT);
+
+ _notifyWindows(aData);
+ },
+
+ resetPreview: function () {
+ if (_previewTimer) {
+ _previewTimer.cancel();
+ _previewTimer = null;
+ _notifyWindows(this.currentThemeForDisplay);
+ }
+ },
+
+ parseTheme: function (aString, aBaseURI) {
+ try {
+ var data = JSON.parse(aString);
+ } catch (e) {
+ return null;
+ }
+
+ if (!data || typeof data != "object")
+ return null;
+
+ for (let prop in data) {
+ if (typeof data[prop] == "string" &&
+ (data[prop] = data[prop].trim()) &&
+ (MANDATORY.indexOf(prop) > -1 || OPTIONAL.indexOf(prop) > -1)) {
+ if (!/URL$/.test(prop))
+ continue;
+
+ try {
+ data[prop] = _makeURI(data[prop], _makeURI(aBaseURI)).spec;
+ if (/^https:/.test(data[prop]))
+ continue;
+ if (prop != "updateURL" && /^http:/.test(data[prop]))
+ continue;
+ } catch (e) {}
+ }
+
+ delete data[prop];
+ }
+
+ for (let i = 0; i < MANDATORY.length; i++) {
+ if (!(MANDATORY[i] in data))
+ return null;
+ }
+
+ return data;
+ },
+
+ updateCurrentTheme: function () {
+ try {
+ if (!_prefs.getBoolPref("update.enabled"))
+ return;
+ } catch (e) {
+ return;
+ }
+
+ var theme = this.currentTheme;
+ if (!theme || !theme.updateURL)
+ return;
+
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Ci.nsIXMLHttpRequest);
+
+ req.mozBackgroundRequest = true;
+ req.overrideMimeType("text/plain");
+ req.open("GET", theme.updateURL, true);
+
+ var self = this;
+ req.onload = function () {
+ if (req.status != 200)
+ return;
+
+ let newData = self.parseTheme(req.responseText, theme.updateURL);
+ if (!newData ||
+ newData.id != theme.id ||
+ _version(newData) == _version(theme))
+ return;
+
+ var currentTheme = self.currentTheme;
+ if (currentTheme && currentTheme.id == theme.id)
+ self.currentTheme = newData;
+ };
+
+ req.send(null);
+ }
+};
+
+function _usedThemesExceptId(aId)
+ LightweightThemeManager.usedThemes.filter(function (t) t.id != aId);
+
+function _version(aThemeData)
+ aThemeData.version || "";
+
+function _makeURI(aURL, aBaseURI)
+ _ioService.newURI(aURL, null, aBaseURI);
+
+function _updateUsedThemes(aList) {
+ if (aList.length > MAX_USED_THEMES_COUNT)
+ aList.length = MAX_USED_THEMES_COUNT;
+
+ _prefs.setCharPref("usedThemes", JSON.stringify(aList));
+
+ _observerService.notifyObservers(null, "lightweight-theme-list-changed", null);
+}
+
+function _notifyWindows(aThemeData) {
+ _observerService.notifyObservers(null, "lightweight-theme-styling-update",
+ JSON.stringify(aThemeData));
+}
+
+var _previewTimer;
+var _previewTimerCallback = {
+ notify: function () {
+ LightweightThemeManager.resetPreview();
+ }
+};
+
+function _persistImages(aData) {
+ function onSuccess(key) function () {
+ let current = LightweightThemeManager.currentTheme;
+ if (current && current.id == aData.id)
+ _prefs.setBoolPref("persisted." + key, true);
+ };
+
+ for (let key in PERSIST_FILES) {
+ _prefs.setBoolPref("persisted." + key, false);
+ if (aData[key])
+ _persistImage(aData[key], PERSIST_FILES[key], onSuccess(key));
+ }
+}
+
+function _getLocalImageURI(localFileName) {
+ var localFile = Cc["@mozilla.org/file/directory_service;1"]
+ .getService(Ci.nsIProperties)
+ .get("ProfD", Ci.nsILocalFile);
+ localFile.append(localFileName);
+ return _ioService.newFileURI(localFile);
+}
+
+function _persistImage(sourceURL, localFileName, callback) {
+ var targetURI = _getLocalImageURI(localFileName);
+ var sourceURI = _makeURI(sourceURL);
+
+ var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
+ .createInstance(Ci.nsIWebBrowserPersist);
+
+ persist.persistFlags =
+ Ci.nsIWebBrowserPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
+ Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION |
+ (PERSIST_BYPASS_CACHE ?
+ Ci.nsIWebBrowserPersist.PERSIST_FLAGS_BYPASS_CACHE :
+ Ci.nsIWebBrowserPersist.PERSIST_FLAGS_FROM_CACHE);
+
+ persist.progressListener = new _persistProgressListener(callback);
+
+ persist.saveURI(sourceURI, null, null, null, null, targetURI);
+}
+
+function _persistProgressListener(callback) {
+ this.onLocationChange = function () {};
+ this.onProgressChange = function () {};
+ this.onStatusChange = function () {};
+ this.onSecurityChange = function () {};
+ this.onStateChange = function (aWebProgress, aRequest, aStateFlags, aStatus) {
+ if (aRequest &&
+ aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK &&
+ aStateFlags & Ci.nsIWebProgressListener.STATE_STOP) {
+ try {
+ if (aRequest.QueryInterface(Ci.nsIHttpChannel).requestSucceeded) {
+ // success
+ callback();
+ return;
+ }
+ } catch (e) { }
+ // failure
+ }
+ };
+}
diff --git a/tools/xo_bundle/modules/NetUtil.jsm b/tools/xo_bundle/modules/NetUtil.jsm
new file mode 100644
index 0000000..61b1b06
--- /dev/null
+++ b/tools/xo_bundle/modules/NetUtil.jsm
@@ -0,0 +1,211 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 sts=4 et filetype=javascript
+ * ***** 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 code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Boris Zbarsky <bzbarsky@mit.edu> (original author)
+ * Shawn Wilsher <me@shawnwilsher.com>
+ *
+ * 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 ***** */
+
+let EXPORTED_SYMBOLS = [
+ "NetUtil",
+];
+
+/**
+ * Necko utilities
+ */
+
+////////////////////////////////////////////////////////////////////////////////
+//// Constants
+
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cr = Components.results;
+
+const PR_UINT32_MAX = 0xffffffff;
+
+////////////////////////////////////////////////////////////////////////////////
+//// NetUtil Object
+
+const NetUtil = {
+ /**
+ * Function to perform simple async copying from aSource (an input stream)
+ * to aSink (an output stream). The copy will happen on some background
+ * thread. Both streams will be closed when the copy completes.
+ *
+ * @param aSource
+ * The input stream to read from
+ * @param aSink
+ * The output stream to write to
+ * @param aCallback [optional]
+ * A function that will be called at copy completion with a single
+ * argument: the nsresult status code for the copy operation.
+ *
+ * @return An nsIRequest representing the copy operation (for example, this
+ * can be used to cancel the copying). The consumer can ignore the
+ * return value if desired.
+ */
+ asyncCopy: function NetUtil_asyncCopy(aSource, aSink, aCallback)
+ {
+ if (!aSource || !aSink) {
+ let exception = new Components.Exception(
+ "Must have a source and a sink",
+ Cr.NS_ERROR_INVALID_ARG,
+ Components.stack.caller
+ );
+ throw exception;
+ }
+
+ var sourceBuffered = ioUtil.inputStreamIsBuffered(aSource);
+ var sinkBuffered = ioUtil.outputStreamIsBuffered(aSink);
+
+ var ostream = aSink;
+ if (!sourceBuffered && !sinkBuffered) {
+ // wrap the sink in a buffered stream.
+ ostream = Cc["@mozilla.org/network/buffered-output-stream;1"].
+ createInstance(Ci.nsIBufferedOutputStream);
+ ostream.init(aSink, 0x8000);
+ sinkBuffered = true;
+ }
+
+ // make a stream copier
+ var copier = Cc["@mozilla.org/network/async-stream-copier;1"].
+ createInstance(Ci.nsIAsyncStreamCopier);
+
+ // Initialize the copier. The 0x8000 should match the size of the
+ // buffer our buffered stream is using, for best performance. If we're
+ // not using our own buffered stream, that's ok too. But maybe we
+ // should just use the default net segment size here?
+ copier.init(aSource, ostream, null, sourceBuffered, sinkBuffered,
+ 0x8000, true, true);
+
+ var observer;
+ if (aCallback) {
+ observer = {
+ onStartRequest: function(aRequest, aContext) {},
+ onStopRequest: function(aRequest, aContext, aStatusCode) {
+ aCallback(aStatusCode);
+ }
+ }
+ } else {
+ observer = null;
+ }
+
+ // start the copying
+ copier.asyncCopy(observer, null);
+ return copier;
+ },
+
+ /**
+ * Asynchronously opens a channel and fetches the response. The provided
+ * callback will get an input stream containing the response, and the result
+ * code.
+ *
+ * @param aChannel
+ * The nsIChannel to open.
+ * @param aCallback
+ * The callback function that will be notified upon completion. It
+ * will get two arguments:
+ * 1) An nsIInputStream containing the data from the channel, if any.
+ * 2) The status code from opening the channel.
+ */
+ asyncFetch: function NetUtil_asyncOpen(aChannel, aCallback)
+ {
+ if (!aChannel || !aCallback) {
+ let exception = new Components.Exception(
+ "Must have a channel and a callback",
+ Cr.NS_ERROR_INVALID_ARG,
+ Components.stack.caller
+ );
+ throw exception;
+ }
+
+ // Create a pipe that will create our output stream that we can use once
+ // we have gotten all the data.
+ let pipe = Cc["@mozilla.org/pipe;1"].
+ createInstance(Ci.nsIPipe);
+ pipe.init(true, true, 0, PR_UINT32_MAX, null);
+
+ // Create a listener that will give data to the pipe's output stream.
+ let listener = Cc["@mozilla.org/network/simple-stream-listener;1"].
+ createInstance(Ci.nsISimpleStreamListener);
+ listener.init(pipe.outputStream, {
+ onStartRequest: function(aRequest, aContext) {},
+ onStopRequest: function(aRequest, aContext, aStatusCode) {
+ pipe.outputStream.close();
+ aCallback(pipe.inputStream, aStatusCode);
+ }
+ });
+
+ aChannel.asyncOpen(listener, null);
+ },
+
+ /**
+ * Constructs a new URI for the given spec, character set, and base URI.
+ *
+ * @param aSpec
+ * The spec for the desired URI.
+ * @param aOriginCharset [optional]
+ * The character set for the URI.
+ * @param aBaseURI [optional]
+ * The base URI for the spec.
+ *
+ * @return an nsIURI object.
+ */
+ newURI: function NetUtil_newURI(aSpec, aOriginCharset, aBaseURI)
+ {
+ if (!aSpec) {
+ let exception = new Components.Exception(
+ "Must have a non-null spec",
+ Cr.NS_ERROR_INVALID_ARG,
+ Components.stack.caller
+ );
+ throw exception;
+ }
+
+ return ioService.newURI(aSpec, aOriginCharset, aBaseURI);
+ },
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//// Initialization
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// Define our lazy getters.
+XPCOMUtils.defineLazyServiceGetter(this, "ioUtil", "@mozilla.org/io-util;1",
+ "nsIIOUtil");
+XPCOMUtils.defineLazyServiceGetter(this, "ioService",
+ "@mozilla.org/network/io-service;1",
+ "nsIIOService");
diff --git a/tools/xo_bundle/modules/NetworkPrioritizer.jsm b/tools/xo_bundle/modules/NetworkPrioritizer.jsm
new file mode 100644
index 0000000..38eea22
--- /dev/null
+++ b/tools/xo_bundle/modules/NetworkPrioritizer.jsm
@@ -0,0 +1,217 @@
+/* ***** 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.org code.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Paul O’Shannessy <paul@oshannessy.com> (original author)
+ *
+ * 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 ***** */
+
+/*
+ * This module adjusts network priority for tabs in a way that gives 'important'
+ * tabs a higher priority. There are 3 levels of priority. Each is listed below
+ * with the priority adjustment used.
+ *
+ * Highest (-10): Selected tab in the focused window.
+ * Medium (0): Background tabs in the focused window.
+ * Selected tab in background windows.
+ * Lowest (+10): Background tabs in background windows.
+ */
+
+let EXPORTED_SYMBOLS = ["trackBrowserWindow"];
+
+const Ci = Components.interfaces;
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+
+// Lazy getters
+XPCOMUtils.defineLazyServiceGetter(this, "_focusManager",
+ "@mozilla.org/focus-manager;1",
+ "nsIFocusManager");
+
+
+// Constants
+const TAB_EVENTS = ["TabOpen", "TabSelect"];
+const WINDOW_EVENTS = ["activate", "unload"];
+// PRIORITY DELTA is -10 because lower priority value is actually a higher priority
+const PRIORITY_DELTA = -10;
+
+
+// Variables
+let _lastFocusedWindow = null;
+let _windows = [];
+
+
+// Exported symbol
+function trackBrowserWindow(aWindow) {
+ WindowHelper.addWindow(aWindow);
+}
+
+
+// Global methods
+function _handleEvent(aEvent) {
+ switch (aEvent.type) {
+ case "TabOpen":
+ BrowserHelper.onOpen(aEvent.target.linkedBrowser);
+ break;
+ case "TabSelect":
+ BrowserHelper.onSelect(aEvent.target.linkedBrowser);
+ break;
+ case "activate":
+ WindowHelper.onActivate(aEvent.target);
+ break;
+ case "unload":
+ WindowHelper.removeWindow(aEvent.currentTarget);
+ break;
+ }
+}
+
+
+// Methods that impact a browser. Put into single object for organization.
+let BrowserHelper = {
+ onOpen: function(aBrowser) {
+ // If the tab is in the focused window, leave priority as it is
+ if (aBrowser.ownerDocument.defaultView != _lastFocusedWindow)
+ this.decreasePriority(aBrowser);
+ },
+
+ onSelect: function(aBrowser) {
+ let windowEntry = WindowHelper.getEntry(aBrowser.ownerDocument.defaultView);
+ if (windowEntry.lastSelectedBrowser)
+ this.decreasePriority(windowEntry.lastSelectedBrowser);
+ this.increasePriority(aBrowser);
+
+ windowEntry.lastSelectedBrowser = aBrowser;
+ },
+
+ // Auxiliary methods
+ getLoadgroup: function(aBrowser) {
+ return aBrowser.webNavigation.QueryInterface(Ci.nsIDocumentLoader)
+ .loadGroup.QueryInterface(Ci.nsISupportsPriority);
+ },
+
+ increasePriority: function(aBrowser) {
+ this.getLoadgroup(aBrowser).adjustPriority(PRIORITY_DELTA);
+ },
+
+ decreasePriority: function(aBrowser) {
+ this.getLoadgroup(aBrowser).adjustPriority(PRIORITY_DELTA * -1);
+ }
+};
+
+
+// Methods that impact a window. Put into single object for organization.
+let WindowHelper = {
+ addWindow: function(aWindow) {
+ // Build internal data object
+ _windows.push({ window: aWindow, lastSelectedBrowser: null });
+
+ // Add event listeners
+ TAB_EVENTS.forEach(function(event) {
+ aWindow.gBrowser.tabContainer.addEventListener(event, _handleEvent, false);
+ });
+ WINDOW_EVENTS.forEach(function(event) {
+ aWindow.addEventListener(event, _handleEvent, false);
+ });
+
+ // This gets called AFTER activate event, so if this is the focused window
+ // we want to activate it. Otherwise, deprioritize it.
+ if (aWindow == _focusManager.activeWindow)
+ this.handleFocusedWindow(aWindow);
+ else
+ this.decreasePriority(aWindow);
+
+ // Select the selected tab
+ BrowserHelper.onSelect(aWindow.gBrowser.selectedBrowser);
+ },
+
+ removeWindow: function(aWindow) {
+ if (aWindow == _lastFocusedWindow)
+ _lastFocusedWindow = null;
+
+ // Delete this window from our tracking
+ _windows.splice(this.getEntryIndex(aWindow), 1);
+
+ // Remove the event listeners
+ TAB_EVENTS.forEach(function(event) {
+ aWindow.gBrowser.tabContainer.removeEventListener(event, _handleEvent, false);
+ });
+ WINDOW_EVENTS.forEach(function(event) {
+ aWindow.removeEventListener(event, _handleEvent, false);
+ });
+ },
+
+ onActivate: function(aWindow, aHasFocus) {
+ // If this window was the last focused window, we don't need to do anything
+ if (aWindow == _lastFocusedWindow)
+ return;
+
+ // handleFocusedWindow will deprioritize the current window
+ this.handleFocusedWindow(aWindow);
+
+ // Lastly we should increase priority for this window
+ this.increasePriority(aWindow);
+ },
+
+ handleFocusedWindow: function(aWindow) {
+ // If we have a last focused window, we need to deprioritize it first
+ if (_lastFocusedWindow)
+ this.decreasePriority(_lastFocusedWindow);
+
+ // aWindow is now focused
+ _lastFocusedWindow = aWindow;
+ },
+
+ // Auxiliary methods
+ increasePriority: function(aWindow) {
+ aWindow.gBrowser.browsers.forEach(function(aBrowser) {
+ BrowserHelper.increasePriority(aBrowser);
+ });
+ },
+
+ decreasePriority: function(aWindow) {
+ aWindow.gBrowser.browsers.forEach(function(aBrowser) {
+ BrowserHelper.decreasePriority(aBrowser);
+ });
+ },
+
+ getEntry: function(aWindow) {
+ return _windows[this.getEntryIndex(aWindow)];
+ },
+
+ getEntryIndex: function(aWindow) {
+ // Assumes that every object has a unique window & it's in the array
+ for (let i = 0; i < _windows.length; i++)
+ if (_windows[i].window == aWindow)
+ return i;
+ }
+};
+
diff --git a/tools/xo_bundle/modules/PlacesDBUtils.jsm b/tools/xo_bundle/modules/PlacesDBUtils.jsm
index b60e597..4209294 100755
--- a/tools/xo_bundle/modules/PlacesDBUtils.jsm
+++ b/tools/xo_bundle/modules/PlacesDBUtils.jsm
@@ -134,7 +134,6 @@ nsPlacesDBUtils.prototype = {
QueryInterface: XPCOMUtils.generateQI([
Ci.nsITimerCallback,
- Ci.nsIObserver,
]),
//////////////////////////////////////////////////////////////////////////////
@@ -581,6 +580,116 @@ nsPlacesDBUtils.prototype = {
aStatement.finalize();
}, this);
},
+
+ /**
+ * This method is only for support purposes, it will run sync and will take
+ * lot of time on big databases, but can be manually triggered to help
+ * debugging common issues.
+ */
+ checkAndFixDatabase: function PDBU_checkAndFixDatabase() {
+ let log = [];
+ let self = this;
+ let sep = "- - -";
+
+ function integrity() {
+ let integrityCheckStmt =
+ self._dbConn.createStatement("PRAGMA integrity_check");
+ log.push("INTEGRITY");
+ let logIndex = log.length;
+ while (integrityCheckStmt.executeStep()) {
+ log.push(integrityCheckStmt.getString(0));
+ }
+ integrityCheckStmt.finalize();
+ log.push(sep);
+ return log[logIndex] == "ok";
+ }
+
+ function vacuum() {
+ log.push("VACUUM");
+ let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+ let placesDBFile = dirSvc.get("ProfD", Ci.nsILocalFile);
+ placesDBFile.append("places.sqlite");
+ log.push("places.sqlite: " + placesDBFile.fileSize + " byte");
+ self._dbConn.executeSimpleSQL("VACUUM");
+ log.push(sep);
+ }
+
+ function backup() {
+ log.push("BACKUP");
+ let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+ let profD = dirSvc.get("ProfD", Ci.nsILocalFile);
+ let placesDBFile = profD.clone();
+ placesDBFile.append("places.sqlite");
+ let backupDBFile = profD.clone();
+ backupDBFile.append("places.sqlite.corrupt");
+ backupDBFile.createUnique(backupDBFile.NORMAL_FILE_TYPE, 0666);
+ let backupName = backupDBFile.leafName;
+ backupDBFile.remove(false);
+ placesDBFile.copyTo(profD, backupName);
+ log.push(backupName);
+ log.push(sep);
+ }
+
+ function reindex() {
+ log.push("REINDEX");
+ self._dbConn.executeSimpleSQL("REINDEX");
+ log.push(sep);
+ }
+
+ function cleanup() {
+ log.push("CLEANUP");
+ self.maintenanceOnIdle()
+ log.push(sep);
+ }
+
+ function stats() {
+ log.push("STATS");
+ let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+ let placesDBFile = dirSvc.get("ProfD", Ci.nsILocalFile);
+ placesDBFile.append("places.sqlite");
+ log.push("places.sqlite: " + placesDBFile.fileSize + " byte");
+ let stmt = self._dbConn.createStatement(
+ "SELECT name FROM sqlite_master WHERE type = :DBType");
+ stmt.params["DBType"] = "table";
+ while (stmt.executeStep()) {
+ let tableName = stmt.getString(0);
+ let countStmt = self._dbConn.createStatement(
+ "SELECT count(*) FROM " + tableName);
+ countStmt.executeStep();
+ log.push(tableName + ": " + countStmt.getInt32(0));
+ countStmt.finalize();
+ }
+ stmt.finalize();
+ log.push(sep);
+ }
+
+ // First of all execute an integrity check.
+ let integrityIsGood = integrity();
+
+ // If integrity check did fail, we can try to fix the database through
+ // a reindex.
+ if (!integrityIsGood) {
+ // Backup current database.
+ backup();
+ // Execute a reindex.
+ reindex();
+ // Now check again the integrity.
+ integrityIsGood = integrity();
+ }
+
+ // If integrity is fine, let's force a maintenance, execute a vacuum and
+ // get some stats.
+ if (integrityIsGood) {
+ cleanup();
+ vacuum();
+ stats();
+ }
+
+ return log.join('\n');
+ }
};
__defineGetter__("PlacesDBUtils", function() {
diff --git a/tools/xo_bundle/modules/SpatialNavigation.js b/tools/xo_bundle/modules/SpatialNavigation.js
index 682a0e1..403fab0 100755
--- a/tools/xo_bundle/modules/SpatialNavigation.js
+++ b/tools/xo_bundle/modules/SpatialNavigation.js
@@ -86,15 +86,15 @@ const kNone = "none";
function _onInputKeyPress (event, callback) {
+ // If it isn't enabled, bail.
+ if (!PrefObserver['enabled'])
+ return;
+
// Use whatever key value is available (either keyCode or charCode).
// It might be useful for addons or whoever wants to set different
// key to be used here (e.g. "a", "F1", "arrowUp", ...).
var key = event.which || event.keyCode;
- // If it isn't enabled, bail.
- if (!PrefObserver['enabled'])
- return;
-
if (key != PrefObserver['keyCodeDown'] &&
key != PrefObserver['keyCodeRight'] &&
key != PrefObserver['keyCodeUp'] &&
@@ -111,6 +111,13 @@ function _onInputKeyPress (event, callback) {
if (!event.crtlKey && PrefObserver['modifierCtrl'])
return;
+ // In some special cases where charCode is equal to one of the default arrow keyCodes we
+ // should bail.
+ if (!event.keyCode &&
+ (key == Ci.nsIDOMKeyEvent.DOM_VK_LEFT || key == Ci.nsIDOMKeyEvent.DOM_VK_DOWN ||
+ key == Ci.nsIDOMKeyEvent.DOM_VK_RIGHT || key == Ci.nsIDOMKeyEvent.DOM_VK_UP))
+ return;
+
var target = event.target;
var doc = target.ownerDocument;
diff --git a/tools/xo_bundle/modules/WindowDraggingUtils.jsm b/tools/xo_bundle/modules/WindowDraggingUtils.jsm
index 0fadb1c..af61c2e 100755
--- a/tools/xo_bundle/modules/WindowDraggingUtils.jsm
+++ b/tools/xo_bundle/modules/WindowDraggingUtils.jsm
@@ -46,7 +46,7 @@ WindowDraggingElement.prototype = {
mouseDownCheck: function(e) { return true; },
dragTags: ["box", "hbox", "vbox", "spacer", "label", "statusbarpanel", "stack",
"toolbaritem", "toolbarseparator", "toolbarspring", "toolbarspacer",
- "radiogroup"],
+ "radiogroup", "deck", "scrollbox"],
handleEvent: function(aEvent) {
switch (aEvent.type) {
case "mousedown":
diff --git a/tools/xo_bundle/modules/XPCOMUtils.jsm b/tools/xo_bundle/modules/XPCOMUtils.jsm
index 311c24a..508db29 100755
--- a/tools/xo_bundle/modules/XPCOMUtils.jsm
+++ b/tools/xo_bundle/modules/XPCOMUtils.jsm
@@ -1,4 +1,5 @@
-/*
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: sw=2 ts=2 sts=2 et filetype=javascript
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@@ -82,7 +83,9 @@
* // QueryInterface implementation, e.g. using the generateQI helper
* QueryInterface: XPCOMUtils.generateQI(
* [Components.interfaces.nsIObserver,
- * Components.interfaces.nsIMyInterface]),
+ * Components.interfaces.nsIMyInterface,
+ * "nsIFoo",
+ * "nsIBar" ]),
*
* // ...component implementation...
* };
@@ -101,6 +104,7 @@
var EXPORTED_SYMBOLS = [ "XPCOMUtils" ];
+const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
@@ -112,7 +116,8 @@ var XPCOMUtils = {
* param, and if it is, returns |this| (the object it was called on).
*/
generateQI: function(interfaces) {
- return makeQI([i.name for each (i in interfaces) if (i)]);
+ /* Note that Ci[Ci.x] == Ci.x for all x */
+ return makeQI([Ci[i].name for each (i in interfaces) if (Ci[i])]);
},
/**
@@ -225,6 +230,47 @@ var XPCOMUtils = {
},
/**
+ * Defines a getter on a specified object that will be created upon first use.
+ *
+ * @param aObject
+ * The object to define the lazy getter on.
+ * @param aName
+ * The name of the getter to define on aObject.
+ * @param aLambda
+ * A function that returns what the getter should return. This will
+ * only ever be called once.
+ */
+ defineLazyGetter: function XPCU_defineLazyGetter(aObject, aName, aLambda)
+ {
+ aObject.__defineGetter__(aName, function() {
+ delete aObject[aName];
+ return aObject[aName] = aLambda.apply(aObject);
+ });
+ },
+
+ /**
+ * Defines a getter on a specified object for a service. The service will not
+ * be obtained until first use.
+ *
+ * @param aObject
+ * The object to define the lazy getter on.
+ * @param aName
+ * The name of the getter to define on aObject for the service.
+ * @param aContract
+ * The contract used to obtain the service.
+ * @param aInterfaceName
+ * The name of the interface to query the service to.
+ */
+ defineLazyServiceGetter: function XPCU_defineLazyServiceGetter(aObject, aName,
+ aContract,
+ aInterfaceName)
+ {
+ this.defineLazyGetter(aObject, aName, function XPCU_serviceLambda() {
+ return Cc[aContract].getService(Ci[aInterfaceName]);
+ });
+ },
+
+ /**
* Convenience access to category manager
*/
get categoryManager() {
diff --git a/tools/xo_bundle/modules/ctypes.jsm b/tools/xo_bundle/modules/ctypes.jsm
new file mode 100644
index 0000000..285c91d
--- /dev/null
+++ b/tools/xo_bundle/modules/ctypes.jsm
@@ -0,0 +1,117 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/* ***** 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 js-ctypes.
+ *
+ * The Initial Developer of the Original Code is
+ * The Mozilla Foundation <http://www.mozilla.org/>.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Dan Witte <dwitte@mozilla.com>
+ *
+ * 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 ***** */
+
+let EXPORTED_SYMBOLS = [ "ctypes" ];
+
+/**
+ * This is the js module for ctypes. Import it like so:
+ * Components.utils.import("resource://gre/modules/ctypes.jsm");
+ *
+ * This will create a 'ctypes' object, which provides an interface to describe
+ * C types and call C functions from a dynamic library. It has the following
+ * properties and functions:
+ *
+ * ABI constants that specify the calling convention to use.
+ * ctypes.default_abi corresponds to the cdecl convention, and in almost all
+ * cases is the correct choice. ctypes.stdcall is provided for calling
+ * functions in the Microsoft Win32 API.
+ *
+ * ctypes.default_abi // corresponds to cdecl
+ * ctypes.stdcall_abi // for calling Win32 API functions
+ *
+ * Types available for arguments and return values, representing
+ * their C counterparts.
+ *
+ * ctypes.void_t // Only allowed for return types.
+ * ctypes.bool // _Bool type (assumed 8 bits wide).
+ * ctypes.int8_t // int8_t (signed char) type.
+ * ctypes.int16_t // int16_t (short) type.
+ * ctypes.int32_t // int32_t (int) type.
+ * ctypes.int64_t // int64_t (long long) type.
+ * ctypes.uint8_t // uint8_t (unsigned char) type.
+ * ctypes.uint16_t // uint16_t (unsigned short) type.
+ * ctypes.uint32_t // uint32_t (unsigned int) type.
+ * ctypes.uint64_t // uint64_t (unsigned long long) type.
+ * ctypes.float // float type.
+ * ctypes.double // double type.
+ * ctypes.string // C string (char *).
+ * ctypes.ustring // 16-bit string (char16_t *).
+ *
+ * Library ctypes.open(name)
+ *
+ * Attempts to dynamically load the specified library. Returns a Library
+ * object on success.
+ * @name A string or nsILocalFile representing the name and path of
+ * the library to open.
+ * @returns A Library object.
+ *
+ * Library.close()
+ *
+ * Unloads the currently loaded library. Any subsequent attempts to call
+ * functions on this interface will fail.
+ *
+ * function Library.declare(name, abi, returnType, argType1, argType2, ...)
+ *
+ * Declares a C function in a library.
+ * @name Function name. This must be a valid symbol in the library.
+ * @abi The calling convention to use. Must be an ABI constant
+ * from ctypes.
+ * @returnType The return type of the function. Must be a type constant
+ * from ctypes.
+ * @argTypes Argument types. Must be a type constant (other than void_t)
+ * from ctypes.
+ * @returns A function object.
+ *
+ * A function object can then be used to call the C function it represents
+ * like so:
+ *
+ * const myFunction = myLibrary.declare("myFunction", ctypes.default_abi,
+ * ctypes.double, ctypes.int32_t, ctypes.int32_t, ...);
+ *
+ * var result = myFunction(5, 10, ...);
+ *
+ * Arguments will be checked against the types supplied at declaration, and
+ * some attempt to convert values (e.g. boolean true/false to integer 0/1)
+ * will be made. Otherwise, if types do not match, or conversion fails,
+ * an exception will be thrown.
+ */
+
+// Initialize the ctypes object. You do not need to do this yourself.
+const init = Components.classes["@mozilla.org/jsctypes;1"].createInstance();
+init();
+
diff --git a/tools/xo_bundle/modules/debug.js b/tools/xo_bundle/modules/debug.js
index 42b22d1..39a6109 100755
--- a/tools/xo_bundle/modules/debug.js
+++ b/tools/xo_bundle/modules/debug.js
@@ -1,4 +1,4 @@
-//@line 44 "/builds/moz2_slave/linux_build/build/toolkit/content/debug.js"
+//@line 44 "/builds/slave/linux_build/build/toolkit/content/debug.js"
var EXPORTED_SYMBOLS = ["NS_ASSERT"];
diff --git a/tools/xo_bundle/modules/distribution.js b/tools/xo_bundle/modules/distribution.js
index 722abe2..be0e186 100755
--- a/tools/xo_bundle/modules/distribution.js
+++ b/tools/xo_bundle/modules/distribution.js
@@ -19,6 +19,7 @@
*
* Contributor(s):
* Dan Mills <thunder@mozilla.com>
+ * Marco Bonardo <mak77@bonardo.net>
*
* 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
@@ -41,87 +42,94 @@ const Cc = Components.classes;
const Cr = Components.results;
const Cu = Components.utils;
-function DistributionCustomizer() {
- this._distroDir = this._dirSvc.get("XCurProcD", Ci.nsIFile);
- this._distroDir.append("distribution");
+const DISTRIBUTION_CUSTOMIZATION_COMPLETE_TOPIC =
+ "distribution-customization-complete";
- let iniFile = this._distroDir.clone();
+function DistributionCustomizer() {
+ let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+ let iniFile = dirSvc.get("XCurProcD", Ci.nsIFile);
+ iniFile.append("distribution");
iniFile.append("distribution.ini");
- this._iniExists = iniFile.exists();
-
- if (!this._iniExists)
- return;
+ if (iniFile.exists())
+ this._iniFile = iniFile;
+}
- this._ini = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].
- getService(Ci.nsIINIParserFactory).createINIParser(iniFile);
+DistributionCustomizer.prototype = {
+ _iniFile: null,
+
+ get _ini() {
+ let ini = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].
+ getService(Ci.nsIINIParserFactory).
+ createINIParser(this._iniFile);
+ this.__defineGetter__("_ini", function() ini);
+ return this._ini;
+ },
- this._prefs = this._prefSvc.getBranch(null);
- this._locale = this._prefs.getCharPref("general.useragent.locale");
+ get _locale() {
+ let locale;
+ try {
+ locale = this._prefs.getCharPref("general.useragent.locale");
+ }
+ catch (e) {
+ locale = "en-US";
+ }
+ this.__defineGetter__("_locale", function() locale);
+ return this._locale;
+ },
-}
-DistributionCustomizer.prototype = {
- __bmSvc: null,
get _bmSvc() {
- if (!this.__bmSvc)
- this.__bmSvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
- getService(Ci.nsINavBookmarksService);
- return this.__bmSvc;
+ let svc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
+ getService(Ci.nsINavBookmarksService);
+ this.__defineGetter__("_bmSvc", function() svc);
+ return this._bmSvc;
},
- __annoSvc: null,
get _annoSvc() {
- if (!this.__annoSvc)
- this.__annoSvc = Cc["@mozilla.org/browser/annotation-service;1"].
- getService(Ci.nsIAnnotationService);
- return this.__annoSvc;
+ let svc = Cc["@mozilla.org/browser/annotation-service;1"].
+ getService(Ci.nsIAnnotationService);
+ this.__defineGetter__("_annoSvc", function() svc);
+ return this._annoSvc;
},
- __livemarkSvc: null,
get _livemarkSvc() {
- if (!this.__livemarkSvc)
- this.__livemarkSvc = Cc["@mozilla.org/browser/livemark-service;2"].
- getService(Ci.nsILivemarkService);
- return this.__livemarkSvc;
+ let svc = Cc["@mozilla.org/browser/livemark-service;2"].
+ getService(Ci.nsILivemarkService);
+ this.__defineGetter__("_livemarkSvc", function() svc);
+ return this._livemarkSvc;
},
- __dirSvc: null,
- get _dirSvc() {
- if (!this.__dirSvc)
- this.__dirSvc = Cc["@mozilla.org/file/directory_service;1"].
- getService(Ci.nsIProperties);
- return this.__dirSvc;
- },
-
- __prefSvc: null,
get _prefSvc() {
- if (!this.__prefSvc)
- this.__prefSvc = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefService);
- return this.__prefSvc;
+ let svc = Cc["@mozilla.org/preferences-service;1"].
+ getService(Ci.nsIPrefService);
+ this.__defineGetter__("_prefSvc", function() svc);
+ return this._prefSvc;
},
- __iosvc: null,
- get _iosvc() {
- if (!this.__iosvc)
- this.__iosvc = Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService);
- return this.__iosvc;
+ get _prefs() {
+ let branch = this._prefSvc.getBranch(null);
+ this.__defineGetter__("_prefs", function() branch);
+ return this._prefs;
},
- _locale: "en-US",
- _distroDir: null,
- _iniExists: false,
- _ini: null,
-
+ get _ioSvc() {
+ let svc = Cc["@mozilla.org/network/io-service;1"].
+ getService(Ci.nsIIOService);
+ this.__defineGetter__("_ioSvc", function() svc);
+ return this._ioSvc;
+ },
_makeURI: function DIST__makeURI(spec) {
- return this._iosvc.newURI(spec, null, null);
+ return this._ioSvc.newURI(spec, null, null);
},
- _parseBookmarksSection: function DIST_parseBookmarksSection(parentId, section) {
+
+ _parseBookmarksSection:
+ function DIST_parseBookmarksSection(parentId, section) {
let keys = [];
for (let i in enumerate(this._ini.getKeys(section)))
keys.push(i);
keys.sort();
+
let items = {};
let defaultItemId = -1;
let maxItemId = -1;
@@ -158,7 +166,7 @@ DistributionCustomizer.prototype = {
if (!items[iid])
continue;
- let index = -1;
+ let index = this._bmSvc.DEFAULT_INDEX;
let newId;
switch (items[iid]["type"]) {
@@ -175,7 +183,8 @@ DistributionCustomizer.prototype = {
items[iid]["folderId"]);
if (items[iid]["description"])
- this._annoSvc.setItemAnnotation(newId, "bookmarkProperties/description",
+ this._annoSvc.setItemAnnotation(newId,
+ "bookmarkProperties/description",
items[iid]["description"], 0,
this._annoSvc.EXPIRE_NEVER);
@@ -191,12 +200,13 @@ DistributionCustomizer.prototype = {
if (iid < defaultItemId)
index = prependIndex++;
+ // Don't bother updating the livemark contents on creation.
newId = this._livemarkSvc.
- createLivemark(parentId,
- items[iid]["title"],
- this._makeURI(items[iid]["siteLink"]),
- this._makeURI(items[iid]["feedLink"]),
- index);
+ createLivemarkFolderOnly(parentId,
+ items[iid]["title"],
+ this._makeURI(items[iid]["siteLink"]),
+ this._makeURI(items[iid]["feedLink"]),
+ index);
break;
case "bookmark":
@@ -209,48 +219,61 @@ DistributionCustomizer.prototype = {
index, items[iid]["title"]);
if (items[iid]["description"])
- this._annoSvc.setItemAnnotation(newId, "bookmarkProperties/description",
+ this._annoSvc.setItemAnnotation(newId,
+ "bookmarkProperties/description",
items[iid]["description"], 0,
this._annoSvc.EXPIRE_NEVER);
break;
}
}
+ return this._checkCustomizationComplete();
},
+
+ _customizationsApplied: false,
applyCustomizations: function DIST_applyCustomizations() {
- if (!this._iniExists)
- return;
+ this._customizationsApplied = true;
+ if (!this._iniFile)
+ return this._checkCustomizationComplete();
// nsPrefService loads very early. Reload prefs so we can set
// distribution defaults during the prefservice:after-app-defaults
// notification (see applyPrefDefaults below)
this._prefSvc.QueryInterface(Ci.nsIObserver);
this._prefSvc.observe(null, "reload-default-prefs", null);
+ },
+
+ _bookmarksApplied: false,
+ applyBookmarks: function DIST_applyBookarks() {
+ this._bookmarksApplied = true;
+ if (!this._iniFile)
+ return this._checkCustomizationComplete();
let sections = enumToObject(this._ini.getSections());
// The global section, and several of its fields, is required
// (we also check here to be consistent with applyPrefDefaults below)
if (!sections["Global"])
- return;
+ return this._checkCustomizationComplete();
let globalPrefs = enumToObject(this._ini.getKeys("Global"));
if (!(globalPrefs["id"] && globalPrefs["version"] && globalPrefs["about"]))
- return;
+ return this._checkCustomizationComplete();
- let bmProcessed = false;
let bmProcessedPref;
-
try {
- bmProcessedPref = this._ini.getString("Global",
- "bookmarks.initialized.pref");
- } catch (e) {
+ bmProcessedPref = this._ini.getString("Global",
+ "bookmarks.initialized.pref");
+ }
+ catch (e) {
bmProcessedPref = "distribution." +
this._ini.getString("Global", "id") + ".bookmarksProcessed";
}
+ let bmProcessed = false;
try {
bmProcessed = this._prefs.getBoolPref(bmProcessedPref);
- } catch (e) {}
+ }
+ catch (e) {}
if (!bmProcessed) {
if (sections["BookmarksMenu"])
@@ -261,19 +284,23 @@ DistributionCustomizer.prototype = {
"BookmarksToolbar");
this._prefs.setBoolPref(bmProcessedPref, true);
}
+ return this._checkCustomizationComplete();
},
+
+ _prefDefaultsApplied: false,
applyPrefDefaults: function DIST_applyPrefDefaults() {
- if (!this._iniExists)
- return;
+ this._prefDefaultsApplied = true;
+ if (!this._iniFile)
+ return this._checkCustomizationComplete();
let sections = enumToObject(this._ini.getSections());
// The global section, and several of its fields, is required
if (!sections["Global"])
- return;
+ return this._checkCustomizationComplete();
let globalPrefs = enumToObject(this._ini.getKeys("Global"));
if (!(globalPrefs["id"] && globalPrefs["version"] && globalPrefs["about"]))
- return;
+ return this._checkCustomizationComplete();
let defaults = this._prefSvc.getDefaultBranch(null);
@@ -343,6 +370,18 @@ DistributionCustomizer.prototype = {
} catch (e) { /* ignore bad prefs and move on */ }
}
}
+
+ return this._checkCustomizationComplete();
+ },
+
+ _checkCustomizationComplete: function DIST__checkCustomizationComplete() {
+ let prefDefaultsApplied = this._prefDefaultsApplied || !this._iniFile;
+ if (this._customizationsApplied && this._bookmarksApplied &&
+ prefDefaultsApplied) {
+ let os = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ os.notifyObservers(null, DISTRIBUTION_CUSTOMIZATION_COMPLETE_TOPIC, null);
+ }
}
};
diff --git a/tools/xo_bundle/modules/openLocationLastURL.jsm b/tools/xo_bundle/modules/openLocationLastURL.jsm
new file mode 100644
index 0000000..dc7a111
--- /dev/null
+++ b/tools/xo_bundle/modules/openLocationLastURL.jsm
@@ -0,0 +1,95 @@
+/* ***** 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 Open Location Dialog Utility Code.
+ *
+ * The Initial Developer of the Original Code is
+ * Ehsan Akhgari <ehsan.akhgari@gmail.com>.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * 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 ***** */
+
+const LAST_URL_PREF = "general.open_location.last_url";
+const nsISupportsString = Components.interfaces.nsISupportsString;
+
+var EXPORTED_SYMBOLS = [ "gOpenLocationLastURL" ];
+
+let pbSvc = Components.classes["@mozilla.org/privatebrowsing;1"]
+ .getService(Components.interfaces.nsIPrivateBrowsingService);
+let prefSvc = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranch);
+
+let observer = {
+ QueryInterface: function (aIID) {
+ if (aIID.equals(Components.interfaces.nsIObserver) ||
+ aIID.equals(Components.interfaces.nsISupports) ||
+ aIID.equals(Components.interfaces.nsISupportsWeakReference))
+ return this;
+ throw Components.results.NS_NOINTERFACE;
+ },
+ observe: function (aSubject, aTopic, aData) {
+ gOpenLocationLastURLData = "";
+ }
+};
+
+Components.classes["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService)
+ .addObserver(observer, "private-browsing", true);
+
+let gOpenLocationLastURLData = "";
+let gOpenLocationLastURL = {
+ get value() {
+ if (pbSvc.privateBrowsingEnabled)
+ return gOpenLocationLastURLData;
+ else {
+ try {
+ return prefSvc.getComplexValue(LAST_URL_PREF, nsISupportsString).data;
+ }
+ catch (e) {
+ return "";
+ }
+ }
+ },
+ set value(val) {
+ if (typeof val != "string")
+ val = "";
+ if (pbSvc.privateBrowsingEnabled)
+ gOpenLocationLastURLData = val;
+ else {
+ let str = Components.classes["@mozilla.org/supports-string;1"]
+ .createInstance(Components.interfaces.nsISupportsString);
+ str.data = val;
+ prefSvc.setComplexValue(LAST_URL_PREF, nsISupportsString, str);
+ }
+ },
+ reset: function() {
+ if (prefSvc.prefHasUserValue(LAST_URL_PREF))
+ prefSvc.clearUserPref(LAST_URL_PREF);
+ gOpenLocationLastURLData = "";
+ }
+};
diff --git a/tools/xo_bundle/modules/utils.js b/tools/xo_bundle/modules/utils.js
index f982934..4645b84 100755
--- a/tools/xo_bundle/modules/utils.js
+++ b/tools/xo_bundle/modules/utils.js
@@ -48,6 +48,9 @@ var EXPORTED_SYMBOLS = ["PlacesUtils"];
var Ci = Components.interfaces;
var Cc = Components.classes;
var Cr = Components.results;
+var Cu = Components.utils;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const EXCLUDE_FROM_BACKUP_ANNO = "places/excludeFromBackup";
const POST_DATA_ANNO = "bookmarkProperties/POSTData";
@@ -65,10 +68,10 @@ const RESTORE_SUCCESS_NSIOBSERVER_TOPIC = "bookmarks-restore-success";
const RESTORE_FAILED_NSIOBSERVER_TOPIC = "bookmarks-restore-failed";
const RESTORE_NSIOBSERVER_DATA = "json";
-//@line 73 "/builds/moz2_slave/linux_build/build/toolkit/components/places/src/utils.js"
+//@line 76 "/builds/slave/linux_build/build/toolkit/components/places/src/utils.js"
// On other platforms, the transferable system converts "\r\n" to "\n".
const NEWLINE = "\r\n";
-//@line 76 "/builds/moz2_slave/linux_build/build/toolkit/components/places/src/utils.js"
+//@line 79 "/builds/slave/linux_build/build/toolkit/components/places/src/utils.js"
function QI_node(aNode, aIID) {
var result = null;
@@ -253,6 +256,61 @@ var PlacesUtils = {
},
/**
+ * Cache array of read-only item IDs.
+ *
+ * The first time this property is called:
+ * - the cache is filled with all ids with the RO annotation
+ * - an annotation observer is added
+ * - a shutdown observer is added
+ *
+ * When the annotation observer detects annotations added or
+ * removed that are the RO annotation name, it adds/removes
+ * the ids from the cache.
+ *
+ * At shutdown, the annotation and shutdown observers are removed.
+ */
+ get _readOnly() {
+ // add annotations observer
+ this.annotations.addObserver(this, false);
+
+ // observe shutdown, so we can remove the anno observer
+ const os = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ os.addObserver(this, "xpcom-shutdown", false);
+
+ var readOnly = this.annotations.getItemsWithAnnotation(READ_ONLY_ANNO, {});
+ this.__defineGetter__("_readOnly", function() readOnly);
+ return this._readOnly;
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIAnnotationObserver,
+ Ci.nsIObserver]),
+
+ // nsIObserver
+ observe: function PU_observe(aSubject, aTopic, aData) {
+ if (aTopic == "xpcom-shutdown") {
+ this.annotations.removeObserver(this);
+ const os = Cc["@mozilla.org/observer-service;1"].
+ getService(Ci.nsIObserverService);
+ os.removeObserver(this, "xpcom-shutdown");
+ }
+ },
+
+ // nsIAnnotationObserver
+ onItemAnnotationSet: function(aItemId, aAnnotationName) {
+ if (aAnnotationName == READ_ONLY_ANNO &&
+ this._readOnly.indexOf(aItemId) == -1)
+ this._readOnly.push(aItemId);
+ },
+ onItemAnnotationRemoved: function(aItemId, aAnnotationName) {
+ var index = this._readOnly.indexOf(aItemId);
+ if (aAnnotationName == READ_ONLY_ANNO && index > -1)
+ delete this._readOnly[index];
+ },
+ onPageAnnotationSet: function(aUri, aAnnotationName) {},
+ onPageAnnotationRemoved: function(aUri, aAnnotationName) {},
+
+ /**
* Determines if a node is read only (children cannot be inserted, sometimes
* they cannot be removed depending on the circumstance)
* @param aNode
@@ -260,11 +318,13 @@ var PlacesUtils = {
* @returns true if the node is readonly, false otherwise
*/
nodeIsReadOnly: function PU_nodeIsReadOnly(aNode) {
- if (this.nodeIsFolder(aNode) || this.nodeIsDynamicContainer(aNode))
- return this.bookmarks.getFolderReadonly(this.getConcreteItemId(aNode));
- if (this.nodeIsQuery(aNode) &&
- asQuery(aNode).queryOptions.resultType !=
- Ci.nsINavHistoryQueryOptions.RESULTS_AS_TAG_CONTENTS)
+ if (this.nodeIsFolder(aNode) || this.nodeIsDynamicContainer(aNode)) {
+ if (this._readOnly.indexOf(aNode.itemId) != -1)
+ return true;
+ }
+ else if (this.nodeIsQuery(aNode) &&
+ asQuery(aNode).queryOptions.resultType !=
+ Ci.nsINavHistoryQueryOptions.RESULTS_AS_TAG_CONTENTS)
return aNode.childrenReadOnly;
return false;
},
@@ -355,18 +415,30 @@ var PlacesUtils = {
return false;
},
- /**
- * Determines whether a result node is a remote container registered by the
- * livemark service.
- * @param aNode
- * A result Node
- * @returns true if the node is a livemark container item
- */
+ /**
+ * Determines if a container item id is a livemark.
+ * @param aItemId
+ * The id of the potential livemark.
+ * @returns true if the item is a livemark.
+ */
+ itemIsLivemark: function PU_itemIsLivemark(aItemId) {
+ // If the Livemark service hasn't yet been initialized then
+ // use the annotations service directly to avoid instanciating
+ // it on startup. (bug 398300)
+ if (this.__lookupGetter__("livemarks"))
+ return this.annotations.itemHasAnnotation(aItemId, LMANNO_FEEDURI);
+ // If the livemark service has already been instanciated, use it.
+ return this.livemarks.isLivemark(aItemId);
+ },
+
+ /**
+ * Determines whether a result node is a livemark container.
+ * @param aNode
+ * A result Node
+ * @returns true if the node is a livemark container item
+ */
nodeIsLivemarkContainer: function PU_nodeIsLivemarkContainer(aNode) {
- // Use the annotations service directly to avoid instantiating
- // the Livemark service on startup. (bug 398300)
- return this.nodeIsFolder(aNode) &&
- this.annotations.itemHasAnnotation(aNode.itemId, LMANNO_FEEDURI);
+ return this.nodeIsFolder(aNode) && this.itemIsLivemark(aNode.itemId);
},
/**
@@ -475,7 +547,11 @@ var PlacesUtils = {
this.value += aStr;
}
};
- self.serializeNodeAsJSONToOutputStream(convertNode(aNode), writer, true, aForceCopy);
+ var node = convertNode(aNode);
+ self.serializeNodeAsJSONToOutputStream(node, writer, true, aForceCopy);
+ // Convert node could pass an open container node.
+ if (self.nodeIsContainer(node))
+ node.containerOpen = false;
return writer.value;
case this.TYPE_X_MOZ_URL:
function gatherDataUrl(bNode) {
@@ -488,7 +564,13 @@ var PlacesUtils = {
// ignore containers and separators - items without valid URIs
return "";
}
- return gatherDataUrl(convertNode(aNode));
+ var node = convertNode(aNode);
+ var dataUrl = gatherDataUrl(node);
+ // Convert node could pass an open container node.
+ if (self.nodeIsContainer(node))
+ node.containerOpen = false;
+ return dataUrl;
+
case this.TYPE_HTML:
function gatherDataHtml(bNode) {
@@ -529,7 +611,12 @@ var PlacesUtils = {
return "<HR>" + NEWLINE;
return "";
}
- return gatherDataHtml(convertNode(aNode));
+ var node = convertNode(aNode);
+ var dataHtml = gatherDataHtml(node);
+ // Convert node could pass an open container node.
+ if (self.nodeIsContainer(node))
+ node.containerOpen = false;
+ return dataHtml;
}
// case this.TYPE_UNICODE:
function gatherDataText(bNode) {
@@ -558,7 +645,12 @@ var PlacesUtils = {
return "";
}
- return gatherDataText(convertNode(aNode));
+ var node = convertNode(aNode);
+ var dataText = gatherDataText(node);
+ // Convert node could pass an open container node.
+ if (self.nodeIsContainer(node))
+ node.containerOpen = false;
+ return dataText;
},
/**
@@ -787,7 +879,9 @@ var PlacesUtils = {
});
},
- // identifier getters for special folders
+ // Identifier getters for special folders.
+ // You should use these everywhere PlacesUtils is available to avoid XPCOM
+ // traversal just to get roots' ids.
get placesRootId() {
delete this.placesRootId;
return this.placesRootId = this.bookmarks.placesRoot;
@@ -891,13 +985,13 @@ var PlacesUtils = {
// filter the ids list
return bmkIds.filter(function(aID) {
- var parent = this.bookmarks.getFolderIdForItem(aID);
+ var parentId = this.bookmarks.getFolderIdForItem(aID);
// Livemark child
- if (this.annotations.itemHasAnnotation(parent, LMANNO_FEEDURI))
+ if (this.itemIsLivemark(parentId))
return false;
- var grandparent = this.bookmarks.getFolderIdForItem(parent);
+ var grandparentId = this.bookmarks.getFolderIdForItem(parentId);
// item under a tag container
- if (grandparent == this.tagsFolderId)
+ if (grandparentId == this.tagsFolderId)
return false;
return true;
}, this);
@@ -905,35 +999,60 @@ var PlacesUtils = {
/**
* Get the most recently added/modified bookmark for a URL, excluding items
- * under tag or livemark containers. -1 is returned if no item is found.
+ * under tag or livemark containers.
+ *
+ * @param aURI
+ * nsIURI of the page we will look for.
+ * @returns itemId of the found bookmark, or -1 if nothing is found.
*/
getMostRecentBookmarkForURI:
function PU_getMostRecentBookmarkForURI(aURI) {
var bmkIds = this.bookmarks.getBookmarkIdsForURI(aURI, {});
for (var i = 0; i < bmkIds.length; i++) {
// Find the first folder which isn't a tag container
- var bk = bmkIds[i];
- var parent = this.bookmarks.getFolderIdForItem(bk);
- if (parent == this.unfiledBookmarksFolderId)
- return bk;
-
- var grandparent = this.bookmarks.getFolderIdForItem(parent);
- if (grandparent != this.tagsFolderId &&
- !this.annotations.itemHasAnnotation(parent, LMANNO_FEEDURI))
- return bk;
+ var itemId = bmkIds[i];
+ var parentId = this.bookmarks.getFolderIdForItem(itemId);
+ // Optimization: if this is a direct child of a root we don't need to
+ // check if its grandparent is a tag.
+ if (parentId == this.unfiledBookmarksFolderId ||
+ parentId == this.toolbarFolderId ||
+ parentId == this.bookmarksMenuFolderId)
+ return itemId;
+
+ var grandparentId = this.bookmarks.getFolderIdForItem(parentId);
+ if (grandparentId != this.tagsFolderId &&
+ !this.itemIsLivemark(parentId))
+ return itemId;
}
return -1;
},
+ /**
+ * Get the most recent folder item id for a feed URI.
+ *
+ * @param aURI
+ * nsIURI of the feed we will look for.
+ * @returns folder item id of the found livemark, or -1 if nothing is found.
+ */
getMostRecentFolderForFeedURI:
- function PU_getMostRecentFolderForFeedURI(aURI) {
- var feedSpec = aURI.spec
- var annosvc = this.annotations;
- var livemarks = annosvc.getItemsWithAnnotation(LMANNO_FEEDURI, {});
- for (var i = 0; i < livemarks.length; i++) {
- if (annosvc.getItemAnnotation(livemarks[i], LMANNO_FEEDURI) == feedSpec)
- return livemarks[i];
+ function PU_getMostRecentFolderForFeedURI(aFeedURI) {
+ // If the Livemark service hasn't yet been initialized then
+ // use the annotations service directly to avoid instanciating
+ // it on startup. (bug 398300)
+ if (this.__lookupGetter__("livemarks")) {
+ var feedSpec = aFeedURI.spec
+ var annosvc = this.annotations;
+ var livemarks = annosvc.getItemsWithAnnotation(LMANNO_FEEDURI, {});
+ for (var i = 0; i < livemarks.length; i++) {
+ if (annosvc.getItemAnnotation(livemarks[i], LMANNO_FEEDURI) == feedSpec)
+ return livemarks[i];
+ }
}
+ else {
+ // If the livemark service has already been instanciated, use it.
+ return this.livemarks.getLivemarkIdForFeedURI(aFeedURI);
+ }
+
return -1;
},
@@ -1149,41 +1268,15 @@ var PlacesUtils = {
var childIds = [];
for (var i = 0; i < root.childCount; i++) {
var childId = root.getChild(i).itemId;
- if (excludeItems.indexOf(childId) == -1)
+ if (excludeItems.indexOf(childId) == -1 &&
+ childId != this._utils.tagsFolderId)
childIds.push(childId);
}
root.containerOpen = false;
for (var i = 0; i < childIds.length; i++) {
var rootItemId = childIds[i];
- if (rootItemId == this._utils.tagsFolderId) {
- // remove tags via the tagging service
- var tags = this._utils.tagging.allTags;
- var uris = [];
- var bogusTagContainer = false;
- for (let i in tags) {
- var tagURIs = [];
- // skip empty tags since getURIsForTag would throw
- if (tags[i])
- tagURIs = this._utils.tagging.getURIsForTag(tags[i]);
-
- if (!tagURIs.length) {
- // This is a bogus tag container, empty tags should be removed
- // automatically, but this does not work if they contain some
- // not-uri node, so we remove them manually.
- // XXX this is a temporary workaround until we implement
- // preventive database maintenance in bug 431558.
- bogusTagContainer = true;
- }
- for (let j in tagURIs)
- this._utils.tagging.untagURI(tagURIs[j], [tags[i]]);
- }
- if (bogusTagContainer)
- this._utils.bookmarks.removeFolderChildren(rootItemId);
- }
- else if ([this._utils.toolbarFolderId,
- this._utils.unfiledBookmarksFolderId,
- this._utils.bookmarksMenuFolderId].indexOf(rootItemId) != -1)
+ if (this._utils.isRootItem(rootItemId))
this._utils.bookmarks.removeFolderChildren(rootItemId);
else
this._utils.bookmarks.removeItem(rootItemId);
@@ -1263,7 +1356,7 @@ var PlacesUtils = {
var id = -1;
switch (aData.type) {
case this.TYPE_X_MOZ_PLACE_CONTAINER:
- if (aContainer == PlacesUtils.bookmarks.tagsFolder) {
+ if (aContainer == PlacesUtils.tagsFolderId) {
// node is a tag
if (aData.children) {
aData.children.forEach(function(aChild) {
@@ -1321,7 +1414,8 @@ var PlacesUtils = {
}
break;
case this.TYPE_X_MOZ_PLACE:
- id = this.bookmarks.insertBookmark(aContainer, this._uri(aData.uri), aIndex, aData.title);
+ id = this.bookmarks.insertBookmark(aContainer, this._uri(aData.uri),
+ aIndex, aData.title);
if (aData.keyword)
this.bookmarks.setKeywordForBookmark(id, aData.keyword);
if (aData.tags) {
@@ -1333,6 +1427,25 @@ var PlacesUtils = {
this.history.setCharsetForURI(this._uri(aData.uri), aData.charset);
if (aData.uri.substr(0, 6) == "place:")
searchIds.push(id);
+ if (aData.icon) {
+ try {
+ // Create a fake faviconURI to use (FIXME: bug 523932)
+ let faviconURI = this._uri("fake-favicon-uri:" + aData.uri);
+ this.favicons.setFaviconUrlForPage(this._uri(aData.uri), faviconURI);
+ this.favicons.setFaviconDataFromDataURL(faviconURI, aData.icon, 0);
+ } catch (ex) {
+ Components.utils.reportError("Failed to import favicon data:" + ex);
+ }
+ }
+ if (aData.iconUri) {
+ try {
+ this.favicons.setAndLoadFaviconForPage(this._uri(aData.uri),
+ this._uri(aData.iconUri),
+ false);
+ } catch (ex) {
+ Components.utils.reportError("Failed to import favicon URI:" + ex);
+ }
+ }
break;
case this.TYPE_X_MOZ_PLACE_SEPARATOR:
id = this.bookmarks.insertSeparator(aContainer, aIndex);
@@ -1399,10 +1512,8 @@ var PlacesUtils = {
function addGenericProperties(aPlacesNode, aJSNode) {
aJSNode.title = aPlacesNode.title;
- var id = aPlacesNode.itemId;
- if (id != -1) {
- aJSNode.id = id;
-
+ aJSNode.id = aPlacesNode.itemId;
+ if (aJSNode.id != -1) {
var parent = aPlacesNode.parent;
if (parent)
aJSNode.parent = parent.itemId;
@@ -1416,7 +1527,7 @@ var PlacesUtils = {
// XXX need a hasAnnos api
var annos = [];
try {
- annos = self.getAnnotationsForItem(id).filter(function(anno) {
+ annos = self.getAnnotationsForItem(aJSNode.id).filter(function(anno) {
// XXX should whitelist this instead, w/ a pref for
// backup/restore of non-whitelisted annos
// XXX causes JSON encoding errors, so utf-8 encode
@@ -1464,32 +1575,37 @@ var PlacesUtils = {
}
function addContainerProperties(aPlacesNode, aJSNode) {
- // saved queries
var concreteId = PlacesUtils.getConcreteItemId(aPlacesNode);
- if (aJSNode.id != -1 && (PlacesUtils.nodeIsQuery(aPlacesNode) ||
- (concreteId != aPlacesNode.itemId && !aResolveShortcuts))) {
- aJSNode.type = self.TYPE_X_MOZ_PLACE;
- aJSNode.uri = aPlacesNode.uri;
- // folder shortcut
- if (aIsUICommand)
- aJSNode.concreteId = concreteId;
- return;
+ if (concreteId != -1) {
+ // This is a bookmark or a tag container.
+ if (PlacesUtils.nodeIsQuery(aPlacesNode) ||
+ (concreteId != aPlacesNode.itemId && !aResolveShortcuts)) {
+ aJSNode.type = self.TYPE_X_MOZ_PLACE;
+ aJSNode.uri = aPlacesNode.uri;
+ // folder shortcut
+ if (aIsUICommand)
+ aJSNode.concreteId = concreteId;
+ }
+ else { // Bookmark folder or a shortcut we should convert to folder.
+ aJSNode.type = self.TYPE_X_MOZ_PLACE_CONTAINER;
+
+ // Mark root folders.
+ if (aJSNode.id == self.placesRootId)
+ aJSNode.root = "placesRoot";
+ else if (aJSNode.id == self.bookmarksMenuFolderId)
+ aJSNode.root = "bookmarksMenuFolder";
+ else if (aJSNode.id == self.tagsFolderId)
+ aJSNode.root = "tagsFolder";
+ else if (aJSNode.id == self.unfiledBookmarksFolderId)
+ aJSNode.root = "unfiledBookmarksFolder";
+ else if (aJSNode.id == self.toolbarFolderId)
+ aJSNode.root = "toolbarFolder";
+ }
}
- else if (aJSNode.id != -1) { // bookmark folder
- if (concreteId != aPlacesNode.itemId)
+ else {
+ // This is a grouped container query, generated on the fly.
aJSNode.type = self.TYPE_X_MOZ_PLACE;
- aJSNode.type = self.TYPE_X_MOZ_PLACE_CONTAINER;
- // mark special folders
- if (aJSNode.id == self.bookmarks.placesRoot)
- aJSNode.root = "placesRoot";
- else if (aJSNode.id == self.bookmarks.bookmarksMenuFolder)
- aJSNode.root = "bookmarksMenuFolder";
- else if (aJSNode.id == self.bookmarks.tagsFolder)
- aJSNode.root = "tagsFolder";
- else if (aJSNode.id == self.bookmarks.unfiledBookmarksFolder)
- aJSNode.root = "unfiledBookmarksFolder";
- else if (aJSNode.id == self.bookmarks.toolbarFolder)
- aJSNode.root = "toolbarFolder";
+ aJSNode.uri = aPlacesNode.uri;
}
}
@@ -1640,7 +1756,7 @@ var PlacesUtils = {
var options = this.history.getNewQueryOptions();
options.expandQueries = false;
var query = this.history.getNewQuery();
- query.setFolders([this.bookmarks.placesRoot], 1);
+ query.setFolders([this.placesRootId], 1);
var result = this.history.executeQuery(query, options);
result.root.containerOpen = true;
// serialize as JSON, write to stream
diff --git a/tools/xo_bundle/mozilla-xremote-client b/tools/xo_bundle/mozilla-xremote-client
index b6f8c0b..dfc9088 100755
--- a/tools/xo_bundle/mozilla-xremote-client
+++ b/tools/xo_bundle/mozilla-xremote-client
Binary files differ
diff --git a/tools/xo_bundle/platform.ini b/tools/xo_bundle/platform.ini
index fabf597..a570432 100755
--- a/tools/xo_bundle/platform.ini
+++ b/tools/xo_bundle/platform.ini
@@ -1,5 +1,5 @@
[Build]
-BuildID=20090824085743
-Milestone=1.9.1.3
-SourceStamp=0da982f65d37
-SourceRepository=http://hg.mozilla.org/releases/mozilla-1.9.1
+BuildID=20100115133306
+Milestone=1.9.2
+SourceStamp=448d0d2d310c
+SourceRepository=http://hg.mozilla.org/releases/mozilla-1.9.2
diff --git a/tools/xo_bundle/plugins/libflashplayer.so b/tools/xo_bundle/plugins/libflashplayer.so
new file mode 100755
index 0000000..5dbecbc
--- /dev/null
+++ b/tools/xo_bundle/plugins/libflashplayer.so
Binary files differ
diff --git a/tools/xo_bundle/plugins/libnullplugin.so b/tools/xo_bundle/plugins/libnullplugin.so
index 34b4350..b28d4c8 100755
--- a/tools/xo_bundle/plugins/libnullplugin.so
+++ b/tools/xo_bundle/plugins/libnullplugin.so
Binary files differ
diff --git a/tools/xo_bundle/removed-files b/tools/xo_bundle/removed-files
index 90ad051..5f45e3d 100755
--- a/tools/xo_bundle/removed-files
+++ b/tools/xo_bundle/removed-files
@@ -43,6 +43,11 @@ components/libjsd.so
components/libxpinstall.so
libxpistub.so
component.reg
+components/aboutCertError.js
+components/aboutPrivateBrowsing.js
+components/aboutRights.js
+components/aboutRobots.js
+components/aboutSessionRestore.js
components/compreg.dat
components/libmyspell.so
components/libspellchecker.so
@@ -493,6 +498,8 @@ extensions/talkback@mozilla.org/components/talkback/talkback.so
components/airbag.xpt
components/nsUrlClassifierTable.js
res/cmessage.txt
+res/broken-image.gif
+res/loading-image.gif
res/html/gopher-audio.gif
res/html/gopher-binary.gif
res/html/gopher-find.gif
@@ -526,6 +533,10 @@ chrome/icons/default/default.xpm
dictionaries/PL.dic
dictionaries/PL.aff
libjemalloc.so
+icons/mozicon16.xpm
+icons/mozicon50.xpm
xpicleanup
chrome.manifest
install.rdf
+libjsj.so
+old-homepage-default.properties
diff --git a/tools/xo_bundle/res/broken-image.png b/tools/xo_bundle/res/broken-image.png
new file mode 100644
index 0000000..2a1e0dc
--- /dev/null
+++ b/tools/xo_bundle/res/broken-image.png
Binary files differ
diff --git a/tools/xo_bundle/res/charsetData.properties b/tools/xo_bundle/res/charsetData.properties
index 853b3fa..6c5c2b0 100755
--- a/tools/xo_bundle/res/charsetData.properties
+++ b/tools/xo_bundle/res/charsetData.properties
@@ -55,16 +55,12 @@ t.61-8bit.notForBrowser = true
x-imap4-modified-utf7.notForBrowser = true
windows-936.notForBrowser = true
us-ascii.notForBrowser = true
-x-obsoleted-euc-jp.notForBrowser = true
-x-obsoleted-iso-2022-jp.notForBrowser = true
-x-obsoleted-shift_jis.notForBrowser = true
iso-8859-6-e.notForBrowser = true
iso-8859-6-i.notForBrowser = true
ibm864i.notForBrowser = true
ibm869.notForBrowser = true
ibm1125.notForBrowser = true
ibm1131.notForBrowser = true
-x-ibm1046.notForBrowser = true
iso-8859-8-e.notForBrowser = true
utf-7.notForBrowser = true
@@ -73,16 +69,12 @@ utf-7.notForOutgoing = true
x-imap4-modified-utf7.notForOutgoing = true
windows-936.notForOutgoing = true
us-ascii.notForOutgoing = true
-x-obsoleted-euc-jp.notForOutgoing = true
-x-obsoleted-iso-2022-jp.notForOutgoing = true
-x-obsoleted-shift_jis.notForOutgoing = true
iso-8859-6-e.notForOutgoing = true
iso-8859-6-i.notForOutgoing = true
ibm864i.notForOutgoing = true
ibm869.notForOutgoing = true
ibm1125.notForOutgoing = true
ibm1131.notForOutgoing = true
-x-ibm1046.notForOutgoing = true
iso-8859-8-e.notForOutgoing = true
iso-8859-8.notForOutgoing = true
iso-2022-kr.notForOutgoing = true
@@ -118,7 +110,6 @@ ibm866.LangGroup = x-cyrillic
ibm869.LangGroup = el
ibm1125.LangGroup = x-cyrillic
ibm1131.LangGroup = x-cyrillic
-x-ibm1046.LangGroup = ar
iso-2022-cn.LangGroup = zh-CN
iso-2022-jp.LangGroup = ja
iso-2022-kr.LangGroup = ko
@@ -149,7 +140,6 @@ tis-620.LangGroup = th
tis620-2.LangGroup = th
windows-874.LangGroup = th
iso-8859-11.LangGroup = th
-x-thaittf-0.LangGroup = th
us-ascii.LangGroup = x-western
t.61-8bit.LangGroup = x-western
utf-8.LangGroup = x-unicode
@@ -174,11 +164,9 @@ windows-1256.LangGroup = ar
windows-1257.LangGroup = x-baltic
windows-1258.LangGroup = x-western
windows-936.LangGroup = zh-CN
-x-cns-11643-1.LangGroup = zh-TW
x-euc-tw.LangGroup = zh-TW
x-gbk.LangGroup = zh-CN
gb_2312-80.LangGroup = zh-CN
-x-gbk-noascii.LangGroup = zh-CN
x-mac-ce.LangGroup = x-central-euro
x-mac-croatian.LangGroup = x-central-euro
x-mac-cyrillic.LangGroup = x-cyrillic
@@ -194,15 +182,11 @@ x-mac-ukrainian.LangGroup = x-cyrillic
x-mac-romanian.LangGroup = x-central-euro
x-user-defined.LangGroup = x-user-def
ks_c_5601-1987.LangGroup = ko
-x-x11johab.LangGroup = ko
x-johab.LangGroup = ko
-x-johab-noascii.LangGroup = ko
x-windows-949.LangGroup = ko
x-koreanjamo-0.LangGroup = ko
x-mac-hebrew.LangGroup = he
x-mac-arabic.LangGroup = ar
-x-iso-8859-6-8-x.LangGroup = ar
-x-iso-8859-6-16.LangGroup = ar
x-sun-unicode-india-0.LangGroup = x-devanagari
x-tscii.LangGroup = x-tamil
x-tamilttf-0.LangGroup = x-tamil
diff --git a/tools/xo_bundle/res/charsetalias.properties b/tools/xo_bundle/res/charsetalias.properties
index ff4efd3..bc42d4e 100755
--- a/tools/xo_bundle/res/charsetalias.properties
+++ b/tools/xo_bundle/res/charsetalias.properties
@@ -136,7 +136,7 @@ x-mac-icelandic=x-mac-icelandic
x-mac-croatian=x-mac-croatian
x-mac-romanian=x-mac-romanian
x-mac-cyrillic=x-mac-cyrillic
-x-mac-ukrainian=x-mac-ukrainian
+x-mac-ukrainian=x-mac-cyrillic
x-mac-hebrew=x-mac-hebrew
x-mac-arabic=x-mac-arabic
x-mac-farsi=x-mac-farsi
@@ -513,10 +513,6 @@ cp1256=windows-1256
cp1257=windows-1257
cp1258=windows-1258
-# Tempory charset for testing purpose. Should be remove before Beta
-x-obsoleted-shift_jis=x-obsoleted-Shift_JIS
-x-obsoleted-iso-2022-jp=x-obsoleted-ISO-2022-JP
-x-obsoleted-euc-jp=x-obsoleted-EUC-JP
x-gbk=x-gbk
windows-936=windows-936
ansi-1251=windows-1251
diff --git a/tools/xo_bundle/res/forms.css b/tools/xo_bundle/res/forms.css
index a90057d..422ed08 100755
--- a/tools/xo_bundle/res/forms.css
+++ b/tools/xo_bundle/res/forms.css
@@ -49,21 +49,25 @@
/* miscellaneous form elements */
-legend {
+fieldset > legend {
padding-left: 2px;
padding-right: 2px;
border: none;
- position: static ! important;
- float: none ! important;
- width: -moz-fit-content ! important;
- min-width: 0 ! important;
- max-width: none ! important;
- height: auto ! important;
- min-height: 0 ! important;
- max-height: none ! important;
+ position: static;
+ float: none;
+ width: -moz-fit-content;
+ min-width: 0;
+ max-width: none;
+ height: auto;
+ min-height: 0;
+ max-height: none;
white-space: nowrap;
}
+legend {
+ display: block;
+}
+
fieldset {
display: block;
margin-left: 2px;
@@ -105,8 +109,9 @@ input {
}
input > .anonymous-div {
- white-space: pre;
word-wrap: normal !important;
+ /* Make the line-height equal to the available height */
+ line-height: -moz-block-height;
}
textarea {
@@ -136,6 +141,7 @@ textarea > scrollbar {
textarea > .anonymous-div,
input > .anonymous-div {
+ white-space: pre;
overflow: auto;
border: 0px !important;
/* The 1px horizontal padding is for parity with Win/IE */
@@ -147,6 +153,15 @@ input > .anonymous-div {
ime-mode: inherit;
}
+textarea > .anonymous-div.wrap,
+input > .anonymous-div.wrap {
+ white-space: pre-wrap;
+}
+textarea > .anonymous-div.inherit-overflow,
+input > .anonymous-div.inherit-overflow {
+ overflow: inherit;
+}
+
input:-moz-read-write,
textarea:-moz-read-write {
-moz-user-modify: read-write !important;
@@ -155,8 +170,8 @@ textarea:-moz-read-write {
select {
margin: 0;
border-color: ThreeDFace;
- background-color: -moz-Field;
- color: -moz-FieldText;
+ background-color: -moz-Combobox;
+ color: -moz-ComboboxText;
font: -moz-list;
line-height: normal !important;
white-space: nowrap !important;
@@ -180,6 +195,8 @@ select[size],
select[multiple],
select[size][multiple] {
/* Different alignment and padding for listbox vs combobox */
+ background-color: -moz-Field;
+ color: -moz-FieldText;
vertical-align: text-bottom;
padding: 1px 0 1px 0;
-moz-appearance: listbox;
@@ -188,6 +205,8 @@ select[size][multiple] {
select[size="0"],
select[size="1"] {
/* Except this is not a listbox */
+ background-color: -moz-Combobox;
+ color: -moz-ComboboxText;
vertical-align: baseline;
padding: 0;
-moz-appearance: menulist;
@@ -339,7 +358,7 @@ optgroup[disabled] {
/* hidden inputs */
input[type="hidden"] {
-moz-appearance: none;
- display: none;
+ display: none !important;
padding: 0;
border: 0;
cursor: auto;
diff --git a/tools/xo_bundle/res/html.css b/tools/xo_bundle/res/html.css
index fd23037..7d00e20 100755
--- a/tools/xo_bundle/res/html.css
+++ b/tools/xo_bundle/res/html.css
@@ -52,6 +52,22 @@ bdo[dir] {
unicode-bidi: bidi-override;
}
+/* To ensure http://www.w3.org/TR/REC-html40/struct/dirlang.html#style-bidi:
+ *
+ * "When a block element that does not have a dir attribute is transformed to
+ * the style of an inline element by a style sheet, the resulting presentation
+ * should be equivalent, in terms of bidirectional formatting, to the
+ * formatting obtained by explicitly adding a dir attribute (assigned the
+ * inherited value) to the transformed element." */
+
+address, blockquote, body, caption, center, col, colgroup, dd, dir, div, dl, dt,
+fieldset, form, h1, h2, h3, h4, h5, h6, hr, html, isindex, li, listing, map,
+marquee, menu, noframes, ol, p, plaintext, pre, table, tbody, td, tfoot, th,
+thead, tr, ul, xmp {
+ unicode-bidi: embed;
+}
+
+
/* blocks */
html, div, map, dt, isindex, form {
diff --git a/tools/xo_bundle/res/langGroups.properties b/tools/xo_bundle/res/langGroups.properties
index 7e18dd4..28b533c 100755
--- a/tools/xo_bundle/res/langGroups.properties
+++ b/tools/xo_bundle/res/langGroups.properties
@@ -48,16 +48,17 @@
# see also toolkit/locales/en-US/chrome/global/languageNames.properties
# and bug 178491
#
-#ab=x-cyrillic
# Strictly speaking, Avestan did not use Arabic script but Aramaic
# (arc)/Avestan script.)
#ae=ar
+ab=x-cyrillic
af=x-western
alg=x-cans
am=x-ethi
ar=ar
as=x-beng
+ay=x-western
be=x-cyrillic
bg=x-cyrillic
bn=x-beng
@@ -98,14 +99,16 @@ ga=x-western
gd=x-western
# gl : ISO-8859-13
gl=x-western
+gn=x-western
#ha=x-western : Latin and Ajami scripts
gu=x-gujr
+gv=x-western
he=he
hi=x-devanagari
-ht=x-western
hr=x-central-euro
# XXX Latin Ext. A is also used for hsb.
hsb=x-western
+ht=x-western
hu=x-central-euro
hy=x-armn
ia=x-western
@@ -116,38 +119,51 @@ it=x-western
iu=x-cans
ja=ja
ka=x-geor
+kk=x-cyrillic
+kl=x-western
km=x-khmr
kn=x-knda
ko=ko
+kok=x-devanagari
ks=ar
-#ku=ar
+# Arabic script is also used for Kurdish
+ku=x-western
# XXX Latin Ext. A is also used for kw(Cornish).
kw=x-western
#ky=x-cyrillic
# XXX Latin Ext. A is also used for Latin.
la=x-western
lb=x-western
+ln=x-western
lt=x-baltic
lv=x-baltic
+mg=x-western
+mh=x-western
#XXX Latin Ext. A is also used for Maori.
mi=x-western
mk=x-cyrillic
ml=x-mlym
-#mo=x-central-euro / x-cyrillic
+# Mongolian script is also used for Mongolian
+mn=x-cyrillic
mr=x-devanagari
ms=x-western
# Maltese: Latin-3
mt=x-western
+na=x-western
nb=x-western
+nd=x-western
ne=x-devanagari
nl=x-western
nn=x-western
no=x-western
+nr=x-western
+nso=x-western
# XXX : x-central-euro may be better
nv=x-western
+ny=x-western
oc=x-western
oj=x-cans
-om=x-ethi
+om=x-western
or=x-orya
os=x-cyrillic
#pa: Punjabi is usually written in Gurmukhi script in India and Arabic script
@@ -160,8 +176,10 @@ ps=ar
pt=x-western
qu=x-western
rm=x-western
+rn=x-western
ro=x-central-euro
ru=x-cyrillic
+rw=x-western
sa=x-devanagari
sc=x-western
sd=ar
@@ -171,26 +189,37 @@ sh=x-central-euro
si=x-sinh
sk=x-central-euro
sl=x-central-euro
+sm=x-western
so=x-western
sq=x-western
sr=x-cyrillic
+ss=x-western
+st=x-western
sv=x-western
sw=x-western
ta=x-tamil
te=x-telu
th=th
+ti=x-ethi
tig=x-ethi
tk=x-cyrillic
#tk=tr # (The country declared in 1992 to gradually move to Latin script)
+tl=x-western
tlh=x-western
+tn=x-western
+to=x-western
tr=tr
+ts=x-western
tt=tr
uk=x-cyrillic
ur=ar
+ve=x-western
# XXX : Vietnamese may need be put into a script group of its own
vi=x-western
vo=x-western
wa=x-western
+wo=x-western
+xh=x-western
yi=he
#Latin Ext. A and Latin Extended Additional block are used for Yoruba.
#yo=x-western
diff --git a/tools/xo_bundle/res/language.properties b/tools/xo_bundle/res/language.properties
index e03793f..321f96f 100755
--- a/tools/xo_bundle/res/language.properties
+++ b/tools/xo_bundle/res/language.properties
@@ -1,5 +1,5 @@
aa.accept = false
-ab.accept = false
+ab.accept = true
ae.accept = false
af.accept = true
ak.accept = false
@@ -25,6 +25,7 @@ ar-ye.accept = true
as.accept = true
ast.accept = true
av.accept = false
+ay.accept = true
az.accept = true
ba.accept = false
be.accept = true
@@ -110,9 +111,9 @@ fy.accept = true
ga.accept = true
gd.accept = true
gl.accept = true
-gn.accept = false
+gn.accept = true
gu.accept = true
-gv.accept = false
+gv.accept = true
ha.accept = false
he.accept = true
hi.accept = true
@@ -140,16 +141,16 @@ ka.accept = true
kg.accept = false
ki.accept = false
kk.accept = true
-kl.accept = false
+kl.accept = true
km.accept = true
kn.accept = true
ko.accept = true
ko-kp.accept = true
ko-kr.accept = true
-kok.accept = false
+kok.accept = true
kr.accept = false
ks.accept = true
-ku.accept = false
+ku.accept = true
kv.accept = false
kw.accept = false
ky.accept = true
@@ -157,36 +158,35 @@ la.accept = true
lb.accept = true
lg.accept = false
li.accept = false
-ln.accept = false
+ln.accept = true
lo.accept = false
lt.accept = true
lu.accept = false
lv.accept = true
-mg.accept = false
-mh.accept = false
+mg.accept = true
+mh.accept = true
mi.accept = true
mk.accept = false
mk-mk.accept = true
ml.accept = true
-mn.accept = false
-mo.accept = true
+mn.accept = true
mr.accept = true
ms.accept = true
mt.accept = true
my.accept = true
-na.accept = false
+na.accept = true
nb.accept = true
-nd.accept = false
+nd.accept = true
ne.accept = true
ng.accept = true
nl.accept = true
nl-be.accept = true
nn.accept = true
no.accept = true
-nr.accept = false
-nso.accept = false
+nr.accept = true
+nso.accept = true
nv.accept = true
-ny.accept = false
+ny.accept = true
oc.accept = true
oj.accept = false
om.accept = true
@@ -197,16 +197,18 @@ pa-in.accept = true
pa-pk.accept = true
pi.accept = false
pl.accept = true
-ps.accept = false
+ps.accept = true
pt.accept = true
pt-br.accept = true
qu.accept = true
rm.accept = true
-rn.accept = false
+rn.accept = true
ro.accept = true
-ro-md.accept = false
+ro-md.accept = true
+ro-ro.accept = true
ru.accept = true
ru-md.accept = false
+rw.accept = true
sa.accept = true
sc.accept = true
sd.accept = true
@@ -214,11 +216,12 @@ sg.accept = true
si.accept = true
sk.accept = true
sl.accept = true
+sm.accept = true
so.accept = true
sq.accept = true
sr.accept = true
-ss.accept = false
-st.accept = false
+ss.accept = true
+st.accept = true
su.accept = false
sv.accept = true
sv-fi.accept = true
@@ -228,27 +231,27 @@ ta.accept = true
te.accept = true
tg.accept = false
th.accept = true
-ti.accept = false
+ti.accept = true
tig.accept = true
tk.accept = true
-tl.accept = false
+tl.accept = true
tlh.accept = true
-tn.accept = false
-to.accept = false
+tn.accept = true
+to.accept = true
tr.accept = true
-ts.accept = false
+ts.accept = true
tt.accept = true
tw.accept = false
ty.accept = false
ug.accept = false
uk.accept = true
-ur.accept = false
+ur.accept = true
uz.accept = false
ve.accept = true
vi.accept = true
vo.accept = true
wa.accept = true
-wo.accept = false
+wo.accept = true
xh.accept = true
yi.accept = true
yo.accept = false
diff --git a/tools/xo_bundle/res/loading-image.png b/tools/xo_bundle/res/loading-image.png
new file mode 100644
index 0000000..5641cf4
--- /dev/null
+++ b/tools/xo_bundle/res/loading-image.png
Binary files differ
diff --git a/tools/xo_bundle/res/ua.css b/tools/xo_bundle/res/ua.css
index f7a1e07..e6cf8a4 100755
--- a/tools/xo_bundle/res/ua.css
+++ b/tools/xo_bundle/res/ua.css
@@ -213,11 +213,6 @@
cursor: default !important;
}
- *|*::-moz-viewport, *|*::-moz-viewport-scroll, *|*::-moz-canvas,
- *|*::-moz-scrolled-canvas {
- background-color: #737373 !important;
- }
-
}
/* XML parse error reporting */
diff --git a/tools/xo_bundle/res/viewsource.css b/tools/xo_bundle/res/viewsource.css
index 3305897..5f029bc 100755
--- a/tools/xo_bundle/res/viewsource.css
+++ b/tools/xo_bundle/res/viewsource.css
@@ -40,11 +40,11 @@
*|*:root {
background-color: white;
+ color: black;
}
#viewsource {
font-family: -moz-fixed;
font-weight: normal;
- color: black;
white-space: pre;
}
#viewsource.wrap {
diff --git a/tools/xo_bundle/run-mozilla-new.sh~ b/tools/xo_bundle/run-mozilla-new.sh~
new file mode 100755
index 0000000..45116b3
--- /dev/null
+++ b/tools/xo_bundle/run-mozilla-new.sh~
@@ -0,0 +1,401 @@
+#!/bin/sh
+#
+# ***** 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.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of 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 *****
+cmdname=`basename "$0"`
+MOZ_DIST_BIN=`dirname "$0"`
+MOZ_DEFAULT_NAME="./${cmdname}-bin"
+MOZ_APPRUNNER_NAME="./mozilla-bin"
+MOZ_VIEWER_NAME="./viewer"
+MOZ_PROGRAM=""
+
+exitcode=0
+#
+##
+## Functions
+##
+##########################################################################
+moz_usage()
+{
+echo "Usage: ${cmdname} [options] [program]"
+echo ""
+echo " options:"
+echo ""
+echo " -g Run in debugger."
+echo " --debug"
+echo ""
+echo " -d debugger Debugger to use."
+echo " --debugger debugger"
+echo ""
+echo " Examples:"
+echo ""
+echo " Run the viewer"
+echo ""
+echo " ${cmdname} viewer"
+echo ""
+echo " Run the mozilla-bin binary"
+echo ""
+echo " ${cmdname} mozilla-bin"
+echo ""
+echo " Debug the viewer in a debugger"
+echo ""
+echo " ${cmdname} -g viewer"
+echo ""
+echo " Debug the mozilla-bin binary in gdb"
+echo ""
+echo " ${cmdname} -g mozilla-bin -d gdb"
+echo ""
+ return 0
+}
+##########################################################################
+moz_bail()
+{
+ message=$1
+ echo
+ echo "$cmdname: $message"
+ echo
+ exit 1
+}
+##########################################################################
+moz_test_binary()
+{
+ binary=$1
+ if [ -f "$binary" ]
+ then
+ if [ -x "$binary" ]
+ then
+ return 1
+ fi
+ fi
+ return 0
+}
+##########################################################################
+moz_get_debugger()
+{
+ debuggers="ddd gdb dbx bdb"
+ debugger="notfound"
+ done="no"
+ for d in $debuggers
+ do
+ moz_test_binary /bin/which
+ if [ $? -eq 1 ]
+ then
+ dpath=`which ${d}`
+ else
+ dpath=`LC_MESSAGES=C type ${d} | awk '{print $3;}' | sed -e 's/\.$//'`
+ fi
+ if [ -x "$dpath" ]
+ then
+ debugger=$dpath
+ break
+ fi
+ done
+ echo $debugger
+ return 0
+}
+##########################################################################
+moz_run_program()
+{
+ prog=$MOZ_PROGRAM
+ ##
+ ## Make sure the program is executable
+ ##
+ if [ ! -x "$prog" ]
+ then
+ moz_bail "Cannot execute $prog."
+ fi
+ ##
+ ## Run the program
+ ##
+ "$prog" ${1+"$@"}
+ exitcode=$?
+}
+##########################################################################
+moz_debug_program()
+{
+ prog=$MOZ_PROGRAM
+ ##
+ ## Make sure the program is executable
+ ##
+ if [ ! -x "$prog" ]
+ then
+ moz_bail "Cannot execute $prog."
+ fi
+ if [ -n "$moz_debugger" ]
+ then
+ moz_test_binary /bin/which
+ if [ $? -eq 1 ]
+ then
+ debugger=`which $moz_debugger`
+ else
+ debugger=`LC_MESSAGES=C type $moz_debugger | awk '{print $3;}' | sed -e 's/\.$//'`
+ fi
+ else
+ debugger=`moz_get_debugger`
+ fi
+ if [ -x "$debugger" ]
+ then
+ tmpfile=`mktemp /tmp/mozargs.XXXXXX` || { echo "Cannot create temporary file" >&2; exit 1; }
+ trap " [ -f \"$tmpfile\" ] && /bin/rm -f -- \"$tmpfile\"" 0 1 2 3 13 15
+ # echo -n isn't portable, so pipe through perl -pe chomp instead
+ echo "set args" | perl -pe 'chomp' > $tmpfile
+ for PARAM in "$@"
+ do
+ echo " '$PARAM'" | perl -pe 'chomp' >> $tmpfile
+ done
+ echo >> $tmpfile
+# If you are not using ddd, gdb and know of a way to convey the arguments
+# over to the prog then add that here- Gagan Saksena 03/15/00
+ case `basename $debugger` in
+ gdb) echo "$debugger $prog -x $tmpfile"
+ $debugger "$prog" -x $tmpfile
+ exitcode=$?
+ ;;
+ ddd) echo "$debugger --debugger \"gdb -x $tmpfile\" $prog"
+ $debugger --debugger "gdb -x $tmpfile" "$prog"
+ exitcode=$?
+ ;;
+ *) echo "$debugger $prog ${1+"$@"}"
+ $debugger "$prog" ${1+"$@"}
+ exitcode=$?
+ ;;
+ esac
+ else
+ echo "Could not find a debugger on your system."
+ fi
+}
+##########################################################################
+##
+## Command line arg defaults
+##
+moz_debug=0
+moz_debugger=""
+#
+##
+## Parse the command line
+##
+while [ $# -gt 0 ]
+do
+ case $1 in
+ -g | --debug)
+ moz_debug=1
+ shift
+ ;;
+ -d | --debugger)
+ moz_debugger=$2;
+ if [ "${moz_debugger}" != "" ]; then
+ shift 2
+ else
+ echo "-d requires an argument"
+ exit 1
+ fi
+ ;;
+ *)
+ break;
+ ;;
+ esac
+done
+#
+##
+## Program name given in $1
+##
+if [ $# -gt 0 ]
+then
+ MOZ_PROGRAM=$1
+ shift
+fi
+##
+## Program not given, try to guess a default
+##
+if [ -z "$MOZ_PROGRAM" ]
+then
+ ##
+ ## Try this script's name with '-bin' appended
+ ##
+ if [ -x "$MOZ_DEFAULT_NAME" ]
+ then
+ MOZ_PROGRAM=$MOZ_DEFAULT_NAME
+ ## Try viewer (this should be deprecated)
+ ##
+ elif [ -x "$MOZ_VIEWER_NAME" ]
+ then
+ MOZ_PROGRAM=$MOZ_VIEWER_NAME
+ ##
+ ## Try mozilla-bin
+ ##
+ elif [ -x "$MOZ_APPRUNNER_NAME" ]
+ then
+ MOZ_PROGRAM=$MOZ_APPRUNNER_NAME
+ fi
+fi
+#
+#
+##
+## Make sure the program is executable
+##
+if [ ! -x "$MOZ_PROGRAM" ]
+then
+ moz_bail "Cannot execute $MOZ_PROGRAM."
+fi
+#
+##
+## Set MOZILLA_FIVE_HOME
+##
+MOZILLA_FIVE_HOME=$MOZ_DIST_BIN
+
+if [ -z "$MRE_HOME" ]; then
+ MRE_HOME=$MOZILLA_FIVE_HOME
+fi
+##
+## Set LD_LIBRARY_PATH
+##
+## On Solaris we use $ORIGIN (set in RUNPATH) instead of LD_LIBRARY_PATH
+## to locate shared libraries.
+##
+## When a shared library is a symbolic link, $ORIGIN will be replaced with
+## the real path (i.e., what the symbolic link points to) by the runtime
+## linker. For example, if dist/bin/libxul.so is a symbolic link to
+## toolkit/library/libxul.so, $ORIGIN will be "toolkit/library" instead of "dist/bin".
+## So the runtime linker will use "toolkit/library" NOT "dist/bin" to locate the
+## other shared libraries that libxul.so depends on. This only happens
+## when a user (developer) tries to start firefox, thunderbird, or seamonkey
+## under dist/bin. To solve the problem, we should rely on LD_LIBRARY_PATH
+## to locate shared libraries.
+##
+## Note:
+## We test $MOZ_DIST_BIN/*.so. If any of them is a symbolic link,
+## we need to set LD_LIBRARY_PATH.
+##########################################################################
+moz_should_set_ld_library_path()
+{
+ [ `uname -s` != "SunOS" ] && return 0
+ for sharedlib in $MOZ_DIST_BIN/*.so
+ do
+ [ -h $sharedlib ] && return 0
+ done
+ return 1
+}
+if moz_should_set_ld_library_path
+then
+ LD_LIBRARY_PATH=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARY_PATH+":$LD_LIBRARY_PATH"}
+fi
+
+if [ -n "$LD_LIBRARYN32_PATH" ]
+then
+ LD_LIBRARYN32_PATH=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARYN32_PATH+":$LD_LIBRARYN32_PATH"}
+fi
+if [ -n "$LD_LIBRARYN64_PATH" ]
+then
+ LD_LIBRARYN64_PATH=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARYN64_PATH+":$LD_LIBRARYN64_PATH"}
+fi
+if [ -n "$LD_LIBRARY_PATH_64" ]; then
+ LD_LIBRARY_PATH_64=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARY_PATH_64+":$LD_LIBRARY_PATH_64"}
+fi
+#
+#
+## Set SHLIB_PATH for HPUX
+SHLIB_PATH=${MOZ_DIST_BIN}:${MRE_HOME}${SHLIB_PATH+":$SHLIB_PATH"}
+#
+## Set LIBPATH for AIX
+LIBPATH=${MOZ_DIST_BIN}:${MRE_HOME}${LIBPATH+":$LIBPATH"}
+#
+## Set DYLD_LIBRARY_PATH for Mac OS X (Darwin)
+DYLD_LIBRARY_PATH=${MOZ_DIST_BIN}:${MRE_HOME}${DYLD_LIBRARY_PATH+":$DYLD_LIBRARY_PATH"}
+#
+## Set LIBRARY_PATH for BeOS
+LIBRARY_PATH=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/components:${MRE_HOME}${LIBRARY_PATH+":$LIBRARY_PATH"}
+#
+## Set ADDON_PATH for BeOS
+ADDON_PATH=${MOZ_DIST_BIN}${ADDON_PATH+":$ADDON_PATH"}
+#
+## Solaris Xserver(Xsun) tuning - use shared memory transport if available
+if [ "$XSUNTRANSPORT" = "" ]
+then
+ XSUNTRANSPORT="shmem"
+ XSUNSMESIZE="512"
+ export XSUNTRANSPORT XSUNSMESIZE
+fi
+
+# Disable Gnome crash dialog
+GNOME_DISABLE_CRASH_DIALOG=1
+export GNOME_DISABLE_CRASH_DIALOG
+
+if [ "$moz_debug" -eq 1 ]
+then
+ echo "MOZILLA_FIVE_HOME=$MOZILLA_FIVE_HOME"
+ echo " LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
+ if [ -n "$LD_LIBRARYN32_PATH" ]
+ then
+ echo "LD_LIBRARYN32_PATH=$LD_LIBRARYN32_PATH"
+ fi
+ if [ -n "$LD_LIBRARYN64_PATH" ]
+ then
+ echo "LD_LIBRARYN64_PATH=$LD_LIBRARYN64_PATH"
+ fi
+ if [ -n "$LD_LIBRARY_PATH_64" ]; then
+ echo "LD_LIBRARY_PATH_64=$LD_LIBRARY_PATH_64"
+ fi
+ if [ -n "$DISPLAY" ]; then
+ echo "DISPLAY=$DISPLAY"
+ fi
+ if [ -n "$FONTCONFIG_PATH" ]; then
+ echo "FONTCONFIG_PATH=$FONTCONFIG_PATH"
+ fi
+ if [ -n "$MOZILLA_POSTSCRIPT_PRINTER_LIST" ]; then
+ echo "MOZILLA_POSTSCRIPT_PRINTER_LIST=$MOZILLA_POSTSCRIPT_PRINTER_LIST"
+ fi
+ echo "DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH"
+ echo " LIBRARY_PATH=$LIBRARY_PATH"
+ echo " SHLIB_PATH=$SHLIB_PATH"
+ echo " LIBPATH=$LIBPATH"
+ echo " ADDON_PATH=$ADDON_PATH"
+ echo " MOZ_PROGRAM=$MOZ_PROGRAM"
+ echo " MOZ_TOOLKIT=$MOZ_TOOLKIT"
+ echo " moz_debug=$moz_debug"
+ echo " moz_debugger=$moz_debugger"
+fi
+#
+export MOZILLA_FIVE_HOME LD_LIBRARY_PATH
+export SHLIB_PATH LIBPATH LIBRARY_PATH ADDON_PATH DYLD_LIBRARY_PATH
+
+if [ $moz_debug -eq 1 ]
+then
+ moz_debug_program ${1+"$@"}
+else
+ moz_run_program ${1+"$@"}
+fi
+
+exit $exitcode
diff --git a/tools/xo_bundle/run-mozilla.sh b/tools/xo_bundle/run-mozilla.sh
index 37e81b7..45116b3 100755
--- a/tools/xo_bundle/run-mozilla.sh
+++ b/tools/xo_bundle/run-mozilla.sh
@@ -110,12 +110,12 @@ moz_get_debugger()
done="no"
for d in $debuggers
do
- moz_test_binary /bin/type
+ moz_test_binary /bin/which
if [ $? -eq 1 ]
then
- dpath=`LC_MESSAGES=C type ${d} | awk '{print $3;}' | sed -e 's/\.$//'`
- else
dpath=`which ${d}`
+ else
+ dpath=`LC_MESSAGES=C type ${d} | awk '{print $3;}' | sed -e 's/\.$//'`
fi
if [ -x "$dpath" ]
then
@@ -156,12 +156,12 @@ moz_debug_program()
fi
if [ -n "$moz_debugger" ]
then
- moz_test_binary /bin/type
+ moz_test_binary /bin/which
if [ $? -eq 1 ]
then
- debugger=`LC_MESSAGES=C type $moz_debugger | awk '{print $3;}' | sed -e 's/\.$//'`
- else
debugger=`which $moz_debugger`
+ else
+ debugger=`LC_MESSAGES=C type $moz_debugger | awk '{print $3;}' | sed -e 's/\.$//'`
fi
else
debugger=`moz_get_debugger`
diff --git a/tools/xo_bundle/searchplugins/yahoo.xml b/tools/xo_bundle/searchplugins/yahoo.xml
index 94ac633..ae93a5d 100755
--- a/tools/xo_bundle/searchplugins/yahoo.xml
+++ b/tools/xo_bundle/searchplugins/yahoo.xml
@@ -2,7 +2,7 @@
<ShortName>Yahoo</ShortName>
<Description>Yahoo Search</Description>
<InputEncoding>UTF-8</InputEncoding>
-<Image width="16" height="16">data:image/x-icon;base64,R0lGODlhEAAQAJECAP8AAAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAAAIplI+py+0NogQuyBDEnEd2kHkfFWUamEzmpZSfmaIHPHrRguUm/fT+UwAAOw==</Image>
+<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA</Image>
<Url type="application/x-suggestions+json" method="GET"
template="http://ff.search.yahoo.com/gossip?output=fxjson&amp;command={searchTerms}" />
<Url type="text/html" method="GET" template="http://search.yahoo.com/search">
diff --git a/tools/xo_bundle/updater b/tools/xo_bundle/updater
index 1956111..c38640b 100755
--- a/tools/xo_bundle/updater
+++ b/tools/xo_bundle/updater
Binary files differ