diff options
author | Bryan Berry <bryan@olenepal.org> | 2010-02-14 11:29:17 (GMT) |
---|---|---|
committer | Bryan Berry <bryan@olenepal.org> | 2010-02-14 11:29:17 (GMT) |
commit | f1a6b7cbb5700287dcdc3e3cfc449401b675f7ee (patch) | |
tree | d29b07dccf83778c077a1a872a9f474af7e08a51 | |
parent | c551470a3be17ee5ea9ef1c553847dee323ffb37 (diff) |
fix firefox version, again
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 Binary files differdeleted file mode 100755 index 7d9fa4e..0000000 --- a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/27c13cf6-d561-f5a5-4a4a3ec5-2ab791a1.dmp +++ /dev/null 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 Binary files differdeleted file mode 100755 index 7c9b69d..0000000 --- a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/4a23810c-bb39-feb7-3d7a3d88-72833eea.dmp +++ /dev/null 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 Binary files differdeleted file mode 100755 index d09c71d..0000000 --- a/tools/xo_bundle/.mozilla/firefox/ukm0hbpm.default/minidumps/541b24cb-4b3c-a613-0d9cceca-770987c7.dmp +++ /dev/null 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 Binary files differindex caecd22..85b890e 100755 --- a/tools/xo_bundle/chrome/browser.jar +++ b/tools/xo_bundle/chrome/browser.jar diff --git a/tools/xo_bundle/chrome/classic.jar b/tools/xo_bundle/chrome/classic.jar Binary files differindex 34b4d25..71a4aef 100755 --- a/tools/xo_bundle/chrome/classic.jar +++ b/tools/xo_bundle/chrome/classic.jar diff --git a/tools/xo_bundle/chrome/comm.jar b/tools/xo_bundle/chrome/comm.jar Binary files differindex 376adc7..df9c226 100755 --- a/tools/xo_bundle/chrome/comm.jar +++ b/tools/xo_bundle/chrome/comm.jar diff --git a/tools/xo_bundle/chrome/en-US.jar b/tools/xo_bundle/chrome/en-US.jar Binary files differindex 378d6a2..e0983e0 100755 --- a/tools/xo_bundle/chrome/en-US.jar +++ b/tools/xo_bundle/chrome/en-US.jar diff --git a/tools/xo_bundle/chrome/pippki.jar b/tools/xo_bundle/chrome/pippki.jar Binary files differindex bc64444..eaee50c 100755 --- a/tools/xo_bundle/chrome/pippki.jar +++ b/tools/xo_bundle/chrome/pippki.jar diff --git a/tools/xo_bundle/chrome/reporter.jar b/tools/xo_bundle/chrome/reporter.jar Binary files differindex c7e2027..1791fb9 100755 --- a/tools/xo_bundle/chrome/reporter.jar +++ b/tools/xo_bundle/chrome/reporter.jar diff --git a/tools/xo_bundle/chrome/rkiosk.jar b/tools/xo_bundle/chrome/rkiosk.jar Binary files differnew file mode 100755 index 0000000..312d717 --- /dev/null +++ b/tools/xo_bundle/chrome/rkiosk.jar 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 Binary files differindex 466b6b8..cc3e371 100755 --- a/tools/xo_bundle/chrome/toolkit.jar +++ b/tools/xo_bundle/chrome/toolkit.jar 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 Binary files differindex f9e5b57..ff34c94 100755 --- a/tools/xo_bundle/components/browser.xpt +++ b/tools/xo_bundle/components/browser.xpt 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 Binary files differindex 0dbc493..573b16e 100755 --- a/tools/xo_bundle/components/libbrowsercomps.so +++ b/tools/xo_bundle/components/libbrowsercomps.so diff --git a/tools/xo_bundle/components/libbrowserdirprovider.so b/tools/xo_bundle/components/libbrowserdirprovider.so Binary files differindex b17f6b9..e4a2926 100755 --- a/tools/xo_bundle/components/libbrowserdirprovider.so +++ b/tools/xo_bundle/components/libbrowserdirprovider.so diff --git a/tools/xo_bundle/components/libdbusservice.so b/tools/xo_bundle/components/libdbusservice.so Binary files differindex ac88c21..0a3466e 100755 --- a/tools/xo_bundle/components/libdbusservice.so +++ b/tools/xo_bundle/components/libdbusservice.so diff --git a/tools/xo_bundle/components/libimgicon.so b/tools/xo_bundle/components/libimgicon.so Binary files differindex 84f9cf7..8997df9 100755 --- a/tools/xo_bundle/components/libimgicon.so +++ b/tools/xo_bundle/components/libimgicon.so diff --git a/tools/xo_bundle/components/libmozgnome.so b/tools/xo_bundle/components/libmozgnome.so Binary files differindex 33a99e8..9019e3e 100755 --- a/tools/xo_bundle/components/libmozgnome.so +++ b/tools/xo_bundle/components/libmozgnome.so diff --git a/tools/xo_bundle/components/libnkgnomevfs.so b/tools/xo_bundle/components/libnkgnomevfs.so Binary files differindex 53928bd..fe975b6 100755 --- a/tools/xo_bundle/components/libnkgnomevfs.so +++ b/tools/xo_bundle/components/libnkgnomevfs.so 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 Binary files differindex 5a437fa..fa4c97d 100755 --- a/tools/xo_bundle/crashreporter +++ b/tools/xo_bundle/crashreporter 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%¤tAppVersion=%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%¤tAppVersion=%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 Binary files differnew file mode 100644 index 0000000..b032749 --- /dev/null +++ b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png 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 Binary files differnew file mode 100644 index 0000000..ec75f5c --- /dev/null +++ b/tools/xo_bundle/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/preview.png 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 Binary files differindex 58aaff5..fe71fb6 100755 --- a/tools/xo_bundle/firefox-bin +++ b/tools/xo_bundle/firefox-bin 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 Binary files differindex 9f40adb..18925f4 100755 --- a/tools/xo_bundle/libfreebl3.chk +++ b/tools/xo_bundle/libfreebl3.chk diff --git a/tools/xo_bundle/libfreebl3.so b/tools/xo_bundle/libfreebl3.so Binary files differindex 243648e..9ee6240 100755 --- a/tools/xo_bundle/libfreebl3.so +++ b/tools/xo_bundle/libfreebl3.so diff --git a/tools/xo_bundle/libmozjs.so b/tools/xo_bundle/libmozjs.so Binary files differindex c4da441..f26734c 100755 --- a/tools/xo_bundle/libmozjs.so +++ b/tools/xo_bundle/libmozjs.so diff --git a/tools/xo_bundle/libnspr4.so b/tools/xo_bundle/libnspr4.so Binary files differindex 19064bc..80373ac 100755 --- a/tools/xo_bundle/libnspr4.so +++ b/tools/xo_bundle/libnspr4.so diff --git a/tools/xo_bundle/libnss3.so b/tools/xo_bundle/libnss3.so Binary files differindex 164bdd4..6520097 100755 --- a/tools/xo_bundle/libnss3.so +++ b/tools/xo_bundle/libnss3.so diff --git a/tools/xo_bundle/libnssckbi.so b/tools/xo_bundle/libnssckbi.so Binary files differindex 321857e..22a605d 100755 --- a/tools/xo_bundle/libnssckbi.so +++ b/tools/xo_bundle/libnssckbi.so diff --git a/tools/xo_bundle/libnssdbm3.chk b/tools/xo_bundle/libnssdbm3.chk Binary files differnew file mode 100644 index 0000000..8d1c009 --- /dev/null +++ b/tools/xo_bundle/libnssdbm3.chk diff --git a/tools/xo_bundle/libnssdbm3.so b/tools/xo_bundle/libnssdbm3.so Binary files differindex a7cabd8..92d3c7f 100755 --- a/tools/xo_bundle/libnssdbm3.so +++ b/tools/xo_bundle/libnssdbm3.so diff --git a/tools/xo_bundle/libnssutil3.so b/tools/xo_bundle/libnssutil3.so Binary files differindex 9352a79..4f49f39 100755 --- a/tools/xo_bundle/libnssutil3.so +++ b/tools/xo_bundle/libnssutil3.so diff --git a/tools/xo_bundle/libplc4.so b/tools/xo_bundle/libplc4.so Binary files differindex f805028..c34ac0e 100755 --- a/tools/xo_bundle/libplc4.so +++ b/tools/xo_bundle/libplc4.so diff --git a/tools/xo_bundle/libplds4.so b/tools/xo_bundle/libplds4.so Binary files differindex a833e67..7e565bf 100755 --- a/tools/xo_bundle/libplds4.so +++ b/tools/xo_bundle/libplds4.so diff --git a/tools/xo_bundle/libsmime3.so b/tools/xo_bundle/libsmime3.so Binary files differindex f211048..81174a4 100755 --- a/tools/xo_bundle/libsmime3.so +++ b/tools/xo_bundle/libsmime3.so diff --git a/tools/xo_bundle/libsoftokn3.chk b/tools/xo_bundle/libsoftokn3.chk Binary files differindex da6a98c..b682971 100755 --- a/tools/xo_bundle/libsoftokn3.chk +++ b/tools/xo_bundle/libsoftokn3.chk diff --git a/tools/xo_bundle/libsoftokn3.so b/tools/xo_bundle/libsoftokn3.so Binary files differindex b48b8dd..44748e2 100755 --- a/tools/xo_bundle/libsoftokn3.so +++ b/tools/xo_bundle/libsoftokn3.so diff --git a/tools/xo_bundle/libsqlite3.so b/tools/xo_bundle/libsqlite3.so Binary files differindex 294bffd..fed0cbc 100755 --- a/tools/xo_bundle/libsqlite3.so +++ b/tools/xo_bundle/libsqlite3.so diff --git a/tools/xo_bundle/libssl3.so b/tools/xo_bundle/libssl3.so Binary files differindex 09a30bf..99d0cf8 100755 --- a/tools/xo_bundle/libssl3.so +++ b/tools/xo_bundle/libssl3.so diff --git a/tools/xo_bundle/libxpcom.so b/tools/xo_bundle/libxpcom.so Binary files differindex a94ee6d..1565498 100755 --- a/tools/xo_bundle/libxpcom.so +++ b/tools/xo_bundle/libxpcom.so diff --git a/tools/xo_bundle/libxul.so b/tools/xo_bundle/libxul.so Binary files differindex cab8b59..1760045 100755 --- a/tools/xo_bundle/libxul.so +++ b/tools/xo_bundle/libxul.so 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 Binary files differindex b6f8c0b..dfc9088 100755 --- a/tools/xo_bundle/mozilla-xremote-client +++ b/tools/xo_bundle/mozilla-xremote-client 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 Binary files differnew file mode 100755 index 0000000..5dbecbc --- /dev/null +++ b/tools/xo_bundle/plugins/libflashplayer.so diff --git a/tools/xo_bundle/plugins/libnullplugin.so b/tools/xo_bundle/plugins/libnullplugin.so Binary files differindex 34b4350..b28d4c8 100755 --- a/tools/xo_bundle/plugins/libnullplugin.so +++ b/tools/xo_bundle/plugins/libnullplugin.so 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 Binary files differnew file mode 100644 index 0000000..2a1e0dc --- /dev/null +++ b/tools/xo_bundle/res/broken-image.png 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 Binary files differnew file mode 100644 index 0000000..5641cf4 --- /dev/null +++ b/tools/xo_bundle/res/loading-image.png 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&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 Binary files differindex 1956111..c38640b 100755 --- a/tools/xo_bundle/updater +++ b/tools/xo_bundle/updater |