|
|
Line 1: |
Line 1: |
| {{extdev}}
| | #REDIRECT [[Install.js]] |
| | |
| To make your extension install in Mozilla Suite, Mozilla Firefox pre-0.9 and Mozilla Thunderbird pre-0.7, you need to have an '''install.js''' file in the root of your XPI file. If you want your extension install in Firefox 0.9 and later and/or Thunderbird 0.7 and later ''only'', you don't need install.js, you need an [[Dev : Extensions : install.rdf|install.rdf]] instead.
| |
| | |
| See also [http://www.xulplanet.com/tutorials/xultu/xpinstall.html] from XulPlanet's Main Tutorial.
| |
| | |
| ==XPI file structure==
| |
| You can use the code below (taken from Pike's extensions [http://www.pikey.me.uk/mozilla/]). It assumes the following structure of your XPI file:
| |
| sampleext.xpi
| |
| chrome\
| |
| sampleext.jar
| |
| content\
| |
| ...
| |
| locale\ (optional)
| |
| skin\ (optional)
| |
| install.js
| |
| install.rdf (optional -- see above)
| |
| | |
| ==Code==
| |
| <pre>
| |
| // install.js
| |
| // XpiInstaller
| |
| // By Pike (Heavily inspired by code from Henrik Gemal and Stephen Clavering)
| |
| | |
| var XpiInstaller = {
| |
| // --- Editable items begin ---
| |
| extFullName: 'Sample Extension', // The name displayed to the user (don't include the version)
| |
| extShortName: 'sampleext', // The leafname of the JAR file (without the .jar part)
| |
| extVersion: '1.0',
| |
| extAuthor: 'Insert-your-name-here',
| |
| extLocaleNames: null, // e.g. ['en-US', 'en-GB']
| |
| extSkinNames: null, // e.g. ['classic', 'modern']
| |
| extPostInstallMessage: null, // Set to null for no post-install message
| |
| // --- Editable items end ---
| |
|
| |
| profileInstall: true,
| |
| silentInstall: false,
| |
|
| |
| install: function()
| |
| {
| |
| var jarName = this.extShortName + '.jar';
| |
| var profileDir = Install.getFolder('Profile', 'chrome');
| |
|
| |
| // Parse HTTP arguments
| |
| this.parseArguments();
| |
|
| |
| // Check if extension is already installed in profile
| |
| if (File.exists(Install.getFolder(profileDir, jarName)))
| |
| {
| |
| if (!this.silentInstall)
| |
| {
| |
| Install.alert('Updating existing Profile install of ' + this.extFullName + ' to version ' + this.extVersion + '.');
| |
| }
| |
| this.profileInstall = true;
| |
| }
| |
| else if (!this.silentInstall)
| |
| {
| |
| // Ask user for install location, profile or browser dir?
| |
| this.profileInstall = Install.confirm('Install ' + this.extFullName + ' ' + this.extVersion + ' to your Profile directory (OK) or your Browser directory (Cancel)?');
| |
| }
| |
|
| |
| // Init install
| |
| var dispName = this.extFullName + ' ' + this.extVersion;
| |
| var regName = '/' + this.extAuthor + '/' + this.extShortName;
| |
| Install.initInstall(dispName, regName, this.extVersion);
| |
|
| |
| // Find directory to install into
| |
| var installPath;
| |
| if (this.profileInstall) installPath = profileDir;
| |
| else installPath = Install.getFolder('chrome');
| |
|
| |
| // Add JAR file
| |
| Install.addFile(null, 'chrome/' + jarName, installPath, null);
| |
|
| |
| // Register chrome
| |
| var jarPath = Install.getFolder(installPath, jarName);
| |
| var installType = this.profileInstall ? Install.PROFILE_CHROME : Install.DELAYED_CHROME;
| |
|
| |
| // Register content
| |
| Install.registerChrome(Install.CONTENT | installType, jarPath, 'content/' + this.extShortName + '/');
| |
|
| |
| // Register locales
| |
| for (var locale in this.extLocaleNames)
| |
| {
| |
| var regPath = 'locale/' + this.extLocaleNames[locale] + '/' + this.extShortName + '/';
| |
| Install.registerChrome(Install.LOCALE | installType, jarPath, regPath);
| |
| }
| |
|
| |
| // Register skins
| |
| for (var skin in this.extSkinNames)
| |
| {
| |
| var regPath = 'skin/' + this.extSkinNames[skin] + '/' + this.extShortName + '/';
| |
| Install.registerChrome(Install.SKIN | installType, jarPath, regPath);
| |
| }
| |
|
| |
| // Perform install
| |
| var err = Install.performInstall();
| |
| if (err == Install.SUCCESS || err == Install.REBOOT_NEEDED)
| |
| {
| |
| if (!this.silentInstall && this.extPostInstallMessage)
| |
| {
| |
| Install.alert(this.extPostInstallMessage);
| |
| }
| |
| }
| |
| else
| |
| {
| |
| this.handleError(err);
| |
| return;
| |
| }
| |
| },
| |
|
| |
| parseArguments: function()
| |
| {
| |
| // Can't use string handling in install, so use if statement instead
| |
| var args = Install.arguments;
| |
| if (args == 'p=0')
| |
| {
| |
| this.profileInstall = false;
| |
| this.silentInstall = true;
| |
| }
| |
| else if (args == 'p=1')
| |
| {
| |
| this.profileInstall = true;
| |
| this.silentInstall = true;
| |
| }
| |
| },
| |
|
| |
| handleError: function(err)
| |
| {
| |
| if (!this.silentInstall)
| |
| {
| |
| Install.alert('Error: Could not install ' + this.extFullName + ' ' + this.extVersion + ' (Error code: ' + err + ')');
| |
| }
| |
| Install.cancelInstall(err);
| |
| }
| |
| };
| |
| | |
| XpiInstaller.install();</pre>
| |
| | |
| [[Categories:Development]]
| |