Dev : Extensions : install.js: Difference between revisions
From MozillaZine Knowledge Base
Jump to navigationJump to search
mNo edit summary |
m (linked to http://www.xulplanet.com/tutorials/xultu/xpinstall.html) |
||
Line 1: | Line 1: | ||
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. | 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== | ==XPI file structure== |
Revision as of 23:41, 6 August 2004
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 install.rdf instead.
See also [1] from XulPlanet's Main Tutorial.
XPI file structure
You can use the code below (taken from Pike's extensions [2]). 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
// 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();