Dev : Tips : Disable XUL cache: Difference between revisions

From MozillaZine Knowledge Base
Jump to navigationJump to search
No edit summary
(redirect to devmo, all the up-to-date info is there minus the overlay reload thing, which sounds kinda iffy)
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{extdev}}
See [http://developer.mozilla.org/en/docs/Setting_up_extension_development_environment Setting up extension development environment] at [http://developer.mozilla.org MDC].


'''nglayout.debug.disable_xul_cache''' is a preference useful for extension developers. Basically when it is set to '''false''' (which is default), Mozilla caches chrome XUL and JavaScript (and more) in a file named XUL.mfl or similarly. This means you have to restart Mozilla to test your changes to chrome files.
[[Category:Redirects]]
 
If you develop and extension you should disable the XUL cache by [[Editing configuration|setting]] this pref to '''true''', although it will make Mozilla slower at startup and when opening new windows.
 
==Getting rid of JARs==
However even when '''nglayout.debug.disable_xul_cache''' is set to '''true''', Mozilla forbids rewriting *.jar files containing installed extensions. To overcome this and to avoid having to repackage after making any changes, you can do one of the following:
* Use the [[Getting_started_with_extension_development#reg-em|new features of Firefox/Thunderbird 1.5's Extension Manager]] ('''recommended''').
* [[#Changing install.rdf|Package your extension to use plain directories]] instead of a single JAR before installing (you should use this if you have to develop using Firefox/Thunderbird 1.0 or older).
* Unarchive the JAR file you want to edit and make it permanent by [[#Editing chrome.rdf|updating chrome.rdf]] to point to the unpacked files instead of the JAR (after installing).
* Use installed-chrome.txt to add your files to chrome, see [http://xulplanet.com/tutorials/xulapp/newpackage.html] and [http://www.mozilla.org/docs/tutorials/tinderstatus/] ''(not sure if it works in Firefox. Definitely not with 1.5)''
 
The following sections provide detailed instructions
 
===Changing install.rdf===
Perhaps you would like to package your extension as a series of directories, rather than
a jar file.  This would allow, for example, an XPI that could be easily edited and perhaps
checked back into a repository (e.g. a developer version).
 
Change the [[install.rdf]] from:
 
<tt><Description about="urn:mozilla:extension:file:myextension.jar"></tt>
 
to:
 
<tt><Description about="urn:mozilla:extension:file:myextension"></tt>
 
An [http://cgi29.plala.or.jp/~mozzarel/addon/obsolete/phoenix_firebird_firefox/non-jarred/ example]
of this technique is available.  Also, myk is planning to update his [http://www.mozilla.org/docs/tutorials/tinderstatus/ tinderstatus extension]
to demonstrate this technique.
 
 
===Editing chrome.rdf===
We assume that the extension is installed in profile in this section.
 
'''''Important!! Backup your profile before editing chrome.rdf!'''''
<ol><li>Unpack the JAR file you have, say <tt>[profile]\extensions\{YOUR-EXTENSION'S-GUID}\chrome\my-ext.jar</tt> to the same directory. You will get (at least) <tt>[profile]\extensions\{YOUR-EXTENSION'S-GUID}\chrome\content</tt> directory.</li>
<li>In <tt>[profile]\chrome\chrome.rdf</tt> look for '''my-ext.jar!''' and delete it. For example replace this line
<pre>c:baseURL="jar:file:///D:/Firefox/Profiles/default/extensions/{GUID}/chrome/my-ext.jar!/content/my-ext/"</pre>
with this:
<pre>c:baseURL="file:///D:/Firefox/Profiles/default/extensions/{GUID}/chrome/content/my-ext/"</pre>
Note, that you should also delete '''jar:''' at the beginning of the path.</li></ol>
 
==The overlay problem==
There is still another issue to be solved: a Javascript that's called from the overlay.
The steps above help you test scripts that are not part of the overlay, like your settings dialog. But they can't help you test the overlay scripts because Firefox caches those.
 
The solution is to have the overlay script load its code from an external [[File IO|file]], which is reloaded and re-evaluated constantly.
Here's an example:
 
<pre>
var TheExt = {
 
//aFuncCall is a string to be evaluated as a function call
inject : function (aFuncCall) {
                var codeFileName =  "injected.js";
 
// Get profile directory
var file = Components.classes["@mozilla.org/file/directory_service;1"].
createInstance(Components.interfaces.nsIProperties).
get("ProfD", Components.interfaces.nsIFile);
 
// Get the file with the code
file.append(codeFileName);
if (!file.exists()) {
dump ("Error: " + file.path + "does not exist.\n");
return;
}
 
// Read the file into code
var code = "";
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"]
.createInstance(Components.interfaces.nsIScriptableInputStream);
fstream.init(file, 1, 0, false);
sstream.init(fstream);
code += sstream.read(-1);
sstream.close();
fstream.close();
// Run the code
eval(code);
eval(aFuncCall);
},
doAction : function() {
this.inject("doAction()");
}
}
 
dump ("Testing the extension.\n");
TheExt.doAction();
</pre>
 
The file injected.js simply looks like this:
<pre>
function doAction() {
dump ("Action!\n")
}
</pre>
 
You can add as many functions as you want. inject() evaluates all the functions in the file, but only executes the aFuncCall parameter.
 
[[Category:Development]]

Latest revision as of 19:53, 23 May 2007