<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Jérémie Bertrand &#187; Addin</title>
	<atom:link href="https://blog.developpez.com/laedit/pcategory/addin/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/laedit</link>
	<description></description>
	<lastBuildDate>Tue, 22 Mar 2011 14:30:08 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Créer un addin pour Firefox</title>
		<link>https://blog.developpez.com/laedit/p8873/articles/creer_un_addin_pour_firefox</link>
		<comments>https://blog.developpez.com/laedit/p8873/articles/creer_un_addin_pour_firefox#comments</comments>
		<pubDate>Mon, 26 Apr 2010 21:03:06 +0000</pubDate>
		<dc:creator><![CDATA[laedit]]></dc:creator>
				<category><![CDATA[Addin]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Même si à première vue la création d&#8217;un addin pour Firefox peut paraître simple, certaines choses sont à connaître si on ne veut pas galérer plus que nécessaire. Voilà donc une liste de truc et astuces / tutoriels qui vous aidera à développer plus facilement des plugins pour Firefox. Tout d&#8217;abord, voici un tutoriel sur BornGeek détaillant au pas à pas la création d&#8217;un addin pour Firefox. Très bien fait, il suffit à lui seul [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Même si à première vue la création d&rsquo;un addin pour Firefox peut paraître simple, certaines choses sont à connaître si on ne veut pas galérer plus que nécessaire. Voilà donc une liste de truc et astuces / tutoriels qui vous aidera à développer plus facilement des plugins pour Firefox.</p>
<p><span id="more-18"></span></p>
<p>Tout d&rsquo;abord, voici un tutoriel sur <a href="http://www.borngeek.com/firefox/toolbar-tutorial/">BornGeek</a> détaillant au pas à pas la création d&rsquo;un addin pour Firefox. Très bien fait, il suffit à lui seul pour la création d&rsquo;addins basiques.</p>
<p>En parallèle, le <a href="https://addons.mozilla.org/fr/developers">pôle développeur du site des addins de Firefox</a> comprend des tutoriels ainsi que des articles assez intéressants, de même que <a href="https://developer.mozilla.org/En">l&rsquo;espace développeur de Mozilla</a> contient toute la documentation requise.</p>
<p>Mais certaines choses, même si elles ne sont pas obligatoires, valent mieux pour notre addin quand elles sont respectées. Je pense par exemple à la partie javascript de l&rsquo;addin, certaines règles sont à respecter pour une meilleure intégration avec Firefox. Mark A. Ziesemer a rédigé un <a href="http://blogger.ziesemer.com/2007/10/respecting-javascript-global-namespace.html">article</a> sur la question, tandis qu&rsquo;un <a href="https://developer.mozilla.org/en/javascript_style_guide">guide de programmation</a> est présent sur l&rsquo;espace développeur de mozilla.</p>
<p>Une chose à connaître aussi est le cache de Firefox. Mettons par exemple que notre addin va contacter un fichier XML distant afin de récupérer des informations. Le cache de Firefox va fausser cette récupération, faisant croire à l&rsquo;addin que le fichier n&rsquo;a pas été modifié alors qu&rsquo;en réalité c&rsquo;est le cas. Il suffit alors d&rsquo;utiliser la fonction Math.random() en javascript, et d&rsquo;ajouter le résultat en tant que paramètre de l&rsquo;url, afin de faire croire à Firefox que l&rsquo;url n&rsquo;est jamais la même. Ainsi nous n&rsquo;aurons pas le contenu du cache mais le vrai fichier XML.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&quot;http://www.example.com/toolbar/infos.xml?&quot;+Math.random()</div></div>
<p>Une autre chose à savoir est que l&rsquo;utilisation de la méthode Load de XMLDOM sur une fichier distant peut provoquer une erreur de sécurité, ce qui n&rsquo;est pas le cas avec un XMLHttpRequest. Ce dernier est donc à privilégier.</p>
<p>La méthode setTimeout est dépréciée par Mozilla, il faudra donc utiliser à la place une classe interne. Il s&rsquo;agit de la classe <a href="https://developer.mozilla.org/en/nsITimer">timer</a>, qui s&rsquo;instancie de la façon suivante :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var timer = Components.classes[&quot;@mozilla.org/timer;1&quot;].createInstance(Components.interfaces.nsITimer);</div></div>
<p>Et pour lancer un compte à rebours, on peut utiliser sa méthode initWithCallback :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">timer.initWithCallback(loadEvent, 2000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);</div></div>
<p>loadEvent est un objet implémentant la méthode notify, qui sera utilisée par le timer :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var loadEvent = { <br />
&nbsp; &nbsp; notify: function(timer) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; alert('fin du timer'); <br />
&nbsp; &nbsp; } <br />
&nbsp; };</div></div>
<p>Dans cet exemple, au bout de 2 secondes une fenêtre s&rsquo;affichera, marquant &laquo;&nbsp;fin du timer&nbsp;&raquo;.</p>
<p>Un service pratique est celui des observers, permettant entre autre de savoir quand votre addin a été désinstallé.<br />
Il faut tout d&rsquo;abord instancier ce service :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var observerService = Components.classes['@mozilla.org/observer-service;1'].getService(Components.interfaces.nsIObserverService);</div></div>
<p>Il faut ensuite rajouter un observer, en définissant un objet définissant une méthode observe, ainsi que le type de l&rsquo;observer :</p>
<p><code class="codecolorer text default"><span class="text">observerService.addObserver(uninstallObserver, &quot;em-action-requested&quot;, false);</span></code></p>
<p>uninstallObserver est l&rsquo;objet implémentant la méthode observe, regardons son code :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var uninstallObserver = { <br />
&nbsp; &nbsp; &nbsp; observe: function(aSubject, aTopic, aData) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; try { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var item = aSubject.QueryInterface(Components.interfaces.nsIUpdateItem); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item.id != PLUGIN_ID) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (aData == &quot;item-uninstalled&quot;) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; preferencesService.deleteBranch(&quot;extensions.toolbar&quot;); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; } catch (e) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; };</div></div>
<p>L&rsquo;id du plugin ayant levé cet appel est récupéré puis comparé à l&rsquo;id de notre plugin (PLUGIN_ID est une constante ayant pour valeur l&rsquo;id du plugin définit dans le fichier install.rdf). Si c&rsquo;est bien notre plugin qui est à la source de cet appel, et si l&rsquo;action est la désinstallation de ce plugin, alors les préférences du plugin appartenant à la branche &laquo;&nbsp;extensions.toolbar&nbsp;&raquo; sont supprimmées.</p>
<p>Pour rester sur les préférences, qui sont déjà vues dans le <a href="http://www.borngeek.com/firefox/toolbar-tutorial/chapter-6/">tutoriel de BornGeek</a>, un autre <a href="http://www.rietta.com/firefox/Tutorial/prefs.html">tutoriel sur rietta.com</a> les décrit plus en détail, ainsi que la <a href="https://developer.mozilla.org/en/nsIPrefBranch">documentation officielle sur mozilla.org.</a><br />
Avec tout ça, plus aucune excuse pour ne pas les utiliser dans votre addin ! <img src="https://blog.developpez.com/laedit/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></p>
<p>Une autre chose à connaître est l&rsquo;eventListener, qui permet par exemple de lancer une action lors du chargement de Firefox. Combiné aux préférences, ça permet par exemple d&rsquo;ouvrir un onglet avec une page vers votre site lors du premier lancement de Firefox après avoir installé votre addin.<br />
Il faut tout d&rsquo;abord ajouter un eventListener :<br />
<code class="codecolorer text default"><span class="text">window.addEventListener(&quot;load&quot;, eventLoad, false);</span></code><br />
Avec le code précédant, on se branche sur l&rsquo;événement load de Firefox. eventLoad est une méthode qui sera appelée à ce moment là.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function eventLoad () <br />
&nbsp; { <br />
&nbsp; &nbsp; if(preferencesService.getBoolPref(PREF_FIRSTRUN)) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; preferencesService.setBoolPref(PREF_FIRSTRUN, false); <br />
&nbsp; &nbsp; &nbsp; timer.initWithCallback(loadEvent, 2000, Components.interfaces.nsITimer.TYPE_ONE_SHOT); <br />
&nbsp; &nbsp; } <br />
&nbsp; }</div></div>
<p>PREF_FIRSTRUN est une constante contenant le nom de la préférence qui va indiquer si c&rsquo;est le premier lancement de Firefox depuis l&rsquo;installation de l&rsquo;addin. Si c&rsquo;est le cas, la préférence est modifiée, et un compte à rebours est déclenché via le timer. Il suffira alors de mettre le code suivant dans loadEvent afin d&rsquo;ouvrir un nouvel onglet :</p>
<p><code class="codecolorer text default"><span class="text">gBrowser.selectedTab = gBrowser.addTab(&quot;http://www.google.com&quot;);</span></code></p>
<p>Passons maintenant au déploiement et aux mises à jours.<br />
Le premier est déjà abordé dans le <a href="http://www.borngeek.com/firefox/toolbar-tutorial/chapter-7/">tutoriel de BornGeek</a> ainsi que sur <a href="https://developer.mozilla.org/en/Install.rdf">mozilla.org</a> et n&rsquo;est pas bien compliqué. A partir de là vous pouvez tester votre addin.<br />
Quand aux mises à jour, il suffit de connaître le process pour que ça passe tout seul. Il est décrit dans un autre <a href="http://www.borngeek.com/firefox/automatic-firefox-extension-updates/">article de BornGeek</a> ainsi que sur <a href="https://developer.mozilla.org/en/Extension_Versioning,_Update_and_Compatibility">mozilla.org</a>.<br />
L&rsquo;ordre à retenir est le suivant :<br />
&#8211; Ajout de la clé dans le fichier install.rdf via McCoy<br />
&#8211; Création du XPI<br />
&#8211; Récupération du hash du XPI<br />
&#8211; Ajout du hash dans le fichier update.rdf dans la section correspondante<br />
&#8211; Signature du fichier update.rdf via McCoy</p>
<p>Il ne faut pas retoucher le fichier update.rdf sous peine de devoir le resigner.</p>
<p>Pour le hash, il existe une exention shell pour windows, <a href="http://beeblebrox.org/">HashTab</a>,  qui permet d&rsquo;avoir le hash d&rsquo;un fichier à partir d&rsquo;un simple clic-droit -> propriété.</p>
<p>Update:</p>
<p>Depuis j&rsquo;ai eu à faire une chose dont je suis pas fier : ouvrir le menu lors du passage de la souris.<br />
C&rsquo;est pas ergonomique du tout et ça bouleverse les habitudes des utilisateurs, mais quand on décide pas&#8230;<br />
Du coup, pour mettre ça en place je me suis d&rsquo;abord dit que ça allait être simple, il y a sûrement un event onmouseover auquel préciser une méthode javascript et ça roulerait.<br />
Bah en fait non. Bon, bah alors y&rsquo;a plus qu&rsquo;à rajouter un eventlistener sur le mouseover de l&rsquo;élément que j&rsquo;me suis dit. Oui, mais lors du chargement de la feuile .js, l&rsquo;élément n&rsquo;est pas encore défini. Solution : ajouter un eventlistener sur le load de la fenêtre, et dans le load, ajouter un eventlistener sur le mouseover de l&rsquo;élément ciblé. Et dans le mouseover, on peut enfin ouvrir le menu.<br />
Plus de code pour plus de comprégension :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; window.addEventListener(&quot;load&quot;, PlopTB_Load, false); <br />
&nbsp;<br />
&nbsp;<br />
&nbsp; &nbsp; function PlopTB_Load () <br />
&nbsp; &nbsp; { <br />
&nbsp; document.getElementById('PlopTB-MainMenu').addEventListener(&quot;mouseover&quot;, PlopTB_MainMenuMouseOver, false); &nbsp; <br />
&nbsp; &nbsp; }, <br />
&nbsp;<br />
&nbsp; &nbsp; function PlopTB_MainMenuMouseOver () <br />
&nbsp; &nbsp; { <br />
&nbsp; var toolbarButton = document.getElementById('PlopTB-MainMenu'); <br />
&nbsp; if(!toolbarButton.open) <br />
&nbsp; { <br />
&nbsp; &nbsp; &nbsp; toolbarButton.open = true; <br />
&nbsp; } <br />
&nbsp; &nbsp; }</div></div>
<p>Et voilà qui termine cette série de liens et trucs et astuces, en vous souhaitant un bon développement d&rsquo;addin Firefox !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer un addin pour Internet Explorer</title>
		<link>https://blog.developpez.com/laedit/p8870/c/creer_un_addin_pour_internet_explorer</link>
		<comments>https://blog.developpez.com/laedit/p8870/c/creer_un_addin_pour_internet_explorer#comments</comments>
		<pubDate>Mon, 26 Apr 2010 14:40:00 +0000</pubDate>
		<dc:creator><![CDATA[laedit]]></dc:creator>
				<category><![CDATA[Addin]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A travers plusieurs recherches sur le net, j&#8217;ai pu m&#8217;apercevoir qu&#8217;à première vue, la création d&#8217;un addin pour IE doit se faire en C++. Loin de moi de dénigrer se langage, mais quand c&#8217;est possible je préfère développer en C#. Et heureusement pour nous, Pavel Zolnikov à convertit les librairies C++ nécessaires à la création d&#8217;un addin pour IE en C#. Il en a d&#8217;ailleurs fait un excellent article sur CodeProject. La partie qui nous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A travers plusieurs recherches sur le net, j&rsquo;ai pu m&rsquo;apercevoir qu&rsquo;à première vue, la création d&rsquo;un addin pour IE doit se faire en C++. Loin de moi de dénigrer se langage, mais quand c&rsquo;est possible je préfère développer en C#. Et heureusement pour nous,  Pavel Zolnikov à convertit les librairies C++ nécessaires à la création d&rsquo;un addin pour IE en C#.</p>
<p><span id="more-17"></span></p>
<p>Il en a d&rsquo;ailleurs fait un excellent article sur <a href="http://www.codeproject.com/KB/shell/dotnetbandobjects.aspx?fid=3788&amp;df=90&amp;mpp=25&amp;noise=3&amp;sort=Position&amp;view=Quick&amp;fr=301&amp;select=1466953">CodeProject</a>.</p>
<p>La partie qui nous intéresse est la classe BandObject. C&rsquo;est grâce à celle-ci que l&rsquo;on va pouvoir créer un addin pour IE.<br />
En effet, il suffira de créer une classe héritant de BandObject, de préciser un Guid ainsi que quelques paramètres via un attribut, et vous aurez votre toolbar. Vide au début, mais il ne tient qu&rsquo;à vous de la remplir avec un ToolStrip et quelques boutons <img src="https://blog.developpez.com/laedit/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Christophe Geers en a fait un article très intéressant sur son <a href="http://cgeers.wordpress.com/2008/02/16/internet-explorer-toolbar/">blog</a>, détaillant le processus du début à la fin tout en résolvant les innombrables problèmes qui ne manquent pas de survenir.</p>
<p>Et pour finir pour les tutoriels, un article sur <a href="http://www.codeproject.com/KB/shell/IEToolbar.aspx">CodeProjet</a> de Sharon Salmon, qui reprend les articles vu plus haut tout en rendant les choses plus simples, notamment en centralisant dans une classe statique les données telles que le GUID de l&rsquo;addin, son nom, etc. Il Implémente aussi une classe Installer spéciale pour les addins de IE, nous évitant ainsi la tâche ardue et complexe d&rsquo;enregistrer notre addin dans la base de registre afin qu&rsquo;Internet Explorer le prenne en compte.</p>
<p>Maintenant quelques trucs et astuces.<br />
En effet, étant donné que nous construisons un addin pour IE, certaines choses sont interdites/limitées. Je n&rsquo;ai par exemple pas réussi à utiliser un fichier de configuration (app.config), mais peut être n&rsquo;ai-je pas assez cherché.</p>
<p>Par contre, la classe BackgroundWorker fonctionne, évitant ainsi de freezer IE à chaque lancement si notre addin va chercher des informations sur un fichier distant par exemple. Car IE instancie chacun de ses addins lors de son lancement, et ne finit lui même de charger que lorsque tout ses addins ont finis, rendant son utilisation impossible si les addins sont trop nombreux ou prennent trop de temps à s&rsquo;instancier.</p>
<p>Pour ceux qui voudraient que leur addin ait leur toolbar bien à eux, vous pouvez jouer avec la propriété dwModeFlags de la classe BandObject, en particulier dans sa méthode GetBandInfo.<br />
D&rsquo;après mes recherches, DBIMF.ADDTOFRONT permettrait de pouvoir déplacer l&rsquo;addin parmi les barres d&rsquo;outils (quand celles-ci ne sont pas vérrouillées, Affichage -> Barre d&rsquo;outils -> Verrouiler les barre d&rsquo;outils) tandis que DBIMF.BREAK permettrait à l&rsquo;addin d&rsquo;avoir sa toolbar. Mais ces valeurs étant prévues pour IE6, elles ne réagissent pas très bien avec IE7 et 8, mêmes si j&rsquo;ai réussi à déplacer mon addin je n&rsquo;ai jamais pu lui faire prendre la forme d&rsquo;une toolbar complète.</p>
<p>Voilà, j&rsquo;espère avoir réussi à vous aider dans la création d&rsquo;un addin pour Internet Explorer <img src="https://blog.developpez.com/laedit/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
