Created
December 20, 2012 08:16
-
-
Save Infocatcher/4343743 to your computer and use it in GitHub Desktop.
Repair Custom Buttons after save in Nightly with javascript.options.xml.chrome = false
http://custombuttons.sf.net/forum/viewtopic.php?p=2905#p2905
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://custombuttons.sf.net/forum/viewtopic.php?p=2905#p2905 | |
// (c) Infocatcher 2012 | |
// version 0.1.0 - 2012-12-20 | |
// Repair Custom Buttons after save in Nightly with javascript.options.xml.chrome = false | |
// Use at your own risk! | |
// Backup your %profile%/custombuttons directory first! | |
Components.utils.import("resource://gre/modules/NetUtil.jsm"); | |
Components.utils.import("resource://gre/modules/FileUtils.jsm"); | |
var cbDir = Components.classes["@mozilla.org/file/directory_service;1"] | |
.getService(Components.interfaces.nsIProperties) | |
.get("ProfD", Components.interfaces.nsIFile); | |
cbDir.append("custombuttons"); | |
var entries = cbDir.directoryEntries; | |
while(entries.hasMoreElements()) { | |
var entry = entries.getNext().QueryInterface(Components.interfaces.nsIFile); | |
if(entry.isFile() && /^\w*buttonsoverlay\.xul$/.test(entry.leafName)) | |
repairFile(entry); | |
} | |
function repairFile(file) { | |
NetUtil.asyncFetch(file, function(istream, status) { | |
if(!Components.isSuccessCode(status)) { | |
alert("NetUtil.asyncFetch() failed: " + getErrorName(status)); | |
return; | |
} | |
try { | |
var data = NetUtil.readInputStreamToString( | |
istream, | |
istream.available(), | |
{ charset: "UTF-8", replacement: "\ufffd" } | |
); | |
} | |
catch(e) { | |
alert("NetUtil.readInputStreamToString() failed:\n" + e + "\nEmpty file?"); | |
return; | |
} | |
var repaired = repairXML(data); | |
if(repaired == data) | |
return; | |
var bak = file.clone(), i = -1; | |
do | |
bak.leafName = file.leafName + ".repair" + (++i || "") + ".bak"; | |
while(bak.exists()); | |
file.copyTo(null, bak.leafName); | |
var ostream = FileUtils.openSafeFileOutputStream(file); | |
var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] | |
.createInstance(Components.interfaces.nsIScriptableUnicodeConverter); | |
suc.charset = "UTF-8"; | |
istream = suc.convertToInputStream(repaired); | |
NetUtil.asyncCopy(istream, ostream, (function(status) { | |
if(!Components.isSuccessCode(status)) { | |
alert("NetUtil.asyncCopy() failed: " + getErrorName(status)); | |
return; | |
} | |
alert("Repaired: " + file.leafName + "\nBackup: " + bak.leafName); | |
})); | |
}); | |
} | |
function repairXML(data) { | |
return data | |
.replace(/ xmlns=""/g, "") | |
.replace(/="[^"]+"/g, function(s) { | |
return s.replace(/[\x00-\x19]/g, function(chr) { | |
return "&#x" + chr.charCodeAt(0).toString(16).toUpperCase() + ";"; | |
}); | |
}); | |
} | |
function getErrorName(code) { | |
var cr = Components.results; | |
for(var errName in cr) | |
if(cr[errName] == code) | |
return errName; | |
return code; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment