From 954f8bd001a4767f33206b0df70f8b26f8aadc69 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Thu, 19 Jun 2014 17:30:52 -0400 Subject: [PATCH] Fix #496, Remove uses of nsICharsetConverterManager We should confirm that the manually added charsets still work on Firefox 32 once we #502 --- chrome/content/zotero/charsetMenu.js | 88 +++++++++++++------ .../xpcom/translation/translate_firefox.js | 12 +-- 2 files changed, 69 insertions(+), 31 deletions(-) diff --git a/chrome/content/zotero/charsetMenu.js b/chrome/content/zotero/charsetMenu.js index 0296e4430..29ced2678 100644 --- a/chrome/content/zotero/charsetMenu.js +++ b/chrome/content/zotero/charsetMenu.js @@ -42,40 +42,76 @@ var Zotero_Charset_Menu = new function() { var charsetSeparator = document.createElement("menuseparator"); charsetPopup.appendChild(charsetSeparator); - var charsetConverter = Components.classes["@mozilla.org/charset-converter-manager;1"]. - getService(Components.interfaces.nsICharsetConverterManager); - var charsets = charsetConverter.getEncoderList(); - - // add charsets to popup in order - while(charsets.hasMore()) { - var charset = charsets.getNext(); - try { - var label = charsetConverter.getCharsetTitle(charset); - } catch(e) { - continue; + var charsets = []; + + if(Zotero.platformMajorVersion >= 32) { + Components.utils.import("resource://gre/modules/CharsetMenu.jsm"); + var cmData = CharsetMenu.getData(); + for each(var charsetList in [cmData.pinnedCharsets, cmData.otherCharsets]) { + for each(var charsetInfo in charsetList) { + if(charsetInfo.value == "UTF-8") { + charsets.push({ + "label":"Unicode (UTF-8)", + "value":"UTF-8" + }); + } else { + charsets.push({ + "label":charsetInfo.label, + "value":charsetInfo.value + }); + } + } } - - var isUTF16 = charset.length >= 6 && charset.substr(0, 6) == "UTF-16"; - - // Show UTF-16 element appropriately depending on exportMenu - if(isUTF16 && exportMenu == (charset == "UTF-16") || - (!exportMenu && charset == "UTF-32LE")) { - continue; - } else if(charset == "x-mac-roman") { - // use the IANA name - charset = "macintosh"; - } else if(!exportMenu && charset == "UTF-32BE") { - label = "Unicode (UTF-32)"; - charset = "UTF-32"; + charsets = charsets.concat([ + {"label":"UTF-16LE", "value":"UTF-16LE"}, + {"label":"UTF-16BE", "value":"UTF-16BE"}, + {"label":"Western (IBM-850)", "value":"IBM850"}, + {"label":"Western (MacRoman)", "value":"macintosh"} + ]); + } else { + var charsetConverter = Components.classes["@mozilla.org/charset-converter-manager;1"]. + getService(Components.interfaces.nsICharsetConverterManager); + var ccCharsets = charsetConverter.getEncoderList(); + // add charsets to popup in order + while(ccCharsets.hasMore()) { + var charset = ccCharsets.getNext(); + try { + var label = charsetConverter.getCharsetTitle(charset); + } catch(e) { + continue; + } + + var isUTF16 = charset.length >= 6 && charset.substr(0, 6) == "UTF-16"; + + // Show UTF-16 element appropriately depending on exportMenu + if(isUTF16 && exportMenu == (charset == "UTF-16") || + (!exportMenu && charset == "UTF-32LE")) { + continue; + } else if(charset == "x-mac-roman") { + // use the IANA name + charset = "macintosh"; + } else if(!exportMenu && charset == "UTF-32BE") { + label = "Unicode (UTF-32)"; + charset = "UTF-32"; + } + charsets.push({ + "label":label, + "value":charset + }); } - + } + + for(var i=0; i 7 && + if(isUTF16 || (label.length >= 7 && label.substr(0, 7) == "Western")) { charsetPopup.insertBefore(itemNode, charsetSeparator); } else if(charset == "UTF-8") { diff --git a/chrome/content/zotero/xpcom/translation/translate_firefox.js b/chrome/content/zotero/xpcom/translation/translate_firefox.js index 45ae76db2..1ff296da3 100644 --- a/chrome/content/zotero/xpcom/translation/translate_firefox.js +++ b/chrome/content/zotero/xpcom/translation/translate_firefox.js @@ -583,12 +583,14 @@ Zotero.Translate.IO.Read = function(file, mode) { const encodingRe = /encoding=['"]([^'"]+)['"]/; var m = encodingRe.exec(firstPart); if(m) { + // Make sure encoding is valid try { - var charconv = Components.classes["@mozilla.org/charset-converter-manager;1"] - .getService(Components.interfaces.nsICharsetConverterManager) - .getCharsetTitle(m[1]); - if(charconv) this._charset = m[1]; - } catch(e) {} + var charconv = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] + .getService(Components.interfaces.nsIScriptableUnicodeConverter); + charconv.charset = m[1]; + } catch(e) { + Zotero.debug("Translate: Ignoring unknown XML encoding "+m[1]); + } } if(this._charset) {