Полезная информация

Общайтесь со знакомыми и друзьями в нашем сообществе в Facebook.
 

Часть 2. Пакеты и XPInstall

Структура расширения

Файловая структура расширения выглядит так:

  • Ext_name
    • chrome
      • Ext_name.jar
        • content
          • Ext_name
            • contents.rdf
        • skin
          • Ext_name
            • contents.rdf
        • locale
          • Ext_name
            • contents.rdf
    • install.rdf
    • install.js

где Ext_name — имя вашего расширения.

Файл install.rdf

Это — глвный файл расширения. Здесь показано его минимальное содержание; в других секциях будет описаны добавления в этот файл.

<?xml version="1.0" encoding="cp-1251"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">

<Description about="urn:mozilla:install-manifest">
 <em:id>{D2BDE81D-F700-4271-A5E6-167D0BFAA583}</em:id>
 <em:name>Ext_name</em:name>
 <em:version>0.1</em:version>
 <em:description>Ваше описание расширения</em:description>
 <em:creator>Вася Пупкин</em:creator>
 <em:file>
  <Description about="urn:mozilla:extension:file:ext_name.jar">
   <em:package>content/ext_name/</em:package>
  </Description>
 </em:file>
 
 <em:targetApplication>
  <Description>
   <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
   <em:minVersion>0.9</em:minVersion>
   <em:maxVersion>1.6</em:maxVersion>
  </Description>
 </em:targetApplication>
</Description>
</RDF>

Описание тегов

  • <?xml version=“1.0” encoding=“cp-1251”?> — сообщает браузеру, что это документ XML версии 1.0, записанный в кодировке windows-1251
  • <RDF xmlns=“http://www.w3.org/1999/02/22-rdf-syntax-ns#” xmlns:em=“http://www.mozilla.org/2004/em-rdf#”> — сообщает браузеру о том, что внутри этого тега будут находиться теги RDF, и описания этих тегов:

xmlns=“http://www.w3.org/1999/02/22-rdf-syntax-ns#” — общие RDF теги
xmlns:em=“http://www.mozilla.org/2004/em-rdf#”> — описание тега em

  • <Description about=“urn:mozilla:install-manifest”> — описание вашего расширения
  • <em:id> — GUID объекта, указанного в теге <Description>. Это одна из важнейших частей расширения. Кстати, сгенерировать новый, уникальный GUID можно программой Microsoft Exchange Server GUID Generator
  • <em:name> — Название расширения
  • <em:version> — Версия расширения. Писать версию в теге <em:name> не надо!
  • <em:targetApplication> — та программа, в которую инсталлировать расширение. Необходимо для проверки совместимости. В данном случае там записан GUID Firefox. Если вы будете разрабатывать расширения для Firefox, этот пункт менять не надо!
  • <em:minVersion> и <em:maxVersion> — теги, определяющие минимальную и максимальную версию приложения (в данном случае Firefox), с которыми расширение совместимо.

Файл install.js

Файл install.js необходим для регистрации вашего расширения в Firefox. Ниже приведен шаблон этого файла.

var XpiInstaller = {

	// --- Редактируемые элементы ---
	extFullName: 'Ext_name', // The name displayed to the user (don't include the version)
	extShortName: 'ext_name', // The leafname of the JAR file (without the .jar part)
	extVersion: '1.0',
	extAuthor: 'Вася Пупкин',
	extLocaleNames: null, // e.g. ['en-US', 'en-GB']
	extSkinNames: null, // e.g. ['classic', 'modern']
	extPostInstallMessage: null, // Set to null for no post-install message
	// --- Конец редактируемых элементов ---

	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('Ошибка! Невозможно установить ' + this.extFullName + ' ' + 
                              this.extVersion + ' (Код ошибки: ' + err + ')');
		}
		Install.cancelInstall(err);
	}
};

XpiInstaller.install();

Описание редактируемых элементов

  • extFullName и extShortName

Папка Content

contents.rdf

Этот файл содержит, в том числе, информацию об авторе и расширении, но основное его назначение — задание перекрытий, или оверлеев. Оверлей — некое изменение уже созданного XUL файла другим XUL файлом. Используется для добавления в браузер разнообразных кнопок, пунктов меню, и т. п.

Вот пример файла:

<?xml version="1.0"?>

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">

	<RDF:Seq RDF:about="urn:mozilla:package:root">
		<RDF:li RDF:resource="urn:mozilla:package:mycmsadmin"/>
	</RDF:Seq>

	<RDF:Seq about="urn:mozilla:overlays">
		<RDF:li resource="chrome://browser/content/browser.xul"/>
	</RDF:Seq>

	<RDF:Seq about="chrome://browser/content/browser.xul">
		<RDF:li>chrome://mycmsadmin/content/mycmsadminOverlay.xul</RDF:li>
	</RDF:Seq>

	<RDF:Description RDF:about="urn:mozilla:package:mycmsadmin"
		chrome:displayName="Ext_name 1.0"
		chrome:author="Васька Пупкин"
		chrome:authorURL="mailto:ваш@адрес.ru"
		chrome:name="ext_name"
		chrome:extension="true"
		chrome:description="Ваше описание">
	</RDF:Description>

</RDF:RDF>

Описание тегов

  • Большинство тегов описано


Оглавление

 
  development/extension/firefox/xpi.txt · Последние изменения: 2005/12/09 03:39
 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2011 Mozilla Russia
Язык отображения форума: [Русский] [English]