diff --git a/toolkit/mozapps/extensions/src/nsExtensionManager.js.in b/toolkit/mozapps/extensions/src/nsExtensionManager.js.in
index 8378d8fd28f..c724305f1c0 100644
--- a/toolkit/mozapps/extensions/src/nsExtensionManager.js.in
+++ b/toolkit/mozapps/extensions/src/nsExtensionManager.js.in
@@ -848,33 +848,56 @@ function extractRDFFileToTempDir(zipFile, fileName, suppressErrors) {
* @returns The Install Manifest datasource
*/
function getInstallManifest(file) {
- var fis = Cc["@mozilla.org/network/file-input-stream;1"].
- createInstance(Ci.nsIFileInputStream);
- fis.init(file, -1, -1, false);
- fis.QueryInterface(Ci.nsILineInputStream);
- var line = { value: "" };
- var text = "";
- while (fis.readLine(line))
- text += line.value;
- fis.close();
+ var uri = getURIFromFile(file);
+ try {
+ var fis = Cc["@mozilla.org/network/file-input-stream;1"].
+ createInstance(Ci.nsIFileInputStream);
+ fis.init(file, -1, -1, false);
+ var bis = Cc["@mozilla.org/network/buffered-input-stream;1"].
+ createInstance(Ci.nsIBufferedInputStream);
+ bis.init(fis, 4096);
+
+ var rdfParser = Cc["@mozilla.org/rdf/xml-parser;1"].
+ createInstance(Ci.nsIRDFXMLParser)
+ var ds = Cc["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].
+ createInstance(Ci.nsIRDFDataSource);
+ var listener = rdfParser.parseAsync(ds, uri);
+ var channel = Cc["@mozilla.org/network/input-stream-channel;1"].
+ createInstance(Ci.nsIInputStreamChannel);
+ channel.setURI(uri);
+ channel.contentStream = bis;
+ channel.QueryInterface(Ci.nsIChannel);
+ channel.contentType = "text/xml";
- var rdfParser = Cc["@mozilla.org/rdf/xml-parser;1"].
- createInstance(Ci.nsIRDFXMLParser)
- var ds = Cc["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].
- createInstance(Ci.nsIRDFDataSource);
- rdfParser.parseString(ds, getURIFromFile(file), text);
+ listener.onStartRequest(channel, null);
+ try {
+ var pos = 0;
+ var count = bis.available();
+ while (count > 0) {
+ listener.onDataAvailable(channel, null, bis, pos, count);
+ pos += count;
+ count = bis.available();
+ }
+ listener.onStopRequest(channel, null, Components.results.NS_OK);
+ bis.close();
+ fis.close();
- var arcs = ds.ArcLabelsOut(gInstallManifestRoot);
- if (!arcs.hasMoreElements()) {
- ds = null;
- var uri = Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService)
- .newFileURI(file);
- var url = uri.QueryInterface(Ci.nsIURL);
- showMessage("malformedTitle", [], "malformedMessage",
- [BundleManager.appName, url.fileName]);
+ var arcs = ds.ArcLabelsOut(gInstallManifestRoot);
+ if (arcs.hasMoreElements())
+ return ds;
+ }
+ catch (e) {
+ listener.onStopRequest(channel, null, e.result);
+ bis.close();
+ fis.close();
+ }
}
- return ds;
+ catch (e) { }
+
+ var url = uri.QueryInterface(Ci.nsIURL);
+ showMessage("malformedTitle", [], "malformedMessage",
+ [BundleManager.appName, url.fileName]);
+ return null;
}
/**
diff --git a/toolkit/mozapps/extensions/test/unit/addons/test_bug425657/install.rdf b/toolkit/mozapps/extensions/test/unit/addons/test_bug425657/install.rdf
new file mode 100644
index 00000000000..e4e1b339bd1
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/unit/addons/test_bug425657/install.rdf
@@ -0,0 +1,17 @@
+
+
+
+
+ bug425657@tests.mozilla.org
+ 1
+
+
+ xpcshell@tests.mozilla.org
+ 1
+ 1
+
+
+ Deutsches Wörterbuch
+
+
diff --git a/toolkit/mozapps/extensions/test/unit/test_bug425657.js b/toolkit/mozapps/extensions/test/unit/test_bug425657.js
new file mode 100644
index 00000000000..4f575ae152f
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/unit/test_bug425657.js
@@ -0,0 +1,61 @@
+/* ***** 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
+ * Dave Townsend .
+ *
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * 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 ADDON = "test_bug425657";
+const ID = "bug425657@tests.mozilla.org";
+
+function run_test()
+{
+ // Setup for test
+ createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1");
+
+ // Install test add-on
+ startupEM();
+ gEM.installItemFromFile(do_get_addon(ADDON), NS_INSTALL_LOCATION_APPPROFILE);
+ var addon = gEM.getItemForID(ID);
+ do_check_neq(addon, null);
+ do_check_eq(addon.name, "Deutsches W\u00f6rterbuch");
+ restartEM();
+
+ addon = gEM.getItemForID(ID);
+ do_check_neq(addon, null);
+ do_check_eq(addon.name, "Deutsches W\u00f6rterbuch");
+ do_check_eq(addon.name.length, 20);
+
+ shutdownEM();
+}